Twitter API v2 SDKをTypeScriptから使ってみた
Twitter API v2
では、TypeScriptのSDKが提供されています。この記事ではTypeScript
での使用例をご紹介します。
手順としてはまずTwitterの開発者ポータルでアカウントを作成し、アクセスキー(Bearere Key)
の払い出しをします。その後、yarn
でSDKをダウンロードし、TypeScript(Node.js)
でコーディングします。
開発者アカウントとアプリの作成
Twitterの開発者ポータルサイトから、アカウントとアプリを作成してBearer Key
を取得する必要があります。詳細は色々な方が書いていますのでググってください。
SDKを使ってみよう
SDKをインストールします。
yarn add twitter-api-sdk
公式ドキュメントが非常に分かりにくいですが、基本的にはここに書いてあります。イーロン・マスクに是非とも改善していただきたい。
ツイートの検索にはclient.tweets.tweetsRecentSearch()
を使用します。過去1週間のツイートを検索できます。
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_TOKEN
にBearer Key
をセットしてください。
BEARER_TOKEN=ABC...
実行してみます。
デバッガーでresp
の中身を表示します。配列でクエリーにマッチしたツイートが返されます。
このid
を使用すれば元のツイートを表示することができます。
https://twitter.com/twitter/status/1539697674827481088
検索式
クエリーに使用できる検索式です。Twitterのアプリの検索機能と同等のものになります。最大512文字までになります。最大100ツイート取得できます。それ以上はパジネーションになります。
一例をあげます。
パターン | 例 |
---|---|
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_annotations
、entities
について説明します。
アノテーションについて
その名の通り、Twitterのシステムが機械学習を使用してツイートにメタデータを付与しています。コンテキスト
とエンティティ
の2種類があります。これらはコード化されており、検索式に指定できます。
コンテキスト
とはカテゴリーのようなものです。例) スポーツ、旅行、テレビ番組
。マスターデータをこちらからダウンロードできます。
エンティティ
とは、人名、地名、組織名、商品名などの固有名詞になります。例) ビットコイン、京都、大谷翔平
例えば、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のコレクションが提供されていますので、ダウンロードして利用できます。
設定方法はこちらをご覧ください。
レートリミット
APIごとにレートリミットがあります。検索APIのばあい、15分間に450リクエストまでになります。
Discussion