我正在构建一个小型命令行实用程序,以帮助我在nodejs中进行一些翻译。问题是,我从谷歌获得的回复文本被混淆了。据我所知,nodejs发送的是一个正确编码的请求,但它显然不是。如果我使用ANSI字符集,一切都按预期工作。主要的想法是不要把字符串放在源文件中,当然,我是这样做的,因为我正在努力解决问题。源代码被编码为UTF8,而我正在解析以获取所讨论的字符串的数据是UTF16 LE格式,但我认为这对本示例来说并不重要。
const https = require('https');
let uri = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией';
console.log(uri);
console.log(encodeURI(uri));
console.log(decodeURI(encodeURI(uri)));
https.get(encodeURI(uri), (res) =>
{
const { statusCode } = res;
let error;
if (statusCode !== 200)
{
error = new Error('Request Failed: ' + statusCode);
}
if (error)
{
console.log(error.message);
res.resume();
return;
}
let data = '';
res.on('data', (chunk) =>
{
console.log('chunks:', chunk);
data += chunk;
});
res.on('end', () =>
{
let parsed;
try {
parsed = JSON.parse(data);
} catch (e) {
console.log('parsing error', e);
}
console.log(data.length, data);
console.log(parsed[0][0][0]);
});
}).on('error', (e) =>
{
console.error(e);
});这是我在命令行中得到的输出。
我假设nodejs正在向google发送一个错误的请求,但我不知道如何解决这个问题。
https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией
https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%9F%D1%80%D0%B8%D0%BE%D0%B1%D1%80%D0%B5%D1%81%D1%82%D0%B8%20%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B%20%D1%81%20%D0%B0%D0%BC%D1%83%D0%BD%D0%B8%D1%86%D0%B8%D0%B5%D0%B9
https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией
chunks: <Buffer 5b 5b 5b 22 d0 a0 d1 9f d0 a1 d0 82 d0 a0 d1 91 d0 a0 d1 95 d0 a0 20 c2 b1 20 d0 a1 d0 82 d0 a0 c2 b5 d0 a1 d0 83 d0 a1 2c 20 d0 a0 d0 81 d0 a0 d1 94 ... >
165 '[[["РџСЂРёРѕР ± ресС, РЁРєРѕРЅС‚РµР№РЅРµСЂС ‹СЃ Р ° РјСѓРЅРЁС † ией","Приобрести контейнеры СЃ амуницией",null,null,3]],null,"ru"]'
РџСЂРёРѕР ± ресС, РЁРєРѕРЅС‚РµР№РЅРµСЂС ‹СЃ Р ° РјСѓРЅРЁС † ией如果我在浏览器中加载请求uri,就会得到预期的结果。
[[["Purchase containers with ammunition","Приобрести контейнеры с амуницией",null,null,3]],null,"ru"]发布于 2018-11-29 11:28:10
好吧,新的一天伴随着新的想法。今天早上,我发现一些标题可能丢失了,结果是我的请求需要一个有效的用户代理来提供,但只适用于这些UTF请求。去想一想。不同的标题组合使响应更加混乱,因此需要一些猜测才能达到。
let headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'
};
https.get(uri, { headers: headers }, (res) =>
{
...
})https://stackoverflow.com/questions/53530178
复制相似问题