提问者:小点点

不使用API使用google翻译文本


我正在尝试使用在线翻译服务编写一个简单的免费翻译器(QT小部件)。 其思想是将标准get请求发送到在线翻译器,然后解析响应。 但回复中不包含翻译文本! 我猜这是因为服务使用了Ajax。 在本例中,我使用的是google translator,但我使用其他翻译器(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;
}

共3个答案

匿名用户

查看谷歌翻译它使用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=tt=>otf=2&ssel=0&tsel=0&xid=45662847&kc=1&tk=656516.836633&q=dies%20ist%20

这个请求返回JSON数据,这些数据应该很容易解析。

我不确定所有的参数是用来做什么的,但也许这些信息对你有帮助。

匿名用户

我认为您可以将API插入到与代码一起的文件中,而不是让它在线,这样它就在您的程序中

匿名用户

我相信您使用屏幕刮取方法的问题可能是翻译应用程序使用Ajax调用服务器端并检索翻译。 使用QNetworkRequest下载时得到的页面仅仅是JS应用程序,它实际上并不包含翻译。 直到从页面向服务器发出调用之后,才会填入。 这就是为什么它不起作用的原因。 也许你可以用某种方法让它工作,所以让我们知道你是怎么做的:-)