17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SlackのRTMを受け取るためのあれこれ

Last updated at Posted at 2015-11-18

まだ、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行受信処理に追加するだけで、以後エラーがでなくなった

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?