Qt实战之开发CSDN下载助理 (2)
现在,我们正式开工啦。这一篇主要学习下基本的抓包分析。学会协议登录****并制作登陆界面。
准备工具: 一款http抓包工具。 可以是FireBug或者fiddler。这里我们用httpWatch。
开始:
1. 用IE (如果你用httpWatch抓包的话) 打开****登陆界面 https://passport.****.net/account/login?from=http://my.****.net/my/my****
2. 开启httmpWatch
点击Recoder 输入好账户和密码后,点击登录 。此时****会切换到个人主页 。在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.****.net/account/login?from=http://my.****.net/my/my**** 页面 。此页面右键查看菜单, 选在查看源,搜索下execution。出现如下数据
好了。****已经解释的很清楚了。我们要做的就是用正则匹配该数据。 其他页面的数据分析大同小异。
接下来,我们来编写代码。 新建工程 。新建类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.****.net/account/login?from=http://my.****.net/my/my****"))); 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.****.net/account/login;jsessionid=57B7511FB180C423750FF8485FEB316C.tomcat1?from=http://my.****.net/my/my****")); networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); networkRequest.setRawHeader(QByteArray("Referer"), QByteArray("https://passport.****.net/account/login?from=http://my.****.net/my/my****")); 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.****.net/detail/wu5151/8945881
本博客地址: http://blog.****.net/wu5151
版权声明:本文为博主原创文章,未经博主允许不得转载。