Задать вопрос

Почему запросы к «Балабоба» возвращают 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?
  • Вопрос задан
  • 4116 просмотров
Подписаться 4 Простой 11 комментариев
Решения вопроса 1
deepblack
@deepblack Куратор тега Python
Выкидываем 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 Куратор тега Python
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)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы