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), //获取浏览器版本,转换为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("<s="); 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有道翻译 爬虫 分析 破解相关推荐
- Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误
一.引言 参考网址:https://tendcode.com/article/youdao-spider/ 当前成功时间:2019-6-28 转自个人开源博客:https://my.oschina.n ...
- 有道翻译 爬虫,分析反爬 附代码
有道翻译 爬虫,破解反爬加密 0引言 1准备工作 开始第一部分 开始第二部分 准备工作,下载并安装requests模块 确定反爬用的变量 确定变量的值 requests模块的使用 0引言 我在这里会很 ...
- 爬虫百战穿山甲(1)有道翻译爬虫
文章目录 系列简介 分析网页 代码实现 拓展延伸 系列简介 将我的"爬虫百战穿山甲"团队平时做的项目放到这个专栏里吧, 仅供学习研究使用,如有侵权,私信我删除,不得转载 本系列不多 ...
- 有道翻译爬虫+JS逆向
一.首先找到有道翻译的API链接 二.点击payload,查看DATA里面需要传输的数据,通过两次不同的翻译内容,可以看到DATA中变化的值. 分别为:salt.sign.lts. 同时发现lts等于 ...
- java有道_java实现有道翻译爬虫
我的博文地址 使用的库 1.commons-codec 主要是为了加密,可以直接用java原生的,这里偷懒了,有点大才小用的感觉. 2.requests-5.0.7 大佬写的java 类似python ...
- 爬虫—有道翻译案例(史上最详细分析教程)
爬虫-有道翻译案例分析 (此内容仅供参考学习) 最近也是刚开始学爬虫,就做这个比较简单的案例,把学习和分析的思路记录一下~ 关键词:request.post.抓包.js分析.MD5加密等 一.分析思路 ...
- python爬虫实战之爬取有道翻译
文章目录 介绍 网页分析 代码实战 当我们学习python爬虫时我们需要做大量的练习,往后我会发布更多的python爬虫练习实战代码,进一步剖析爬虫的每一个细节 介绍 本次爬取的是有道翻译,利用pyt ...
- python读音有道-python爬虫之有道在线翻译
今天初学了python这门课 老师简单的讲解了一下 python的安装环境,配置环境变量,当前主流Python使用的是3.x版本, 下午简单的讲解了python的起源,发展以及在各个方面的应用 然后晚 ...
- 有道翻译-python
有道翻译-爬虫练习 案例分析 1.抓取url请求接口 如图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OMdUQcX2-1638268219047)(https: ...
最新文章
- WR:微生物污染源解析中宿主特异性标记物在中国的表现特征
- 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze
- matlab生成实指数序列、matlab茎状图
- JavaWeb 入门篇(4)HttpResponse 详解 HttpRequest 详解
- 附pdf下载 | 入门Python和深度学习的经典书
- vector 不初始化时什么状态_练车时,教练为什么不给你开空调?
- 使用JAVA爬取网页图片
- keras报错ModuleNotFoundError: No module named ‘keras.backend.tensorflow_backend‘;
- RPC和MQ对比及其适用/不适用场合
- JavaScript语言精粹(修订版)
- Ros学习笔记(六)Launch启动文件
- 爬虫之 单线程+多任务异步协程
- 在汇编语言调用c语言程序,C/C++调用汇编语言实例:目录表程序
- 内核各个版本下载地址
- 对于谷歌搜索的一些基本语法整理
- Doctrine 查询语法
- EXCEL中将数字日期格式改为日期格式
- 搞汉化以来的一件后悔的事
- 2022年哪些浏览器安全、速度快、好用又不卡?
- 美团招博士后啦!深度学习、强化学习、计算机视觉与NLP、法学方向