環境
- slack_sdk: 3.27.1
- Python 3.12.1
2024/06/13に動作確認しました。
はじめに
Slackのchat.postMessage APIでメッセージを投稿する際、<url|text>
という形式のメッセージをtext
引数に渡すとテキストにリンクを貼れます。
ドキュメントにも記載されている通り、URLに半角スペースが含まれているとリンクが貼られません。
URLs with spaces will break, so we recommend that you remove any spaces from your URL links.
url
部分に問題ありそうURLをいくつか指定して、Slackアプリではどのように表示されるかを確認しました。
結果
以下のPythonファイルを実行しました。
import os
from slack_sdk import WebClient
client = WebClient(os.environ["SLACK_API_TOKEN"])
lines = []
lines.append("<https://example.com/|test1-通常のurl>")
lines.append("<https://example.com/ foo|test2-スペースが含まれているURL>")
lines.append("<https://example.com/ |test3-URLの直後にスペースあり>")
lines.append("< https://example.com/|test4-URLの直前にスペースあり>")
lines.append("<foo https://example.com/|test5-通常のメッセージの後にURLが続く>")
lines.append("<foo://example.com/|test6-存在しないプロトコル>")
lines.append("<foo-bar|test7-urlでない>")
client.chat_postMessage(channel="channel_id", text="\n".join(lines))
分かったこと
- リンクが貼られるケース
- 正しくリンクが貼られるケース
- スペースが含まれていない通常のURL
- URLの直後にスペースがある
- 存在しないプロトコル(
https
やhttp
でない)を含むURL
- 不正な状態でリンクが貼られるケース
- URLの直前にスペースがある
- 正しくリンクが貼られるケース
- リンクが貼られないケース
- URL部分が表示されるケース
- URLでない
- URL部分が表示されないケース
- スペースが含まれているURL
- URL部分が表示されるケース
補足
対応方法
urllib.parse.quote
でパーセントエンコーディングして、解決しました。
import urllib
lines.append(f"<https://example.com/{urllib.parse.quote(' foo')}|test2-スペースが含まれているURL>")