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

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

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

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

Twitter

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

Python

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

Q&A

解決済

1回答

414閲覧

Twitter API の呼び出しのタイミングは?

hajifu

総合スコア88

Python 3.x

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

Twitter

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

Python

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

0グッド

0クリップ

投稿2019/05/01 14:44

背景

最近Pythonを学習している者です。
今、tweepyを使ってTwitterの自分のフォローやフォロワーの情報を得たり、条件に沿ってフォロー解除するプログラムを作成しています。

##問題 TweepError?で終了してしまう

しかしフォロワー4-500くらいならば情報を得ることはできたのですが、2000人近く読み込むときにエラーになってしまいます。
その他にも下記のような自分のツイート500件取得してRT/favしてくれた人の一覧を得るプログラムを作ったのですが、そちらもエラーになってしまいます(件数小さい規模ならうまくいきました)

Twitter apiの呼び出し制限にかかっていると思われたので、下記のようなtry: except:を使って回避を試みましたがエラーで終了してしまいます。

python

1import tweepy 2import json 3import re 4import csv 5import urllib.request 6from tqdm import tqdm 7from time import sleep 8from tweepy.error import TweepError 9 10CONSUMER_KEY = "0000000000000000000000000" 11CONSUMER_SECRET = "0000000000000000000000000" 12ACCESS_TOKEN = "0000000000000000000000000" 13ACCESS_TOKEN_SECRET = "0000000000000000000000000" 14 15auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 16auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) 17api = tweepy.API(auth, wait_on_rate_limit = True) 18 19# リツイート・ファボした人の空のリスト用意 20rt_acount = [] 21fav_acount = [] 22pages = [1, 2, 3, 4, 5] 23retry = 0 24def RtFav_collection(pages, counts): 25 global rt_acount 26 global fav_acount 27 global retry 28 counta = counts 29 for page in pages: 30 try: 31 usertimeline = api.user_timeline(id="hogehoge_hoge", count=100, page=page) 32 print("===============", page, "ページ目の取得開始! ===============") 33 34 # ↓●ページ目の△ツイート目でエラーになった場合△ツイート目から再開できるようにしたかった 35 if counta >= 100: 36 counta = 0 37 elif counta != 0: 38 del usertimeline[0:counta:1] 39 print(counta + 1, "ツイート目から再開") 40 41 for retweeter in tqdm(usertimeline): 42 retwe = api.retweets(id=retweeter.id_str) 43 for rt in retwe: 44 rt_id = rt.user.screen_name 45 if rt_id not in rt_acount: 46 rt_acount.append(rt_id) 47 print("rt追加 3秒待機します。") 48 sleep(3) 49 # usertimeline を参照しファボした人も同様にリストに追加 50 json_data = urllib.request.urlopen('https://twitter.com/i/activity/favorited_popup?id=' + retweeter.id_str).read() 51 # json_data をstrに変換 52 json_data = json_data.decode("utf8") 53 found_ids = re.findall(r'data-screen-name=\"+\w+', json_data) 54 for fav in found_ids: 55 fav_id = fav.replace('data-screen-name=\"',"").strip() 56 if fav_id not in fav_acount: 57 fav_acount.append(fav_id) 58 print("fav追加 3秒待機します。") 59 sleep(3) 60 counta += 1 61 except TweepError: 62 print("================= 制限に到達したため15分スリープして再開します =================") 63 retry += 1 64 if retry == 3: 65 print("エラー 終了") 66 break 67 sleep(60 * 15 + 10) 68 print("再開します。") 69 pages = list(i * 1 for i in range(page, 6)) 70 RtFav_collection(pages, counta) 71 72RtFav_collection(pages, 0) 73 74if "hogehoge_hoge" in rt_acount: 75 rt_acount.remove("hogehoge_hoge") 76if "hogehoge_hoge" in fav_acount: 77 fav_acount.remove("hogehoge_hoge") 78 79with open(r"C:\Users\ユーザー名\Desktop\snspython\rt_acount.csv", "a") as f: 80 writer = csv.writer(f) 81 writer.writerow(rt_acount) 82 print("過去1年にリツイートした人を rt_acount.csv に保存しました。") 83 84with open(r"C:\Users\ユーザー名\Desktop\snspython\fav_acount.csv", "a") as f: 85 writer = csv.writer(f) 86 writer.writerow(fav_acount) 87 print("過去1年いいねした人を fav_acount.csv に保存しました。") 88

##知りたいこと
上記コードの問題点。

また、今後もTwitter apiを使って開発するうえで似たような問題に対処するため、
この制限にかかる"呼び出し"というのが一体どのタイミングなのか教えていただきたいです。

このコードでいう、「api.」という部分で呼び出しているということでしょうか?
そうならばできるだけ「api.
」を減らしたり一回の呼び出しで多く取得するようにすればいいのでしょうか?
また呼び出しの制限は、種類を問わず15分に15回ということなのでしょうか?

宜しくお願い致します。
なにぶん初心者ですので、基本的なことや根本的なこともご指摘いただければと思います。
文脈を読む努力はしつつもいろんなサイトから切り貼りしたプログラムですので、根本的なことがわかっていない可能性があります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このコードでいう、「api.~」という部分で呼び出しているということでしょうか?

実際に利用したわけではないのですが、以下のリファレンスとgithubから確認した感じだとapi.***で一度TwitterAPIを叩いているように思います。

tweepyのリファレンス

また呼び出しの制限は、種類を問わず15分に15回ということなのでしょうか?

呼び出すものによって違いますので、正確に確認したいなら以下を参照してください。
制限がかかっていることからおそらく無料のアカウントだと思いますので、それぞれのページでStandard (free)の箇所を参照すればいいかと思います。また、それぞれによって、100件分しか取れないなどの制限もあるので、解除したい場合は課金が必要になるかと思います。

TwitterAPIデベロッパーの料金体系など

投稿2019/05/07 09:08

Yuki_S

総合スコア356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問