質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1504閲覧

Twitter API v2で、一定数以上リツイートされているツイートのみを取得したい

amemidaifuku

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/07/16 17:46

編集2022/07/16 23:47

前提

twitter api v2とpython3.10.4を使っています。クエリを用いて検索する際に、リツイート数が一定数以上のツイートを取得したいです。

実現したいこと

  • リツイート数が一定数以上のツイートを取得する

該当のソースコード

こちらのサイトからお借りしています。

python

1import datetime 2import json 3import time 4import urllib 5import requests 6import tqdm 7 8 9def request_search(bearer_token, params, max_count): 10 # ツイートデータ 11 tweets = [] 12 # 追加データ 13 expanded = { 14 "tweets": [], 15 "users": [], 16 "media": [], 17 "places": [], 18 "polls": [], 19 } 20 21 # 次のページのトークン 22 next_token = None 23 24 # 毎ページ処理を繰り返す 25 while True: 26 # `next_token` があるとき(=初回以外)はパラメータに設定する 27 if next_token is not None: 28 params["next_token"] = next_token 29 30 # API にリクエストを送信する 31 url = "https://api.twitter.com/2/tweets/search/recent" 32 encoded_params = urllib.parse.urlencode(params) 33 headers = {"Authorization": f"Bearer {BEARER_TOKEN}"} 34 res = requests.request( 35 "GET", url, params=encoded_params, headers=headers) 36 print("*", end="") 37 38 # rate limit に引っかかったときは解除されるまで待つ 39 if res.status_code == 429: 40 rate_limit_reset = int(res.headers["x-rate-limit-reset"]) 41 now = time.mktime(datetime.datetime.now().timetuple()) 42 wait_sec = int(rate_limit_reset - now) 43 desc = f"Waiting for {wait_sec} seconds" 44 for _ in tqdm.trange(wait_sec, desc=desc): 45 time.sleep(1) 46 47 # それ以外のエラーのときはエラーを投げる 48 elif res.status_code != 200: 49 raise Exception(res.status_code, res.text) 50 51 # 正常に処理されたとき 52 else: 53 res_json = res.json() 54 55 # データが0件になったら終了する 56 if res_json["meta"]["result_count"] == 0: 57 break 58 59 # リストにデータを追加する 60 tweets += res_json["data"] 61 print(f"{len(tweets)}件のツイートを取得しました。") 62 63 # リストに追加データを追加する 64 if res_json.get("includes"): 65 includes = res_json["includes"] 66 for k, v in expanded.items(): 67 if includes.get(k): 68 expanded[k] += includes[k] 69 70 # `next_token` がない(=データを全て取得)or 取得数の上限に達したときは終了する 71 next_token = res_json.get("meta").get("next_token") 72 if next_token is None or len(tweets) >= max_count: 73 break 74 75 return tweets[:max_count], expanded 76 77 78def export_json(fpath, data): 79 with open(fpath, "w", encoding="utf-8") as f: 80 json.dump(data, f, ensure_ascii=False) 81 82 83if __name__ == "__main__": 84 bearer_token = "" # Twitter API のトークン 85 max_count = 10 # ツイート取得数の上限(Essential で最大50万件、Elevated で最大200万件) 86 87 # API のパラメータ 88 params = { 89 "query": "雨 綺麗 -is:retweet min_retweets:100", 90 "start_time": "2022-07-16T00:00:00+09:00", 91 "end_time": "2022-07-16T23:59:59+09:00", 92 # "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", 93 "max_results": "10", 94 # "media.fields": "duration_ms,height,media_key,preview_image_url,type,url,width,public_metrics", 95 # "place.fields": "contained_within,country,country_code,full_name,geo,id,name,place_type", 96 # "poll.fields": "duration_minutes,end_datetime,id,options,voting_status", 97 # "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", 98 # "user.fields": "created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected,public_metrics,url,username,verified,withheld", 99 } 100 101 # ツイートを取得する 102 tweets, expanded = request_search(bearer_token, params, max_count) 103 104 # データを json に書き出す 105 export_json("tweets.json", tweets) 106 export_json("expanded.json", expanded) 107

試したこと

v1.1と同様にmin_retweets:100のように指定しましたが、実行されませんでした。

Exception: (400, '{"errors":[{"parameters":{"query":["雨 綺麗 -is:retweet min_retweets:100"]},"message":"There were errors processing your request: Reference to invalid operator \'min_retweets\'. Operator is not available in current product or product packaging. Please refer to complete available operator list at http://t.co/operators. (at position 18), Reference to invalid field \'min_retweets\' (at position 18)"}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}')

補足

とりあえず手当たり次第に検索しその中からリツイート数の多いものを見つけるのではなく、検索段階でフィルタを掛けたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2022/07/16 23:37

提示ソースにはmin_retweetsは指定されていませんが、意図通りのコードでしょうか。 また実行されなかったとは具体的にどのような結果になったということでしょうか。
amemidaifuku

2022/07/17 00:07

その通りです。 URLのような比較ページがあるのですね、確認不足でした。公式で提供されていないとなると難しそうですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問