c++ - 在没有 API 的情况下使用谷歌翻译文本
问题描述
我正在尝试使用在线翻译服务编写一个简单的免费翻译器(QT 小部件)。这个想法是将标准获取请求发送给在线翻译,然后解析响应。但回复不包含翻译文本!我猜这是因为该服务使用 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
调用服务器端并检索翻译。使用下载时获得的页面QNetworkRequest
只是JS application
,它实际上并不包含翻译。直到从页面向服务器发出调用后才会填写 。这就是为什么它不起作用。也许你可以让它以某种方式工作,所以让我们知道你是怎么做的:-)
推荐阅读
- java - 每个令牌的 Spring OAuth2 访问令牌到期时间更新
- visual-studio - 带有错误 git 存储库的 Visual Studio 新项目
- flutter - 允许 Flutter 中的应用使用同一包的多个版本
- java - 如何处理 protobuf3 消息中可为空的枚举类型字段?
- javascript - 顺风 css 不在反应项目上应用暗模式
- python - 有没有办法让代码与“导入”一起工作?
- flutter - Flutter 2.0:文本字段和十进制
- sql-server-2012 - 可以使用 2 个不同的 Active Directory 组访问 Synapse Analytics 无服务器池/SQL Server 的用户控制列表
- php - PHP如何添加资源链接使用klein.php
- reactjs - React Image Annotate - 覆盖函数 onExit() 的可能性