zoukankan      html  css  js  c++  java
  • 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=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。。 借助界面设计器。

    然后美化输入框      添加图标

    [cpp] view plaincopy
     
    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.   
    9.     QLabel *lab2 = new QLabel;  
    10.     lab2->setPixmap(QPixmap("://login-key-icon.png"));  
    11.     QHBoxLayout *lay2 = new QHBoxLayout(ui->lineEdit_Pass);  
    12.     lay2->addWidget(lab2);  
    13.     ui->lineEdit_Pass->setTextMargins(30, 0, 0, 0);  
    14.   
    15. }  


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

    [cpp] view plaincopy
     
    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.   
    6.     QEventLoop loop;  
    7.     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));  
    8.     loop.exec();  
    9.   
    10.     QString str = reply->readAll();  
    11.     reply->deleteLater();  
    12.   
    13.     // 先判断网页访问是否成功  
    14.     if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()!= 200)  
    15.     {  
    16.         QMessageBox::warning(this, QString("警告"), QString("网络连接失败!"), QString("确定"));  
    17.         exit(0);  
    18.         return;  
    19.     }  
    20.   
    21.     // 正则表达式匹配登陆元素  
    22.     /* 
    23.      *<input type="hidden" name="lt" value="LT-2780076-afAuDvwMNK0ognpslyK5X2ae1K9OVJ" /> 
    24.      *<input type="hidden" name="execution" value="e2s1" /> 
    25.      */  
    26.   
    27.     QRegExp rx("LT-[^"]{1,200}"");  
    28.     rx.indexIn(str);  
    29.   
    30.     m_Lt = rx.cap(0).remove(""");  
    31.   
    32.     rx.setPattern("execution" value="[^"]{4,4}"");  
    33.     rx.indexIn(str);  
    34.     m_Execution = rx.cap(0).remove("execution" value="").remove(""");  
    35.   
    36.     m_Cookie = reply->rawHeader("Set-Cookie");  // 获取cookie  
    37.     m_Cookie.remove("Path=/; HttpOnly");  
    38. }  

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

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

    需要注意下:  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

  • 相关阅读:
    DOM对象
    多态
    封装和继承
    析构函数
    构造函数
    二维数组
    javascript的基本语法
    javascript数组
    js
    BOM和DOM的区别
  • 原文地址:https://www.cnblogs.com/findumars/p/5079457.html
Copyright © 2011-2022 走看看