Qt模拟用户名密码登录网站
win7 64bit vs2010 Qt4.8.4 模拟用户名密码登录网站,并获取cookie再发送请求,获取返回值
cpp文件
主要涉及的函数
#AccessHttp::AccessHttp(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::AccessHttp)//,network_cookie_(this)
{
ui->setupUi(this);
firstUserList = 1; //用户列表第一次请求第一条记录默认为1
lastUserList = 50; //用户列表第一次请求最有一条条记录默认为50
userListCnt = 1; //用户列表累计请求的次数默认为1
netManager = new QNetworkAccessManager(this);
network_cookie_ = new NetworkCookie(this);
//netManager->setCookieJar(cookieJar); //获取cookie值
netManager->setCookieJar(network_cookie_);
connect(netManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
}
//GET
void AccessHttp::do_get(QString url, QString content)
{
QString absUrl;
absUrl = url.append(content);
qDebug()<<" absUrl"<<absUrl;
QNetworkRequest req;
req.setUrl(QUrl(absUrl));
// req.setHeader(QNetworkRequest::CookieHeader,"sid=90vfV9fBTKShz6rugMH6iQ");
// netManager->get(req);
netManager->get(req);
// QList<QNetworkCookie> networkCookieList = cookieJar()->cookiesForUrl(req.url());
}
void AccessHttp::do_get_cookie(QString url, QString content)
{
QString absUrl;
absUrl = url.append(content);
QNetworkRequest req;
req.setUrl(QUrl(absUrl));
// G_sid="sid=PKTbgfodRcyHLRBQuMX+rg";
//req.setHeader(QNetworkRequest::CookieHeader,G_sid);
//req.setRawHeader("Cookie",G_sid.toAscii());
netManager->get(req);
}
//获取cookie信息
void AccessHttp::getCookie( QString &usr, QString &pwd)
{
QString usrname = usr;
QString password = MD5Encryption(pwd);
QString url = "http://127.0.0.1:13180";
QString content = QString("/request_userlogin?username=%1&userpassword=%2&code= HTTP/1.1").arg(usrname).arg(password);
QString sumUrl = url.append(content);
qDebug()<<"sumUrl "<<sumUrl;
//ui->webView->load(sumUrl);
do_get(url,content);
QTime dieTime = QTime::currentTime().addMSecs(1000);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
QString cookieStr;
QList<QNetworkCookie> cookies = network_cookie_->getCookies();
for (int i = 0; i < cookies.count(); ++i)
cookieStr.append(cookies.at(i).toRawForm());
QStringList strList = cookieStr.split(";");
G_sid = strList.at(0);
qDebug()<<"cookieStr "<<cookieStr<<"G_sid"<<G_sid;
netManager->cookieJar()->setCookiesFromUrl(cookies,QUrl(url));
}
//获取用户列表函数
void AccessHttp::getUserList()
{
sflag = 1;
QString url = "http://127.0.0.1:13180";
QString arg1,arg2,arg3;
getRandomNum(); //构造随机数
//arg1 = randomStr;
arg2 = QString::number(firstUserList);
arg3 = QString::number(lastUserList);
QString content = QString("/request_userlist?mid=%1&startnum=%2&needcount=%3 HTTP/1.1").arg(randomStr).arg(arg2).arg(arg3);
do_get_cookie(url,content);
firstUserList = firstUserList+50;
lastUserList = lastUserList +50;
}
void AccessHttp::replyFinished(QNetworkReply *reply)
{
replyInfoStr.clear(); //清空原来的返回值
QByteArray bytes = reply->readAll(); // bytes
int len = 0;
len= bytes.length();
qDebug()<<"&&&&&&&&&&&&&&&&&&&"<<bytes.length();
QString string = QString::fromUtf8(bytes);
qDebug()<<"&&&&&&&&&&&&&&&&&string id "<<string;
//replyInfoStr = string;
//analyseData(replyInfoStr,sflag);
reply->deleteLater();
}
我的mian文件
#include <QtGui/QApplication>
#include "accesshttp.h"
#include <QWaitCondition>
#include <QTime>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AccessHttp w;
QString name = "100001";
QString password = "admin";
w.getCookie(name,password); //模拟登录并获取cookie
w.getUserList(); //问题所在函数,获取用户列表
// w.getUserList();
w.hide();
return a.exec();
}
我模拟登录时没有问题的,并且能成功获取cookie,并加入netManager
GET /request_userlogin?username=100001&userpassword=21232f297a57a5a743894a0e4a801fc3&code= HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Referer: http://127.0.0.1:13180/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Host: 127.0.0.1:13180
Connection: Keep-Alive
其中100001时用户名,密码是base64编码,这个我能成功登录没问题
接下来发送的请求时
GET /request_userlist?mid=0796156337802721&startnum=1&needcount=50 HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Referer: http://127.0.0.1:13180/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Host: 127.0.0.1:13180
Connection: Keep-Alive
Cookie: sid=Y05KK88fQ2296FqWjEKgzg
mid是随机构造的一个随机数,没有什么特别要求,startnum=1&needcount=50 每次累加50,表示每次请求50条记录,正确的获取应该是类似于{"data":[{"name":"","userid":"1","ver":"wan","isbm":"0","parentid":"","mac":"00:FF:4B:28:A9:C5","lanips":"192.168.0.58","wanip":"192.168.0.58","computername":"lenovo-PC","domain":"lenovo-PC","os":"Windows 7 (6.1 Build 7600),0","loginuser":"lenovo","lanport":"13145","wanport":"0","logintime":"2015-02-04 10:09:53","backupserverid":"","version":"2.0","realmac":"88:9F:FA:61:56:38","iszx":1,"auth":1},{"name":"","userid":"2","ver":"wan","isbm":"0","parentid":"","mac":"08:00:27:AA:35:8C","lanips":"192.168.0.95","wanip":"192.168.0.95","computername":"frr_win81","domain":"frr_win81","os":"Windows 8 (6.2 Build 9200),0","loginuser":"frr_win8","lanport":"13145","wanport":"0","logintime":"2015-01-27 14:27:07","backupserverid":"","version":"2.0","realmac":"08:00:27:AA:35:8C","iszx":0,"auth":1}],"isend":1,"qyid":100001}
我获取的值是"{"data":[],"isend":0,"qyid":100001}" ,isend表示请求还未结束,可是不论我请求多少次都是这个结果!请问我有哪里弄错了!