Почему я получаю ошибку 429 с Reddit API? - PullRequest
0 голосов
/ 20 апреля 2020

Я экспериментировал с flask и API Reddit, но, что бы я ни пытался, мне кажется, что каждый раз, когда я пытаюсь получить доступ, я сталкиваюсь с ошибкой 429 «слишком много запросов» token.

Первоначальная аутентификация пользователя работает без каких-либо проблем, и я получаю код обратно и могу подтвердить, что я авторизовал приложение в моих настройках Reddit. Я также позаботился о том, чтобы использовать уникальный пользовательский агент, так как это, казалось, решило проблему для большинства людей, и я не использую такие слова, как «бот», «завиток», «веб» или что-либо еще, что могло бы быть вероятный блокировщик.

Насколько я знаю, я также вполне допускаю ограничение скорости при слишком большом количестве запросов.

Учитывая, что я использую это впервые и flask, и API Reddit, я уверен, что упускаю что-то очевидное, но после 4 часов обильного поиска в Google и чтения всех документов, я не понимаю, в чем я здесь не прав.

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)

1 Ответ

0 голосов
/ 21 апреля 2020

С помощью сообщества Reddit (в частности, / u / nmtake ) я выяснил, в чем дело.

В моей функции get_the_access_token() я добавлял поле user-agent к своим параметрам данных вместо того, чтобы объявлять его как часть заголовка.

Вместо:

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)
...