编程工具: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),        //获取浏览器版本,转换为MD5r = '' + (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++ QT有道翻译 爬虫 分析 破解相关推荐

  1. Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误

    一.引言 参考网址:https://tendcode.com/article/youdao-spider/ 当前成功时间:2019-6-28 转自个人开源博客:https://my.oschina.n ...

  2. 有道翻译 爬虫,分析反爬 附代码

    有道翻译 爬虫,破解反爬加密 0引言 1准备工作 开始第一部分 开始第二部分 准备工作,下载并安装requests模块 确定反爬用的变量 确定变量的值 requests模块的使用 0引言 我在这里会很 ...

  3. 爬虫百战穿山甲(1)有道翻译爬虫

    文章目录 系列简介 分析网页 代码实现 拓展延伸 系列简介 将我的"爬虫百战穿山甲"团队平时做的项目放到这个专栏里吧, 仅供学习研究使用,如有侵权,私信我删除,不得转载 本系列不多 ...

  4. 有道翻译爬虫+JS逆向

    一.首先找到有道翻译的API链接 二.点击payload,查看DATA里面需要传输的数据,通过两次不同的翻译内容,可以看到DATA中变化的值. 分别为:salt.sign.lts. 同时发现lts等于 ...

  5. java有道_java实现有道翻译爬虫

    我的博文地址 使用的库 1.commons-codec 主要是为了加密,可以直接用java原生的,这里偷懒了,有点大才小用的感觉. 2.requests-5.0.7 大佬写的java 类似python ...

  6. 爬虫—有道翻译案例(史上最详细分析教程)

    爬虫-有道翻译案例分析 (此内容仅供参考学习) 最近也是刚开始学爬虫,就做这个比较简单的案例,把学习和分析的思路记录一下~ 关键词:request.post.抓包.js分析.MD5加密等 一.分析思路 ...

  7. python爬虫实战之爬取有道翻译

    文章目录 介绍 网页分析 代码实战 当我们学习python爬虫时我们需要做大量的练习,往后我会发布更多的python爬虫练习实战代码,进一步剖析爬虫的每一个细节 介绍 本次爬取的是有道翻译,利用pyt ...

  8. python读音有道-python爬虫之有道在线翻译

    今天初学了python这门课 老师简单的讲解了一下 python的安装环境,配置环境变量,当前主流Python使用的是3.x版本, 下午简单的讲解了python的起源,发展以及在各个方面的应用 然后晚 ...

  9. 有道翻译-python

    有道翻译-爬虫练习 案例分析 1.抓取url请求接口 如图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OMdUQcX2-1638268219047)(https: ...

最新文章

  1. WR:微生物污染源解析中宿主特异性标记物在中国的表现特征
  2. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze
  3. matlab生成实指数序列、matlab茎状图
  4. JavaWeb 入门篇(4)HttpResponse 详解 HttpRequest 详解
  5. 附pdf下载 | 入门Python和深度学习的经典书
  6. vector 不初始化时什么状态_练车时,教练为什么不给你开空调?
  7. 使用JAVA爬取网页图片
  8. keras报错ModuleNotFoundError: No module named ‘keras.backend.tensorflow_backend‘;
  9. RPC和MQ对比及其适用/不适用场合
  10. JavaScript语言精粹(修订版)
  11. Ros学习笔记(六)Launch启动文件
  12. 爬虫之 单线程+多任务异步协程
  13. 在汇编语言调用c语言程序,C/C++调用汇编语言实例:目录表程序
  14. 内核各个版本下载地址
  15. 对于谷歌搜索的一些基本语法整理
  16. Doctrine 查询语法
  17. EXCEL中将数字日期格式改为日期格式
  18. 搞汉化以来的一件后悔的事
  19. 2022年哪些浏览器安全、速度快、好用又不卡?
  20. 美团招博士后啦!深度学习、强化学习、计算机视觉与NLP、法学方向

热门文章

  1. 多线程基础:两种实现方式
  2. 卷积神经网络在句子分类上的应用[翻译]
  3. AUTOCAD——拉长
  4. IPv4与IPv6区别
  5. ASEMI整流桥GBU410参数,GBU410介绍,GBU410代换
  6. NSIS (NullSoft Scriptable Install System)使用指北(超详细)
  7. Python 机器学习/深度学习/算法专栏 - 导读目录
  8. template和template
  9. 7款开源ERP系统比较
  10. java 数据库排序_Java如何排序数据库表的数据内容?