Поддельный щелчок по кнопке на странице входа в систему с помощью QNetworkAccessManager

#c #qt

#c #qt

Вопрос:

Я хочу войти на страницу с помощью QNetworkAccessManager и сохранить файлы cookie, чтобы получить исходный код со страницы, на которой вы должны войти в систему. С помощью моего кода я не могу заполнить входные данные на странице, но я не могу нажать кнопку. Кто-нибудь может мне помочь, пожалуйста?

В файле .pro: QT = сеть

Вот мой код:

file.h:

 #include <QNetworkAccessManager>
#include <QUrl>
#include <QByteArray>
#include <QString>
#include <QEventLoop>
#include <QNetworkCookieJar>
#include <QNetworkProxy>

#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrlQuery>
#include <iostream>
#include <QObject>

#include <QCoreApplication>

class object : public QObject
{
    Q_OBJECT
public:
    QUrlQuery postData;
    QNetworkAccessManager *networkManager;
    QUrl serviceUrl;
    QNetworkCookieJar *cookies;
    QNetworkRequest request;

    object(QObject *parent = 0);
    ~object();

    void load();

public slots:
    void finished(QNetworkReply* a);
};
 

file.cpp:

 #include "networkaccessmanager.h"


object::object(QObject *parent)
    :  QObject(parent)
{

    networkManager = new QNetworkAccessManager();
    serviceUrl = QUrl("https://*/user/login?redirect_to=");
    cookies = networkManager->cookieJar();
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)) );
}

object::~object()
{

}

void object::load()
{
    postData.addQueryItem("user_name", "use");
    postData.addQueryItem("password", "pw");

    request.setUrl(serviceUrl);

    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
}

void object::finished(QNetworkReply *a)
{
    std::cout << a->readAll().toStdString() << std::endl;
    QCoreApplication::exit();
}
 

main.cpp:

 #include <QCoreApplication>
#include <iostream>

#include "networkaccessmanager.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    object obj;

    obj.load();

    return a.exec();
}

 

Комментарии:

1. Если имя пользователя и пароль верны, int слот завершен a-> ReadAll().toStdString() ничего не значит, а если имя пользователя или пароль неверны a-> ReadAll().toStdString() — это код страницы. Я не знаю, почему это так, но это может помочь maby

Ответ №1:

Я использовал qwebview, что я на самом деле не хотел использовать, и использовал эту функцию:

 int WebView::clickButton(QString inputName /* input[type=submit] */ )
{
    QWebElement button = this->page()->mainFrame()->documentElement().findFirst(inputName);
    if (button.isNull()) {
        std::cout << "33[2Kr" << " => Error: Button konnte nicht gefunden werden." << std::endl;
        return 1;
    }

    button.evaluateJavaScript( "this.click()" );
    return 0;
}