twitter apiを用いてツイートの取得を目指しておりますこちらのサイトにあったサンプルコードを実行しましたが, 400errorを吐きうまくいきません.consumer keyとapi keyを同一の物として扱ってよいのかもわかりません.
エラーは
python
1 if res.status_code != 200: 2 raise Exception('Twitter API error %d' % res.status_code) 3
の部分に出ております.コード全体は文字数制限上記載できないため, エラーの出た部分までを記載しており, 参考元のページのほうが正確です.
エラー内容
Traceback (most recent call last): File "conversation_py3.py", line 334, in <module> reset = checkLimit(session) File "conversation_py3.py", line 238, in checkLimit raise Exception('Twitter API error %d' % res.status_code) Exception: Twitter API error 400
400 errorはリクエストが無効になっているらしいのですが, 原因がよくわからず苦戦しています 知識のある方教えていただけると幸いです
python
1 * 2# tweet_idから時刻情報を取得する * 3# * 4#******************************************************************************* 5def tweet_id2time(tweet_id) : 6 id_bin = bin(tweet_id>>22) 7 tweet_time=int(id_bin,2) 8 tweet_time += 1288834974657 9 return tweet_time 10 11def getTweet(res,start_time,reset): 12 res_text = json.loads(res.text) 13 url1 = 'https://api.twitter.com/1.1/statuses/user_timeline.json' #今回こちらは使わない 14 url2 = 'https://api.twitter.com/1.1/statuses/lookup.json' 15 16 cnt_req = 0 17 max_tweet=start_time 18 19 total_text = [] # tweet本文(発話/応答)のリスト 20 tweet_list = [] # n_reply_to_status_idと応答tweetの対のリスト 21 for tweet in res_text['statuses']: 22 status_id = tweet['in_reply_to_status_id_str'] 23 tweet_id=tweet['id'] # 応答tweetのid 24 25 if status_id != None : # 当該tweetが応答かどうかの判断 26 27 tweet_time = tweet_id2time(tweet_id) 28 if tweet_time <= start_time : # 前回処理より新しいtweetのみ処理する 29 continue 30 31 if max_tweet < tweet_time : 32 max_tweet = tweet_time 33 34 res_sentence = tweet['text'] 35 #RTを対象外にする 36 if res_sentence[0:3] == "RT " : 37 continue 38 39 res_sentence = screening(res_sentence) 40 if res_sentence == '' : 41 continue 42 43 tweet_list.append([status_id,res_sentence]) 44 45 46 if len(tweet_list) == 0 : 47 return max_tweet,cnt_req ,total_text 48 49 #複数status_idを連結する 50 id_list = tweet_list[0][0] 51 for i in range(1,len(tweet_list)) : 52 id_list += ',' 53 id_list += tweet_list[i][0] 54 55 56 #複数status_id指定で発話tweet取得 57 unavailableCnt = 0 58 while True : 59 try : 60 req = session.get(url2, params = {'id':id_list ,'count':len(tweet_list)}) 61 except SocketError as e: 62 print('ソケットエラー errno=',e.errno) 63 if unavailableCnt > 10: 64 raise 65 66 waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 67 unavailableCnt += 1 68 continue 69 70 if req.status_code == 503: 71 # 503 : Service Unavailable 72 if unavailableCnt > 10: 73 raise Exception('Twitter API error %d' % res.status_code) 74 75 unavailableCnt += 1 76 print ('Service Unavailable 503') 77 waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 78 continue 79 80 unavailableCnt = 0 81 82 if req.status_code == 200 : 83 req_text = json.loads(req.text) 84 break 85 else : 86 raise Exception('Twitter API error %d' % res.status_code) 87 88 # 発話tweet本文スクリーニング 89 for i in range(0,len(tweet_list)) : 90 for j in range(0,len(req_text)) : 91 if req_text[j]['id_str'] == tweet_list[i][0] : 92 req_sentence = req_text[j]['text'] 93 94 if len(req_text) <= 0 : 95 print(req_text) 96 continue 97 98 req_sentence = req_text[j]['text'] 99 #RTを対象外にする 100 if req_sentence[0:3] == "RT " : 101 continue 102 103 req_sentence = screening(req_sentence) 104 105 #スクリーニングの結果、ブランクだったら対象外 106 if req_sentence == '' : 107 continue 108 # 発話tweetと応答tweetを対で書き込み 109 if req_sentence != tweet_list[i][1] : 110 total_text.append("REQ:"+req_sentence) 111 total_text.append('RES:'+tweet_list[i][1]) 112 cnt_req += 1 113 114 max_tweet = max(max_tweet,start_time) 115 return max_tweet,cnt_req ,total_text 116 117 118# tweet本文スクリーニング 119 120# In[2]: 121 122 123def screening(text) : 124 s = text 125 126 #RTを外す 127 if s[0:3] == "RT " : 128 s = s.replace(s[0:3],"") 129 #@screen_nameを外す 130 while s.find("@") != -1 : 131 index_at = s.find("@") 132 if s.find(" ") != -1 : 133 index_sp = s.find(" ",index_at) 134 if index_sp != -1 : 135 s = s.replace(s[index_at:index_sp+1],"") 136 else : 137 s = s.replace(s[index_at:],"") 138 else : 139 s = s.replace(s[index_at:],"") 140 141 #改行を外す 142 while s.find("\n") != -1 : 143 index_ret = s.find("\n") 144 s = s.replace(s[index_ret],"") 145 146 #URLを外す 147 s = re.sub(r'https?://[\w/:%#$&?()~.=+\-…]+', "", s) 148 #絵文字を「。」に置き換え その1 149 non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), '。') 150 s = s.translate(non_bmp_map) 151 #絵文字を「。」に置き換え その2 152 s=''.join(c if c not in emoji.UNICODE_EMOJI else '。' for c in s ) 153 154 #置き換えた「。」が連続していたら1つにまとめる 155 while s.find('。。') != -1 : 156 index_period = s.find('。。') 157 s = s.replace(s[index_period:index_period+2],'。') 158 159 #ハッシュタグを外す 160 while s.find('#') != -1 : 161 index_hash = s.find('#') 162 s = s[0:index_hash] 163 164 return s 165 166 167# 回数制限を問合せ、アクセス可能になるまで wait する 168 169# In[3]: 170 171 172 173def checkLimit(session): 174 unavailableCnt = 0 175 url = "https://api.twitter.com/1.1/application/rate_limit_status.json" 176 177 while True : 178 try : 179 res = session.get(url) 180 except SocketError as e: 181 print('erron=',e.errno) 182 print('ソケットエラー') 183 if unavailableCnt > 10: 184 raise 185 186 waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 187 unavailableCnt += 1 188 continue 189 190 if res.status_code == 503: 191 # 503 : Service Unavailable 192 if unavailableCnt > 10: 193 raise Exception('Twitter API error %d' % res.status_code) 194 195 unavailableCnt += 1 196 print ('Service Unavailable 503') 197 waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 198 continue 199 200 unavailableCnt = 0 201 202 if res.status_code != 200: 203 raise Exception('Twitter API error %d' % res.status_code) 204 205 remaining_search,remaining_user, remaining_limit ,reset = getLimitContext(json.loads(res.text)) 206 if remaining_search <= 1 or remaining_user <=1 or remaining_limit <= 1: 207 waitUntilReset(reset+30) 208 else : 209 break 210 211 sec = reset - time.mktime(datetime.datetime.now().timetuple()) 212 print(remaining_search,remaining_user, remaining_limit ,sec) 213 return reset 214 215 216def waitUntilReset(reset): 217 seconds = reset - time.mktime(datetime.datetime.now().timetuple()) 218 seconds = max(seconds, 0) 219 print ('\n =====================') 220 print (' == waiting %d sec ==' % seconds) 221 print (' =====================') 222 sys.stdout.flush() 223 time.sleep(seconds + 10) # 念のため + 10 秒 224 225 226
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。