使用Qt登录网站

Login to website using Qt

本文关键字:网站 登录 Qt 使用      更新时间:2023-10-16

我需要登录到一个网站检索一个页面的源代码。我怎么用Qt来做呢?

我不熟悉QUrlQNetworkAcessManager是如何工作的,但我能够编写代码,允许我下载任何页面的源代码,而不是在登录表单后面。

这是我目前所知道的。最后我下载了重定向页面的源代码:

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;
                }


    }