def postTweet(session, res_text, src_tweet_id): unavailableCnt = 0 url = "https://api.twitter.com/1.1/statuses/update.json" #ツイートポストエンドポイント while True: reset = check_limit.checkLimit(session) try: res = session.post(url, params={ 'status': res_text, 'in_reply_to_status_id': src_tweet_id }) except SocketError as e: print('ソケットエラー errno=', e.errno) if unavailableCnt > 10: raise check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) unavailableCnt += 1 continue if res.status_code == 503: # 503 : Service Unavailable if unavailableCnt > 10: raise Exception('Twitter API error %d' % res.status_code) unavailableCnt += 1 print('Service Unavailable 503') check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) continue if res.status_code == 403: #post文重複対策 res_text = res_text + '_' unavailableCnt += 1 continue unavailableCnt = 0 if res.status_code != 200: raise Exception('Twitter API error %d' % res.status_code) else: break
def main_loop(search_word, session): total = -1 total_count = 0 cnt = 0 url = 'https://api.twitter.com/1.1/search/tweets.json' # ツイートを検索して取得するためのエンドポイント loop_start_time = get_tweet.FIRST_LOOP_START_TIME # 1回のループで100ツイートを取得します。 while True: next_reset_time = check_limit.checkLimit( session) # 回数制限を迎えていたら回復するまで待機。 tweets_get_time = time.mktime( datetime.datetime.now().timetuple()) #現在時刻取得 unavailableCnt = 0 # ツイートの取得に失敗した回数。 try: res = session.get(url, params={ 'q': search_word, 'count': 100 }) # 検索し、100件のツイートを取得。 except SocketError as e: print('ソケットエラー errno=', e.errno) if unavailableCnt > 10: raise check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) unavailableCnt += 1 continue if res.status_code == 503: # 503 : Service Unavailable if unavailableCnt > 10: raise Exception('Twitter API error %d' % res.status_code) unavailableCnt += 1 print('Service Unavailable 503') check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) continue if res.status_code != 200: raise Exception('Twitter API error %d' % res.status_code) loop_start_time, count, total_text = get_tweet.getTweet( res, loop_start_time, next_reset_time, session) # 100件のツイートからリプライのみを抽出してペアで取得する。 # ファイル書き込み date = datetime.date.today() fname = 'tweet/' + search_word + 'tweet' + str(date) + '.txt' if not os.path.exists("tweet"): os.mkdir("tweet") f = open(fname, 'a', encoding='utf-8') for i in range(0, len(total_text)): f.write(str(total_text[i]) + "\n") f.close() total_count += count print('total_count=', total_count, 'start_time=', loop_start_time) current_time = time.mktime(datetime.datetime.now().timetuple()) # 処理時間が2秒未満なら2秒wait if current_time - tweets_get_time < 2: check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 2) #デバッグ用 if total > 0: cnt += 100 if total > 0 and cnt >= total: break
def main_loop(search_word, session): get_words_total_count = 0 url = 'https://api.twitter.com/1.1/search/tweets.json' # ツイートを検索して取得するためのエンドポイント loop_start_time = get_tweet.FIRST_LOOP_START_TIME # 1回のループで100ツイートを取得します。 while True: next_reset_time = check_limit.checkLimit( session) # 回数制限を迎えていたら回復するまで待機。 tweets_get_time = time.mktime( datetime.datetime.now().timetuple()) #現在時刻取得 unavailableCnt = 0 # ツイートの取得に失敗した回数。 try: res = session.get(url, params={ 'q': search_word, 'count': 100 }) # 検索し、100件のツイートを取得。 except SocketError as e: print('ソケットエラー errno=', e.errno) if unavailableCnt > 10: raise check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) unavailableCnt += 1 continue if res.status_code == 503: # 503 : Service Unavailable if unavailableCnt > 10: raise Exception('Twitter API error %d' % res.status_code) unavailableCnt += 1 print('Service Unavailable 503') check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) continue if res.status_code != 200: raise Exception('Twitter API error %d' % res.status_code) loop_start_time, count, total_text = get_tweet.getTweet( res, loop_start_time, next_reset_time, session) # 100件のツイートからリプライのみを抽出してペアで取得する。 # ファイル書き込み date = datetime.date.today() write_to_file(total_text, search_word + 'tweet' + str(date)) get_words_total_count += count print('total_count=', get_words_total_count, 'start_time=', loop_start_time) current_time = time.mktime(datetime.datetime.now().timetuple()) # 処理時間が2秒未満なら2秒wait if current_time - tweets_get_time < 2: check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 2)
def getTweet(res, start_time, reset, session): res_text = json.loads(res.text) url1 = 'https://api.twitter.com/1.1/statuses/user_timeline.json' #今回こちらは使わない url2 = 'https://api.twitter.com/1.1/statuses/lookup.json' cnt_req = 0 max_tweet = start_time total_text = [] # tweet本文(発話/応答)のリスト tweet_list = [] # n_reply_to_status_idと応答tweetの対のリスト # 応答tweetを探す。 for tweet in res_text['statuses']: status_id = tweet['in_reply_to_status_id_str'] # 発言tweetのid tweet_id = tweet['id'] # 応答tweetのid if status_id != None: # 当該tweetが応答かどうかの判断 tweet_time = tweet_id2time(tweet_id) if tweet_time <= start_time: # 前回処理より新しいtweetのみ処理する continue if max_tweet < tweet_time: max_tweet = tweet_time res_sentence = tweet['text'] #RTを対象外にする if res_sentence[0:3] == "RT ": continue res_sentence = screening(res_sentence) if res_sentence == '': continue tweet_list.append([status_id, res_sentence]) # 発言側idと応答文 if len(tweet_list) == 0: # 1つも応答tweetが無かった時。 return max_tweet, cnt_req, total_text #複数status_idを連結する id_list = tweet_list[0][0] for i in range(1, len(tweet_list)): id_list += ',' id_list += tweet_list[i][0] #--------------------------------------------------------------------------* # * # 発話tweet抽出取得 * # * #--------------------------------------------------------------------------* #複数status_id指定で発話tweet取得 unavailableCnt = 0 while True: try: req = session.get(url2, params={ 'id': id_list, 'count': len(tweet_list) }) # 発言tweetの取得。 except SocketError as e: print('ソケットエラー errno=', e.errno) if unavailableCnt > 10: raise check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) unavailableCnt += 1 continue if req.status_code == 503: # 503 : Service Unavailable if unavailableCnt > 10: raise Exception('Twitter API error %d' % res.status_code) unavailableCnt += 1 print('Service Unavailable 503') check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) continue unavailableCnt = 0 if req.status_code == 200: req_text = json.loads(req.text) break else: raise Exception('Twitter API error %d' % res.status_code) # 発話tweet本文スクリーニング for i in range(0, len(tweet_list)): for j in range(0, len(req_text)): if req_text[j]['id_str'] == tweet_list[i][0]: req_sentence = req_text[j]['text'] if len(req_text) <= 0: print(req_text) continue req_sentence = req_text[j]['text'] #RTを対象外にする if req_sentence[0:3] == "RT ": continue req_sentence = screening(req_sentence) #スクリーニングの結果、ブランクだったら対象外 if req_sentence == '': continue # 発話tweetと応答tweetを対で書き込み if req_sentence != tweet_list[i][1]: total_text.append("REQ:" + req_sentence) total_text.append('RES:' + tweet_list[i][1]) cnt_req += 1 max_tweet = max(max_tweet, start_time) return max_tweet, cnt_req, total_text
reset = check_limit.checkLimit(session) # 回数制限確認 get_time = time.mktime(datetime.datetime.now().timetuple()) #getの時刻取得 try: res = session.get(url, params={ 'q': setting.BOT_SCREEN_NAME, 'since_id': since_id, 'count': 100 }) # Botへのメンションツイートの確認 except SocketError as e: print('ソケットエラー errno=', e.errno) if unavailableCnt > 10: raise check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) unavailableCnt += 1 continue if res.status_code == 503: # 503 : Service Unavailable if unavailableCnt > 10: raise Exception('Twitter API error %d' % res.status_code) unavailableCnt += 1 print('Service Unavailable 503') check_limit.waitUntilReset( time.mktime(datetime.datetime.now().timetuple()) + 30) continue if res.status_code != 200: