如何使用Qt进行post get模拟登录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Qt进行post get模拟登录相关的知识,希望对你有一定的参考价值。
QtWebKit模块实现了html到DOM的解析,封装了Get等方法,直接使用就行了例:用代码实现在百度首页中输入关键字并提交,然后显示百度返回的搜索结果:
#include "widget.h"
#include "ui_widget.h"
#include <QtWebKit>
#include <QDebug>
#include <QtNetwork/QtNetwork>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);//ui窗体上放了一个QWebView部件,一个testButton按钮
ui->webView->setUrl(QUrl("<a href=""" target="_blank">h"</a>));
Widget::~Widget()
delete ui;
void Widget::on_testButton_clicked()
QWebPage *p=ui->webView->page();
QWebElement e = p->mainFrame()->findFirstElement("input[id=kw]");//输入框
e.setAttribute("value","金瓶梅");//指定搜索的关键字
QWebElement submit = p->mainFrame()->findFirstElement("input[id=su]");//提交按钮
p->mainFrame()->documentElement().evaluatejavascript("document.getElementById(\'su\').click()");
//上面一句是执行javascript脚本,让提交按钮产生单击事件,随后接受到百度返回的搜索结果页面
void Widget::changeEvent(QEvent *e)
QWidget::changeEvent(e);
switch (e->type())
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
-------------------
Main.cpp:
#include <QtGui/QApplication>
#include "widget.h"
#include <QTextCodec>
int main(int argc, char *argv[])
QApplication a(argc, argv);
QTextCodec *c = QTextCodec::codecForName("gb18030");
QTextCodec::setCodecForLocale(c);
QTextCodec::setCodecForCStrings(c);
QTextCodec::setCodecForTr(c);
Widget w;
w.show();
return a.exec();
参考技术A QtWebKit模块实现了HTML到DOM的解析,封装了Get等方法,直接使用就行了
例:用代码实现在百度首页中输入关键字并提交,然后显示百度返回的搜索结果:
#include "widget.h"
#include "ui_widget.h"
#include <QtWebKit>
#include <QDebug>
#include <QtNetwork/QtNetwork>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);//ui窗体上放了一个QWebView部件,一个testButton按钮
ui->webView->setUrl(QUrl("http://www.baidu.com/"));
Widget::~Widget()
delete ui;
void Widget::on_testButton_clicked()
QWebPage *p=ui->webView->page();
QWebElement e = p->mainFrame()->findFirstElement("input[id=kw]");//输入框
e.setAttribute("value","金瓶梅");//指定搜索的关键字
QWebElement submit = p->mainFrame()->findFirstElement("input[id=su]");//提交按钮
p->mainFrame()->documentElement().evaluateJavaScript("document.getElementById('su').click()");
//上面一句是执行javascript脚本,让提交按钮产生单击事件,随后接受到百度返回的搜索结果页面
void Widget::changeEvent(QEvent *e)
QWidget::changeEvent(e);
switch (e->type())
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
-------------------
Main.cpp:
#include <QtGui/QApplication>
#include "widget.h"
#include <QTextCodec>
int main(int argc, char *argv[])
QApplication a(argc, argv);
QTextCodec *c = QTextCodec::codecForName("gb18030");
QTextCodec::setCodecForLocale(c);
QTextCodec::setCodecForCStrings(c);
QTextCodec::setCodecForTr(c);
Widget w;
w.show();
return a.exec();
C# 模拟登录网站的cookie问题
使用httpwebrequest post用户名密码来获取页面的查看权限,在使用get来获取需要的内容.
现在做好是输入要查询的内容后,先post用户名密码再get内容,怎样才能保持cookie,实现只用登录1次就行?
就是程序开始运行时post一次 。每次输入要查询的内容直接get就可以了?
另外,如果cookie超时,get目标页面会报500错误,C#中如何检查服务器状态,以实现超时后在次post?
主要是cookie传值的问题 比如我在Form_Load提交post获得cookie,我没办法在button里面调用啊 怎样才能调用到这个cookie?ref 是不是还是每次都要先请求post?
另外 500错误 程序会直接出错,而不返回html内容哦
post方法大致如下
public static string SendData(string method, string Url, byte[] data, ref CookieContainer cookie, string encoding, string refer)
string retString = "";
try
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (cookie.Count == 0)
request.CookieContainer = new CookieContainer();
cookie = request.CookieContainer;
else
request.CookieContainer = cookie;
//实际处理
catch (Exception e)
throw e;
return retString;
get 方法大致如下
public static string SendData(string Url, ref CookieContainer cookie, string encoding, string refer)
return SendData("get", Url, null, ref cookie, encoding, refer);
2. 根据返回的html值进行判断,如果包括了500错误,重新post即可追问
主要是cookie传值的问题 比如我在Form_Load提交post获得cookie,我没办法在button里面调用啊 怎样才能调用到这个cookie?ref 是不是还是每次都要先请求post?
另外 500错误 程序会直接出错,而不返回html内容哦
1. 这个CookieContainer变量可以设置为窗体的成员,比如下面
public partial class Form1 : Form
private CookieContainer cookie;
public Form1()
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
2. 在SendData中加异常处理,一旦抛出异常则返回html为string.Empty,你的应用程序获得为空时就应该重新get和post了
添加private CookieContainer cookie;
调用时提示错误 “非静态的字段、方法或属性“WindowsFormsApplication1.Form1.cookie”要求对象引用”
如果你是静态方法调用就应该是
private static CookieContainer cookie;
关键是怎么传递这个cookie啊...不知道怎么做
追答请求时指定Header属性
Headers.Add(HttpRequestHeader.Cookie, cookie);
以上是关于如何使用Qt进行post get模拟登录的主要内容,如果未能解决你的问题,请参考以下文章