为什么我在 Reddit API 中收到 429 错误?
Why am I getting a 429 error with the Reddit API?
我一直在尝试使用 flask 和 Reddit api,但无论我尝试什么,我似乎都会遇到 429 'too many requests' 错误每次我尝试接收访问令牌时。
初始用户身份验证工作没有任何问题,我收到了代码并可以验证我已经在我的 Reddit 设置中对应用程序进行了身份验证。我还确保使用唯一的用户代理,因为这似乎可以解决大多数人的问题,并且我没有使用 'bot'、'curl'、'web' 或任何其他可能的障碍。
据我所知,我也完全可以忍受因请求过多而受到速率限制。
考虑到这是我第一次同时使用 flask 和 Reddit API,我确定我遗漏了一些明显的东西,但 4 小时后,大量谷歌搜索并阅读了所有文档,我不明白我在这里弄错了什么。
import requests
import requests.auth
from flask import Flask, redirect, request, url_for
import string
import random
app = Flask(__name__)
client_id = "client id of my web app"
client_secret = "client secret of my web app"
base_auth_url = 'https://www.reddit.com/api/v1'
authorization_endpoint = '/authorize'
access_token_endpoint = '/access_token'
@app.route("/login")
def get_the_auth_code():
state = state_generator()
params = {
'client_id': client_id,
'response_type': 'code',
'state': state,
'redirect_uri': 'http://localhost:5000/redditor',
'scope': 'identity',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
return redirect(url_builder(authorization_endpoint, params))
@app.route("/redditor")
def get_the_access_token():
code = request.args.get('code')
client_auth = requests.auth.HTTPBasicAuth(client_id, client_secret)
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data)
token_json = response.json()
return token_json
def state_generator(size=25, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def url_builder(endpoint, parameters):
params = '&'.join(['%s=%s' % (k, v) for k, v in parameters.items()])
url = '%s%s?%s' % (base_auth_url, endpoint, params)
return url
if __name__ == "__main__":
app.run(debug=True)
在 Reddit 社区(特别是 /u/nmtake)的帮助下,我发现了哪里出了问题。
在我的 get_the_access_token()
函数中,我将 user-agent 字段添加到我的数据参数中,而不是将其声明为 header.
的一部分
而不是:
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data)
我现在使用的是下面的,效果很好:
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
}
post_headers = {
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data, headers=post_headers)
我一直在尝试使用 flask 和 Reddit api,但无论我尝试什么,我似乎都会遇到 429 'too many requests' 错误每次我尝试接收访问令牌时。
初始用户身份验证工作没有任何问题,我收到了代码并可以验证我已经在我的 Reddit 设置中对应用程序进行了身份验证。我还确保使用唯一的用户代理,因为这似乎可以解决大多数人的问题,并且我没有使用 'bot'、'curl'、'web' 或任何其他可能的障碍。
据我所知,我也完全可以忍受因请求过多而受到速率限制。
考虑到这是我第一次同时使用 flask 和 Reddit API,我确定我遗漏了一些明显的东西,但 4 小时后,大量谷歌搜索并阅读了所有文档,我不明白我在这里弄错了什么。
import requests
import requests.auth
from flask import Flask, redirect, request, url_for
import string
import random
app = Flask(__name__)
client_id = "client id of my web app"
client_secret = "client secret of my web app"
base_auth_url = 'https://www.reddit.com/api/v1'
authorization_endpoint = '/authorize'
access_token_endpoint = '/access_token'
@app.route("/login")
def get_the_auth_code():
state = state_generator()
params = {
'client_id': client_id,
'response_type': 'code',
'state': state,
'redirect_uri': 'http://localhost:5000/redditor',
'scope': 'identity',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
return redirect(url_builder(authorization_endpoint, params))
@app.route("/redditor")
def get_the_access_token():
code = request.args.get('code')
client_auth = requests.auth.HTTPBasicAuth(client_id, client_secret)
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data)
token_json = response.json()
return token_json
def state_generator(size=25, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def url_builder(endpoint, parameters):
params = '&'.join(['%s=%s' % (k, v) for k, v in parameters.items()])
url = '%s%s?%s' % (base_auth_url, endpoint, params)
return url
if __name__ == "__main__":
app.run(debug=True)
在 Reddit 社区(特别是 /u/nmtake)的帮助下,我发现了哪里出了问题。
在我的 get_the_access_token()
函数中,我将 user-agent 字段添加到我的数据参数中,而不是将其声明为 header.
而不是:
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data)
我现在使用的是下面的,效果很好:
post_data = {
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:5000/redditor',
}
post_headers = {
'user-agent': 'myapp v0.1 by /u/myredditusername'
}
response = requests.post(base_auth_url + access_token_endpoint, auth=client_auth, data=post_data, headers=post_headers)