読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

SlackでOAuthを利用して BOT投稿 するための アクセストークン を取得する方法

Slack Twitter API

以下ではSlackのチーム作成が完了してあるという前提で説明をすすめます。

SlackでBOTを動かすには権限を指定した上でアクセストークンを取得することが必要です。SlackではOAuthを利用した2段階認証を採用していますが、その手順は少々面倒ですので解説記事を書きました。ここで書かれた内容がお役に立てば幸いです。

1.Slackのアプリ登録を行う

SlackでBOTを作成するには最初にアプリ登録を済ませる必要があります

Using OAuth 2.0 | Slack

最初にSlack公式のページに移動してregister your appをクリックします。

f:id:mochizuki_p:20161001011747p:plain

次の画面に進んだらcreate an appをクリックします。

f:id:mochizuki_p:20161001020108p:plain

ここでは登録するチームを指定してBOTの名前を入力する必要があります。

f:id:mochizuki_p:20161003003757p:plain

ここではServer Watchmanとしましょう。

f:id:mochizuki_p:20161001033201p:plain

入力が完了したら右下のボタンを押して登録を完了します。

f:id:mochizuki_p:20161001033218p:plain

無事登録が完了するとclient_idclient_secretが発行されます。 どちらも後で必要になるのでメモ帳などに保存しておきましょう。

注:client_secretは他人に知られないように保管しておいてください。

f:id:mochizuki_p:20161001011854p:plain

2.認証コードを取得する

SlackではOauthの2段階認証を採用しています。つまり最初に認証コードを発行してから、そのコードを利用してアクセストークンを取得します。 登録したアプリに対して認証コードを取得するには少なくとも1つのリダイレクトURLを登録する必要があります。

ここで再びregister your appのページに移動してください。すると先ほど登録したアプリがリストにあるはずです。このリンクをクリックしてください

f:id:mochizuki_p:20161003003744p:plain

そしてOAuth & PermissionをクリックしてリダイレクトURLを登録します。1つ登録すればOKですが複数指定することも可能です。

f:id:mochizuki_p:20161001034401p:plain

完了したら次に進みます。

クエリ 説明
client_id 先ほど取得したクライアントID (必須)
scope アプリの権限 (以下で説明) (必須)
redirect_uri リダイレクトURL (任意:複数登録した場合に有効)
state unique string to be passed back upon completion (任意)
team アプリの権限を特定のチームに限定する (任意)

scopeでアプリの権限を指定する

SlackのAPIではスコープという機能によってAPIの権限を限定することができます。それぞれのスコープによって利用できる機能は異なります。詳しくは下の表を確認してください。

Oauthのスコープ 利用できるメソッド
channels:history channels.history
channels:read channels.info channels.list
channels:write channels.archive channels.create channels.invite channels.join channels.kick channels.leave channels.mark channels.rename channels.setPurpose channels.setTopic channels.unarchive
chat:write:bot chat.delete chat.postMessage chat.update
chat:write:user chat.delete chat.meMessage chat.postMessage chat.update
dnd:read dnd.info dnd.teamInfo
dnd:write dnd.endDnd dnd.endSnooze dnd.setSnooze
emoji:read emoji.list
files:read files.info files.list
files:write:user files.comments.add files.comments.delete files.comments.edit files.delete files.revokePublicURL files.sharedPublicURL files.upload
groups:history groups.history groups:read groups.info groups.list
groups:write groups.archive groups.close groups.create groups.createChild groups.invite groups.kick groups.leave groups.mark groups.open groups.rename groups.setPurpose groups.setTopic groups.unarchive identity.basic users.identity
im:history im.history
im:read im.list
im:write im.close im.mark im.open
mpim:history mpim.history
mpim:read mpim.list
mpim:write mpim.close mpim.mark mpim.open
pins:read pins.list
pins:write pins.add pins.remove
reactions:read reactions.get reactions.list
reactions:write reactions.add reactions.remove
reminders:read reminders.info reminders.list
reminders:write reminders.add reminders.complete reminders.delete
search:read search.all search.files search.messages
stars:read stars.list stars:write stars.add stars.remove
team:read team.info
usergroups:read usergroups.list usergroups.users.list
usergroups:write usergroups.create usergroups.disable usergroups.enable usergroups.update usergroups.users.update
users.profile:read team.profile.get users.profile.get
users.profile:write users.deletePhoto users.profile.set users.setPhoto
users:read bots.info users.getPresence users.info users.list
users:write users.setActive users.setPresence

セキュリティの観点からはあまり多くの権限を与えることは好ましくありません。ここでは投稿ができれば十分ですのでchat:write:botを指定します。

ここまで確認したら実際にコードを取得してみましょう。

https://slack.com/oauth/authorize?client_id=60496348391.83556129685&
scope=chat:write:bot

もし設定に間違いがなければ次のような画面が表示されるはずです。

f:id:mochizuki_p:20161003003732p:plain

ここでAuthorizeを選択するとリダイレクトURLに転送され、そのURLに認証コードが付いてきます。

リダイレクト先のURL

http://example.com/?code=60496348391.86093651942.e140ce530a&state=

このcodeで指定されている部分"60496348391.86093651942.e140ce530a"が認証コードです。

注意

この認証コードの有効期限は10分以内です。10分が経過すると期限切れになって利用できなくなります。その場合は再び上の手順で発行しなおすことになるので注意してください。

3. 2で発行した認証コードを利用してアクセストークンを発行する。

https://slack.com/api/oauth.access

クエリ 説明
client_id 2で発行したクライアントID (必須)
client_secret 2で発行したクライアント秘密鍵 (必須)
code 3で発行した認証コード (必須)
redirect_uri リダイレクト先のURL (任意:3で指定したURLと一致させる必要あり)

実際にアクセストークンを取得してみましょう。

https://slack.com/api/oauth.access?client_id=60496348391.83556129685&client_secret=267c0b972d182c562356abab44485&code=604652673568391.86093651942.e140ce530a

成功したらこのようにJSON形式のレスポンスが帰ってきます。

{"ok":true,"access_token":"xoxp-44535673567-606576567300562-86100429205-ca6326e0351ebf5b168507b43473576413","scope":"identify,chat:write:bot","user_id":"U1SEX00GJ","team_name":"Example.com","team_id":"T1SELA8BH"}

うまくいきました!

アクセストークンはaccess_tokenの値で、ここでは"xoxp-44535673567-606576567300562-86100429205-ca6326e0351ebf5b168507b43473576413"です。

このアクセストークンを使ってAPIにアクセスできます。つまりこれでBOTを動かすことができるのです! このアクセストークンは一度発行すれば再発行することなく何度も利用できます。 ためしに以下のアクセスポイントを利用してみましょう。特定のチャンネルにtextで指定したメッセージを投稿することができます。

https://slack.com/api/chat.postMessage

https://slack.com/api/chat.postMessage?token=xoxp-44535673567-606576567300562-86100429205-ca6326e0351ebf5b168507b43473576413&channel=C1SEX00P4&text="Hello"

成功すると以下のようなメッセージがJSON形式が返されます。

{"ok":true,"channel":"C1SEX00P4","ts":"1475254247.817553","message":{"text":"\"Hello\"","username":"Server Watchman","bot_id":"B2J39E3S6","type":"message","subtype":"bot_message","ts":"1475254247.817553"}}

指定したチャンネルにはこのように表示されました。OKですね!

f:id:mochizuki_p:20161003004837p:plain