#author("2022-08-11T13:58:57+00:00","","") #author("2022-08-11T14:12:06+00:00","","") [[Pythonライブラリ]] 目次 #contents *Search Tweets(recent) [#yc40455d] Search Tweetsではツイートの取得ができる。~ 方法が2種類あり、recent(GET /2/tweets/search/recent)とall(GET /2/tweets/search/all)がある。~ recentは、ツイートの投稿日時を指定してツイートを取得すると、取得時から過去7日間に公開されたツイートのみ取得できる。~ allは、ツイートの投稿日時を指定してツイートを取得しても投稿日時の制限に縛られずにツイートを取得できる。~ しかし、allはアクセスレベルAcademic Researchが必要になる。~ *レート制限 [#rb001310] ||Essential|Elevated|Academic Research| |1ヶ月あたりのツイート取得制限|50万件|200万件|1000万件| |1アカウントあたりのプロジェクト(稼働アプリ)制限|1アプリ|1アプリ|1アプリ| |1アプリあたりの稼働ユーザ制限|1ユーザ|3ユーザ|1ユーザ| |1アプリあたりのリクエスト回数|450(回/15分)|450(回/15分)|450(回/15分)| |1ユーザあたりのリクエスト回数|180(回/15分)|180(回/15分)|180(回/15分)| *パラメータ [#t61fc103] パラメータを簡単な説明と共に列挙し、パラメータの補足を加える。 |名前|型|説明| |query|文字列|取得したいツイートを検索する| |next_token|文字列|前回の取得から遡ってツイートを取得するための文字列| |since_id|文字列|指定したIDより大きいツイートを取得する| |until_id|文字列|指定したIDより小さいツイートを取得する| |max_results|整数|1リクエストあたりのツイート取得件数を指定する| |start_time|日付|取得したいツイートのうち、最も古い日付を指定する| |end_time|日付|取得したいツイートのうち、最も新しい日付を指定する| |sort_order|列挙列|取得したツイートの順番を指定する| |tweet.fields|列挙列|取得したツイートに関する情報を指定し、加える| |media.fields|列挙列|取得したツイートに含まれる画像や動画に関する情報を指定し、加える| |user.fields|列挙列|取得したツイートを投稿したユーザに関する情報を指定し、加える| |place.fields|列挙列|場所に関する情報を指定し、加える| |poll.fields|列挙列|投票に関する情報を指定し、加える| |expansions|列挙列|取得したツイートの追加データを指定し、加える| **sort_order [#sfef28ee] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |recency|新しい順に並ぶ| |relevancy|関連する順に並ぶ| 両方指定すると、新しい順に並んだ後、関連する順に並ぶと思われる。 **tweet.fields [#c0b557bd] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |attachments|添付ファイルデータ| |author_id|取得したツイートを投稿したユーザのID| |context_annotations|注釈データ| |conversation_id|返信先のツイートのID| |created_at|ツイートの投稿日時| |entities|特殊テキストデータ| |geo|場所データ| |id|ツイートのID| |in_reply_to_user_id|返信先のツイートを投稿したユーザのID| |lang|ツイートの言語| |non_public_metrics|非公開機械的指標データ| |public_metrics|公開指標データ| |organic_metrics|非公開非機械的指標データ| |promoted_metrics|非公開宣伝指標データ| |possibly_sensitive|ツイートが成人向けかどうか| |referenced_tweets|リツイートデータ| |reply_settings|このツイートに返信できるユーザ| |source|ユーザがツイートしたアプリ名| |text|ツイート文| |withheld|凍結コンテンツデータ| **media.fields [#w4338e72] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |duration_ms|動画の長さ| |height|コンテンツの高さ| |media_key|メディアコンテンツのID| |preview_image_url|サムネイル画像のURL| |type|コンテンツのタイプ| |url|メディアコンテンツのURL| |width|コンテンツの幅| |public_metrics|動画の合計再生回数データ| |non_public_metrics|メディアコンテンツの非公開機械的指標データ| |organic_metrics|メディアコンテンツの非公開非機械的指標データ| |promoted_metrics|メディアコンテンツの非公開宣伝指標データ| |alt_text|アクセシビリティを有効にしてサポートするための画像の説明| |variants|異なる複数の表示、再生データ| **user.fields [#c17445c3] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |created_at|ユーザの作成日時| |description|ユーザのプロフィール文| |entities|プロフィール文に含まれる特殊テキストデータ| |id|ユーザのID| |location|ユーザの存在場所| |name|ユーザの名前| |pinned_tweet_id|ピン止めツイートのID| |profile_image_url|プロフィールに使用されている画像URL| |protected|ユーザが非公開かどうか| |public_metrics|ユーザのアクティビティデータ| |url|プロフィールに指定されているURL| |username|ユーザの表示名| |verified|認証済みユーザかどうか| |withheld|凍結コンテンツデータ| **place.fields [#w9c6ee3d] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |contained_within|参照された場所を含む既知の場所のID| |country|場所が属する国名| |country_code|この場所が属する国コード| |full_name|地名の正式名称| |geo|場所データ| |id|場所のID| |name|この場所の略称| |place_type|場所の種類| **poll.fields [#u703e94f] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |duration_minutes|投票期間| |end_datetime|投票の終了日時| |id|投票の終了日時| |options|投票の各選択肢のデータ| |voting_status|投票が継続されているか終了しているか| **expansions [#md3cce85] 以下をスペースを入れずにカンマ(,)区切りで列挙して指定する。 |名前|説明| |attachments.poll_ids|投票のID| |attachments.media_keys|添付されたメディアのID| |author_id|取得したツイートを投稿したユーザのID| |entities.mentions.username|ユーザメンション(@)として認識される文字列(data.(辞書n番目).textに含まれるユーザ名)| |geo.place_id|場所のID| |in_reply_to_user_id|返信先のツイートを投稿したユーザのID| |referenced_tweets.id|参照ツイートのID| |referenced_tweets.id.author_id|参照ツイートのID| *取得できる情報 [#y8843a38] 取得できる情報を簡単な説明と共に列挙し、情報の補足を加える。 |名前|型|説明| |data|配列|ツイートデータ| |includes|辞書|拡張データ| |errors|辞書|エラーデータ| |meta|辞書|メタデータ| エラーが無く、1件もツイートを取得できなかった場合はmetaのみになる。 **data(ツイートデータ) [#fd3c6429] ツイートのデータに関する情報。~ 取得できた分だけ長さは大きくなる。~ すなわち、1リクエストあたりに取得できたツイート数(meta.countの値)と同じになる。~ 長さの最小値は1、最大値は100。~ Tweet object(ツイートオブジェクト)と構造は同じ。 |名前|型|説明| |id|文字列|ツイートのID| |text|文字列|ツイート文| |lang|文字列|ツイートの言語| |author_id|文字列|取得したツイートを投稿したユーザのID| |source|文字列|ユーザがツイートしたアプリ名| |reply_settings|文字列|このツイートに返信できるユーザ| |conversation_id|文字列|返信先のツイートのID(返信ツイートでなければidと同じ)| |in_reply_to_user_id|文字列|返信先のツイートを投稿したユーザのID| |created_at|日付|ツイートの投稿日時| |possibly_sensitive|ブール値|ツイートが成人向けかどうか| |referenced_tweets|配列|リツイートデータ| |context_annotations|配列|注釈データ| |public_metrics|辞書|公開指標データ| |entities|辞書|特殊テキストデータ| |attachments|辞書|添付ファイルデータ| |geo|辞書|場所データ| |withheld|辞書|凍結コンテンツデータ| |non_public_metrics|辞書|ツイートの非公開機械的指標データ| |organic_metrics|辞書|ツイートの非公開非機械的指標データ| |promoted_metrics|辞書|ツイートの非公開宣伝指標データ| ***referenced_tweets(リツイートデータ) [#t0b3a915] 取得したツイートが参照しているツイートに関する情報。 |名前|型|説明| |id|文字列|参照先のツイートのID| |type|列挙型|参照元のツイートと参照先のツイートの関係| ***context_annotations(注釈データ) [#a6074300] ドメイン名や組織名などに関する情報。 |名前|型|説明| |domain|辞書|ドメイン分類データ| |entity|辞書|ドメイン分類エンティティデータ| -domain(ドメイン分類データ) |名前|型|説明| |id|文字列|ドメインのID| |name|文字列|ドメイン名| |description|文字列|ドメイン分類の長い形式の説明| -entity(ドメイン分類エンティティデータ) |名前|型|説明| |id|文字列|明示的に言及されている人や場所、製品、組織などのID| |name|文字列|明示的に言及されている人や場所、製品、組織などの名前| |description|文字列|エンティティの追加情報| ***public_metrics(公開指標データ) [#t73d72bc] 取得したツイートの「いいね」数やリツイートされた回数などに関する情報。 |名前|型|説明| |like_count|整数|いいね数| |reply_count|整数|返信数| |retweet_count|整数|リツイート数| |quote_count|整数|引用数| ***entities(特殊テキストデータ) [#b138bf0d] URLなど特別な意味を持つテキストに関する情報。 |名前|型|説明| |annotations|配列|注釈データ| |urls|配列|URLデータ| |hashtags|配列|ハッシュタグ(#)データ| |mentions|配列|ユーザメンション(@)データ| |cashtags|配列|キャッシュタグ($)データ| -annotations(注釈データ) |名前|型|説明| |start|整数|注釈をつけるためのテキストの開始位置| |end|整数|注釈をつけるためのエキスとの終了位置| |probability|数値|注釈の信頼度| |type|整数|エンティティの種類| |normalized_text|文字列|注釈タイプ決定に使用されるテキスト| -urls(URLデータ) |名前|型|説明| |start|整数|URLの開始位置| |end|整数|URLの終了位置| |url|文字列|Twitterによる短縮形式のURL(data.(辞書n番目).textに含まれるURL)| |expanded_url|文字列|完全な形式のURL| |display_url|文字列|Twitterクライアントに表示されるURL| |unwound_url|文字列|完全な宛先URL| -hashtags(ハッシュタグ(#)データ) |名前|型|説明| |start|整数|ハッシュタグ(#)の開始位置| |end|整数|ハッシュタグ(#)の終了位置| |tag|文字列|ハッシュタグ(#)のテキスト(data.(辞書n番目).textに含まれるハッシュタグ)| -mentions(ユーザメンション(@)データ) |名前|型|説明| |start|整数|ユーザメンション(@)の開始位置| |end|整数|ユーザメンション(@)の終了位置| |username|文字列|ユーザメンション(@)として認識される文字列(data.(辞書n番目).textに含まれるユーザ名)| -cashtags(キャッシュタグ($)データ) |名前|型|説明| |start|整数|キャッシュタグ($)の開始位置| |end|整数|キャッシュタグ($)の終了位置| |tag|文字列|キャッシュタグ($)のテキスト| ***attachments(添付ファイルデータ) [#x65fab0e] 取得したツイートに添付されているファイルに関する情報。~ 添付されていなければこのフィールドは無い。 |名前|型|説明| |media_keys|配列|添付されたメディアのID| |poll_ids|配列|投票のID| ***geo(場所データ) [#mbe511cd] ユーザの位置情報に関する情報。 |名前|型|説明| |place_id|文字列|場所のID| |coordinates|辞書|座標データ| -coordinates(座標データ) |名前|型|説明| |type|文字列|座標の種類| |coordinates|配列|ユーザの緯度、経度| ***withheld(凍結コンテンツデータ) [#w5f858b6] 取得したツイートが法的要求に基づいて凍結されているかなどに関する情報。 |名前|型|説明| |copyright|ブール値|コンテンツが凍結されているかどうか| |country_codes|配列|このコンテンツを利用できない国| |scope|列挙|凍結コンテンツがツイートかユーザか両方か| ***non_public_metrics(非公開機械的指標データ) [#db251b8e] 機械的にアクセスされた回数など、内部的に集計されている情報。~ OAuth 2.0ユーザーコンテキスト認証を使用する必要がある。 |名前|型|説明| |impression_count|整数|このツイートが機械的に閲覧された回数| |url_link_clicks|整数|ツイートに含まれるURLを用いて機械的にアクセスされた回数| |user_profile_clicks|整数|ツイートの内、ユーザ名、ユーザID、プロフィール画像を用いて機械的にアクセスされた回数| ***organic_metrics(非公開非機械的指標データ) [#j5cc83fc] 取得したツイートが閲覧された回数やクリークされた回数など、内部的に集計されている情報。~ OAuth 2.0ユーザーコンテキスト認証を使用する必要がある。 |名前|型|説明| |impression_count|整数|このツイートが非機械的に閲覧された回数| |url_link_clicks|整数|ツイートに含まれるURLを用いて非機械的にアクセスされた回数| |user_profile_clicks|整数|ツイートの内、ユーザ名、ユーザID、プロフィール画像を用いて非機械的にアクセスされた回数| |retweet_count|整数|このツイートが非機械的にリツイートされた回数| |reply_count|整数|このツイートに非機械的にされた返信数| |like_count|整数|このツイートに非機械的に送られたいいね数| ***promoted_metrics(非公開宣伝指標データ) [#l9a41869] 取得したツイートが宣伝目的で表示された回数など、宣伝に関する情報。~ OAuth 2.0 ユーザー コンテキスト認証を使用する必要がある。 |名前|型|説明| |impression_count|整数|このツイートが宣伝として表示された回数| |url_link_clicks|整数|このツイートが宣伝されている時にアクセスされた回数| |user_profile_clicks|整数|このツイートが宣伝されている時にツイートの内、ユーザ名、ユーザID、プロフィール画像を用いて非機械的にアクセスされた回数| |retweet_count|整数|このツイートが宣伝されている時にリツイートされた回数| |reply_count|整数|このツイートが宣伝されている時にされた返信数| |like_count|整数|このツイートが宣伝されている時に送られたいいね数| **includes(拡張データ) [#rcc48653] expansionsをパラメータに指定すると取得できる情報。 |名前|型|説明| |tweets|配列|リツイート先、返信先、引用先のツイートのデータ| |users|配列|取得したツイート、リツイート先のツイート、返信先のツイート、引用先のツイートを投稿したユーザのデータ| |media|配列|取得したツイートに含まれる画像や動画などに関するデータ| |places|配列|取得したツイートの位置情報のデータ| |polls|配列|取得したツイートの投票のデータ| ***tweets [#nbe64905] data(ツイートデータ)に含まれているツイートが参照、返信、引用しているツイートの情報。~ Tweet object(ツイートオブジェクト)と構造は同じ。~ data(ツイートデータ)に含まれているツイートは含まれない。~ 例えば、ツイートを10件取得し、そのうち5件はリツイートされたものだと仮定すると、5個のツイートの情報が含まれることになる。 |名前|型|説明| |id|文字列|参照先、返信先、引用先ツイートのID| |text|文字列|参照先、返信先、引用先ツイート文| |lang|文字列|参照先、返信先、引用先ツイートの言語| |author_id|文字列|この参照先、返信先、引用先ツイートを投稿したユーザのID| |source|文字列|ユーザが参照先、返信先、引用先ツイートしたアプリ名| |reply_settings|文字列|この参照先、返信先、引用先ツイートに返信できるユーザ| |conversation_id|文字列|参照先、返信先、引用先ツイートの返信先のツイートのID| |in_reply_to_user_id|文字列|参照先、返信先、引用先ツイートの返信先のツイートを投稿したユーザのID| |created_at|日付|参照先、返信先、引用先ツイートの投稿日時| |possibly_sensitive|ブール値|参照先、返信先、引用先ツイートが成人向けかどうか| |referenced_tweets|配列|参照先、返信先、引用先ツイートデータ| |context_annotations|配列|注釈データ| |public_metrics|辞書|公開指標データ| |entities|辞書|特殊テキストデータ| |attachments|辞書|添付ファイルデータ| |geo|辞書|場所データ| |withheld|辞書|凍結コンテンツデータ| |non_public_metrics|辞書|参照先、返信先、引用先ツイートの非公開機械的指標データ| |organic_metrics|辞書|参照先、返信先、引用先ツイートの非公開非機械的指標データ| |promoted_metrics|辞書|参照先、返信先、引用先ツイートの非公開宣伝指標データ| ***users [#vcdc2886] data(ツイートデータ)に含まれているツイート、およびそのツイートが参照、返信、引用しているツイートを投稿したユーザの情報。~ User object(ユーザオブジェクト)と構造は同じ。~ 例えば、ツイートを10件取得し、そのうち5件はリツイートされたもので、それぞれのツイートを投稿したユーザがすべて異なると仮定すると、15個のユーザの情報が含まれることになる。 |名前|型|説明| |id|文字列|ユーザのID| |name|文字列|ユーザの名前| |username|文字列|ユーザの表示名| |description|文字列|ユーザのプロフィール文| |location|文字列|ユーザの存在場所| |pinned_tweet_id|文字列|ピン止めツイートのID| |profile_image_url|文字列|プロフィールに使用されている画像URL| |url|文字列|プロフィールに指定されているURL| |created_at|日付|ユーザの作成日時| |protected|ブール値|ユーザが非公開かどうか| |verified|ブール値|認証済みユーザかどうか| |entities|辞書|プロフィール文に含まれる特殊テキストデータ| |public_metrics|辞書|ユーザのアクティビティデータ| |withheld|辞書|凍結コンテンツデータ| ***media [#gc2fa88c] data(ツイートデータ)に含まれているツイートに添付されているメディアコンテンツの情報。~ data(ツイートデータ)に含まれているツイートが参照、返信、引用しているツイートに添付されているメディアコンテンツの情報は含まれない。~ 例えば、ツイートを10件取得し、そのうち5件はリツイートされたもので、合計15件それぞれのツイートに1個ずつ画像が添付されていると仮定すると、10個の画像の情報が含まれることになる。 |名前|型|説明| |media_key|文字列|メディアコンテンツのID| |type|文字列|コンテンツのタイプ| |url|文字列|メディアコンテンツのURL| |preview_image_url|文字列|サムネイル画像のURL| |alt_text|文字列|アクセシビリティを有効にしてサポートするための画像の説明| |duration_ms|整数|動画の長さ| |height|整数|コンテンツの高さ| |width|整数|コンテンツの幅| |variants|配列|異なる複数の表示、再生データ| |public_metrics|辞書|動画の合計再生回数データ| |non_public_metrics|辞書|メディアコンテンツの非公開機械的指標データ| |organic_metrics|辞書|メディアコンテンツの非公開非機械的指標データ| |promoted_metrics|辞書|メディアコンテンツの非公開宣伝指標データ| ***places [#a5c09750] data(ツイートデータ)に含まれているツイートに位置情報がある場合、その情報が含まれる。 |名前|型|説明| |id|文字列|場所のID| |full_name|文字列|地名の正式名称| |country|文字列|場所が属する国名| |country_code|文字列|この場所が属する国コード| |name|文字列|この場所の略称| |place_type|文字列|場所の種類| |contained_within|配列|参照された場所を含む既知の場所のID| |geo|辞書|場所データ| ***polls [#ab733f74] data(ツイートデータ)に含まれているツイートに含まれる投票の情報。 |名前|型|説明| |id|文字列|投票のID| |voting_status|文字列|投票が継続されているか終了しているか| |end_datetime|日付|投票の終了日時| |duration_minutes|整数|投票期間| |options|配列|投票の各選択肢のデータ| **errors(エラーデータ) [#pd31d421] リクエストした際にエラーになる箇所が存在する場合、そのエラーに関する情報がまとめられる。~ エラーが発生していないと付与されない。~ 大体は参照、返信、引用先のツイートが1週間より昔のものであるために、取得権限が無いというエラーや、参照、返信、引用先のツイートを投稿したユーザアカウントが削除されているため、その情報を取得できないというエラーであると思われる。~ |名前|型|説明| |resource_id|文字列|エラーが発生するツイートのID| |parameter|文字列|エラーが発生する情報| |resource_type|文字列|エラーが発生するツイートの種類(通常、参照、返信、引用)| |section|文字列|data、includes、metaのどこでエラーが発生しているか| |value|文字列|エラーが発生する原因| |title|文字列|エラータイトル| |detail|文字列|エラーコメント| |type|文字列|エラーデータに関する追加情報を確認できるURL| **meta(メタデータ) [#se520290] リクエストで返されたツイート数やツイートIDに関する情報。 |名前|型|説明| |count|整数|このリクエストで取得できたツイート数| |oldest_id|文字列|このリクエストで取得できた内、最古のツイートのID| |newest_id|文字列|このリクエストで取得できた内、最新のツイートのID| |next_token|文字列|次回のリクエストで続きからツイートを取得するための文字列| *使えそうな情報 [#ab33a8de] **data [#b60108ca] |名前|型|説明| |text|文字列|解析に使う軸となる情報| |id|文字列|ツイートの重複を取り除くために使える| |created_at|日付|期間で解析したい場合にデータを分割するときに使える| |referenced_tweets|辞書|参照、返信、引用ツイートも用いる場合、これを介して特殊な処理が必要| |attachments|辞書|画像や投票など添付物をツイートに紐づけて保存する場合にこれを介して特殊な処理が必要| |public_metrics|辞書|いいね数やリツイート数など、ツイートのバズり具合など分析する場合に使えるかもしれない| |context_annotations|配列|ある組織に関するツイートなど、特定のツイートが必要な場合に使えるかもしれない| |entities|辞書|ハッシュタグを用いてトピック分類してみるのに使えるかもしれない| **includes [#hc5f554f] |名前|型|説明| |tweets|辞書|参照、返信、引用先のツイートを用いる場合に必要| |media|辞書|画像などを用いる場合ここの情報から保存する| |polls|辞書|投票(アンケート)の結果を全体的に集計してみるのも面白いかもしれない| **users [#a298a9a8] |名前|型|説明| |description|文字列|プロフィール文とツイートの文に関係性が見出せる可能性がある| **meta [#p03f6c38] |名前|型|説明| |next_token|文字列|繰り返しリクエストして遡ってツイートを取得する場合に必須| |count|整数|クエリで用いたキーワードでどれくらいのツイートを取得できたか目安になる| *Search Tweets(recent)を使ってみよう [#nca84d43] **その1 [#y16c4127] 最初の一歩。~ import urllib import requests import json bearer_token = r'ここに各自のbearer tokenを入力する。' parameter = { 'query': 'アニメ', } endpoint_url = 'https://api.twitter.com/2/tweets/search/recent' encoded_parameter = urllib.parse.urlencode(parameter) token_header = {'Authorization': f'Bearer {bearer_token}'} response = requests.request('GET', endpoint_url, params=encoded_parameter, headers=token_header) response_json = response.json() with open('tr1_data.json', mode='w', encoding='utf-8') as w: json.dump(response_json, w, indent=4, ensure_ascii=False) **その2 [#ib5c948d] パラメータを色々設定して取得してみよう。~ import urllib import requests import json bearer_token = r'ここに各自のbearer tokenを入力する。' parameter = { 'query': 'アニメ', 'max_results': 20, 'tweet.fields': 'attachments,author_id,context_annotations,conversation_id,created_at,entities,geo,id,in_reply_to_user_id,lang,public_metrics,possibly_sensitive,referenced_tweets,reply_settings,source,text,withheld', 'user.fields': 'created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected,public_metrics,url,username,verified,withheld', 'media.fields': 'duration_ms,height,media_key,preview_image_url,type,url,width,public_metrics,alt_text', 'place.fields': 'contained_within,country,country_code,full_name,geo,id,name,place_type', 'poll.fields': 'duration_minutes,end_datetime,id,options,voting_status', 'expansions': 'attachments.poll_ids,attachments.media_keys,author_id,entities.mentions.username,geo.place_id,in_reply_to_user_id,referenced_tweets.id,referenced_tweets.id.author_id', } endpoint_url = 'https://api.twitter.com/2/tweets/search/recent' encoded_parameter = urllib.parse.urlencode(parameter) token_header = {'Authorization': f'Bearer {bearer_token}'} response = requests.request('GET', endpoint_url, params=encoded_parameter, headers=token_header) response_json = response.json() with open('tr2_data.json', mode='w', encoding='utf-8') as w: json.dump(response_json, w, indent=4, ensure_ascii=False) **その3 [#p892f291] 繰り返しリクエストし、取得してみよう。~ import urllib import requests import json bearer_token = r'ここに各自のbearer tokenを入力する。' parameter = { 'query': 'アニメ', 'max_results': 20, 'tweet.fields': 'attachments,author_id,context_annotations,conversation_id,created_at,entities,geo,id,in_reply_to_user_id,lang,public_metrics,possibly_sensitive,referenced_tweets,reply_settings,source,text,withheld', 'user.fields': 'created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected,public_metrics,url,username,verified,withheld', 'media.fields': 'duration_ms,height,media_key,preview_image_url,type,url,width,public_metrics,alt_text', 'place.fields': 'contained_within,country,country_code,full_name,geo,id,name,place_type', 'poll.fields': 'duration_minutes,end_datetime,id,options,voting_status', 'expansions': 'attachments.poll_ids,attachments.media_keys,author_id,entities.mentions.username,geo.place_id,in_reply_to_user_id,referenced_tweets.id,referenced_tweets.id.author_id', } next_token = None endpoint_url = 'https://api.twitter.com/2/tweets/search/recent' for _ in range(2): try: with open('tr3_data.json', mode='r', encoding='utf-8') as r: data_list = json.load(r) except FileNotFoundError: data_list = [] if next_token is not None: parameter['next_token'] = next_token encoded_parameter = urllib.parse.urlencode(parameter) token_header = {'Authorization': f'Bearer {bearer_token}'} response = requests.request('GET', endpoint_url, params=encoded_parameter, headers=token_header) response_json = response.json() data_list.append(response_json) next_token = response_json.get('meta').get('next_token') with open('tr3_data.json', mode='w', encoding='utf-8') as w: json.dump(data_list, w, indent=4, ensure_ascii=False) *参考 [#ie6be010] -Twitter API reference( https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference ) -Search tweets recent reference( https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent ) -build query( https://developer.twitter.com/en/docs/twitter-api/tweets/search/integrate/build-a-query ) -Tweet object( https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet ) -User object( https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/user ) -Media object( https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media ) -Place objects( https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place ) -Poll object( https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll )