GoでTwitterのAccount Activity APIを使ってDMを利用したサンプルアプリを作成してみた

はじめに

エウレカで今年新卒入社した @godslew です。現在はAPI Teamに所属しています。好きな食べ物は🍣と🍜、趣味はTwitterとサバゲーです。

なぜサンプルアプリを作ったのか

社内でTwitterのダイレクトメッセージ(以下DM)を利用したユーザに数回質問を投げかけてその回答に応じて結果を表示するという開発案件が来たのですが、それを実現するにあたりリアルタイムでユーザとやりとりする必要がありました。リアルタイム通知を実現できるUserStreams APIの提供が2018年8月16日に終了してしまっているのでUserStreamsAPIの後継であるAccount Activity APIを使用することにしました。

開発途中でAccount Activity APIが思ったより複雑で躓くことが多かったのでサンプルアプリを作成するに至りました。


目次

  1. AccountActivityAPIを使うための準備
  2. サンプルアプリをクローンしてくる
  3. 環境構築をしてアプリケーションを動かす
  4. AccountActivityAPIの設定をする
  5. CRCテストを通す
  6. Webhookを購読できるように登録する
  7. 実際にプロダクトで使った例
  8. 終わりに

AccountActivityAPIを使うための準備

  1. Twitterの開発者登録を通す
  2. アプリを作成する
  3. アプリのアクセス権限を Read, Write and Access direct messagesに変更する
  4. Consumer Key,Consumer Secret, Access Token, Access Token Secretをメモする
  5. httpsで通信できるサーバーを用意する(筆者はAWSでEC2 + ELB+ Nginxの構成にしました)

サンプルアプリをクローンしてくる

DMに反応してDMを返してくれるサンプルアプリを作成したのでクローンしてください。

git clone git@github.com:godslew/ScarlettNova.git

環境構築をしてアプリケーションを動かす

Goの環境が整っている前提で話を進めていきます。

まず、環境構築に必要なライブラリを取得します。

go get -u github.com/golang/dep/cmd/dep
go get -u github.com/direnv/direnv

依存関係をvendor以下に入れます。

dep ensure

direnvを使えるようにします。

echo 'eval "$(direnv hook bash)"' >> ~/.bashrc

今回はbashを使ってる前提で設定します。各々の環境用に書き換えてください。

環境変数を設定します。

cp .envrc.sample .envrc

.envrcに先ほどメモしたConsumer Key, Consumer Secret, Access Token, Access Token Secretを書き込みます。

export CONSUMER_KEY="メモしたConsumer Key"
export CONSUMER_SECRET="メモしたConsumer Secret"
export ACCESS_TOKEN="メモしたAccess Token"
export ACCESS_TOKEN_SECRET="メモしたAccess Token Secret"

反映します。

direnv allow

アプリケショーンを実行します。

go build main.go  
go run main.go

AccountActivityAPIの設定をする

準備で作成したアプリを選択しlabelを設定します。設定が完了すると以下のようになる。設定したlabelはメモしておきます。


CRCテストを通す

crcテストが通らないとwebhookの登録ができないのでcrcテストを通す必要があります。

サンプルアプリではcrcテストを通すためのAPIを GET /twitter_webhookに用意してあります。crcテストのレスポンスとして必要なトークンを生成するコードは以下で実現しています。

func CreateCRCToken(crcToken string) string {
mac := hmac.New(sha256.New, []byte(cs)) //csはConsumer Secret
mac.Write([]byte(crcToken))
return "sha256=" + base64.StdEncoding.EncodeToString(mac.Sum(nil))
}

今回crcテストはInsomniaを使ってリクエストを生成します。

POSTするURLは以下のようになります。

https://api.twitter.com/1.1/account_activity/all/{設定したlabel}/webhooks.json?url=https://{自分のサーバのドメイン名}/{crcチェックするエンドポイント}

認証方法はOAuth1.0で準備でメモしておいたConsumer Key, Consumer Secret, Access Token, Access Token Secretを入力して画像のように設定してリクエストを送ります。

成功するとステータスコード200とともに以下が返却されます。

{
"id": "webhookで使用するID",
"url": "https://{自分のサーバのドメイン名}/{crcチェックするエンドポイント}",
"valid": true,
"created_timestamp": "2018-09-21 09:08:21 +0000"
}

WebhookURLを登録する

webhookを購読できるように登録を以下のURLでPOSTして行います。

https://api.twitter.com/1.1/account_activity/all/{設定したlabel}/subscriptions.json

認証方法はOAuth1.0で準備でメモしておいたConsumer Key, Consumer Secret, Access Token, Access Token Secretを入力し、画像のように設定します。

次にcrcテストの時にレスポンスとして返ってきたidを以下のようにして入れます。

{
"webhook_id": "{crcテスト時に返ってきたid}"
}

ヘッダーはContentTypeとしてapplication/jsonを設定します。

以上を設定してリクエストをし、ステータスコード204で返ってくれば成功です。

この状態でTwitterアプリ作成時にキーを発行したアカウントにDMを送信すると

「仕事お疲れ様!頑張ったね!!」

と返ってきて圧倒的癒しを得られます。また、美少女アイコンを設定しておくとさらに癒しの効果が高くなります!


実際にプロダクトに使った例

Pairs公式Twitterでキャラ診断というものを実装したときに使用しました。

順番に質問に答えていくとPairsのマッチングデータから相性の良いコミュニティを算出してくれるというものでたくさんのユーザさんに利用してもらいました!感謝します。