Ошибка JSONDecoder - при доступе к Google Translate API с Python - PullRequest
0 голосов
/ 14 июля 2020

Я учусь использовать HTTP-запросы в Python, используя этот HTTP-запрос, предоставленный учебным заданием TopCoder (только в учебных целях! Никакой компенсации), в котором вам необходимо получить доступ к Google Translate API:

curl --location --request POST 'https://translate.google.com/translate_a/single?client=at&dt=t&dt=ld&dt=qca&dt=rm&dt=bd&dj=1&hl=%25s&ie=UTF-8&oe=UTF-8&inputm=2&otf=2&iid=1dd3b944-fa62-4b55-b330-74909a99969e&' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'User-Agent: AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1' \
--data-urlencode 'sl=de' \
--data-urlencode 'tl=en' \
--data-urlencode 'q=Hallo' 

и мне интересно, как сделать аналогичный запрос в моем приложении Python? Любая помощь приветствуется.

На данный момент у меня установлено и импортировано:

  • requests
  • понял, что мне нужно сохранить свой запрос POST в переменной и проанализируйте его с помощью JSON.

Проблема в том, что я получаю ошибку JSONDecoder

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\myname\Documents\Code\GoogleTranslateApiPy\env\lib\site-packages\requests\models.py", line 898, in json
    return complexjson.loads(self.text, **kwargs)
  File "c:\users\myname\appdata\local\programs\python\python38-32\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "c:\users\myname\appdata\local\programs\python\python38-32\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\users\myname\appdata\local\programs\python\python38-32\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

с этим запросом Python (я попытался перевести запрос curl как лучше как мог):

import requests

headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1',
}

params = (
    ('client', 'at'),
    ('dt', ['t', 'ld', 'qca', 'rm', 'bd']),
    ('dj', '1'),
    ('hl', '%s'),
    ('ie', 'UTF-8'),
    ('oe', 'UTF-8'),
    ('inputm', '2'),
    ('otf', '2'),
    ('iid', '1dd3b944-fa62-4b55-b330-74909a99969e'),
    ('', ''),
)

response = requests.get('https://translate.google.com/translate_a/single', headers=headers, params=params)

Я чувствую, что мне здесь не хватает чего-то принципиального. Запрос в текущей документации Google for Translate отличается от этого предоставленного запроса, но я хотел бы знать, как я могу заставить этот способ работать, на случай, если мне когда-либо будет предоставлена ​​такая команда curl в будущем.

1 Ответ

0 голосов
/ 14 июля 2020

Две вещи:

  1. Вы должны выполнить запрос POST (в настоящее время вы выполняете запрос на получение)
Вы не включаете тело запроса. Например, вызов curl включает данные в кодировке url, например: data-urlencode 'q = Hallo'. Вы также должны включить эти параметры в свой почтовый запрос, предоставленная ссылка показывает вам, как. Это ключевые значения, которые будут go внутри словаря, например {q: 'Hallo', ...}

PS: Я на 90% уверен, что вам также следует преобразовать в словарю параметры запроса, которые у вас есть внутри кортежей. Итак, у вас будет сообщение с заголовками, параметрами и данными.

...