【Slack】自作アプリを自動でチャンネルに追加する方法

Slack

Slackでアプリを作って”Bot User OAuth Token”で何か処理をしたい場合、処理を行いたいチャンネルにアプリを追加しておかないと”not_in_channel”エラーになってしまいます。

チャンネルが多い場合や、新規作成されたチャンネルなど、毎回アプリを追加するとなると大変だし、抜けが発生しそうなので、自分が参加しているチャンネルに対してアプリを自動で招待する仕組みを考えてみました。

User OAuth Tokenを使うので、まだ自分が参加していないチャンネルでは”not_in_channel”エラーになると思います。

スポンサーリンク

Slackアプリ権限設定

まずはアプリを作成します。そしてOAuth&Permissionsページを開く。

ScopesでUser Token Scopesに以下を追加します。

  • channels:read
  • channels:write.invites
  • users:read

※Bot Token Scopesには、とりあえず”Channels:read”を追加しているだけなので、適宜必要な権限を設定してください

権限を追加したら、”Install to Workspace”でインストールを行います。

OAuth Tokens for Your WorkspaceからUser OAuth Tokenをコピーしておきます。

チャンネルに自動で招待するスクリプトを書く

トークンの準備ができたら、スクリプトを書いていきます。私は今回pythonで書きましたが、他の言語でも少し変更すれば同じようにできるはずです。

ユーザーリストを取得

まずはワークスペースにいるユーザーリストを取得します。使うのはusers.listです。

apiの情報はこちら:https://api.slack.com/methods/users.list

import requests
import pprint

USER_TOKEN = "ユーザートークン"


def getUserList():
    '''ワークスペースに参加しているユーザー一覧を取得'''
    url = "https://slack.com/api/users.list"
    headers = {"Authorization": "Bearer {}".format(USER_TOKEN)}
    res = requests.get(url=url, headers=headers)
    
    pprint.pprint(res.json()["members"])


getUserList()

これを実行するとワークスペース内のユーザー情報が出てきます。

ユーザー名やIDが含まれており、自動で招待するアプリの”ID”が必要なので確認しておきます。

チャンネルリストを取得

アプリがチャンネルに参加しているかどうかを確認するため、ワークスペースにあるチャンネルリストも取得します。

今回はパブリックチャンネルのみに限定し、アーカイブ済みのものは除くオプションを追加しました。

apiの情報はこちら:https://api.slack.com/methods/conversations.list

def getChannelList():
    '''ワークスペースのチャンネル一覧を取得'''
    url = "https://slack.com/api/conversations.list"
    headers = {"Authorization": "Bearer {}".format(USER_TOKEN)}
    data = {
        "types": "public_channel",
        "exclude_archived": True
    }
    res = requests.get(url=url, headers=headers, params=data)
    pprint.pprint(res.json()["channels"])


getChannelList()

チャンネルの参加メンバーを取得

チャンネルリストが取れたので、さらにそのチャンネルに参加しているメンバーリストを取得します。

getChannelListで取得した情報”channels”内の”id”を使ってチャンネルを指定し、メンバー一覧を取得します。(ここで取得できるのはメンバーIDです)

apiの情報はこちら:https://api.slack.com/methods/conversations.members

def getChannelList():
    '''ワークスペースのチャンネル一覧を取得'''
    url = "https://slack.com/api/conversations.list"
    headers = {"Authorization": "Bearer {}".format(USER_TOKEN)}
    data = {
        "types": "public_channel",
        "exclude_archived": True
    }
    res = requests.get(url=url, headers=headers, params=data)
    return res.json()["channels"]


def getChannelMembers(channel):
    '''チャンネルのメンバー一覧を取得'''
    url = "https://slack.com/api/conversations.members"
    headers = {"Authorization": "Bearer {}".format(USER_TOKEN)}
    data = {"channel": channel}
    res = requests.get(url=url, headers=headers, params=data)
    pprint.pprint(res.json().get("members"))


channels = getChannelList()
getChannelMembers(channels[0]["id"])  # テストのためリストの0番目だけで実行

ユーザーをチャンネルに追加

ユーザー(アプリ)をチャンネルに追加するには”conversations.invite”を使います。

apiの情報はこちら:https://api.slack.com/methods/conversations.invite

def inviteUser(channel, user_id):
    '''ユーザーをチャンネルに招待'''
    url = "https://slack.com/api/conversations.invite"
    headers = {"Authorization": "Bearer {}".format(USER_TOKEN)}
    data = {
        "channel": channel,
        "users": user_id
        }
    res = requests.get(url=url, headers=headers, params=data)
    if res:
        pprint.pprint(res.json())

未参加のチャンネルにアプリを招待する

これらの情報を使って「チャンネル内のメンバーにアプリがいなければ招待」を行います。

generalチャンネル限定でテストする場合は以下となります。

BOT_ID = "アプリID"

ch_list = getChannelList()

for ch in ch_list:
    if ch["name"] == "general":
        members = getChannelMembers(ch["id"])
        if BOT_ID in members:
            print("Joined!")
        else:
            print("Not member")
            inviteUser(ch["id"], BOT_ID)

コメント

タイトルとURLをコピーしました