DEV Community

Fomalhaut Weisszwerg
Fomalhaut Weisszwerg

Posted on

How to post bulleted lists using Slack Webhook URL.

TL;DR

The "Rich text block" is your friend.

import os

from slack_sdk import WebhookClient

if __name__ == "__main__":
    api_client = WebhookClient(url=os.environ["SLACK_WEBHOOK_URL"])

    unordered_list_elements: list[dict] = []
    for fragment in ["foo", "bar", "baz"]:
        unordered_list_elements.append(
            {
                "type": "rich_text_section",
                "elements": [{"type": "text", "text": fragment}],
            }
        )

    api_client.send(
        blocks=[
            {
                "type": "rich_text",
                "elements": [
                    {
                        "type": "rich_text_list",
                        "style": "bullet",
                        "indent": 0,
                        "elements": unordered_list_elements,
                    }
                ],
            }
        ]
    )
Enter fullscreen mode Exit fullscreen mode

The official Markdown example does not work

The official document provides a Markdown example:

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "• Detective Chimp\n• Bouncing Boy\n• Aqualad"
            }
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

But the example does not work properly.

There seems to be a bug in Markdown processing. So we need to use the other way to post a bulleted list via Webhook URL.

"Rich text block"

Rich text block is one of workarounds to the bug.

The basic format of the block is:

[
    {
        "type": "rich_text",
        "elements": [
            {
                "type": "rich_text_list",
                "style": "bullet",
                "elements": [rich_text_sections],
            }
        ],
    }
]
Enter fullscreen mode Exit fullscreen mode

Note that the type of outermost block must always be set to "rich_text". And a block of bulleted list need to be declared as the inner block.

Finally, define elements of the bulleted list as a list of rich_text_section. The format of rich_text_section is following:

{
    "type": "rich_text_section",
    "elements": [
        {
            "type": "text",
            "text": value_of_elements
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Now it is able to post to your Slack workspace using slack_sdk.WebhookClient.send method!

Top comments (0)