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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1089閲覧

pythonでtwitterのリツイート情報を取得したい

aki_CJ

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/02 09:55

前提・実現したいこと

pythonを使用してtwitterのリツイート情報を取得したいです。
ネットにあった下記ソースの必要そうな箇所(27~30行、38行)を修正して実行したのですが、下記のようなエラーが出てしまいました。
エラーの原因を調べたのですが、プログラム自体ほぼ初心者なこともあり解決できませんでした。
申し訳ございませんが原因がわかる方がいたら教えていただきたいです。

発生している問題・エラーメッセージ

--------送信するリクエスト数合計:1-------------
Traceback (most recent call last):
File "D:\xxx\xxx\xxx\get_retweet.py", line 64, in <module>
requests_limit = api_response.headers['X-rate-limit-remaining']#リクエスト可能残数の取得
File "C:\Users\xxx\AppData\Roaming\Python\Python39\site-packages\requests\structures.py", line 54, in getitem
return self._store[key.lower()][1]
KeyError: 'x-rate-limit-remaining'

該当のソースコード

python

1#coding:utf-8 2#!/usr/bin/env Python 3from requests_oauthlib import OAuth1Session 4import json 5import csv 6import collections as cl 7import datetime,sys,time 8''' 9OAuth認証 10''' 11def request_authorization (**url_and_params): 12 twitter = OAuth1Session(url_and_params['ck'], url_and_params['cs'], url_and_params['at'], url_and_params['ats']) 13 if('params' in url_and_params): 14 request_result = twitter.get(url_and_params['request_url'],params=url_and_params['params']) 15 else: 16 request_result = twitter.get(url_and_params['request_url']) 17 return request_result 18''' 19API制限をチェックし、制限解除までスリープ 20''' 21def sleep_until_api_limit(api_response): 22 sec = int(api_response.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple()) #UTCを秒数に変換 23 sec += 60.0#念のため1分追加 24 print(str(sec)+"秒待機") 25 time.sleep(sec) 26#取得した4つのkeyをここに差し込みます。 27CK = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer key 28CS = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer secret 29AT = "XXXXXXXXXXXXXXXXXXXXXX" #Access token 30AS = "XXXXXXXXXXXXXXXXXXXXXX" #Access token secret 31global twitter#メソッド内で再認証を行うため 32twitter = OAuth1Session(CK, CS, AT, AS)#認証処理。数時間すると認証が切れる。 33# ツイート情報取得用エンドポイントURL 34request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json" 35''' 36情報を取得したいTweetIDをリストに格納 37''' 38tweet_id_list = ["XXXXX","XXXXX","XXXXX"] #リツイート情報を取得したい TweetID をここに差し込みます。 39tweet_id_list.sort() 40total_requests_number = len(tweet_id_list) 41print("--------"+"送信するリクエスト数合計:" + str(total_requests_number)+"-------------") 42''' 43TwitterからUserID情報の取得開始 44''' 45sched_requests_number = 0 #リクエストしたtweet_idの数 46should_get_requests_limit = True #API上限数を取得するためのスイッチ 47i_plus = 1 #API上限数を取得するためのスイッチ 48requests_count = 0 #「API上限までリクエストを送る」を実行するのは何回目かカウントする用 49error_count = 0 #エラーを返された回数をカウントする用 50output_csv_file_name = 'retweet_info.csv' #取得した値を格納ファイル名 51''' 52ループ開始前にカラムへ書き込み 53''' 54with open(output_csv_file_name,'a') as f: 55 writer = csv.writer(f, lineterminator='\n') 56 header = ['tweet_id', 'retweet_id', 'user_id', 'created_at'] 57 writer.writerow(header) 58''' 59ループ開始。retweet_idの書き込み。 60''' 61for i in range(0,total_requests_number,i_plus): 62 if(should_get_requests_limit == True): 63 api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS) 64 requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得 65 requests_limit = int(requests_limit)#limitが文字列なのでキャスト 66 requests_count += 1 67 print("--------"+str(requests_count)+"回目。今回送信するリクエスト数:" + str(requests_limit)+"--------------------") 68 sched_requests_number += requests_limit 69 should_get_requests_limit = False 70 if(requests_limit != 0): 71 i_plus = 1 72 print(str(i) + ":リクエストしたtweetID:" + str(tweet_id_list[i])+"---------") 73 request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id_list[i])+".json?count=10&trim_user=false" 74 params = {'tweet_id':tweet_id_list[i]} 75 request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params) 76 if request_result.status_code == 200: 77 tweetinfo = json.loads(request_result.text)#JSON形式で読み込む 78 for j in range(0,len(tweetinfo)): 79 print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id'])) 80 followerdata = {'tweet_id':tweet_id_list[i], 81 'retweet_id':tweetinfo[j]['id'], 82 'user_id':tweetinfo[j]['user']['id'], 83 'created_at':tweetinfo[j]['created_at']} 84 with open(output_csv_file_name, 'a') as f: 85 writer = csv.writer(f, lineterminator='\n') 86 writer.writerow(followerdata.values()) 87 else: 88 print ("Error: %d" % request_result.status_code) 89 error_count += 1 90 print("Error数:"+str(error_count)) 91 else: 92 i_plus = 0 #limitが0のままiが1増えてしまうと実行されないTweeetIDが発生するので、0入れて増やさない。 93 if(i == sched_requests_number): 94 print("--------"+"残りリクエスト数" + str(total_requests_number-requests_limit) + "-------------") 95 sleep_until_api_limit(api_response) 96 should_get_requests_limit = True

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sfdust

2020/11/02 10:37

api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS) の直下に print(api_response.status_code) という文を入れて実行した場合、「--------送信するリクエスト数合計:1-------------」の下にどのような数字が出ますか? 「401」が出る場合、CT,CS,AT,ASのいずれかのトークンが誤っているか、他の要因で、正常に認証できていません。 https://developer.twitter.com/ja/docs/basics/response-codes
aki_CJ

2020/11/04 00:57

返信ありがとうございます。 401が出力されたので、CT,CS,AT,ASを再度修正して実行したところ10件ですが、リツイート情報を取得することができました。 ありがとうございました!
guest

回答1

0

ベストアンサー

endpointを

request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json"

と書いてますが、その変数を使っているのはrate limitを取得している部分です。
そこはrate limitを取得するURLになっていたのではないですか?
そうであれば元に戻しましょう。

参考
https://developer.twitter.com/en/docs/twitter-api/v1/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status

投稿2020/11/03 00:37

編集2020/11/03 00:37
quickquip

総合スコア11038

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

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

aki_CJ

2020/11/04 00:57

ありがとうございます。 返信ありがとうございます。 CT,CS,AT,ASを再度修正して実行したところ10件ですが、リツイート情報を取得することができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問