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

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

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

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Python 3.x

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

Python

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

API

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

Q&A

2回答

1161閲覧

Imgur APIのレート制限に達していないのに429 Too Many Requestsが返される。

Avent

総合スコア47

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Python 3.x

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

Python

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

API

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

0グッド

0クリップ

投稿2022/12/16 19:49

前提

Imgur の API を利用していますが、レート制限に達していないと思われるにも関わらず429 Too Many Requestsが返されます。

なにか問題は考えられますか?

レスポンス

json

1{ 2 "errors": [ 3 { 4 "id": "legacy-api-86869d4c8c-f755t/Wtq1naVA0s-051815", 5 "code": "429", 6 "status": "Too Many Requests", 7 "detail": "Too Many Requests" 8 } 9 ] 10}
レスポンスヘッダ

json

1{ 2 "Connection": "keep-alive", 3 "Content-Length": "142", 4 "Content-Type": "application/vnd.imgur.v1+json", 5 "Content-Encoding": "gzip", 6 "Imgur-Media-Type": "imgur.v1; param=full; format=json", 7 "X-Post-Rate-Limit-Limit": "1250", 8 "X-Post-Rate-Limit-Remaining": "1204", 9 "X-Post-Rate-Limit-Reset": "2788", 10 "X-Ratelimit-Clientlimit": "12500", 11 "X-Ratelimit-Clientremaining": "12450", 12 "X-Ratelimit-Clientreset": "83609", 13 "X-Ratelimit-Userlimit": "500", 14 "X-Ratelimit-Userremaining": "449", 15 "X-Ratelimit-Userreset": "660", 16 "Accept-Ranges": "bytes", 17 "Date": "Fri, 16 Dec 2022 19:38:15 GMT", 18 "X-Served-By": "cache-bur-kbur8200048-BUR", 19 "X-Cache": "MISS", 20 "X-Cache-Hits": "0", 21 "X-Timer": "S1671219495.314450,VS0,VE263", 22 "access-control-allow-methods": "GET, PUT, POST, PATCH, DELETE, OPTIONS", 23 "Server": "cat factory 1.0", 24 "Access-Control-Allow-Origin": "*", 25 "Access-Control-Allow-Credentials": "true", 26 "X-Frame-Options": "DENY", 27 "Access-Control-Allow-Headers": "Authorization, Content-Type, Accept, X-Mashape-Authorization, IMGURPLATFORM, IMGURUIDJAFO, sessionCount, IMGURMWBETA, IMGURMWBETAOPTIN, X-expSNKPK127, X-Imgur-Defender-Bypass" 28}

プログラムは以下の関数を単純にfor文で回して画像を50枚ほどアップロードしようとしています。

アップロードに使った関数

Python

1 def upload_url(self, libkey, src_link) -> str: 2 res = requests.post( 3 'https://api.imgur.com/3/upload', 4 data={'image': src_link, 'type': 'url'}, 5 headers={'Authorization': 'Client-ID ' + self.client_id} 6 ) 7 decode_res = res.json() 8 try: 9 status = decode_res['status'] 10 if not status // 100 == 2: 11 raise RuntimeError() 12 except (KeyError, RuntimeError): 13 log_path = 'error_' + datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.json' 14 with open(log_path, 'wb') as f: 15 f.write(res.content) 16 log_path2 = 'res_header_' + datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.json' 17 with open(log_path2, 'w') as f: 18 json.dump(dict(res.headers), f, indent=4, ensure_ascii=False) 19 raise RuntimeError(f"upload error. see {log_path} and {log_path2}") 20 21 data = decode_res['data'] 22 self.library[libkey] = {} 23 self.library[libkey]['id'] = data['id'] 24 self.library[libkey]['deletehash'] = data['deletehash'] 25 self.library[libkey]['link'] = data['link'] 26 self.library[libkey]['datetime'] = data['datetime'] 27 28 with open(self.savedata_path, 'w') as f: 29 json.dump({'library': self.library}, f, indent=4, ensure_ascii=False) 30 31 return data['link']

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

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

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

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

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

guest

回答2

0

完全な回答ではないと思いますが、クロスチェックの観点で:

Response Headerに含まれている関連ヘッダ(例:X-RateLimit-ClientRemaining)が残っているのに、429エラーが返却されている点が想定外と認識しました。

確かに、imgur API - Rate Limitsを見る限り、HTTP Headerで言及されている値では制限されていないように読めました。

ドキュメントには明示的に言及が見つけられなかったのですが、一般的なRate Limitに対する対応として、各forループ内の実行において、一定の秒数スリープ(time.sleep(x))を入れるなどはいかががでしょうか?

Your use of the Imgur API is also limited by the number of POST requests your IP can make across all endpoints. This limit is 1,250 POST requests per hour. Commercial Usage is not impacted by this limit. Each POST request will contain the following headers.

Header上はまだ、1204 Credit残っているということかと思いますが、リクエストのスピードを落としても再現するのかどうか、何度も同じタイミングでエラー終了するのか、などが切り分けのポイントになるのではないかと感じました。

投稿2022/12/16 23:45

knuser

総合スコア178

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

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

0

upload_url を呼び出している元プログラムの不記載、および APIを呼び出している状況の説明の欠如から何とも言えませんが、
https://api.imgur.com/
の「Rate Limits」を読む限りでは、
① 1ユーザーあたり一日当たりのリクエスト上限:およそ12,500回
② 1ユーザーあたり一日当たりのアップロード上限:およそ1,250回
③ 同一月に①または②の上限を超える日が5回発生した場合、その日以降から月末まで制限される。
④ (APIキーだけではなく)IPアドレスも識別して制限(別ユーザーでも、テザリングの使用やBBルーター等でIPアドレスが同じになることはありえます)
とあるので、①か②に心当たりがないのであれば ③か④が原因ではないでしょうか。

投稿2022/12/16 23:33

編集2022/12/16 23:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問