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

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

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

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

Python

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

API

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

Q&A

解決済

2回答

3045閲覧

twitter apiでのツイート取得ができない

退会済みユーザー

退会済みユーザー

総合スコア0

Twitter

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

Python

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

API

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

0グッド

0クリップ

投稿2022/01/06 14:27

編集2022/01/06 14:35

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

原因はtwitter apiが2021年にv2が主要になり, 最近登録した自分もv2だったが, サンプルコードはv1用のものであったことでした.主要な関数の仕様が変更されており, 実行できません.

投稿2022/01/07 12:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

「リクエストが無効になっている」と記載されておりますが…
厳密には「無効なリクエストが投げられている」です。

つまり、リクエストを投げるところまではよくて、投げられたリクエストの内容に問題がありそうな気がしています。

■よくあること
①アクセストークンや、セキュリティキーを誤って設定している。
②存在しないオプションを設定している。(APIのアップデートなどが原因)

もとの記事を見たところかなり古いものと思われます。
もしかしたら実行の仕方が変わっているのかもしれません。

■対応策
・アクセストークン、セキュリティキーなどの固有情報の見直し。
→誤字脱字もそうですが、指定の仕方も合わせて確認する。

・まずは簡単な1行コードから動作を確認する
→状況の切り分けが必要、本当にこのコマンドが原因か、など。

・実行コマンドのフォーマットを確認する
→コマンドでググれば公式に飛べるでしょう、実行時に指定が必要なものをご確認ください。

投稿2022/01/07 03:11

編集2022/01/07 03:13
haihaikazuma

総合スコア181

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

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

退会済みユーザー

退会済みユーザー

2022/01/07 05:55

回答ありがとうございます!keyを修正したところ, errorが403に変わりました.またtwitter apiを使ったもっと簡易的なコードをこちらの(https://www.learning-nao.com/?p=1985)サイトでみつけ, 実行した際にも同様のエラーが出ました.調べるとCallback URLsというものが関係しているらしいのですが, 修正の方法がわからず, 苦戦しています. api keyを使うコードにはエラーが出て, bearer keyを使うコードでは出ないため, それらも何かしら関係しているのかなと調べています. 良ければ教えていただけると幸いです
haihaikazuma

2022/01/07 06:19

すいませんが私はPythonも使ったことがなく知識に明るいわけではありません。 共有いただいたサイトを確認したところ、サンプルコードの8行目に以下があります。 auth = tweepy.OAuthHandler(API_Key, API_Sec) こちらに、callback_urlを追加して… auth = tweepy.OAuthHandler(API_Key, API_Sec, Callback_Url) …の形になるのではないでしょうか。 私はTwitter APIの開発者ページを知らないので存在するか分かりませんが、アクセストークンを発行する開発者ページのようなものはありますか?もしかしたらそこからcallback_urlが分かるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問