【Twitter】特定ユーザのツイート内容、いいね数、リツイート数などをGoogleスプレッドシートに自動取得する(Python)

Others

Twitter APIGoogle Sheets APIを用いて、Twitterの特定ユーザのツイート内容、いいね数、リツイート数などを取得し、Googleスプレッドシートに保存するpythonスクリプトを作成したので、作成の過程やスクリプトをまとめてみます。基本的な流れは、Twitter開発者プラットフォームのチュートリアルを参考に進めました。

Twitter API KeyとTokenの取得

まずはTwitterからデータを取得するためのTokenを取得します。公式ドキュメントはこちらです。

1. 開発者ポータルにサインアップ

開発者ポータルにアクセスし、Twitter Developer Accountの登録を行います。Twitterアカウント自体を持っていない方は、Twitterの登録から実施してください。

2. 必要事項の入力

Twitterにログインした状態で開発者ポータルにアクセスすると、下記のような画面になるので、必要事項を記入し、”Next“を選択。電話番号を登録していない場合は、先に登録するよう求められることがあります。

Developer agreement & policyが表示されるので、内容確認し、チェックを入れて、”Submit“をクリック。

3. メール確認

下記のようなメールが届くので、”Confirm your email“をクリック。

4. API Key & Tokenの取得

下記のようなページが表示されるので、適当なアプリケーション名を入力して、”Get keys“をクリック。

API keyやTokenが表示されるので、安全な場所に保管してください。

Googleサービスアカウントの作成とキーの取得

ツールからGoogleのAPIを呼び出し、スプレッドシートにデータを記入しにいくために、Googleサービスアカウントを作成します。作成方法の公式ドキュメントはこちらです。

1. プロジェクトの作成

まず、サービス アカウントの作成画面に移動し、左上の方にある”プロジェクトの選択“をクリック。Googleアカウントを持っていない方はアカウントの作成から実施してください。Googleにログインしていない場合は、ログインが先に求められます。

既存プロジェクトを使用する場合は、適切なプロジェクトを選択し、右下の”開く“をクリック。プロジェクトを新規作成する場合は、右上の”新しいプロジェクト“を選択。

適当なプロジェクト名を設定し、”作成“をクリック。

2. サービスアカウントの作成

適切なプロジェクトが選択された状態で、”サービスアカウントを作成“をクリック。

サービスアカウントの名前や説明を設定し、”作成して続行“を選択。

このアカウントに対する必要最小限のアクセス権を設定します。”ロールを選択“をクリック。

API経由でGoogleスプレッドシートの編集・閲覧のみを実行する場合は、”workspace”でフィルタをかけて、”Google Workspace アドオン デベロッパー“を選択するのが良いかと思います。

Google Workspace (Gmail, Meet, スプレッドシート, カレンダーなど)以外のサービスもAPI経由で利用したいよという場合は、クイックアクセス>基本>”編集者“を選択するのが良さそうです。”オーナー”は権限が強すぎて課金設定なんかもいじれるようなので、できる限り最小限の権限を付与するように設定しましょう。

これで”続行” > “完了“を選択します。

3. サービスアカウントキーの取得

先の画面で”完了”を選択すると、下記のような画面に遷移するので、メールアドレスを選択。※このメールアドレスはあとで使用するので、どこかにコピーしておくと便利です。

キー“のタブを選択。

鍵を追加” > “新しい鍵を作成“を選択。

キーのタイプに”JSON“を選択し、”作成“をクリック。

JSONファイルがダウンロードされるので、安全な場所に保存しておく。

Google Sheets APIの有効化

左上(画像赤枠内)をクリックし、ナビゲーションメニューを開き、”APIとサービス“>”有効なAPIとサービス“を選択。

+ APIとサービスの有効化“をクリック。

“sheets”などで検索をかけると”Google Sheets API“が出てくるので、選択。

有効にする“をクリック。

下記のような画面に遷移するので、ステータスが”有効“になっていることを確認。

スプレッドシートをサービスアカウントに共有

1. サービスアカウントのアドレスの確認

サービスアカウントのページにアクセスし、サービスアカウントを作成したプロジェクトを選択。下記の赤枠内のアドレスを確認します。

2. スプレッドシートに共有設定

スプレッドシートを新規作成し、右上の”共有“を選択。

サービスアカウントのアドレスを入力し、”編集者“に設定、”共有“をクリック。

Pythonでプログラム開発

下記のリファレンスを参照し、コードを書きました。エラー処理などがかなり甘いので、利用する際は適宜修正して頂けると幸いです。

リファレンス

開発・テスト環境

  • MacOS 12.2.1 (M1 Chip)
  • Python 3.10.3

(ライブラリ)

  • gspread 5.2.0
  • oauth2client 4.1.3
  • pandas 1.4.1
  • requests 2.27.1

サンプルコード

import pandas as pd
import gspread
import requests
import os
from oauth2client.service_account import ServiceAccountCredentials

def connect_to_twitter(bearer_token):
    return {"Authorization": "Bearer {}".format(bearer_token)}

def get_userid(headers, username):
    url = 'https://api.twitter.com/2/users/by/username/' + username
    response = requests.request("GET", url, headers=headers).json()
    return response["data"]["id"]

def get_recent_tweets(headers, searchId, max_results=10, next_token=""):
    url = 'https://api.twitter.com/2/users/' + searchId + '/tweets'
    if int(max_results)<5:
        max_results = 5 # The minimum permitted value is 5

    if next_token=="":
            params = {
                "tweet.fields": "created_at,public_metrics",
                "max_results": int(max_results),
            }
    else:
            params = {
                "tweet.fields": "created_at,public_metrics",
                "max_results": int(max_results),
                "pagination_token": next_token
            }

    response=requests.request("GET", url, headers=headers, params=params).json()
    next_token=response['meta']['next_token']

    return response,next_token

def make_df(response):
    df = pd.json_normalize(response["data"])
    df = df.rename(columns= {'public_metrics.retweet_count': 'retweet', 
                        'public_metrics.reply_count': 'reply',
                        'public_metrics.like_count':'like',
                        'public_metrics.quote_count':'quote'})
    return df

def authenticate_to_google():
    scope = [
        "https://spreadsheets.google.com/feeds"
    ]
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        "/path/to/your/file.json", scope
    )  #(★1)
    return credentials

if __name__ == "__main__":
    # 必要なパラメータの入力
    username = input("Which user's tweets do you want to retrieve? ex. @nikkei -> nikkei : ")
    max_tweets = input("How many tweets do you want to retrieve? (min=5) : ")
    print("This tool may return different number of tweets you want because the minimum permitted value for get_tweets api is 5")

    # Twitterからのデータ取得
    bearer_token = os.environ.get('BEARER_TOKEN')
    headers = connect_to_twitter(bearer_token)
    user_id = (get_userid(headers,username))
    #APIの仕様上、get_recent_tweetsで一回で取得できるツイート数が10ツイートなので、max_tweetsが10以上の場合は、next tokenを取得して、必要な回数取得し続けるようにしています。それでも上限は3,200ツイートのようです。
    #(ref) https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets
    if int(max_tweets)<=10:
        response,next_token = get_recent_tweets(headers,user_id,max_results=int(max_tweets))
        df = make_df(response)
    else:
        response,next_token = get_recent_tweets(headers,user_id,max_results=10)
        df = make_df(response)
        tweets_count = int(max_tweets)-10
        while tweets_count>0:
            if tweets_count<10:
                max_results = tweets_count
            else:
                max_results = 10
            response,next_token = get_recent_tweets(headers,user_id,max_results=max_results,next_token=next_token)
            df_new = make_df(response)
            df = pd.concat([df,df_new])
            tweets_count = tweets_count-10

    # Googleスプレッドシートへのデータのアップロード
    credentials = authenticate_to_google()
    gc = gspread.authorize(credentials)
    workbook = gc.open_by_key("spreadsheet_id")  #(★2)
    sheet = workbook.worksheet("Sheet1")
    sheet.clear()
    sheet.update("A1", [df.columns.values.tolist()] + df.values.tolist())
    print("Please check https://docs.google.com/spreadsheets/d/spreadsheet_id") #(★2)

(★1) /path/to/your/file.jsonには、2-3. サービスアカウントキーの取得でダウンロードしたJSONファイルへのパスを指定してください。
(★2) spreadsheet_idには、4で作成したスプレッドシートにアクセスした際のURLに含まれる文字列(下記画像のグレー部分)が入ります。

実行結果

コード実行前に下記のコマンドで環境変数の設定を行ってください。your-bearer-tokenには、4. API Key & Tokenの取得で取得した”Bearer Token”の値が入ります。

export BEARER_TOKEN='your-bearer-token'

コードの実行

 % python3 get_tweet_by_username.py
Which user's tweets do you want to retrieve? ex. @nikkei -> nikkei : nikkei
How many tweets do you want to retrieve? (min=5) : 5
This tool may return different number of tweets you want because the minimum permitted value for get_tweets api is 5
Please check https://docs.google.com/spreadsheets/d/spreadsheet_id

Googleスプレッドシートにアップロードされたツイート情報

注意点

  • スプレッドシートは事前作成しておく必要があります。シート名はコード内に指定したものとあわせておかないと、「gspread.exceptions.WorksheetNotFound: Sheet1」のエラーがでます。
  • スプレッドシートの更新対象のシートは、sheet.clear()で都度クリアされ、上書きされるようになっています。
  • Twitter APIの仕様により、最大で取得できるツイート数は3,200までのようです。
  • APIの仕様変更等により、動作しなくなる可能性があります。
  • Twitter, GoogleのAPI keyやToken(jsonファイルなど)は誤って外部公開しないように注意です。

まとめ

初めてTwitter APIとGoogle Sheets APIを使って、簡易ツールを作成してみましたが、リファレンスやサンプルコードも豊富で他にも色々できそうだなと思いました。今回ツイート情報の取得でしたが、投稿もAPI経由でできるので、Bot作成なんかも楽しそうです。

余談ですが、Pandasインストールで”ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly”が出て、かなり手こずりました。結果、Pythonを3.10にアップグレードすることで、解決しましたが、M1 Macだとたまに思わぬところで時間かかることがありますね。。

自分のTwitter分析ができればOKという方であれば、SocialDogがおすすめです。私も利用していますが、予約投稿やフォロワー数の推移、フォロワーの属性分析、エンゲージメント率のチェックなどができます。7日間無料で有料プランも使えるので、一度試してみてもよいかもです。

コメント

タイトルとURLをコピーしました