Войти на сайт с помощью 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 работает, но я получаю исходный код страницы входа с заполненной формой входа. Не знаю, как получить страницу после входа в систему.


person Quaxton Hale    schedule 05.05.2014    source источник
comment
Установка имени пользователя и пароля полезна только для сайтов, использующих HTTP-аутентификацию пользователя. Для большинства веб-сайтов вам потребуется отправить форму, содержащую обязательные поля.   -  person Captain Obvlious    schedule 05.05.2014
comment
@CaptainObvlious Отредактировано с кодом. Я бы так отправил POST?   -  person Quaxton Hale    schedule 05.05.2014
comment
Похоже, вы уже в пути, но вы, вероятно, захотите изменить http на https, так как многие веб-сайты требуют аутентификации через зашифрованное соединение.   -  person Captain Obvlious    schedule 05.05.2014
comment
@CaptainObvlious Как мне пройти страницу перенаправления? Должен ли я отправить еще один запрос GET?   -  person Quaxton Hale    schedule 05.05.2014
comment
Неважно, я придумал решение.   -  person Quaxton Hale    schedule 06.05.2014
comment
Это хорошая возможность ответить на свой вопрос.   -  person Captain Obvlious    schedule 06.05.2014
comment
Это особенно хорошая возможность из-за того, что Google теперь поднимает эту страницу в поиске. Не могли бы вы поделиться своим решением?   -  person Paul Nelson Baker    schedule 08.08.2014


Ответы (1)


Это было мое решение для входа на определенный веб-сайт и получения файла. Меня несколько раз перенаправляли, прежде чем я достиг пункта назначения. Я тестирую коды состояния HTTP, пока не получу окончательный ответ. Я также проверяю, является ли конечный 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;

                }




    }
person Quaxton Hale    schedule 08.08.2014