使用Qt登录网站

时间:2014-05-05 18:34:49

标签: c++ qt qnetworkaccessmanager

我需要登录网站才能检索网页的源代码。我如何使用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工作但我得到登录页面的源代码,填写了登录表单。登录后不确定如何获取页面。

1 个答案:

答案 0 :(得分:0)

这是我的解决方案,用于登录特定网站并检索文件。在到达目的地之前,我被多次重定向。我测试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;

                }




    }