使用Qt登录网站
Login to website using Qt
我需要登录到一个网站检索一个页面的源代码。我怎么用Qt
来做呢?
我不熟悉QUrl
和QNetworkAcessManager
是如何工作的,但我能够编写代码,允许我下载任何页面的源代码,而不是在登录表单后面。
这是我目前所知道的。最后我下载了重定向页面的源代码:
test = new QNetworkAccessManager(this);
QUrl URL = QUrl("http://website.com/page");
URL.setUserName("user");
URL.setPassword("password");
test->get(QNetworkRequest(URL));
编辑:QByteArray loginData("username=user&password=password");
QNetworkRequest request(QUrl("http://website.com/login/index.php"));
manager->post(request,loginData);
QUrl URL = QUrl("http://website.com/mod/resource/view.php?id=114198");
manager->get(QNetworkRequest(URL));
我仍然在检索303回复。
页面在Moodle上,它使用HTTP POST登录表单。
我也试过另一个网站。POST工作,但我得到的登录页的源代码与填写的登录表单。不确定登录后如何获得页面。
这是我的解决方案,登录到一个特定的网站和检索文件。在到达目的地之前,我多次被重定向。我测试HTTP状态码,直到得到最后的回复。我还测试了最终URL是否是我请求的URL,而不是登录页面后面的某个主页。这是因为我正在下载一个文件。
QByteArray loginData;
loginData.append("username="+(ui->lineEdit_2->text())+"&password="+(ui->lineEdit_3->text())+"&action=login");
cookiesHandler* test = new cookiesHandler(this);
QUrl request("http://website.com");
test->sendPostRequest(request, loginData);
cookie处理程序类
class cookiesHandler: public QObject{
Q_OBJECT
public:
cookiesHandler(QObject *parent = 0) : QObject(parent){
mManager = new QNetworkAccessManager(this);
mManager->setCookieJar(new QNetworkCookieJar(this));
connect(mManager, SIGNAL(finished(QNetworkReply*)), SLOT(replyFinished(QNetworkReply*)));
}
void sendPostRequest(const QUrl &url, const QByteArray &data){
mUrl = url;
login = data;
QNetworkRequest r(mUrl);
mManager->post(r, data);
}
void sendGetRequest(const QUrl &url)
{
mUrl = url;
test = mUrl;
QNetworkRequest r(mUrl);
mManager->get(r);
}
virtual ~cookiesHandler(){}
private slots:
void replyFinished(QNetworkReply *reply){
if (reply->error() != QNetworkReply::NoError){
qWarning() << "ERROR:" << reply->errorString();
return;
}
//Cookies//
QList<QNetworkCookie> cookies = mManager->cookieJar()->cookiesForUrl(mUrl);
qDebug() << "COOKIES for" << mUrl.host() << cookies;
QString str;
QDebug dStream(&str);
dStream << mUrl.host() << cookies;
//End Cookies//
int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (v >= 200 && v < 300) // Success
{
getFile(reply);
// Here we got the final reply
return;
}
else if (v >= 300 && v < 400) // Redirection
{
/* Use Cookies for Login */
qDebug() << "REDIRECTING";
rUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if(rUrl != mUrl)
{
mManager->post(QNetworkRequest(rUrl),login);
return;}
out << QString("redirected: " + rUrl.toEncoded()) << endl;
QNetworkRequest r(mUrl);
QVariant var;
var.setValue(cookies);
r.setHeader(QNetworkRequest::CookieHeader, var);
mManager->get(r);
return;
}
}
相关文章:
- 如何使用url确定网站协议
- 密码登录程序将永远循环并显示不正确的结果
- 如何检查cURL是否成功登录?c ++
- 如何从网站获取数据并将其传输到数据库?
- 网站和C++程序在同一台 Linux PC 上的通信
- 从网站复制证书,并使用脚本将其添加到受信任的根证书颁发机构
- 在 Tizen 中登录特定文件?
- 谷歌浏览器在访问网站时发送第二个 0 长度的请求?
- 如何在 c++ 中将密码和用户名保存到 .txt 文件中.如果用户尝试登录,我仍然希望能够检索它们
- Win7 C++ - 从以用户身份登录的服务启动可执行文件的问题
- 在主窗口之前显示登录对话框并隐藏主窗口按钮
- 为什么作业提交网站的输出与Visual Studio不同
- 如何使用 libcurl 登录本网站?(C++)
- 如何使用 Apache C 模块登录到文件
- 是否需要QtWebkit从需要登录的网站获取数据
- 登录一个网站,然后访问该网站的另一个部分
- 基于令牌的网站登录
- 如何将HTML表单发送到网站进行登录,并使用c++下载网页(使用WinHTTP API)
- 创建一个脚本,使我自动登录到由 IP URL 访问的网站,包括"click OK to logon"
- 使用Qt登录网站