0
0

Slack `chat.postMessage`API: `<url|text>`形式で指定したURLに半角スペースが含まれていると、リンクが貼られない

Posted at

環境

  • 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))

image.png

分かったこと

  • リンクが貼られるケース
    • 正しくリンクが貼られるケース
      • スペースが含まれていない通常のURL
      • URLの直後にスペースがある
      • 存在しないプロトコル(httpshttpでない)を含むURL
    • 不正な状態でリンクが貼られるケース
      • URLの直前にスペースがある
  • リンクが貼られないケース
    • URL部分が表示されるケース
      • URLでない
    • URL部分が表示されないケース
      • スペースが含まれているURL

補足

対応方法

urllib.parse.quoteでパーセントエンコーディングして、解決しました。

import urllib
lines.append(f"<https://example.com/{urllib.parse.quote(' foo')}|test2-スペースが含まれているURL>")
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0