@MeidoNoHitsuji

Почему запросы к «Балабоба» возвращают 403? И как сделать правильно?

Пишу скрипт работы с нейронкой "Балабоба" на Python 3.8.5. По запросам сайта можно понять, что api там предельно простое, однако, непонятно почему, при запросах страницы сайт решает возвращать мне 403 с страницей вот такого содержания:
60d80214bc7bb412702443.png
Пытался кидать запрос и с домашнего и с сервера - всё одно и то же.

Запрос, который я кидаю, предельно прост:
import requests

result = requests.post('https://zeapi.yandex.net/lab/api/yalm/text3', json={
    'filter': 1,
    'intro': 0,
    'query': "Пошёл я как-то гулять"
}, headers={
    "Content-Type": "application/json"
})

print(result.text)


Забавный факт. По api на сервер отправляется 3 запроса: GET "intros" для получения типов генерации текстов, OPTIONS text3 (так и не понял для чего), POST text3 (для отправки введённого текста и генерации ответа). Забавно то, что intros возвращает нормальный ответ. Остальные же запросы 403. Также пытался кидать GET, чтобы получить просто код страницы, но ловил 403.

Из возможных решений предлагают пересесть на 3.7.3. Сам я это не проверял, однако если это действительно так работает, то можете подсказать почему? И как это перенести на 3.8, 3.9?
  • Вопрос задан
  • 760 просмотров
Решения вопроса 1
Andrew_Pinkerton
@Andrew_Pinkerton Куратор тега Python
Не так страшны первые 99%, как оставшиеся 99%
Выкидываем requests и используем urllib.request
Рабочий вариант, python 3.8-3.9:

import json
import urllib.request

headers = {
    'Content-Type': 'application/json',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/605.1.15 '
                  '(KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
    'Origin': 'https://yandex.ru',
    'Referer': 'https://yandex.ru/',
}


API_URL = 'https://zeapi.yandex.net/lab/api/yalm/text3'
payload = {"query": "Ура Хабр", "intro": 0, "filter": 1}
params = json.dumps(payload).encode('utf8')
req = urllib.request.Request(API_URL, data=params, headers=headers)
response = urllib.request.urlopen(req)
print(response.read().decode('utf8'))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HemulGM
@HemulGM
Delphi Developer, сис. админ
import requests
import json

url = "https://zeapi.yandex.net/lab/api/yalm/text3"

payload = json.dumps({
  "filter": 1,
  "into": 0,
  "query": "Тест был"
})
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы