チュートリアル

アカウントアクティビティAPIの概要

このチュートリアルの目的は、TwitterのWebhookベースのアカウントアクティビティAPIについて概要を説明することです。こちらからチュートリアルを視聴するか、このまま以下を読み進めてください。

アカウントアクティビティAPIは、Twitterユーザーのアカウントアクティビティに関連するイベントをリアルタイムで送信します。たとえば、受信登録したユーザーによるツイートの作成または削除、リツイート、ダイレクトメッセージの送受信、新しいユーザーのフォロー、投稿への「いいね」があるたびに、アカウントアクティビティAPIからJSONイベントペイロードが配信されます。アカウントアクティビティAPIが処理するアクティビティの種類の完全なリストについては、Twitterの開発者向けドキュメントを参照してください(プレミアムとエンタープライズ)。

WebhookベースのAPI

アカウントアクティビティAPIはTwitterのRESTやストリーミングAPIとは異なり、複数のRESTエンドポイントを組み合わせて設定と管理を行い、データ配信にはWebhookを使用します。Webhookでは、登録済みWebアプリケーションのWebhook URLにイベントを「プッシュ(POST)」することでデータを配信します。これは、特定のイベント(アカウントアクティビティ)がTwitter上で発生したときに、リアルタイムでHTTP呼び出しを行うことで実現されます。

Twitterのより一般的なAPIはクライアント-サーバーアプローチに基づいており、開発者はTwitterのサーバーに接続して情報を受信するクライアントアプリケーションを作成します。これによりストリーミングモデルをベースにすることができます。この場合、クライアントとTwitterのサーバーの間の接続は常時開いており、リアルタイムでデータを受信します。また、開発者が特定のツイートオブジェクトを取得したい場合などにはクライアントがトリガーするリクエストにすることもできます。

アカウントアクティビティAPIではこれが逆になります。クライアントアプリケーションからTwitterのサーバーに接続リクエストを行うのではなく、データをリッスンする開発者のWebアプリケーションWebhookへの接続をTwitterのサーバーから行います。このケースでは、Twitterがクライアントとして機能し、開発者のサーバーへの接続を開いてイベントが発生するたびにそのWebhookにアクティビティを投稿します。

WebhookベースのAPIには多くのメリットがあります。

  • コンピューティングリソース確保の観点から見ると、ストリーミングAPIに対して継続的に接続を開く場合よりも、Webhookでは必要なリソースが少なくなります。
  • HTTP 200応答コードでPOSTごとに配信されるアクティビティの両サイドで確認が行われます。
  • アクティビティの配信に失敗した場合に備えて、POSTを再実行するための再試行プロセスが組み込まれているため、データ損失が発生する可能性が低くなります。
  • Webhookでは、新しいデータが利用可能かを確認するために、アプリケーションからAPIに対して定期的にポーリングリクエストを行う必要がありません。
  • 新しいデータが利用可能になり次第、自動的にサーバーに送信されます。そのため、受信するデータはほとんどの場合最新のものになります。

使用開始に必要なもの

アカウントアクティビティAPIの使用を開始するには以下が必要です。

  • TwitterのどのAPIを使用する場合でも開発者アカウントが必要です。アカウントがない場合は申請してください。
  • 適切な権限を持つTwitter開発者アプリ開発者ポータルのアプリセクションにある [Create an app] ボタンを選択して、新しいアプリを作成できます。
    • アプリページの権限のタブで [Read, Write, and Access Direct Messages] を有効にします。過去により低い権限が設定された認証済みユーザーに権限設定が遡って適用されることはありません。
    • [Keys and Access token] タブで、アプリのコンシューマーAPIキーとAPIシークレットをメモします。この情報は、ベアラートークンの生成に必要です。
    • アプリのアクセストークンとアクセストークンシークレットも生成する必要があります。Webhook URLを登録する際に、これらが必要です。 
  • 開発者ポータルの [developer environment] セクションで設定できる開発環境。アプリを選択し、環境名を選択します。別のアカウントアクティビティAPIエンドポイントの使用を開始すると、:env_nameトークンが選択した名前に置き換わります。
  • Webhookを通じてデータを受信するためのURLを持つセキュリティ保護された専用Webアプリケーション。開発環境でWebhookをテストするためのローカルWebアドレスを作成するには、ngrokなどのツールが役に立ちます。

Webhookのセキュリティ保護

Webhook経由でTwitterからアクティビティを受信するには、指定したURLでHTTP(POSTとGET)リクエストを受信できるWebアプリケーションを作成し、セキュリティ保護する必要があります。アカウントアクティビティAPI用の開発者環境で設定したのと同じTwitterアプリ認証情報でこのWebアプリケーションを保護し、これらの認証情報を使用してcrc_tokenを作成するようコーディングする必要があります。Twitterではお使いのWebhookにチャレンジレスポンス方式のチェック(CRC)のGETリクエストを頻繁に送信します。これに対応するために、Webアプリケーションでは承認済み開発者環境アプリと一致するTwitterアプリケーション認証情報を使って生成されたcrc_tokenを返す必要があります。

POST account_activity/all/:env_name/webhooksエンドポイントを使用して、アカウントアクティビティAPIのWebhook URLを登録できます。

アカウントアクティビティAPIの設定はすべてAPIリクエストで行います。開発者ポータルには、ユーザーインターフェイスは組み込まれていません。ただし、テスト用に、TwitterDev GitHubページ(https://github.com/twitterdev/account-activity-dashboard)にサンプルダッシュボードツールが用意されています。

アカウントアクティビティAPIは、イベントデータを含むHTTP POSTリクエスト形式で、選択した登録済みWebhook URLからアカウントアクティビティを送信します。

認証

APIの機能ごとに認証方法が異なるため、アカウントアクティビティAPIの認証は複雑になる場合があります。大半のWebhook設定は、ベアラートークンを使用したアプリケーション専用認証によって行います。必要なベアラートークンの生成方法に関する、Twitterのドキュメントを参照してください。

サブスクリプションの設定は、各ユーザーサブスクリプションのアプリケーション-ユーザー間認証を通じて行います。自身のTwitterアカウントのイベントを受信する場合は、開発者ポータルのAPIキーとAPIシークレットキーで生成したアクセストークンを使用できます。これはAPIの使用開始とテストに最適な方法です。ただし、別のTwitterアカウントに関連するイベントを受信するには、そのアカウントの所有者から3-Legged OAuthプロセスを通じて権限を付与してもらう必要があります。このプロセスはサーバー側のコードにも実装する必要があります。これを行うことでユーザーのアクセストークンを受信できるようになります。

イベント

Webhook URLへの受信登録が完了すると、ユーザーのイベントを受信するようになります。そもそもイベントとは何なのでしょうか?この場合、イベントとは受信登録したユーザーのTwitterアカウントに関連するアクティビティを指します。各イベントはアプリで使用できるJSONペイロード形式で配信されます。以下のサンプルにあるとおり、ユーザーがダイレクトメッセージを受信すると「message_create」イベントが配信されます。メッセージの内容やその他の情報を含む「text」フィールドがあります。

      {
"for_user_id": "1102321381",
"direct_message_events": [
{
"type": "message_create",
"id": "1133674120380657669",
"created_timestamp": "1559123947602",
"message_create": {
"target": {
"recipient_id": "1102321381"
},
"sender_id": "1029741837916012544",
"message_data": {
"text": "Good morning ☀️☕",
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": []
}
}
}
}
],
"users": {
"1102321381": {
"id": "1102321381",
"created_timestamp": "1358552743000",
"name": "Aurelia Specker",
"screen_name": "AureliaSpecker",
"location": "London, England",
"description": "partner engineer @TwitterUK 👩‍💻 • instructor @CodeFirstGirls • alumni @UniofOxford 🎓 • outdoor enthusiast 🌄 • bookworm 📚 • from switzerland 🇨🇭",
"protected": false,
"verified": false,
"followers_count": 589,
"friends_count": 745,
"statuses_count": 521,
"profile_image_url": "http://pbs.twimg.com/profile_images/1025560966434443264/vsVPbXiT_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1025560966434443264/vsVPbXiT_normal.jpg"
},
"1029741837916012544": {
"id": "1029741837916012544",
"created_timestamp": "1534344560624",
"name": "Aurelia",
"screen_name": "re_testing",
"location": "London, England",
"description": "I like travelling 🐪🌴☀️",
"protected": false,
"verified": false,
"followers_count": 4,
"friends_count": 10,
"statuses_count": 52,
"profile_image_url": "http://pbs.twimg.com/profile_images/1029742489090121728/-83RqB5N_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1029742489090121728/-83RqB5N_normal.jpg"
}
}
}
{
"for_user_id": "1102321381",
"direct_message_indicate_typing_events": [
{
"created_timestamp": "1559123947551",
"sender_id": "1029741837916012544",
"target": {
"recipient_id": "1102321381"
}
}
],
"users": {
"1102321381": {
"id": "1102321381",
"created_timestamp": "1358552743000",
"name": "Aurelia Specker",
"screen_name": "AureliaSpecker",
"location": "London, England",
"description": "partner engineer @TwitterUK 👩‍💻 • instructor @CodeFirstGirls • alumni @UniofOxford 🎓 • outdoor enthusiast 🌄 • bookworm 📚 • from switzerland 🇨🇭",
"protected": false,
"verified": false,
"followers_count": 589,
"friends_count": 745,
"statuses_count": 521,
"profile_image_url": "http://pbs.twimg.com/profile_images/1025560966434443264/vsVPbXiT_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1025560966434443264/vsVPbXiT_normal.jpg"
},
"1029741837916012544": {
"id": "1029741837916012544",
"created_timestamp": "1534344560624",
"name": "Aurelia",
"screen_name": "re_testing",
"location": "London, England",
"description": "I like travelling 🐪🌴☀️",
"protected": false,
"verified": false,
"followers_count": 4,
"friends_count": 10,
"statuses_count": 52,
"profile_image_url": "http://pbs.twimg.com/profile_images/1029742489090121728/-83RqB5N_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1029742489090121728/-83RqB5N_normal.jpg"
}
}
}
    

特定の種類のイベントだけを受信し、その他のイベントを除外することはできません。常に、受信登録したユーザーに関連するすべてのイベントを受信します。すべてのイベントタイプはこちらのドキュメントで確認できます。

有料でご利用いただいているお客様の場合、再試行を有効にすることで、アクティビティが配信されず、Webhookが正常な応答を返さない場合でも、Twitterサーバーにより再度アクティビティの送信が試行されます。また、エンタープライズアカウントアクティビティAPIをご利用のお客様は、アカウントアクティビティReplay APIを利用することで冗長性を高めて復元対象を拡張し、過去5日間から指定した期間のアクティビティを再送信することができます。
サブスクリプションの数が増えるほど、システムで大量のイベントを受信できるようにするためのキャパシティ計画の重要性が増します。

ソリューション作成の準備が整った方は

開発者アクセスに申し込んで利用を開始しましょう