2021年8月17日火曜日

Slack bot を書き直す

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 トークンでいいと思う。

Python スクリプトの書き方は、こっちのほうがわかりやすかった。

Python Slack SDK

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)

自分もまだ勉強中で全部移植できていない状態で少しづつ進めていきたい。