Package: pymsteams
pymsteamsPython Wrapper Library to send requests to Microsoft Teams Webhooks.
Microsoft refers to these messages as Connector Cards.  A message can be sent with only the main Connector Card, or additional sections can be included into the message.This library uses Webhook Connectors for Microsoft Teams.  Please visit the following Microsoft Documentation link for instructions on how to obtain the correct url for your Channel:https://dev.outlook.com/Connectors/GetStarted#creating-messages-through-office-365-connectors-in-microsoft-teamsPlease refer to the Microsoft Documentation for the most up to date screenshots.https://dev.outlook.com/connectors/referenceInstallationInstall with pip:pipinstallpymsteamsInstall with async capabilities (python 3.6+):pipinstallpymsteams[async]Python 2 InstallationAt time of writing, the latest release supported by Python 2 isVersion 0.1.16UsageCreating ConnectorCard MessagesThis is the simplest implementation of pymsteams.  It will send a message to the teams webhook url with plain text in the message.importpymsteams# You must create the connectorcard object with the Microsoft Webhook URLmyTeamsMessage=pymsteams.connectorcard("<Microsoft Webhook URL>")# Add text to the message.myTeamsMessage.text("this is my text")# send the message.myTeamsMessage.send()Creating CreatorCard Messages to send via async loopimportasyncioimportpymsteamsloop=asyncio.get_event_loop()# the async_connectorcard object is used instead of the normal one.myTeamsMessage=pymsteams.async_connectorcard("<Microsoft Webhook URL>")# all formatting for the message should be the samemyTeamsMessage.text("This is my message")# to send the message, pass to the event looploop.run_until_complete(myTeamsMessage.send())Please visit the python asyncio documentation for more info on using asyncio and the event loop:https://docs.python.org/3/library/asyncio-eventloop.htmlOptional Formatting Methods for CardsAdd a titlemyTeamsMessage.title("This is my message title")Add a link buttonmyTeamsMessage.addLinkButton("This is the button Text","https://github.com/rveachkc/pymsteams/")Change URLThis is useful in the event you need to post the same message to multiple rooms.myTeamsMessage.newhookurl("<My New URL>")Set Color ThemeThis sets the theme color of the card. The parameter is expected to be a hex color code without the hash or the string red.myTeamsMessage.color("<Hex Color Code>")Preview your objectThis is a simple print command to view your connector card message object before sending.myTeamsMessage.printme()Adding sections to the Connector Card MessageTo create a section and add various formatting elements# create the sectionmyMessageSection=pymsteams.cardsection()# Section TitlemyMessageSection.title("Section title")# Activity ElementsmyMessageSection.activityTitle("my activity title")myMessageSection.activitySubtitle("my activity subtitle")myMessageSection.activityImage("http://i.imgur.com/c4jt321l.png")myMessageSection.activityText("This is my activity Text")# Facts are key value pairs displayed in a list.myMessageSection.addFact("this","is fine")myMessageSection.addFact("this is","also fine")# Section TextmyMessageSection.text("This is my section text")# Section ImagesmyMessageSection.addImage("http://i.imgur.com/c4jt321l.png",ititle="This Is Fine")# Add your section to the connector card object before sendingmyTeamsMessage.addSection(myMessageSection)You may also add multiple sections to a connector card message as well.# Create Section 1Section1=pymsteams.cardsection()Section1.text("My First Section")# Create Section 2Section2=pymsteams.cardsection()Section2.text("My Second Section")# Add both Sections to the main card objectmyTeamsMessage.addSection(Section1)myTeamsMessage.addSection(Section2)# Then send the cardmyTeamsMessage.send()Adding potential actions to the Connector Card MessageTo create a actions on which the user can interect with in MS Teams
To find out more information on what actions can be used, please visithttps://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#setting-up-a-custom-incoming-webhookmyTeamsMessage=pymsteams.connectorcard("<Microsoft Webhook URL>")myTeamsPotentialAction1=pymsteams.potentialaction(_name="Add a comment")myTeamsPotentialAction1.addInput("TextInput","comment","Add a comment here",False)myTeamsPotentialAction1.addAction("HttpPost","Add Comment","https://..."")myTeamsPotentialAction2=pymsteams.potentialaction(_name="Set due date")myTeamsPotentialAction2.addInput("DateInput","dueDate","Enter due date")myTeamsPotentialAction2.addAction("HttpPost","save","https://...")myTeamsPotentialAction3=pymsteams.potentialaction(_name="Change Status")myTeamsPotentialAction3.choices.addChoices("In progress","0")myTeamsPotentialAction3.choices.addChoices("Active","1")myTeamsPotentialAction3.addInput("MultichoiceInput","list","Select a status",False)myTeamsPotentialAction3.addAction("HttpPost","Save","https://...")myTeamsMessage.addPotentialAction(myTeamsPotentialAction1)myTeamsMessage.addPotentialAction(myTeamsPotentialAction2)myTeamsMessage.addPotentialAction(myTeamsPotentialAction3)myTeamsMessage.summary("Test Message")myTeamsMessage.send()Adding HTTP Post to potential actions in the Connector Card MessagemyTeamsMessage=pymsteams.connectorcard("<Microsoft Webhook URL>")myTeamsPotentialAction1=pymsteams.potentialaction(_name="Add a comment")# You can add a TextInput to your potential action like below - Please note the 2nd argment below as the id namemyTeamsPotentialAction1.addInput("TextInput","comment","Add a comment here",False)# we use the 2nd argument above as the id name to parse the values into the body post like below.myTeamsPotentialAction1.addAction("HttpPost","Add Comment","https://...","{{comment.value}}")myTeamsMessage.addPotentialAction(myTeamsPotentialAction1)myTeamsMessage.summary("Test Message")myTeamsMessage.send()# Notes:# If you post anything via teams, you will get some Javascript encoding happening via the post - For example:# Posting this:  {"name":"john", "comment" : "nice"}# Output will be:  b'{\\u0022name\\u0022:\\u0022john\\u0022, \\u0022comment\\u0022 : \\u0022nice\\u0022}'# i solved this issue by decoding unicode escape for a custom rest backend.Please use Github issues to report any bugs or request enhancements.Troubleshooting HTTP responseThis module is really just a nice wrapper pointed at the Microsoft API. To help troubleshoot missing messages, the requests response content is saved to the connectorcard class attributelast_http_response.To get the last http status code:importpymsteamsmyTeamsMessage=pymsteams.connectorcard("<Microsoft Webhook URL>")myTeamsMessage.text("this is my text")myTeamsMessage.send()last_status_code=myTeamsMessage.last_http_response.status_codeMore info on the Response Content is available in the requests documentation,link.ExceptionsIf the call to the Microsoft Teams webhook service fails, aTeamsWebhookExceptionwill be thrown.TestingIn order to test in your environment with pytest, set the environment variableMS_TEAMS_WEBHOOKto the Microsoft Teams Webhook url you would like to use.Then, from the root of the repo, install the requirements and run pytest.pipinstall-rdev-requirements.txtMS_TEAMS_WEBHOOK=MicrosoftWebhookURLexportMS_TEAMS_WEBHOOK
pytest--cov=./pymsteams--cov-report=term-missing--cov-branchThis will send two MS Teams messages describing how they are formatted.  Manually validate that the message comes through as expected.Certificate ValidationIn some situations, a custom CA bundle must be used.  This can be set on class initialization, by setting the verify parameter.importpymsteams# set custom ca bundlemsg=pymsteams.connectorcard("<Microsoft Webhook URL>",verify="/path/to/file")# disable CA validationmsg=pymsteams.connectorcard("<Microsoft Webhook URL>",verify=False)Set to either the path of a custom CA bundle or False to disable.The requests documentation can be referenced for full details:https://2.python-requests.org/en/master/user/advanced/#ssl-cert-verification