IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ QT有道翻译 爬虫 分析 破解 -> 正文阅读

[C++知识库]C++ QT有道翻译 爬虫 分析 破解

编程工具:C++ QT

浏览器+分析工具:Firefox

打开有道翻译首页,任意输入一句中文,按F12进入DEBUG模式,点击翻译按钮后按以下截图步骤操作

?得到提交的表单数据

再重复点击几次翻译按钮,可以发现表单数据的salt、sign、lts这几个参数是变化的

点击”调试器“按钮,来到调试页面,按CTRL+SHIFT+F,输入”sign“进行搜索

?

?发现一个sign 的md5值,如果不知道是哪个,可以一个个点击进去查看,必要的时候下断点,再点击翻译试试看是否会被断下,可以断下的话就很大可能是要找的sign值了。

?以下是截取的部分JS代码:

var r = function (e) {
    var t = n.md5(navigator.appVersion),        //获取浏览器版本,转换为MD5
    r = '' + (new Date).getTime(),              //获取当前时间
    i = r + parseInt(10 * Math.random(), 10);    //当前时间尾部加上随机数
    return {
      ts: r,                    //当前时间
      bv: t,                    //版本信息MD5值
      salt: i,                  //加上随机数后的时间
      sign: n.md5('fanyideskweb' + e + i + 'Y2FYu%TNSbMCxc3t2u^XT')      //sign值
    }
  };

用C++ QT代码实现,其中原网址应为 “https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule” ,需去掉” translate_o “后面的”_o“,否则会出错,具体代码如下:

void Test::YouDaoFanYi()
{
        myurl = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"; 
	QDateTime time = QDateTime::currentDateTime();  //获取当前时间 
	qint64 t= time.toMSecsSinceEpoch(); 
	string lts= QString::number(t).toStdString();  
	qsrand(t);  //置随机种子
	string salt = lts + QString::number(qrand() % 10).toStdString(); //当前时间+随机数
	QString s,str;
	str = "根据调查,超过90%的同学表示在假期中自身存在拖延";
	s.clear();
s.append("fanyideskweb").append(str).append(QString::fromStdString(salt)).append("Y2FYu%TNSbMCxc3t2u^XT");
        
        //计算sign 的 MD5值
	MD5 md5 = MD5(s.toStdString());
	string youdao_sign = md5.outstr(32).c_str();
	//string youdao_sign = md5Str.toStdString();
	//qDebug() << md5Str;
	//qDebug() << QString::fromStdString(youdao_sign);
	data.clear();
	data.append("i=");
	data.append(MyURLencode(str));
	data.append("&from=");
	data.append("AUTO");
	data.append("&to=");
	data.append("AUTO");
	data.append("&smartresult=dict&client=fanyideskweb&salt=");

	data.append(salt);
	data.append("&sign=");

	data.append(youdao_sign);
	data.append("&lts=");  
	data.append(lts);  
	data.append("&bv=e2a78ed30c66e16a857c5b6486a1d326&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_CLICKBUTTION");
}

需加入 “Content_Type” 、 “Cookie” 、 “User_Agent” 这几个请求头信息。

void YoudaoTranslation::on_pushButton_2_clicked()
{
    Test test;
    test.YouDaoFanYi();

    QNetworkRequest request;
    request.setUrl(QUrl(QString::fromStdString(test.myurl)));

    request.setRawHeader("Content_Type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.setRawHeader("Cookie", "YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=-435057197@10.169.0.102; OUTFOX_SEARCH_USER_ID_NCOO=825663831.7448548; fanyi-ad-id=113723; fanyi-ad-closed=1; YOUDAO_FANYI_SELECTOR=ON; JSESSIONID=aaaIQOEW249b2frXGYgSx; ___rl__test__cookies=1627909716667; SESSION_FROM_COOKIE=fanyiweb");
    request.setRawHeader("Sec-Fetch-Mode","cors");
    request.setRawHeader("User_Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0");

    //2. 创建一个管理器
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    //3. 连接请求结束信号
    QEventLoop* loop = new QEventLoop;
    QTimer timer;
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(youdaoreply(QNetworkReply*)));
    connect(manager, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit()));
    connect(&timer, SIGNAL(timeout()), loop, SLOT(quit()));

    //4. 发送post请求
    manager->post(request, QString::fromStdString(test.data).toLatin1());

    timer.start(5000);
    loop->exec();

    if (timer.isActive())
    {
        timer.stop();
        //qDebug() << "连接成功!";
    }
    else
    {
        QMessageBox::warning(NULL, QObject::tr("错误"), QObject::tr("网络链接超时!"));
        //qDebug() << "网络链接超时!";

    }

    delete loop;
    delete manager;
    ui.textdisplay->setText(return_str);
}

以下槽函数,处理返回的数据

void YoudaoTranslation::youdaoreply(QNetworkReply* reply)
{
    if (reply->error() == QNetworkReply::NoError) {   //判断是否请求成功
        QString all = reply->readAll();   //读出返回数据
        //qDebug() << all;  
        QString res = youdaoregex(all);   //解析出翻译结果
        
        return_str = res;
        //qDebug() << return_str;
        reply->deleteLater();
    }
    else {
        //qDebug() << reply->errorString() << " error " << reply->error();
        QMessageBox::warning(NULL, QObject::tr("错误"), reply->errorString() + "\r\n" + "error code: " + QString::number(reply->error()));
    }
}

正则解析函数,获取需要的内容:

QString YoudaoTranslation::youdaoregex(const QString& qstr) {   //正则解析函数
    string ans;
    string str = qstr.toStdString();
    string pattern = "\"tgt\":\"(.+?)\"\\}";
    regex e("\\[\\[(.*)\\]\\]");
    regex r(pattern);
    smatch m;
    regex_search(str, m, e);

    string temp = m[1];
    auto res = vector<string>(9);
    sregex_iterator pos(temp.cbegin(), temp.cend(), r), end;
    for (; pos != end; ++pos) {
        res.push_back(pos->str(1));
    }

    for (int i = 9; i < res.size(); i++)
    {
        ans = ans + res[i] ;
    }

    return QString::fromStdString(ans);
}

经验证,对比官方网页翻译结果会有差异,官方网页翻译结果更准确,可能是由于网址 “https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule” ,去掉”_o“后,缺失了相关功能。

以及可以发现 表单数据中的salt和sign值即使为0也可以获得翻译结果,只是翻译结果不是很理想。

这些差异原因有待后续分析。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:03:10  更:2021-08-08 11:05:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 6:39:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码