TwitterのAccount Activity APIを叩くnodejsコード

2018/05/17 01:02(JST)にTwitterのAccount Activity APIが一般公開されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/30c56241-0977-769e-6cf6-251c933545e8.png)
https://twitter.com/TwitterDev/status/996782993200025600

nodejsで叩いてみたのでサンプルコードの説明をします。

リンク集
- [API Reference — Twitter Developers](https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference) API一覧のドキュメントはこちら。
- [Dev Environments — Twitter Developers](https://developer.twitter.com/en/account/environments) Account Activity APIを使う時にアプリを紐付ける。

## やり方

エンドポイントのURLを決める。WebHookなので、外部から叩けるページ。
このサンプルでは`https://example.com/twitter-webhook-test/`とします。もちろんパス名はなんでもいい。
あと、アプリのラベル名も決める。これはurlの一部になるので1単語がよい。今回は`test`とする。

twitterのアプリにコールバックURLを設定する
[Twitter Application Management](https://apps.twitter.com/) よりアプリを登録。権限は全部入りの「Read, write, and direct messages」で。Callback URLの所に、エンドポイントのURLを入れる。ここではアプリのラベル名は使わない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/529e108e-bbe0-ecce-350b-ca198bb9510e.png)
Add a callback urlのボタンを押してリストを増やすと、消すことが出来ないので注意。二個目は適当なURLを入れておけば問題は無いが、消す手段が無い。

4つのキーをメモする。以下のキーは全て作成し直しましたので無効です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/135a248a-de48-8dfc-010f-2cabb5c8e863.png)

次に、上記でapps.twitter.comに登録したアプリを、developer.twitter.comに関連付ける。
[Dev Environments — Twitter Developers](https://developer.twitter.com/en/account/environments)
「Account Activity API Sandbox」を選んで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/2d4fe790-0182-4500-5689-cc1330fcaeea.png)
アプリのラベル名をここで入力し、apps.twitter.comで作成したアプリを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/6b68d1f9-d1ad-42ae-4665-d7c237fce661.png)
「Account Activity API Sandbox」の項目に反映される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/4ebe59ab-c269-0f46-32b2-18d826cdef61.png)
この画面でのアプリの登録はもちろん解除出来るが、アプリのラベル名は裏で覚えているらしく、登録解除後 再度同じ名前で登録しようとすると弾かれる。だから「test」という名前は慎重に使おう。

これでtwitterのwebページからの設定は終了。

次に自鯖での作業。上記で決めた、エンドポイントのドメインのサーバーで実行するとよい。nodejsの環境を作ること。
使うapiは一般と企業向けでURLが違い、[公式のサンプル](https://github.com/twitterdev/twitter-webhook-boilerplate-node)は使いにくかったので、描き直した。

https://github.com/fushihara/twitter-account-activity-api-sample をgit cloneする。
cloneしたフォルダに以下の4つのファイルがある事を確認する

```plaintext
cli.js
config.sample.json
package.json
server.js
```

`config.sample.json`を`config.json`にコピーする。上記でメモった情報を埋める。
この時点ではhookIdの項目は空文字でよい。expressWatchPathは、webhookUrlのパス部分と一致させる。
devLabelがアプリのラベル名。

```plaintext

{
  "TWITTER_CONSUMER_KEY": "xxxxxx",
  "TWITTER_CONSUMER_SECRET": "xxxxxx",
  "TWITTER_ACCESS_TOKEN": "xxxxxx",
  "TWITTER_ACCESS_TOKEN_SECRET": "xxxxxxx",
  "devLabel": "test",
  "hookId": "",
  "webhookUrl": "https://example.com/twitter-webhook-test/",
  "expressWatchPath":"/twitter-webhook-test/"
}
```
そして`node server.js`を起動する。表示の通り5000番ポートで待ち受けるので、nginxの環境を変えるなり、待受ポートを80にして直で受けるなりする事。

```plaintext
[xxx@example.com twitter-webhook-sample]$node server.js 
Node app is running on port 5000
```

webhookUrlにブラウザからアクセスすると`Error: crc_token missing from request.`というメッセージが表示されればOK。


もう一つターミナルを立ち上げる。
次は`cli.js`を使う。上記のスクリプトがある同じディレクトリに移動して、`cli.js`にregist subsc get-list と順番にパラメータを与えて実行する。これで受信準備OK

```plaintext
[xxx@example.com twitter-webhook-sample]$node cli.js regist
{"id":"900000000000000000","url":"https://example.com/twitter-webhook-test/","valid":true,"created_timestamp":"2018-05-16 19:07:54 +0000"}
[xxx@example.com twitter-webhook-sample]$node cli.js subsc
204 No Content

[xxx@example.com twitter-webhook-sample]$node cli.js get-list
[{"id":"900000000000000000","url":"https://example.com/twitter-webhook-test/","valid":true,"created_timestamp":"2018-05-16 19:07:54 +0000"}]
```

`server.js`側のターミナルに`receive crc check. token=xxxxxxxx responce=xxxxxxxxxxxxx=`というログが出ている事も確認する。
その後、Twitterで自分のアカウントでツイートしたり、自分でお気に入りツイートをfavったりする。すると`server.js`のターミナルに今までのstreaming apiのようなjsonが流れてきます。
どうやら、他人のツイートは見れないっぽい。公式には無料ユーザーでも「15 subscriptions / period」と書いてあるけど、これは何が15件なんだろう・・・。

登録解除する時は、上記のターミナルで表示されたid 今回は`900000000000000000`をconfig.jsonのhookIdの項目に記入する。そして`node cli.js del`を実行。

これで登録→確認→削除 の流れは確認する事が出来たと思う。streaming apiの代替には全くならない。アナウンスの通り、2018/08/16にstreaming apiは終了される予定。

以上です。