Что я делаю, это cli multiple IP checker, если его онлайн-вход в его html-форму, используя: input type = "text" name = "username" id = "username"; input type = "password" name = "password" id = "password" и получить значение из нескольких атрибутов, но такие вещи, как network.post (request, loginData) или аналогичные, которые встраивают имя пользователя и пароль в ссылку, как-то не работают , Мне нужно что-то вроде подхода Mechanize, но ist доступно только в Ruby и Python. Любая помощь приветствуется, bunging моей головы на этом несколько недель, не получить, что сделано ...Как подключиться к веб-форме с помощью qt5
Вот код формы:
<body>
<table border="0" cellpadding="0" cellspacing="0" align="center" class="loginsubtable">
<form enctype="multipart/form-data" id="loginform" method="post" action="/login.cgi">
<tr>
<td valign="top"><img src="/130830.1622/images/airos_logo.png"></td>
<td class="loginsep">
<input type="hidden" name="uri" id="uri" value="/" />
<table border="0" cellpadding="0" cellspacing="0" class="logintable" align="center">
<tr>
<td colspan="2" align="center">
<div id="errmsg" class="error">
</div>
</td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td><label for="username">Username:</label></td>
<td><input type="text" name="username" id="username" /></td>
</tr>
<tr>
<td><label for="password">Password:</label></td>
<td><input type="password" name="password" id="password" maxlength="128"/></td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
</td>
<td class="submit" align="right">
<input type="submit" value="Login" />
</td>
</tr>
</form>
</table>
</body>
Обновление для вопроса:
Я написал небольшие multipart/form-data, которые содержат форму и файл действий для тестирования кода ниже:
1. Форма:
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h2>Data Collection</h2><p>
<form enctype="multipart/form-data" id="loginform" method="post" action="proceed.php">
<table>
<tr>
<td>Name:</td>
<td><input type="text" name="username" id="username"/></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="text" name="password" id="password"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit"/>
</td>
</tr>
</table>
</form>
</body>
</html>
2. Действие Файл:
<html>
<body>
Welcome <?php echo $_POST["username"]; ?><br>
Your password is: <?php echo $_POST["password"]; ?>
</body>
</html>
3. Код для теста:
void MainWindow::login()
{
manager = new QNetworkAccessManager(this);
//ssl errors ignoring
connect(manager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
this,SLOT(onIgnoreSSLErrors(QNetworkReply*,QList<QSslError>)));
theurl = "http://localhost/form/";
QString userName = "usr";
QString userPassword = "pwd";
qDebug() << "Attempting to login with Username =" << userName << "and Password =" << userPassword;
m_userName = userName;
QHttpMultiPart *loginData = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart userNamePart;
userNamePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("multipart/form-data; name=\"username\"; filename=\""+ userName + "\""));
userNamePart.setBody(userName.toUtf8());
QHttpPart userPasswordPart;
userPasswordPart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("multipart/form-data; name=\"password\"; filename=\""+ userPassword + "\""));
userPasswordPart.setBody(userPassword.toUtf8());
loginData->append(userNamePart);
loginData->append(userPasswordPart);
qDebug() << "OK with code1";
QNetworkRequest request(theurl);
request.setRawHeader("User-Agent" , "Mozilla Firefox");
qDebug() << "OK with code2";
QNetworkReply *reply = manager->post(
request,
loginData);
loginData->setParent(reply);
qDebug() << "OK with code3";
connect(reply, SIGNAL(finished()),
SLOT(_q_onLoginRequestFinished()));
connect(reply, SIGNAL(metaDataChanged()),
SLOT(_q_onLoginMetaDataChanged()));
}
void MainWindow::_q_onLoginRequestFinished()
{
qDebug() << Q_FUNC_INFO;
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
QByteArray ba = reply->readAll();
qDebug() << ba + " request-finished->";
if (!reply)
return;
QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie> >(reply->header(QNetworkRequest::SetCookieHeader));
if(cookies.count() != 0){
//you must tell which cookie goes with which url
manager->cookieJar()->setCookiesFromUrl(cookies, theurl);
}
qDebug() << QString::number(cookies.count());
if (ba.isEmpty())
{
emit loggedInAs(m_userName);
m_isLoggedIn = true;
emit isLoggedInChanged();
}
}
void MainWindow::_q_onLoginMetaDataChanged()
{
qDebug() << Q_FUNC_INFO;
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
if (!reply)
return;
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (!statusCode.isValid())
return;
int status = statusCode.toInt();
if (status != 302)
{
QString reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
qDebug() << QString::number(status) + " status num" ;
qDebug() << tr("Loging request failed: %1.").arg(reason);
emit loginFailed(reason);
}
if(status == 302)
{
QUrl newUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
qDebug() << "redirected from xx to " + newUrl.toString();
QNetworkRequest newRequest(newUrl);
manager->get(newRequest);
return;
}
}
Этот код печатает только HTML формы, но должны представить и распечатать результат действия. Он использует .cgi. Есть ли способ войти через .cgi?
theurl должен указать URL-адрес формы, ** не ** форму. – dom0
он работает для бесплатной формы для печенья, но как заставить его работать для https: //localhost/login.cgi? Uri =/ –