1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00
LibQQt/demo/LearnCookieTest/mainwindow.cpp

298 lines
10 KiB
C++
Raw Normal View History

2018-03-03 14:09:29 +08:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <GumboQueryDocument.h>
#include <GumboQuerySelection.h>
#include <GumboQueryNode.h>
#include <QStringList>
#include <QTextCodec>
MainWindow::MainWindow ( QWidget* parent ) :
QMainWindow ( parent ),
ui ( new Ui::MainWindow )
{
ui->setupUi ( this );
m_webmanager = new QQtWebAccessManager ( this );
connect ( m_webmanager, SIGNAL ( replyFinished ( QQtWebAccessSession* ) ),
this, SLOT ( replyFinished ( QQtWebAccessSession* ) ) );
m_webmanager->setCookieJar ( &cookiejar );
sendInitPage();
}
MainWindow::~MainWindow()
{
delete ui;
}
QList<QNetworkCookie> MainWindow::getLoginCookies()
{
QUuid uuid = QUuid::createUuid ( );
QString uuidStr = uuid.toString();
uuidStr.remove ( '-' ).remove ( '{' ).remove ( '}' );
uuidStr = uuidStr.toUpper();
//pline() << uuidStr;
const int size = 3;
QNetworkCookie cookies[size] =
{
QNetworkCookie ( "orgId", "1" ),
QNetworkCookie ( "orgName", "%25u8D44%25u9633%25u5E02%25u536B%25u8BA1%25u59D4" ),
QNetworkCookie ( "userName", "ss_admin" )
};
QList<QNetworkCookie> cookieList;
for ( int i = 0; i < size; i++ )
cookieList.push_back ( cookies[i] );
return cookieList;
}
QList<QNetworkCookie> MainWindow::getSessionCookies()
{
QUuid uuid = QUuid::createUuid ( );
QString uuidStr = uuid.toString();
uuidStr.remove ( '-' ).remove ( '{' ).remove ( '}' );
uuidStr = uuidStr.toUpper();
//pline() << uuidStr;
static QString myuuidstr = uuidStr;
const int size = 4;
QNetworkCookie cookies[size] =
{
QNetworkCookie ( "JSESSIONID", myuuidstr.toLocal8Bit().constData() ),
QNetworkCookie ( "orgId", "1" ),
QNetworkCookie ( "orgName", "%25u8D44%25u9633%25u5E02%25u536B%25u8BA1%25u59D4" ),
QNetworkCookie ( "userName", "ss_admin" )
};
QList<QNetworkCookie> cookieList;
for ( int i = 0; i < size; i++ )
cookieList.push_back ( cookies[i] );
return cookieList;
}
2018-03-03 14:09:29 +08:00
void MainWindow::sendInitPage()
{
QString url =
"http://124.161.179.36:8080/index/";
req.setUrl ( QUrl ( url ) ); //
m_webmanager->sendGetRequest ( req );
}
void MainWindow::sendGetLoginPage()
{
QString url =
"http://124.161.179.36:8080/index/ssologin.action";
req.setUrl ( QUrl ( url ) ); //
m_webmanager->sendGetRequest ( req );
}
void MainWindow::sendLoginRequest()
{
req.setRawHeader ( "User-Agent",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" );
req.setRawHeader ( "Accept-Encoding", "gzip, deflate" );
req.setRawHeader ( "Accept-Language", "zh-cn" );
req.setRawHeader ( "Connection", "keep-alive" );
req.setRawHeader ( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" );
req.setRawHeader ( "DNT", "1" );
req.setRawHeader ( "Origin", "http://124.161.179.36:8080" );
req.setRawHeader ( "Host", "124.161.179.36:8080" );
req.setRawHeader ( "X-Requested-With", "XMLHttpRequest" );
req.setRawHeader ( "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" );
req.setRawHeader ( "Upgrade-Incecure-Requests", "1" );
// req.setRawHeader ( "Referer",
// "http://124.161.179.36:8080/sso/login?service=http%3A%2F%2F124.161.179.36%3A8080%2Findex%2Fssologin.action" );
QList<QNetworkCookie> cookieList = getLoginCookies();
QListIterator<QNetworkCookie> itor ( cookieList );
while ( itor.hasNext() )
{
QNetworkCookie cookie = itor.next();
cookiejar.insertCookie ( cookie );
}
// QVariant cookieVar;
// cookieVar.setValue ( cookiejar.cookiesForUrl() );
// req.setHeader ( QNetworkRequest::CookieHeader, cookieVar );
QString url =
"http://124.161.179.36:8080/sso/login?service=http%3A%2F%2F124.161.179.36%3A8080%2Findex%2Fssologin.action";
req.setUrl ( QUrl ( url ) ); //
req.setRawHeader ( "Content-Length", "124" );
QByteArray data;
data = "isJgChecked=on&orgid=1&username=ss_admin&isZhChecked=on&lt=e2s2&_eventId=submit&rememberMe=1&password=MTExMTEx&imageCode=954";
m_webmanager->sendPostRequest ( req, data );
}
void MainWindow::sendYaowuRequest()
{
req.setRawHeader ( "Accept", "application/json, text/javascript, */*; q=0.01" );
req.setRawHeader ( "Referer", "http://124.161.179.36:8080/index/ssologin.action" );
QString url =
"http://124.161.179.36:8080/index/dictionaryItem/queryItemTreeListByCode.action?dictionaryCode=DIC_GBT2260_2007&itemCode=null";
QByteArray cookieBytes =
"JSESSIONID=40E28196F1766BDEC15F6B11B465E8EE; orgId=1; orgName=%25u8D44%25u9633%25u5E02%25u536B%25u8BA1%25u59D4; userName=ss_admin";
req.setRawHeader ( "Referer", "http://124.161.179.36:8080/dictionary-manage/yptym/totymzdmx.action" );
url = QString ( "http://124.161.179.36:8080/dictionary-manage/yptym/queryZDMXList.action" );
cookieBytes =
"JSESSIONID=03D49123CB34BDBEA60E2F36C23118C9; orgId=1; orgName=%25u8D44%25u9633%25u5E02%25u536B%25u8BA1%25u59D4; userName=ss_admin";
//登陆
cookieBytes =
"JSESSIONID=74F47D80C4681A4E3E1509018AE68747; orgId=1; orgName=%25u8D44%25u9633%25u5E02%25u536B%25u8BA1%25u59D4; userName=ss_admin";
//mReq.setRawHeader ( "Referer", "http://124.161.179.36:8080/dictionary-manage/yptym/totymzdmx.action" );
url = QString ( "http://124.161.179.36:8080/sso/login?service=http%3A%2F%2F124.161.179.36%3A8080%2Fdictionary-manage%2Findex.action" );
cookieBytes =
"";
QList<QNetworkCookie> cookieList = getSessionCookies();
//pline() << cookieList;
QVariant cookieVar;
cookieVar.setValue ( cookieList );
req.setUrl ( QUrl ( url ) ); //
//mReq.setHeader ( QNetworkRequest::CookieHeader, cookieVar );//
//cookiejar.setCookiesFromUrl ( cookieList, url );
}
void MainWindow::replyFinished ( QQtWebAccessSession* session )
{
QNetworkReply* reply = session->getWebAccessReply();
//pline() << reply->readAll();
pline() << "请求的网址" << reply->url().toString();
QList<QNetworkCookie> cookies = m_webmanager->cookieJar()->cookiesForUrl ( reply->url() );
//=外部设置的CookieJar
2018-03-03 14:09:29 +08:00
//pline() << "内部cookie" << cookies;
cookies = cookiejar.cookiesForUrl ( reply->url() );
static QList<QNetworkCookie> staticCookieList = cookies;
if ( staticCookieList != cookies )
{
pline() << "cookies 在这次请求返回后被更换了";
staticCookieList = cookies;
}
pline() << "我本地存储的cookie" << cookies;
//经过测试QNetworkCookieJar可以保存多个网址的cookie组。
// pline() << "cookie for " << "http://124.161.179.36:8080/index/ssologin.action" <<
// m_webmanager->cookieJar()->cookiesForUrl (
// QUrl ( "http://124.161.179.36:8080/index/ssologin.action" ) );
2018-03-03 14:09:29 +08:00
int nHttpCode = reply->attribute ( QNetworkRequest::HttpStatusCodeAttribute ).toInt(); //http返回码
if ( nHttpCode == 200 ) //成功
{
pline() << "success";
}
else if ( nHttpCode == 302
|| nHttpCode == 301 )
{
QString redirect = reply->attribute ( QNetworkRequest::RedirectionTargetAttribute ).toString();
pline() << "redirect" << "重定向url是" << redirect;
req.setRawHeader ( "Content-Length", "0" );
// QVariant var;
// var.setValue ( cookieList );
// req.setHeader ( QNetworkRequest::CookieHeader, var );
if ( redirect.contains ( "http" ) )
req.setUrl ( QUrl ( redirect ) );
else
{
req.setUrl ( QUrl ( "http://124.161.179.36:8080" + redirect ) );
}
m_webmanager->sendGetRequest ( req );
return;
}
else
{
pline() << nHttpCode << "fail";
return;
}
QByteArray resultContent = reply->readAll();
//pline() << QString ( resultContent );
QString result1 = resultContent;
//pline() << result1.toLatin1().constData();
pline() << QTextCodec::codecForHtml ( resultContent )->name();
QString codecName = QTextCodec::codecForHtml ( resultContent )->name();
/*用页面源文件的编码来进行解码 GB2312 or UTF-8*/
QTextCodec* pCodec = QTextCodec::codecForName ( "UTF-8" );
QString strResult = pCodec->toUnicode ( resultContent );
//pline() << strResult;
QTextCodec* pCodec2 = QTextCodec::codecForName ( "UTF-8" );
QByteArray resultContent2 = pCodec2->fromUnicode ( strResult );
QString result2 = resultContent2;
//pline() << result2;
pline() << QTextCodec::codecForLocale()->name();
pline() << result2;
//获取初始页面成功,开始获取登录页面
if ( result2.contains ( "0;url=ssologin.action" ) )
{
sendGetLoginPage();
return;
}
//获取登录页面成功,需要获取验证码,使用用户名密码开始登录请求。
else if ( result2.contains ( "!--登录框start--" ) )
{
//这里是登陆的最后一步,也是关键一步,但是没有实现。这个函数里面,验证码是错误的,所以登录失败,再一次进入相同页面。
//关于地址服务器IP 端口
//关于用户名密码,加密的密码。(抓包软件抓到的那种。)
//关于验证码没有实现读取所以实现到这里就停下了。但是使用cookie进行通信的过程顺序理清楚了。
//这个程序的重点在于学习http带cookie的工作过程。
sendLoginRequest();
return;
}
QTextCodec* pCodec3 = QTextCodec::codecForName ( "GBK" );
QByteArray resultContent3 = pCodec3->fromUnicode ( resultContent2 );
QString result3 = resultContent3;
QFile file ( "/Users/abel/Desktop/cc.html" );
file.open ( QFile::WriteOnly );
file.write ( result1.toLocal8Bit().constData() );
file.close();
return;
GumboQueryDocument doc;
doc.parse ( result2.toLocal8Bit().constData() );
GumboQuerySelection s = doc.find ( "table" );
GumboQueryNode pNode = s.nodeAt ( 0 );
QString txt = QString::fromStdString ( pNode.text() );
//pline() << txt;
QStringList tList = txt.split ( "\n", QString::SkipEmptyParts );
}
void MainWindow::on_pushButton_clicked()
{
}