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。。 借助界面设计器。



然后美化输入框      添加图标

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








Qt是一个跨平台的C++应用程序开发框架,具有良好的可扩展性和易于使用的特点。而CSDN是一个国内知名的技术社区,提供了大量的编程教程和经验分享。 Qt项目实战CSDN可以是一个关于Qt开发的教程或者项目案例分享。在这个项目中,我会结合Qt的特点,通过撰写一系列的技术文章或者视频教程,详细介绍如何使用Qt进行应用程序的开发。 在这个项目中,我会从安装Qt开始,讲解Qt的基础知识,如界面设计、信号与槽机制、Qt对象模型等。然后,我会介绍Qt的高级特性,比如网络编程、数据库操作、多线程等。通过这些文章或者教程,读者可以系统地学习Qt的各个方面,从而快速掌握Qt开发技巧。 同时,为了更好地帮助读者理解和学习Qt,我会结合实际的项目案例,展示如何使用Qt进行实际应用的开发。具体案例可以涵盖不同的领域,比如一个简单的音乐播放器、一个图像处理应用、一个聊天程序等。通过这些案例,读者可以更好地理解Qt的实际应用场景,并且通过参考案例代码,快速上手Qt开发。 除了撰写技术文章或者制作视频教程,我还会积极参与到CSDN的技术社区中,回答读者的问题,与他们交流经验。这样可以进一步提升读者对于Qt开发的理解,并且根据读者的反馈,不断优化项目内容,使之更加符合读者的需求。 通过Qt项目实战CSDN,我希望能够帮助更多的开发者掌握Qt开发技巧,实现自己的应用想法。同时,也希望能够通过与读者的交流,不断提升自己的技术水平,共同促进技术的发展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值