まだ、OAuthをアプリ側で完結させる方法を調べてないのでそれ以外の部分でメモ書き
認証
まず、
https://api.slack.com/docs/oauth
の通りに認証する
ID
https://api.slack.com/applications
から、アプリケーションを登録する。
RedirectURIは、OAuth認証をするためのパラメータを返すのに利用するので1つ以上登録する必要がある
登録が完了するとClientIDとClientSecretが生成される。
認証情報の送信
https://slack.com/oauth/authorize
にGETでアクセスする。
client_id : アプリケーション登録で取得したID
scope : アプリケーションにどんなことをしてもいいかの権限
https://api.slack.com/docs/oauth-scopes に権限リストがある
RTMを利用する場合、scope=clientを設定しておかないとscopeが足りないというエラーが出る
https://slack.com/oauth/authorize?client_id=[client_id]&scope=client
特殊scopeのadminは、いろいろやれるので使うことはほとんどなさそう。
使うとしても、個人的に動かしているアプリか公式アプリくらいでしか使い道なさそうな気がする。
identify : Allows applications to confirm your identity.
client: Allows applications to connect to slack as a client, and post messages on behalf of the user.
admin: Allows applications to perform administrative actions, requires the authed user is an admin.
認証情報とアクセス範囲の画面が出るので、そこでAuthorizeボタンを押すとcodeがついた形でRedirectURIへリダイレクトされる
https://[redirect URI]/?code=[code]&state=
ブラウザの場合、URL欄に表示される
アクセストークンの取得
https://slack.com/api/oauth.access にGETでアクセスする
client_id : アプリケーション登録で取得したID
client_secret : アプリケーション登録で取得したシークレットトークン
code : 認証情報送信後のリダイレクトURLについてきたコード(?code=?????の形で送信される)
JSON形式でaccess_tokenなどが返ってくるので、あとはこのトークンでアクセスをする
トークンはユーザーごとに生成される。生成されているユーザーを確認するには
https://api.slack.com/applications/[ClientID]
に一覧があるので、そこで見る。一度生成したらRevokeするまでは存在し続けるらしい。
https://slack.com/api/oauth.access?client_id=[client_id]&client_secret=[client_secret]&code=[code]
RTMサーバーへの接続
認証が終わったら、
https://slack.com/api/rtm.start
へアクセスする。
token : oauth.accessからもらったアクセストークン
JSONでサーバーの情報、チャンネルの情報などが返ってくるので、このデータは別で保存するなりする。
rtm:streamが許可されていないというエラーが出た場合は、最初のscope設定にclientを指定して再度認証すること。
url で指定されている wss: で始まるURLがWebSocketServerのURL。
有効期限が30秒くらいと短いので、間に合わなかったときは、さいどrtm.startから始めないとダメ。
接続したら、サーバーから type: hello が送られてくる。
受信したJSONを解析して type: message のみ拾っていけば、発言内容を使って処理するのは問題なくできそう。
問題は認証部分の簡略化。手作業でやるのはちょっとめんどくさい。
実装memo
gem
https://github.com/shokai/websocket-client-simple
橋本商会さんのwebsocket-client-simple(http://shokai.org/blog/archives/7223)
他にもライブラリはあるようなのですが、これが一番わかりやすかったので。
JSON parseエラーについて
受信した内容によって、たまにJSON parseエラーが出ることがある。
原因は何かで改行コードだけが送られてくることらしい。
next if msg.data.strip == ""
1行受信処理に追加するだけで、以後エラーがでなくなった