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

Почему запросы к «Балабоба» возвращают 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?
  • Вопрос задан
  • 4127 просмотров
Подписаться 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)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽