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