Slack bot はカスタムインテグレーションと Python の Slacker を使っていましたが、いつの間にか非推奨になっていて新しい Slack アプリへの切り替えが推奨されています。
Moving on from custom integrations
Start your journey
Slack アプリには Python なら Bolt というライブラリが用意されており、連休中に Bolt 向けにスクリプトを書き直しました。
Bolt 入門ガイド
入門ガイドもあるけどアプリを作成する上では役に立つけど、Python スクリプトの書き方としては参考にはならなかった。Slack アプリを作成して、ボットにスコープに必要なパーミッションを追加して、トークンを生成する。
トークンには User と Bot があって、User のトークンを使って Slack にメッセージを送ると自分自身が発言したように見え Bot トークンだと Slack アプリが発言したように見えます。基本は Bot トークンでいいと思う。
Slacker も Bolt も Slack にメッセージを送るときは対して変わらない。
Slacker のとき
slack = Slacker(mytokens.slack_customintegration_token)
slack.chat.post_message(channel,title)
Bolt のとき
client = WebClient(token=mytokens.slack_bot_token)
client.chat_postMessage(
channel=channel_id,
text="Hello world!"
)
Slacker はメッセージを送るくらいしか機能がなかった (自分が知らないだけかもしれない) のでメッセージを送ること以外の他のことをする場合は requests をつかって直接 WebAPI を叩いていたけど、Bolt はライブラリで大体の機能は網羅されてるようにみえます。
例えば、チャンネルの一覧を取得するときは Slacker にはそういう機能がなかったので WebAPI にアクセスして取得してましたが、Bolt にするとかなりスッキリしました。
Bolt のとき
client = WebClient(token=mytokens.slack_user_token)
channels = []
res = client.conversations_list()
for c in res['channels']:
channels.append(c['id'])
print(channels)
Slacker のとき
def httprequest(url, params):
time.sleep(1)
try:
req = urllib.request.Request(url)
params = urllib.parse.urlencode(params).encode('ascii')
req.data = params
res = urllib.request.urlopen(req)
except:
return None
body = res.read()
return json.loads(body.decode('utf-8'))
list_url = "https://slack.com/api/conversations.list"
channels = []
list_params = {
'token' : token
}
data = httprequest(list_url, list_params)
for c in data['channels']:
channels.append(c["id"])
print(channels)
自分もまだ勉強中で全部移植できていない状態で少しづつ進めていきたい。