TwitterAPIv2を叩いてみた(まずはcurlとPOSTMANで!)

2022/5/02

(最終更新: 2022/5/02

はじめに

かねてより使ってみたいと思っていた、

TwitterのAPI

を使ってみました!!!

開発者申請があるので、少し敷居が高い感覚もありますが、やってみたら簡単でした。

この記事を読むとわかること

TwitterのAPIを使って

  • 特定の条件でツイートを検索する手順(投稿者やキーワード)
  • 特定のキーワードを含むツイートの数(期間も指定可能)を調べる手順

がわかります。

必要なもの

  • Twitterアカウント
  • 費用は無料(7日以上前のツイートが必要な場合は有料になる)

やってみようと思った理由

最近はチーム内で、AWSのSQSとかSNSの検討が熱いです。このへんを勉強しないといけないので、TwitterのAPIを非同期に叩いてお役立ちツールでも作ってみようかなと思ったのがきっかけです。

具体的には、「電車遅延の可能性通知ツール」です。毎朝Twitterを「山手線」で検索して、山手線関連のツイートが増えたら自分のスマホに通知(メール?slack?要検討)してくれたらいいなぁと思っています。

全体の流れ

Step by Stepで解説している公式チュートリアルがあるので、ひとまずこの通りに実施します。

参考資料
公式チュートリアル

https://developer.twitter.com/en/docs/tutorials/step-by-step-guide-to-making-your-first-request-to-the-twitter-api-v2

  1. 開発者アカウントを作成する。その際はTwitter側の審査を通過する必要がある。
  2. デベロッパーポータルで「Project」を作成する。Project内に「App」を作成する。
  3. Appに与えられたAPIアクセスキーをメモする。
  4. APIを叩く。
    1. curlコマンドでやってみる
    2. Postmanでやってみる

【参考】この記事で学んだことを使って、アプリケーションを作ってみました! →

【AWS入門】電車遅延をSMS通知してくれるアプリを作成した(TwitterAPI利用)

【AWS入門】電車遅延をSMS通知してくれるアプリを作成した(TwitterAPI利用)

AWSサービスを使ってみよう。EventBridge+Lambda+AmazonSNSを使ってアプリを作成。

https://bunsugi.com/train-delay-check-app

開発者アカウントを作成する

こちらの記事を参照。

デベロッパーポータルで「Project」を作成する。Project内に「App」を作成する。

簡単なのでわかる人は飛ばしてOK。⇒APIを叩いてみる

審査に合格するとTwitterの「デベロッパーポータル(Developer Portal)」に入れるようになるので、「プロジェクト」と「アプリケーション」を作成する。

無料で使えるプロジェクトのタイプは、

  • Essential
  • Elevated

の2つ。 普通にプロジェクトを作ったらElevatedになった。

プロジェクトは、合わせて1つまで作成できる。 プロジェクト内のAppの数は、Essentialでは1つまで、Elevatedでは3つまでとのこと。 その他の特徴は以下を参照。

参考資料
https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level

CreateProjectをクリック。 CreateProject

プロジェクト名を設定。 プロジェクト名

プロジェクトの利用用途を設定。 私は「Building consumer tools (hobbyist)」を選択した。 ユースケース

プロジェクトの説明。どんなものを作ろうとしているか簡単に記載した。(あくまで予定) プロジェクトの説明

Create Newを選択。

Create New App

環境は、

  • 開発用
  • ステージング用(本番環境に条件を限りなく近づけた、最終テスト用環境のことを言う1
  • 本番用

のうち開発用を選択した。

環境選択

次にアプリケーション(App)を作成する。

App名を入力。 App名を入力

Nextを押せばAPIキーが表示される。

APIアクセスキーをメモする。

こんな形で3つのAPIキーが作成されるので、メモしておく。 ※ここでメモしないと再表示はできないらしい。

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のインストール方法・基本的な使用方法は以下を参照。

https://tomiko0404.hatenablog.com/entry/2021/10/17/Postman-GET-POST

Postmanを利用すると、CURLコマンドより視覚的にURLやパラメータを設定することができる。 Postmanでの叩き方

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が投稿したツイート)
  • デフォルトではidtextだけ取得する。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を叩いてみることができた。


個別連絡はこちらへ→Twitterお問い合わせ

プロフィール

プロフィールイメージ

はち子

事業会社のシステム部門で働きはじめて5年目の会社員。システム企画/要件定義/システムアーキテクチャ等。

Twitter→@bun_sugi

過去の記事について

はてなブログに掲載の記事(主にプログラミングメモ)についてはこちらに掲載しております。(本ブログに移行中)

タグ一覧

関連記事

Copyright© 2023, エンジニアを目指す日常ブログ

お問い合わせ|プライバシーポリシー