Python
Slack
SlackClient

API から Slack のスラッシュコマンドを送信する闇の方法

この記事では bot 等 API からスラッシュコマンドを使って Simple Poll の投票を作成する怪しげな方法を説明します。


スラッシュコマンド

/invite @halhorn 

等と Slack に投稿すると Slack 謹製やサードパーティ製のアプリ等を実行できる便利な機能です。

しかし残念ながら bot の API から実行すると、コマンドとして認識されません。ただの文字列として評価されてしまいます。

# python のサンプル

from slackclient import SlackClient

slack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
"chat.postMessage",
channel="C0XXXXXX",
text='/poll "インコ" "すき" "きらい"',
)
# bot が `/poll "インコ" "すき" "きらい"` という文字をつぶやくだけで何も起こらない


API からスラッシュコマンドを送る

2点変更を行います。

# python のサンプル

from slackclient import SlackClient

slack_token = os.environ["LEGACY_SLACK_API_TOKEN"]
sc = SlackClient(slack_token)

sc.api_call(
"chat.command",
channel="C0XXXXXX",
text='/poll "インコ" "すき" "きらい"',
)

image.png

レガシーな API トークンはユーザーに紐付いているので、あたかもユーザーが自身で発言したように見えてしまいますが、とりあえず bot を使って自動で投票を作成することができます。

見ての通り、非公式のエンドポイントは叩くわレガシーで危なげなトークンは使うわの闇の方法なので、使うのは自己責任でお願いします。

参照: https://stackoverflow.com/questions/40919745/how-do-you-invoke-the-poll-command-using-the-slack-api


余談

レガシーなトークンではなく普通のトークンで chat.command を叩くと {'error': 'user_is_bot', 'headers': {'V... みたいなレスポンスが返ってきます。

Slack としては bot がコマンドを叩くのを推奨していない気持ちが伝わってきます。