はじめに
かねてより使ってみたいと思っていた、 TwitterのAPI
開発者申請があるので、少し敷居が高い感覚もありますが、やってみたら簡単でした。
この記事を読むとわかること
TwitterのAPIを使って
- 特定の条件でツイートを検索する手順(投稿者やキーワード)
- 特定のキーワードを含むツイートの数(期間も指定可能)を調べる手順
がわかります。
必要なもの
- Twitterアカウント
- 費用は無料(7日以上前のツイートが必要な場合は有料になる)
やってみようと思った理由
最近はチーム内で、AWSのSQSとかSNSの検討が熱いです。このへんを勉強しないといけないので、TwitterのAPIを非同期に叩いてお役立ちツールでも作ってみようかなと思ったのがきっかけです。
具体的には、「電車遅延の可能性通知ツール」です。毎朝Twitterを「山手線」で検索して、山手線関連のツイートが増えたら自分のスマホに通知(メール?slack?要検討)してくれたらいいなぁと思っています。
全体の流れ
Step by Stepで解説している公式チュートリアルがあるので、ひとまずこの通りに実施します。
- 開発者アカウントを作成する。その際はTwitter側の審査を通過する必要がある。
- デベロッパーポータルで「Project」を作成する。Project内に「App」を作成する。
- Appに与えられたAPIアクセスキーをメモする。
- APIを叩く。
- curlコマンドでやってみる
- Postmanでやってみる
【参考】この記事で学んだことを使って、アプリケーションを作ってみました! →
開発者アカウントを作成する
こちらの記事を参照。
デベロッパーポータルで「Project」を作成する。Project内に「App」を作成する。
簡単なのでわかる人は飛ばしてOK。⇒APIを叩いてみるへ
審査に合格するとTwitterの「デベロッパーポータル(Developer Portal)」に入れるようになるので、「プロジェクト」と「アプリケーション」を作成する。
無料で使えるプロジェクトのタイプは、
- Essential
- Elevated
の2つ。 普通にプロジェクトを作ったらElevatedになった。
プロジェクトは、合わせて1つまで作成できる。 プロジェクト内のAppの数は、Essentialでは1つまで、Elevatedでは3つまでとのこと。 その他の特徴は以下を参照。
プロジェクトの利用用途を設定。 私は「Building consumer tools (hobbyist)」を選択した。
プロジェクトの説明。どんなものを作ろうとしているか簡単に記載した。(あくまで予定)
Create Newを選択。
環境は、
- 開発用
- ステージング用(本番環境に条件を限りなく近づけた、最終テスト用環境のことを言う1)
- 本番用
のうち開発用を選択した。
次にアプリケーション(App)を作成する。
Nextを押せばAPIキーが表示される。
APIアクセスキーをメモする。
こんな形で3つのAPIキーが作成されるので、メモしておく。 ※ここでメモしないと再表示はできないらしい。
本記事では3つめのBearer Tokenのみ利用する。
Bearer Tokenとは
Bearer認証という、サービスから発行されるアクセストークンを受け取って、APIのリクエスト時に送信する方式で利用される。
切符にたとえられることが多いらしく、「持ってれば使ってOK」という単純なもの。HTTPリクエストでは、<head>
タグに設定することで「切符、持っていますよ」ということを示す。
APIを叩いてみる
ここまで来たらあとは叩くだけ。
実際に叩いてみる方法
例として @bun_sugi
の直近7日間のツイートを取得する。
CURLコマンドでたたく
Linuxの場合
$ curl --request GET 'https://api.twitter.com/2/tweets/search/recent?query=from:bun_sugi' --header 'Authorization: Bearer <<Bearer Tokenの値>>'
Bearer Tokenの値は機密情報なので、実際にアプリで利用する際はプログラムに入れ込まず、環境変数を利用しましょう。
Windows(Power Shell)の場合2(PowerShellでcurl
と打つとInvoke-WebRequest
が実行される)
> $headers = @{}
> $headers["Authorization"] ="Bearer <<Bearer Tokenの値>>"
> curl -Method GET -Uri 'https://api.twitter.com/2/tweets/search/recent?query=from:bun_sugi' -Headers $headers
Postmanでたたく
Postmanのインストール方法・基本的な使用方法は以下を参照。
Postmanを利用すると、CURLコマンドより視覚的にURLやパラメータを設定することができる。
GETメソッドであることに注意してください。
結果
いずれの方法でも以下のようなJSONを取得できます。
{
"data": [
{
"id": (省略),
"text": "Googleアドセンスの再審査、2週間過ぎましたが結果が来ません🤣落ちてるんだろうなあ。。\n#ブログ初心者"
},
{
"id": (省略),
"text": "AWSのCode Commitを使ってみた記事を新ブログに移行しました。Code Pipelineの勉強の際にメモとして書いた記事です。\n\nhttps://t.co/ZnaiZ0FgBH\n\n#ブログ初心者\n#AWS"
},
{
"id": (省略),
"text": "採用したほう↓\n\nhttps://t.co/CNPCBSy6Qf"
}
],
"meta": {
"newest_id":(省略),
"oldest_id":(省略),
"result_count": 3
}
}
基本的なリクエスト方法の紹介
以下はURLとクエリのみ記載します。
①ツイート検索API
ツイートを特定の条件で検索するAPI。
https://api.twitter.com/2/tweets/search/recent
- 直近7日間のツイートを取得できる。
- キーワードで検索できる。(例:「電車」を含むツイート)
- 投稿者で検索できる。(例:twitterdevが投稿したツイート)
- デフォルトでは
id
とtext
だけ取得する。expansions
オプションを設定すると他の値も取得できる。 - デフォルトでは直近10件。
max_results
で設定可能。
例1:直近10件(7日間)の、みちょぱさんのツイートを検索する
https://api.twitter.com/2/tweets/search/recent?query=from:michopaaaaa
例2:直近100件(7日間)の、「システム開発」を含むツイートを検索する
https://api.twitter.com/2/tweets/search/recent?query=システム開発&max_results=100
例3:直近100件(7日間)の、「iPhone」を含む日本語のツイートを検索する
https://api.twitter.com/2/tweets/search/recent?query=iPhone lang:ja&max_results=100
②ツイート数取得API
ツイートの内容ではなく、数を取得するAPI。トレンドを把握することができる。
https://api.twitter.com/2/tweets/counts/recent
- 直近7日間を検索対象にできる。
- ①ツイート検索APIと同じようにクエリを組める。
- 開始時刻~終了時刻を設定することができる。
時刻はISO8601で設定する必要がある
開始時刻、終了時刻は、ISO8601形式で設定する必要があるので注意。
日本時間:2022-05-02 15:00 の場合、
2022-05-02T06:00:00.000Z
(世界協定時:UTC) または 2022-05-02T15:00:00.000+09:00
(日本標準時:JST)
例4:7日間の日ごとの「ゴールデンウィーク」を含むツイート数を検索する
https://api.twitter.com/2/tweets/counts/recent?query=ゴールデンウィーク&granularity=day
結果は以下。今が2022-05-02 15:38で、UTC時刻としては2022-05-02 6:38であるので、
2022-04-25 6:38 (UTC) ~2022-05-02 6:38 (UTC)
のツイートを取得できる。- 2022-04-25 6:38 ~ 2022-04-26 0:00(7日前)
- 2022-04-26 0:00 ~ 2022-04-27 0:00(6日前)
- ・・・
- 2022-05-02 0:00 ~ 2022-05-02 6:38(本日)
{
"data": [
{
"end": "2022-04-26T00:00:00.000Z",
"start": "2022-04-25T06:38:23.000Z",
"tweet_count": 75614
},
{
"end": "2022-04-27T00:00:00.000Z",
"start": "2022-04-26T00:00:00.000Z",
"tweet_count": 106965
},
{
"end": "2022-04-28T00:00:00.000Z",
"start": "2022-04-27T00:00:00.000Z",
"tweet_count": 157230
},
{
"end": "2022-04-29T00:00:00.000Z",
"start": "2022-04-28T00:00:00.000Z",
"tweet_count": 343639
},
{
"end": "2022-04-30T00:00:00.000Z",
"start": "2022-04-29T00:00:00.000Z",
"tweet_count": 455769
},
{
"end": "2022-05-01T00:00:00.000Z",
"start": "2022-04-30T00:00:00.000Z",
"tweet_count": 235088
},
{
"end": "2022-05-02T00:00:00.000Z",
"start": "2022-05-01T00:00:00.000Z",
"tweet_count": 244592
},
{
"end": "2022-05-02T06:38:23.000Z",
"start": "2022-05-02T00:00:00.000Z",
"tweet_count": 80127
}
],
"meta": {
"total_tweet_count": 1699024
}
}
例5:今朝7:00-9:00の「山手線」を含むツイート数を検索する 今朝(2022/5/2)の7:00-9:00の「山手線」を含むツイート数を検索する。
時刻はUTCの記法に揃えて、
2022-05-01T22:00:00.000Z
から2022-05-02T00:00:00.000Z
の2時間分のツイート数を取得する。
https://api.twitter.com/2/tweets/counts/recent?query=山手線&start_time=2022-05-01T22:00:00.000Z&end_time=2022-05-02T00:00:00.000Z&granularity=day
結果は以下のように取得できる。
{
"data": [
{
"end": "2022-05-02T00:00:00.000Z",
"start": "2022-05-01T22:00:00.000Z",
"tweet_count": 254
}
],
"meta": {
"total_tweet_count": 254
}
}
granularity
はグループ化の粒度を設定するオプションである。
例えば、ここをminite
とすれば1分ごとのツイート数も取得することができる。
https://api.twitter.com/2/tweets/counts/recent?query=山手線&start_time=2022-05-01T22:00:00.000Z&end_time=2022-05-01T22:10:00.000Z&granularity=minute
{
"data": [
{
"end": "2022-05-01T22:01:00.000Z",
"start": "2022-05-01T22:00:00.000Z",
"tweet_count": 4
},
{
"end": "2022-05-01T22:02:00.000Z",
"start": "2022-05-01T22:01:00.000Z",
"tweet_count": 1
},
{
"end": "2022-05-01T22:03:00.000Z",
"start": "2022-05-01T22:02:00.000Z",
"tweet_count": 2
},
{
"end": "2022-05-01T22:04:00.000Z",
"start": "2022-05-01T22:03:00.000Z",
"tweet_count": 2
},
{
"end": "2022-05-01T22:05:00.000Z",
"start": "2022-05-01T22:04:00.000Z",
"tweet_count": 2
},
{
"end": "2022-05-01T22:06:00.000Z",
"start": "2022-05-01T22:05:00.000Z",
"tweet_count": 0
},
{
"end": "2022-05-01T22:07:00.000Z",
"start": "2022-05-01T22:06:00.000Z",
"tweet_count": 2
},
{
"end": "2022-05-01T22:08:00.000Z",
"start": "2022-05-01T22:07:00.000Z",
"tweet_count": 0
},
{
"end": "2022-05-01T22:09:00.000Z",
"start": "2022-05-01T22:08:00.000Z",
"tweet_count": 0
},
{
"end": "2022-05-01T22:10:00.000Z",
"start": "2022-05-01T22:09:00.000Z",
"tweet_count": 2
}
],
"meta": {
"total_tweet_count": 15
}
}
(おまけ)グラフにしてみる
以下のクエリを叩いて取得した、1時間ごとの「コナン」関連ツイート数をグラフにしてみた。
https://api.twitter.com/2/tweets/counts/recent?query=コナン&granularity=hour
※最初のレコードと最後のレコードは中途半端なデータになっているので除いたほうが良い。
2022-05-01の0:00になんだかバズっていることがわかる。
調べてみると、モンストとのコラボ企画が5/1 0:00から始まっていたみたいです。おもしろい~。
まとめ
- Twitter API v2を使ってみることができた。
- CURLやPOSTMANを使って、試験的にAPIを叩いてみることができた。