我正在尝试使用在线翻译服务编写一个简单的免费翻译器(QT小部件(。 这个想法是将标准 get 请求发送给在线翻译器,然后解析响应。 但是回复不包含翻译文本!我想这是因为该服务使用 AJAX。 在示例中,我使用的是谷歌翻译器,但我得到了与其他翻译器(yandex,deepl(类似的结果。 我知道有一种方法可以使用共享软件API,但由于该项目目前不是商业的,我不想注册银行卡。 有没有一种类似浏览器的方法可以在没有 API 的情况下获得翻译并免费使用它?
我已经搜索了任何信息,但令我惊讶的是,它目前已经过时且无关紧要(因为谷歌关闭了免费服务(。
还有一个问题。当我尝试将结果转换为 QString (QString s = reply->readAll((.toString(( 或 QString s = reply->readAll((.toStdString((.c_str( (时,我得到了一个扭曲的 htlm 代码(文件开头有很多 NUL 字符(。我认为这是由于对转义序列的误解,但是如何正确转换结果呢?即使在当前版本中,文件开头也有一些垃圾(NUL NUL Уi(。
我使用的代码是:
void getTranslate() {
QNetworkAccessManager manager;
QUrl url("https://translate.google.com/#view=home&op=translate&sl=en&tl=ru&text=Hello%2C%20World%20!");
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
do {
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
} while(!reply->isFinished());
QFile html("out.html");
if (html.open(QIODevice::ReadWrite)) {
QDataStream out(&html);
out << reply->readAll();
}
reply->close();
delete reply;
}
查看谷歌翻译,它使用AJAX请求来获取翻译。您可以尝试将 URL 更改为类似以下内容(这是 ajax 请求转到的位置(:
https://translate.google.de/translate_a/single?client=webapp&sl=auto&tl=en&hl=de&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=sos&dt=ss&dt=t&dt=gt&otf=2&ssel=0&tsel=0&xid=45662847&kc=1&tk=656516.836633&q=dies%20ist%20ein%20test
此请求返回 JSON 数据,这些数据应该易于解析。
我不确定所有参数的用途,但也许这些信息对您有所帮助。
我相信您对屏幕抓取方法的问题可能是翻译应用程序使用Ajax
来调用服务器端并检索翻译。使用QNetworkRequest
下载时获得的页面只是JS application
,它实际上不包含翻译。直到从页面到服务器进行调用后,才会填写。 这就是为什么它不起作用的原因。也许你可以让它以某种方式工作,所以让我们知道你是如何做到的:-(