Qt实战之开发CSDN下载助手 (2)
现在,我们正式开工啦。这一篇主要学习下基本的抓包分析。学会协议登录CSDN并制作登陆界面。
准备工具: 一款http抓包工具。 可以是FireBug或者fiddler。这里我们用httpWatch。
开始:
1. 用IE (如果你用httpWatch抓包的话) 打开CSDN登陆界面https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
2. 开启httmpWatch
点击Recoder 输入好账户和密码后,点击登录 。此时CSDN会切换到个人主页 。在httpWatch点击Stop 停止抓包。 接下来我们来看列表中的数据包。
一般而言,网页的登录和表格的提交,都会采用post方式来发送数据 。(post和get的区别,不懂得自行问度娘)。
找到发送数据包后我们看下他的协议内容:
一般有用的就是: cookie 还有 reference . post地址 . body(post的数据内容)
关于cookie的获取。。一般都是你打开此网站的第一个页面时会返回一段Set-Cookie 我们直接获取就行了 然后我们分析下post的内容
username=vi7tese&password=12345651<=LT-2659236-VmpkqPlv4fuHKYBiIMhOH2OffF3hbl&execution=e1s1&_eventId=submit
这里username 和password就不用解释了。。我们看后面的lt 还有exection 。这个多半是在登录页面里的。隐藏起来了。 顺便说下。如果说你post或者get的网址里面多了一串动态内容,那么多半是js加密 。。比如yy的注册协议就是这样的。(这个后面再说说怎么分析这类问题).。。
好。回到 https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn 页面 。此页面右键查看菜单, 选在查看源,搜索下execution。出现如下数据
好了。csdn已经解释的很清楚了。我们要做的就是用正则匹配该数据。 其他页面的数据分析大同小异。
接下来,我们来编写代码。 新建工程 。新建类CLoginDialog。。 借助界面设计器。
然后美化输入框 添加图标
- void CLoginDialog::init()
- {
- QLabel *lab = new QLabel;
- lab->setPixmap(QPixmap("://login-locked.png"));
- QHBoxLayout *lay1 = new QHBoxLayout(ui->lineEdit_Account);
- lay1->addWidget(lab);
- ui->lineEdit_Account->setTextMargins(30, 0, 0, 0);
- QLabel *lab2 = new QLabel;
- lab2->setPixmap(QPixmap("://login-key-icon.png"));
- QHBoxLayout *lay2 = new QHBoxLayout(ui->lineEdit_Pass);
- lay2->addWidget(lab2);
- ui->lineEdit_Pass->setTextMargins(30, 0, 0, 0);
- }
好了,我们编写网络部分。需要在pro文件添加QT += network 来加载网络模块。
- void CLoginDialog::getLoginFeature()
- {
- QNetworkAccessManager manager;
- QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")));
- QEventLoop loop;
- connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
- loop.exec();
- QString str = reply->readAll();
- reply->deleteLater();
- // 先判断网页访问是否成功
- if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()!= 200)
- {
- QMessageBox::warning(this, QString("警告"), QString("网络连接失败!"), QString("确定"));
- exit(0);
- return;
- }
- // 正则表达式匹配登陆元素
- /*
- *<input type="hidden" name="lt" value="LT-2780076-afAuDvwMNK0ognpslyK5X2ae1K9OVJ" />
- *<input type="hidden" name="execution" value="e2s1" />
- */
- QRegExp rx("LT-[^\"]{1,200}\"");
- rx.indexIn(str);
- m_Lt = rx.cap(0).remove("\"");
- rx.setPattern("execution\" value=\"[^\"]{4,4}\"");
- rx.indexIn(str);
- m_Execution = rx.cap(0).remove("execution\" value=\"").remove("\"");
- m_Cookie = reply->rawHeader("Set-Cookie"); // 获取cookie
- m_Cookie.remove("Path=/; HttpOnly");
- }
这样我们就成功获取登陆相关的元素了。接下来编写登陆代码
- void CLoginDialog::on_pBtnLogin_clicked()
- {
- ui->pBtnLogin->setText(QString("正在登录,请稍等。。"));
- ui->pBtnLogin->setEnabled(false);
- QNetworkRequest networkRequest;
- networkRequest.setUrl(QUrl("https://passport.csdn.net/account/login;jsessionid=57B7511FB180C423750FF8485FEB316C.tomcat1?from=http://my.csdn.net/my/mycsdn"));
- networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
- networkRequest.setRawHeader(QByteArray("Referer"), QByteArray("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"));
- networkRequest.setRawHeader(QByteArray("Cookie"), m_Cookie.toLatin1());
- /*
- *username=tese&password=12345651<=
- *LT-2534065-JtNQtbSgtdlndU5zMjpu0EETUPiWod
- *&execution=e1s1&_eventId=submit
- *
- */
- g_Account = ui->lineEdit_Account->text();
- QByteArray postData = "username=" + ui->lineEdit_Account->text().toLatin1() + "&password=" +
- ui->lineEdit_Pass->text().toLatin1() + "<=" + m_Lt.toLatin1() + "&execution=" +
- m_Execution.toLatin1() + "&_eventId=submit";
- QNetworkAccessManager manager;
- QNetworkReply *reply = manager.post(networkRequest, postData);
- QEventLoop loop;
- connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
- loop.exec();
- QString str = reply->readAll();
- reply->deleteLater();
- qDebug()<< str;
- }
需要注意下: post数据时,我们需要自己填写 QNetworkRequest 内容。 通过setRawHeader方法来设置。采用QByteArray存放数据。所以QString需要先转换。
这里我们有一个技巧,就是借助QEventLoop来简化数据的接收。通过绑定事件,等待接收完毕再结束函数。获取Cookie用此方法
m_Cookie = reply->rawHeader("Set-Cookie"); 即可。
具体的请看此源码文件: http://download.csdn.net/detail/wu5151/8945881
本博客地址: http://blog.csdn.net/wu5151
http://blog.csdn.net/wu5151/article/details/47145289
Qt实战之开发CSDN下载助手 (2)的更多相关文章
- Qt实战之开发CSDN下载助手 (3)(结束篇)
再次申明下,开发这款助手,主要是用来学习交流,并不是用来开发什么刷积分的软件. 好了,言归正传,这次,主要的分析下CSDN的下载,评论,验证码获取机制等等. 好,回到第二篇,当我们成功登陆时,CSDN ...
- Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)
前段时间,受朋友委托,需要做一个能够获取别人软件文本框中内容的助手.当然这需要调用win api来解决问题.一开始,我想都没想,就用getWindowText()....居然没用,好郁闷.于是查msd ...
- Qt开发环境下载和安装
Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project.org ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
随机推荐
- SQL学习之使用常用函数处理数据
一.在介绍使用函数处理数据前,先说下使用DBMS(数据库管理系统)处理数据所带来的问题! 1.与几乎所有的DBMS都同等的支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数,事实上,只 ...
- c#操作word文档之简历导出
前言 1.写这个功能之前,我得说说微软的这个类库,用着真苦逼!是他让我有程序猿,攻城尸的感觉了.首先这个类库,从没接触过,方法与属性都不懂,还没有提示.神啊,我做这功能真是一步一卡,很潇洒啊. 2.这 ...
- sql大数据量查询的优化技巧
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- ASP.Net中使用Report Service
昨天研究以下Report Service,发现SQL Service自带的报表服务器也非常强大, 一,报表在不同的应用中表现形式 参考:http://www.cnitblog.com/yide/arc ...
- Hadoop学习之Hadoop案例分析
一.日志数据分析1.背景1.1 ***论坛日志,数据分为两部分组成,原来是一个大文件,是56GB:以后每天生成一个文件,大约是150-200MB之间: 每行记录有5部分组成:1.访问ip:2.访问时间 ...
- spring 入门篇
spring 入门篇 相对于Hibernate(冬眠),Spring(春天),具有更多的诗意与希望的感觉,是为了解决传统J2EE开发效率过低.开发商之间不统一.没有真正实现“写一次到处 ...
- Web API (一)
页面内容 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- Tic-Tac-Toe游戏
#Tic-Tac-Toe #机器人和人类下井字棋 #全局变量 import random X = "X" O = "O" EMPTY = " &quo ...
- angular的$q服务和promise模式
此承诺/延迟(promise/deferred)实现的灵感来自于 Kris Kowal's Q CommonJS Promise建议文档 将承诺(promise) 作为和 异步执行操作(action) ...
- 20个经典bootsrtap后台html网站模板推荐
今天为大家推荐20款不同风格的Bootstrap后台管理模板,每一款都经典可用,能预览和下载,保证让你挑得眼花缭乱. 1,Simpli flag蓝色 Simpli Flat蓝色管理模板是一款采用Fla ...