Twitter APIを使用している場合、応答ペイロードをGoogleスプレッドシートに転送する必要がある場合が多々あります。Googleスプレッドシートは、基本的なデータ分析と速やかな結果共有に最適です。さまざまなバックグラウンドの関係者と連携して1回限りの分析を行う場合、特に便利です。以前のブログ投稿で、ツイート関数を使ってGoogleスプレッドシート内でツイートを動的に使う方法を説明しています。このブログ投稿では、Pythonを使ってTwitter API v2にリクエストを行い、Googleスプレッドシートに応答を送信する方法について、順を追って説明します。
設定
Twitter API v2を使う前に、承認された開発者アカウントが必要となります。承認された開発者アカウントが準備できたら、プロジェクトとそのプロジェクト内にアプリを作成する必要があります。Twitter APIの使用を開始する方法の詳細は、このブログ投稿とドキュメントの「はじめに」セクションをご参照ください。
このコードサンプルでは、Python 3を使います。また、Google Drive APIに接続する必要もあります。設定にあたってサポートが必要な場合は、この役に立つリソースを確認してみてください。
パッケージをインポートする
設定を行うため、pandas、gspread、requests、oauth2clientをインストールします。pandas
はTwitter APIからのJSONペイロード応答の表形式への変換、gspread
はGoogleスプレッドシートへの接続、requests
はHTTPリクエストを行うためのTwitter APIへの接続、oauth2client
はサービスアカウントを使った認証のサポートに使用します。osもインポートしますが、スタンダードに含まれるため、これを先にインストールする必要はありません
import pandas as pd
import gspread
import os
import requests
from oauth2client.service_account import ServiceAccountCredentials
ベアラートークンの環境変数を設定する
Twitter APIに接続するには、まずAPIで認証を受ける必要があります。認証はアプリのベアラートークンで実行できます。開発者ポータル内のアプリの「キーとトークン」セクションでベアラートークンを入手します。ベアラートークンを誤って共有しないよう、環境変数を設定できます。設定するには、ターミナル内で以下を実行します。your-bearer-tokenの部分を必ずご自身のベアラートークンに置き換えてください。
export BEARER_TOKEN='your-bearer-token'
コードエディター内で、connect_to_twitter
と呼ばれる関数を作成します。これで、ベアラートークンを入手し、Twitter APIへのHTTPリクエストに渡すヘッダーを返します。
def connect_to_twitter():
bearer_token = os.environ.get('BEARER_TOKEN')
return {"Authorization": "Bearer {}".format(bearer_token)}
Twitter APIにリクエストを行う
Tweet lookupエンドポイントにリクエストを行うことにより、所定のIDに合致するツイートが返されます。デフォルトでは、このエンドポイントはツイートIDを含むid
フィールドと、ツイートのテキストを返すtext
フィールドのみを返します。返されるオブジェクトに追加フィールドを加えることもできます。下の例では、パラメーター変数にauthor_id、created_at、langのフィールドを含めるよう指定しています。
次に、make_request
と呼ばれる関数を作ります。これに先ほど作成した認証ヘッダーを渡します。これにより、URLは取得したいフィールドと詳細情報を得たいツイートのツイートIDを含めるようリクエストを行います。リクエストライブラリを使って、URL変数へのGETリクエストを行い、認証ヘッダーを渡し、リクエストがJSONペイロードを返すよう指定します。
def make_request(headers):
url = "https://api.x.com/2/tweets"
params = {
"tweet.fields": "author_id,created_at,lang",
"ids": "21,1293593516040269825,1334542969530183683",
}
return requests.request("GET", url, headers=headers, params=params).json()
JSONペイロードを解析する
返される応答はJSONペイロード内にあり、次のようになっています。
{"data":[{"created_at":"2006-03-21T20:51:43.000Z","author_id":"13","text":"just setting up my twttr","id":"21","lang":"en"},{"created_at":"2020-08-12T17:01:42.000Z","author_id":"2244994945","text":"It’s finally here! \uD83E\uDD41 Say hello to the new #TwitterAPI.\n\nWe’re rebuilding the Twitter API v2 from the ground up to better serve our developer community. And today’s launch is only the beginning.\n\nhttps://t.co/32VrwpGaJw https://t.co/KaFSbjWUA8","id":"1293593516040269825","lang":"en"},{"created_at":"2020-12-03T17:00:13.000Z","author_id":"783214","text":"2020 in one word","id":"1334542969530183683","lang":"en"}]}
リクエストしたツイートの情報は、data
と呼ばれるオブジェクトにありますが、スプレッドシートにそのまま移せる形式にはなっていません。行と列に対応できるようにするため、make_df
と呼ばれる関数を作成します。これはJSONペイロードをpandasデータフレームに変換します。このデータフレームはスプレッドシートに似た構造で、両方とも表形式という特徴があります。拡張または複数のオブジェクトを持つ最新の検索などのエンドポイントを使っている場合、オブジェクトを変換する前にJSONを正規化する必要がある場合があります。
def make_df(response):
return pd.DataFrame(response["data"])
GoogleスプレッドシートAPIで認証を受ける
GoogleスプレッドシートAPIへの接続には、サービスアカウントを使います。サービスアカウントは、商品におけるユーザーアカウントの機能と同じような形でアプリケーションに属しているアカウントです。GoogleスプレッドシートAPIで認証を受けるには、まず使用する範囲を設定し、サービスアカウント認証情報に渡す必要があります。
def authenticate_to_google():
scope = [
"https://spreadsheets.google.com/feeds"
]
credentials = ServiceAccountCredentials.from_json_keyfile_name(
"/path/to/your/file.json", scope
)
return credentials
サービスアカウントはメールアドレスも保持しています。修正するスプレッドシートの共有設定を更新して、サービスアカウントを含める必要があります。同僚や友人の場合に、Googleスプレッドシートの共有設定の「ユーザーやグループを追加」などで、メールアドレスを追加する場合と同様の方法で行います。
連携する
続いて、main
関数を作成し、これまで記述した関数すべてを呼び出します。認証ヘッダーを設定するconnect_to_twitter
関数を呼び出すheadersと呼ばれる変数を作成します。response変数ではmake_request
関数を呼び出し、response変数に応答を渡します。df
変数では、Twitter APIから返されたJSONオブジェクト型の応答用にデータフレームを作成します。続いて、credentials
と呼ばれる変数を保存し、authenticate_to_google
関数を呼び出して、サービスアカウント認証情報を設定します。次のステップでは、認証情報を認証するgc
と呼ばれる変数を作成します。
workbook変数では、使用するスプレッドシートをスプレッドシートキーで開き、使用するスプレッドシートの値を設定します。以下のURLのGoogleスプレッドシートがあるとします。
https://docs.google.com/spreadsheets/d/skosdo;gaetgiwoesofgkd45/edit
この例のスプレッドシートキーはskosdo;gaetgiwoesofgkd45
です。以下のコードスニペットで、spreadsheet_id
をskosdo;gaetgiwoesofgkd45
に置き換えます。
使用するシートを設定することもできます。この例の場合はシート1ですが、スプレッドシート内のどのシートでも設定可能です。更新するセル値または範囲の指定も必要です。この例では最初のセルであるA1
から始まっています。最後に、データフレームの値を追加して、スプレッドシートをTwitter APIからのデータで更新します。
def main():
headers = connect_to_twitter()
response = make_request(headers)
df = make_df(response)
credentials = authenticate_to_google()
gc = gspread.authorize(credentials)
workbook = gc.open_by_key("spreadsheet_id")
sheet = workbook.worksheet("Sheet1")
sheet.update("A1", [df.columns.values.tolist()] + df.values.tolist())
if __name__ == "__main__":
main()
GitHubのコードの完全版を確認できます。Twitter APIからGoogleスプレッドシートに送られたデータがあれば、Google Scriptを使って、このコードサンプルを発展させられます。このブログ投稿がTwitterデータとGoogleスプレッドシートAPI両方を使用する最初のきっかけとなれば幸いです。途中で問題が発生した場合はフォーラムでお知らせください。何かを生み出すきっかけになった場合には、@TwitterDevにツイートしてください。