现在,我们正式开工啦。这一篇主要学习下基本的抓包分析。学会协议登录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=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。。 借助界面设计器。

然后美化输入框      添加图标

  1. void CLoginDialog::init()
  2. {
  3. QLabel *lab = new QLabel;
  4. lab->setPixmap(QPixmap("://login-locked.png"));
  5. QHBoxLayout *lay1 = new QHBoxLayout(ui->lineEdit_Account);
  6. lay1->addWidget(lab);
  7. ui->lineEdit_Account->setTextMargins(30, 0, 0, 0);
  8. QLabel *lab2 = new QLabel;
  9. lab2->setPixmap(QPixmap("://login-key-icon.png"));
  10. QHBoxLayout *lay2 = new QHBoxLayout(ui->lineEdit_Pass);
  11. lay2->addWidget(lab2);
  12. ui->lineEdit_Pass->setTextMargins(30, 0, 0, 0);
  13. }

好了,我们编写网络部分。需要在pro文件添加QT += network  来加载网络模块。

  1. void CLoginDialog::getLoginFeature()
  2. {
  3. QNetworkAccessManager manager;
  4. QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")));
  5. QEventLoop loop;
  6. connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  7. loop.exec();
  8. QString str = reply->readAll();
  9. reply->deleteLater();
  10. // 先判断网页访问是否成功
  11. if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()!= 200)
  12. {
  13. QMessageBox::warning(this, QString("警告"), QString("网络连接失败!"), QString("确定"));
  14. exit(0);
  15. return;
  16. }
  17. // 正则表达式匹配登陆元素
  18. /*
  19. *<input type="hidden" name="lt" value="LT-2780076-afAuDvwMNK0ognpslyK5X2ae1K9OVJ" />
  20. *<input type="hidden" name="execution" value="e2s1" />
  21. */
  22. QRegExp rx("LT-[^\"]{1,200}\"");
  23. rx.indexIn(str);
  24. m_Lt = rx.cap(0).remove("\"");
  25. rx.setPattern("execution\" value=\"[^\"]{4,4}\"");
  26. rx.indexIn(str);
  27. m_Execution = rx.cap(0).remove("execution\" value=\"").remove("\"");
  28. m_Cookie = reply->rawHeader("Set-Cookie");  // 获取cookie
  29. m_Cookie.remove("Path=/; HttpOnly");
  30. }

这样我们就成功获取登陆相关的元素了。接下来编写登陆代码

  1. void CLoginDialog::on_pBtnLogin_clicked()
  2. {
  3. ui->pBtnLogin->setText(QString("正在登录,请稍等。。"));
  4. ui->pBtnLogin->setEnabled(false);
  5. QNetworkRequest networkRequest;
  6. networkRequest.setUrl(QUrl("https://passport.csdn.net/account/login;jsessionid=57B7511FB180C423750FF8485FEB316C.tomcat1?from=http://my.csdn.net/my/mycsdn"));
  7. networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
  8. networkRequest.setRawHeader(QByteArray("Referer"), QByteArray("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"));
  9. networkRequest.setRawHeader(QByteArray("Cookie"), m_Cookie.toLatin1());
  10. /*
  11. *username=tese&password=12345651<=
  12. *LT-2534065-JtNQtbSgtdlndU5zMjpu0EETUPiWod
  13. *&execution=e1s1&_eventId=submit
  14. *
  15. */
  16. g_Account = ui->lineEdit_Account->text();
  17. QByteArray postData = "username=" + ui->lineEdit_Account->text().toLatin1() + "&password=" +
  18. ui->lineEdit_Pass->text().toLatin1() + "<=" + m_Lt.toLatin1() + "&execution=" +
  19. m_Execution.toLatin1() + "&_eventId=submit";
  20. QNetworkAccessManager manager;
  21. QNetworkReply *reply = manager.post(networkRequest, postData);
  22. QEventLoop loop;
  23. connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  24. loop.exec();
  25. QString str = reply->readAll();
  26. reply->deleteLater();
  27. qDebug()<< str;
  28. }

需要注意下:  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)的更多相关文章

  1. Qt实战之开发CSDN下载助手 (3)(结束篇)

    再次申明下,开发这款助手,主要是用来学习交流,并不是用来开发什么刷积分的软件. 好了,言归正传,这次,主要的分析下CSDN的下载,评论,验证码获取机制等等. 好,回到第二篇,当我们成功登陆时,CSDN ...

  2. Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)

    前段时间,受朋友委托,需要做一个能够获取别人软件文本框中内容的助手.当然这需要调用win api来解决问题.一开始,我想都没想,就用getWindowText()....居然没用,好郁闷.于是查msd ...

  3. Qt开发环境下载和安装

    Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project.org ...

  4. 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示

    去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...

  5. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  6. 【Qt编程】基于Qt的词典开发系列--后序

    从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...

  7. 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  8. 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计

    这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...

  9. 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计

    我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...

随机推荐

  1. 怎么增加照片的KB大小

    之前都是要想办法压缩图片的大小 今天有人发来一张1.8MB的图片让我帮忙调到30MB左右 一下子放大这么多着实有点茫然 之后想到了一个办法 首先把图片占用体积变大,是不会增加清晰度的,而减小占用体积却 ...

  2. EasyUI easyui-combobox 重复发送请求

    今天在做个EasyUI easyui-combobox 下拉框动态连级的时候发现在选择一个值的时候发送了两次请求,这有点逆天呀~!!反人类~!必须和谐一开始以为是重复绑定了,重新审核了代码 确定没有~ ...

  3. 通过git和Xcode将代码上传到GitHub

    长话短说: 第一步:初始化一个本地仓库 git init 第二步:将你的文件添加到缓存区 git add . 后面的空格 . 是将全部的文件都添加到缓存区  可以使用git status  查看状态 ...

  4. TOJ 1702.A Knight's Journey

    2015-06-05 问题简述: 有一个 p*q 的棋盘,一个骑士(就是中国象棋里的马)想要走完所有的格子,棋盘横向是 A...Z(其中A开始 p 个),纵向是 1...q. 原题链接:http:// ...

  5. Nginx启动报错:10013: An attempt was made to access a socket in a way forbidden

    Nginx在win7,win2008下启动报错:bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket i ...

  6. 用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  7. DelphiXe5中的双向绑定(使用使用TBindScope和TBindExpression,并覆盖AfterConstruction函数)

    在Delphi下等这一功能很久了,虽然C#下早已实现了这一功能.但是在Dephi下尝试这项功能时还是有些许的激动.闲言少絮,直接上代码. unit BindingDemo; interface use ...

  8. QT小记之在VS2005中使用(设置QMAKESPEC环境变量,以及编译QT Lib)

    QT的结构很清晰明了,看过第一个HELLO WORLD便爱上了它,感觉CEGUI有借鉴过QT的设计.如何在Windows平台下使用QT开发?一,下载SDK包请去官网(QT被NOKIA收购,貌似使用协议 ...

  9. css 自适应布局

    转载一篇文章: 自适应网页设计(Responsive Web Design) 作者: 阮一峰 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小 ...

  10. ssh 如何通过外网访问内网多台服务器

    本帖子未验证: 我看到一个论坛,坛友发的一个问题 http://bbs.51cto.com/thread-934340-1.html 解决方法,我自己开了这个帖子写在这里. 首先你需要一个软件“Sec ...