JSONDecoder 错误 - 访问 Google 时用 Python 翻译 API
JSONDecoder Error - While accessing Google Translate API with Python
我正在学习在 Python 中使用 HTTP 请求,使用由 TopCoder 培训挑战提供的 HTTP 请求(仅用于学习目的!没有任何形式的补偿),您必须在其中访问 Google 翻译 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 解析它。
问题是我收到 JSON解码器错误
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 对翻译的请求与此提供的请求不同,但我想知道如何让这种方式工作,以防我在未来。
两件事:
- 您必须执行 POST request(当前您正在执行获取请求)
- 您没有包含请求的 body。例如,curl 调用包含 url 编码数据,如下所示:data-urlencode 'q=Hallo'。您也必须在 post 请求中包含此参数,提供的 link 向您展示了如何操作。这是将放入字典中的键值,例如 {q: 'Hallo', ...}
PS:我 90% 确定您还应该将当前包含在元组中的查询参数转换为字典。因此,您将拥有 post 和 headers、参数和数据。
我正在学习在 Python 中使用 HTTP 请求,使用由 TopCoder 培训挑战提供的 HTTP 请求(仅用于学习目的!没有任何形式的补偿),您必须在其中访问 Google 翻译 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 解析它。
问题是我收到 JSON解码器错误
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 对翻译的请求与此提供的请求不同,但我想知道如何让这种方式工作,以防我在未来。
两件事:
- 您必须执行 POST request(当前您正在执行获取请求)
- 您没有包含请求的 body。例如,curl 调用包含 url 编码数据,如下所示:data-urlencode 'q=Hallo'。您也必须在 post 请求中包含此参数,提供的 link 向您展示了如何操作。这是将放入字典中的键值,例如 {q: 'Hallo', ...}
PS:我 90% 确定您还应该将当前包含在元组中的查询参数转换为字典。因此,您将拥有 post 和 headers、参数和数据。