pymsteams
Looking for new maintainers. Please see https://github.com/rveachkc/pymsteams/issues/151

Python 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-teams
Please refer to the Microsoft Documentation for the most up to date screenshots.
https://dev.outlook.com/connectors/reference
Installation
Install with pip:
pip install pymsteams
Install with async capabilities (python 3.6+):
pip install pymsteams[async]
Python 2 Installation
At time of writing, the latest release supported by Python 2 is Version 0.1.16
Usage
Creating ConnectorCard Messages
This is the simplest implementation of pymsteams. It will send a message to the teams webhook url with plain text in the message.
import pymsteams
myTeamsMessage = pymsteams.connectorcard("<Microsoft Webhook URL>")
myTeamsMessage.text("this is my text")
myTeamsMessage.send()
Creating CreatorCard Messages to send via async loop
import asyncio
import pymsteams
loop = asyncio.get_event_loop()
myTeamsMessage = pymsteams.async_connectorcard("<Microsoft Webhook URL>")
myTeamsMessage.text("This is my message")
loop.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.html
Optional Formatting Methods for Cards
Add a title
myTeamsMessage.title("This is my message title")
Add a link button
myTeamsMessage.addLinkButton("This is the button Text", "https://github.com/rveachkc/pymsteams/")
Change URL
This is useful in the event you need to post the same message to multiple rooms.
myTeamsMessage.newhookurl("<My New URL>")
Set Color Theme
This 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 object
This is a simple print command to view your connector card message object before sending.
myTeamsMessage.printme()
Adding sections to the Connector Card Message
To create a section and add various formatting elements
myMessageSection = pymsteams.cardsection()
myMessageSection.title("Section title")
myMessageSection.activityTitle("my activity title")
myMessageSection.activitySubtitle("my activity subtitle")
myMessageSection.activityImage("http://i.imgur.com/c4jt321l.png")
myMessageSection.activityText("This is my activity Text")
myMessageSection.addFact("this", "is fine")
myMessageSection.addFact("this is", "also fine")
myMessageSection.text("This is my section text")
myMessageSection.addImage("http://i.imgur.com/c4jt321l.png", ititle="This Is Fine")
myTeamsMessage.addSection(myMessageSection)
You may also add multiple sections to a connector card message as well.
Section1 = pymsteams.cardsection()
Section1.text("My First Section")
Section2 = pymsteams.cardsection()
Section2.text("My Second Section")
myTeamsMessage.addSection(Section1)
myTeamsMessage.addSection(Section2)
myTeamsMessage.send()
Adding potential actions to the Connector Card Message
To 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 visit https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#setting-up-a-custom-incoming-webhook
myTeamsMessage = 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 Message
myTeamsMessage = 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://...", "{{comment.value}}")
myTeamsMessage.addPotentialAction(myTeamsPotentialAction1)
myTeamsMessage.summary("Test Message")
myTeamsMessage.send()
Please use Github issues to report any bugs or request enhancements.
Troubleshooting HTTP response
This 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 attribute last_http_response
.
To get the last http status code:
import pymsteams
myTeamsMessage = pymsteams.connectorcard("<Microsoft Webhook URL>")
myTeamsMessage.text("this is my text")
myTeamsMessage.send()
last_status_code = myTeamsMessage.last_http_response.status_code
More info on the Response Content is available in the requests documentation, link.
Exceptions
If the call to the Microsoft Teams webhook service fails, a TeamsWebhookException
will be thrown.
Testing
In order to test in your environment with pytest, set the environment variable MS_TEAMS_WEBHOOK
to the Microsoft Teams Webhook url you would like to use.
Then, from the root of the repo, install the requirements and run pytest.
pip install -r dev-requirements.txt
MS_TEAMS_WEBHOOK=MicrosoftWebhookURL
export MS_TEAMS_WEBHOOK
pytest --cov=./pymsteams --cov-report=term-missing --cov-branch
This will send two MS Teams messages describing how they are formatted. Manually validate that the message comes through as expected.
Certificate Validation
In some situations, a custom CA bundle must be used. This can be set on class initialization, by setting the verify parameter.
import pymsteams
msg = pymsteams.connectorcard("<Microsoft Webhook URL>", verify="/path/to/file")
msg = 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