What's this?
Twitterから提供されているAccount Activity APIを利用して個人で利用しているTwitterアプリのデータをAPI経由で取得するための手順をまとめた記事です。この記事ではデータ取得の前段であるwebhook URLの登録までの手順をまとめています。
Account Activity APIとは?
webhookを介してアカウントに関連するアクティビティをリアルタイムに検知してデータ取得ができます。
- 取得可能なデータの例
- ツイート
- いいね
- RT(引用RT)
- リプライ
- メンション
- フォロー(アンフォロー)
- DM
PremiumプランのSandboxの範囲であれば無料で利用可能です。
詳細はTwitter公式のドキュメントを参照してください。
全体構成
webhook URLの作成
Account Activity APIのアクティビティデータを受信するには、Twitterから定期的にGETリクエストされるCRCリクエストに対してレスポンストークンを返す必要があります。
- レスポンストークンの必要要件(ドキュメント)
・A base64 encoded HMAC SHA-256 hash created from the crc_token and your app Consumer Secret
・Valid response_token and JSON format.
・Latency less than 3 seconds.
・200 HTTP response code.
そのため、GETリクエストの受け口になるwebhook URLとレスポンストークンを返すLambdaを作成します。
レスポンストークン用のLambdaの作成
node.jsのLambda関数を作成します。
ランタイム:Node.js 12.x
exports.handler = async(event, context, callback) => {
// パラメータのcrc_token取得
var response_token = null;
if (event.queryStringParameters){
var crc_token = event.queryStringParameters.crc_token;
// ハッシュ化
var crypto = require('crypto');
var hmac = crypto.createHmac('sha256', process.env['CONSUMER_SECRET']).update(crc_token).digest('base64');
console.log(`receiving crc check. token=${crc_token} res=${hmac}`)
var calculatedSignature = 'sha256=' + hmac;
response_token = calculatedSignature;
}
const response = {
statusCode: 200,
body: JSON.stringify({'response_token': response_token}),
};
return response;
};
-
process.env['CONSUMER_SECRET']
の環境変数についてはTwitter Developer Account開設後に設定します。
APIGatewayでGETメソッドの作成
次にTwitterからのGETリクエストを受け取るwebhook URLをAPIGatewayで作成します。
- APIタイプをREST APIとして新規APIを作成
Access-Control-Allow-Originを「*.twitter.com」に変更
無事デプロイがされるとステージが作成され、API呼び出しURLが生成されます。
このURLがwebhook URLとなります。
Twitter Developer Account の申請と設定
アカウントの申請
Account Activity APIを利用するにはTwitterのDeveloper Accountが必要になるためアカウントの申請を行います。
こちらのページから[Create an app]ボタンを押すと申請ページに遷移します。
申請フォームは全て英語になりAPIの使用目的などを聞かれるので、頑張って英語で記入し申請します。
申請が完了すると登録したメールアドレス宛に申請完了メールが届きます。
場合によってメールで追加の確認事項がくる場合があるのでめげずに英語で回答します。
僕の場合、承認まで2回ほどメールでの確認がありました。
承認まで2週間ほどかかりましたが、もっと早く承認される人もいるようです。
無事承認されるとDeveloper Accountからアプリの作成が可能になり、APIも利用可能になります。
基本設定
-
アクセストークンの取得
既に作成済のためキャプチャでは[Regenarate]になっていますが、初回は[create]になってると思います。
-
作成された下記4つのkeyは大切に保管して置いてください
- API key
- API secret key
- Access token
- Access token secret
-
パーミッションの設定
これでTwitter Developer Accountの初期設定は完了です。
Lambda関数に環境変数を追加
事前に作成したLambda関数に環境変数を追加します。
webhook URLの登録
最後にwebhook URL登録作業を行います。
こちらのドキュメントを参考に進めていきます。
本来そこまで難しい作業ではないはずなのですが、中々うまくいかず最終的にnode.jsでスクリプトを作成し実施しました。
nodeスクリプトの環境構築
まずはnodeスクリプト実行に必要な環境を作ります。
// nodejsインストール
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
//バージョン確認
node -v
npm -v
//初期化
npm init
//require,requestのインストール
npm install require --save
npm install request --save
これで環境構築は完了です。
環境変数の準備
プロジェクト配下のルートディレクトリにconfig.json
ファイルを作成し、必要な環境変数を設定します。
{
"TWITTER_CONSUMER_KEY": "①",
"TWITTER_CONSUMER_SECRET": "②",
"TWITTER_ACCESS_TOKEN": "③",
"TWITTER_ACCESS_TOKEN_SECRET": "④",
"devLabel": "⑤",
"webhookUrl": "⑥"
}
①-④の情報はTwitter Developer Account作成時に発行されたアクセストークンを設定します。
⑤:APIGatewayで作成したステージ名
⑥:APIGatewayで作成したwebhook URLを設定
webhook URLの登録とwebhook_idの取得
webhook URLを登録するためのTwitter_register_webhook.js
を作成します。
// webhook URLの登録コード
const request = require('request');
const config = require(`./config.json`);
const twitter_oauth = {
consumer_key: config.TWITTER_CONSUMER_KEY.trim(),
consumer_secret: config.TWITTER_CONSUMER_SECRET.trim(),
token: config.TWITTER_ACCESS_TOKEN.trim(),
token_secret: config.TWITTER_ACCESS_TOKEN_SECRET.trim()
}
const request_options = {
url: `https://api.twitter.com/1.1/account_activity/all/${config.devLabel}/webhooks.json`,
oauth: twitter_oauth,
headers: { 'Content-type': 'application/x-www-form-urlencoded' },
form: { url: config.webhookUrl }
};
request.post(request_options, (error, response, body) => { console.log(body) });
実行します。
node Twitter_register_webhook.js
成功するとレスポンスでwebhook_idが返ってきます。
このidは今後必要になるのでメモしておきます。
これでwebhook URLの登録は完了です。
webhookにユーザーアカウントの追加
最後です。
登録したwebhook URLにユーザーアカウントを追加するためのTwitter_add_subscription.js
を作成します。
//Twitter_add_subscription.js
// アカウント追加のコード
const request = require('request');
const config = require(`./config.json`);
const twitter_oauth = {
consumer_key: config.TWITTER_CONSUMER_KEY.trim(),
consumer_secret: config.TWITTER_CONSUMER_SECRET.trim(),
token: config.TWITTER_ACCESS_TOKEN.trim(),
token_secret: config.TWITTER_ACCESS_TOKEN_SECRET.trim()
}
const request_options = {
url: `https://api.twitter.com/1.1/account_activity/all/${config.devLabel}/subscriptions.json`,
oauth: twitter_oauth
};
request.post(request_options, (error, response, body) => { console.log(`${response.statusCode} ${response.statusMessage}`); console.log(body) });
実行します。
node Twitter_add_subscription.js
204 No Content
と返ってくればOKです。
以上で完了です。
これでようやくAccount Activity APIを利用してデータ取得ができる準備ができました。
次の記事では実際にデータを取得してDynamoDBにデータを保存する手順を紹介します。