🐦

Twitter API v2 SDKをTypeScriptから使ってみた

2022/06/23に公開

Twitter API v2では、TypeScriptのSDKが提供されています。この記事ではTypeScriptでの使用例をご紹介します。
手順としてはまずTwitterの開発者ポータルでアカウントを作成し、アクセスキー(Bearere Key)の払い出しをします。その後、yarnでSDKをダウンロードし、TypeScript(Node.js)でコーディングします。

開発者アカウントとアプリの作成

Twitterの開発者ポータルサイトから、アカウントとアプリを作成してBearer Keyを取得する必要があります。詳細は色々な方が書いていますのでググってください。

SDKを使ってみよう

SDKをインストールします。

yarn add twitter-api-sdk

公式ドキュメントが非常に分かりにくいですが、基本的にはここに書いてあります。イーロン・マスクに是非とも改善していただきたい。

https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet

ツイートの検索にはclient.tweets.tweetsRecentSearch()を使用します。過去1週間のツイートを検索できます。

main.ts
import {Client} from "twitter-api-sdk";
import UserEntity from "./user";
import * as dotenv from "dotenv";

const MAX_RESULTS = 10; // なぜか10以下では動かない。

dotenv.config();

// queryにクエリーをセット
export async function searchByTweet(client: Client, query: string): Promise<any> {
    const response = await client.tweets.tweetsRecentSearch({
        query: query,
        max_results: MAX_RESULTS,
    });

    return response.data;
}

async function main() {
    const client = new Client(process.env.BEARER_TOKEN as string);
    try {
        const resp = await searchByTweet(client, "ビットコイン");
        console.log(JSON.stringify(resp, null, 4));
    } catch (e) {
        console.error(e)
    }
}

main()

環境変数BEARER_TOKENBearer Keyをセットしてください。

.env
BEARER_TOKEN=ABC...

実行してみます。
デバッガーでrespの中身を表示します。配列でクエリーにマッチしたツイートが返されます。

このidを使用すれば元のツイートを表示することができます。

https://twitter.com/twitter/status/1539697674827481088

検索式

クエリーに使用できる検索式です。Twitterのアプリの検索機能と同等のものになります。最大512文字までになります。最大100ツイート取得できます。それ以上はパジネーションになります。

https://developer.twitter.com/en/docs/twitter-api/tweets/counts/integrate/build-a-query

一例をあげます。

パターン
AND検索 "ビタリック イーサリアム #仮想通貨"
OR検索 "ビットコイン OR イーサリアム"
リツイートを除外 "イーサリアム -is:retweet"

レスポンスデータ

TwitterのバックエンドシステムにはGraphQLが使用されています。そのため、APIのレスポンスもGraphQLのように必要なフィールドだけを返すことができます。expansions,user.fields,tweets.fieldsなどに取得するフィールドを指定します。ここまでできるのであれば、GraphQLのエンドポイントを提供してくれると助かるのですが。

    const response = await client.tweets.tweetsRecentSearch({
        query: query,
        max_results: MAX_RESULTS,
        expansions: ["author_id", "attachments.media_keys", "referenced_tweets.id"],
        "user.fields": ["id", "name", "username", "description"],
        "tweet.fields": ["context_annotations", "entities", "created_at"],
    });

次に、context_annotationsentitiesについて説明します。

アノテーションについて

その名の通り、Twitterのシステムが機械学習を使用してツイートにメタデータを付与しています。コンテキストエンティティの2種類があります。これらはコード化されており、検索式に指定できます。

https://developer.twitter.com/en/docs/twitter-api/annotations/overview

コンテキストとはカテゴリーのようなものです。例) スポーツ、旅行、テレビ番組。マスターデータをこちらからダウンロードできます。

https://github.com/twitterdev/twitter-context-annotations

エンティティとは、人名、地名、組織名、商品名などの固有名詞になります。例) ビットコイン、京都、大谷翔平

例えば、bitcoinのアノテーションは次のようになっています。domainがコンテキストになります。

{
	"domain": {
	    "id": "174",
	    "name": "Digital Assets & Crypto",
	    "description": "For cryptocurrency entities"
	},
	"entity": {
	    "id": "1007360414114435072",
	    "name": "Bitcoin cryptocurrency",
	    "description": "Bitcoin Cryptocurrency"
	}
}

検索式として指定するには次のように指定します。

const resp = await searchByTweet(client, "context:174.1007360414114435072");

ストリーミング

SDKのGitHubにサンプル例がありますが、ストリーミングでレスポンシブに書くこともできます。

export async function sampleStream(client: Client) {
    const stream = client.tweets.sampleStream({
        "tweet.fields": ["author_id", "geo"],
    });

    for await (const tweet of stream) {
        console.log(tweet.data);
    }
}

ガンガンとツイートが流れてきます。(サンプリングされたもの)

イーロンマスクのフォロワーを取得する

ちなにみ彼のフォロワーは1億人います。その大部分がボットである疑いがあり、買収が進んでいません。2022-06-23

async function getFollowers(client: Client, userName: string) {
    const {data} = await client.users.findUserByUsername(userName);
    if (!data) throw new Error("Couldn't find user");

    console.log(data)

    const followers = client.users.usersIdFollowers(data.id);

    // NB. this fails due to 429, rate limit error.
    for await (const page of followers) {
        console.log(page.data);
    }
}

await getFollowers(client, "elonmusk");

PostManを使う

PostManのコレクションが提供されていますので、ダウンロードして利用できます。

設定方法はこちらをご覧ください。

https://developer.twitter.com/en/docs/tutorials/postman-getting-started

レートリミット

APIごとにレートリミットがあります。検索APIのばあい、15分間に450リクエストまでになります。

https://developer.twitter.com/en/docs/twitter-api/rate-limits

Discussion