2014-10-07 1 views
0

Что я делаю, это 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">&nbsp;</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">&nbsp;</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?

+1

theurl должен указать URL-адрес формы, ** не ** форму. – dom0

+0

он работает для бесплатной формы для печенья, но как заставить его работать для https: //localhost/login.cgi? Uri =/ –

ответ

0

Возможно, вы не представили данные в правильной форме. Проверьте с помощью таких инструментов, как Wireshark, что ваша программа действительно отправляет на сервер и соответствует ли это вашим ожиданиям.

Поскольку не так уж много, чтобы сказать с этим вопросом, я расскажу, как правильно отправлять запросы POST с помощью QNetworkAccessManager.

Обновление: Теперь это относится к многочастным формам, а не к нормальным urlencoded-формам. Остерегайтесь, эти два несовместимы и обрабатываются совершенно иначе. Возможно, вам потребуется настроить .toUtf8 для соответствия ожидаемому кодированию сервером.

QHttpMultiPart loginData(QHttpMultiPart::FormDataType); 
QHttpPart userNamePart; 
userNamePart.setHeader(QNetworkRequest::ContentDispositionHeader, 
         QVariant("form-data; name=\"username\"")); 
userNamePart.setBody(userName.toUtf8()); 

QHttpPart userPasswordPart; 
userPasswordPart.setHeader(QNetworkRequest::ContentDispositionHeader, 
          QVariant("form-data; name=\"password\"")); 
userPasswordPart.setBody(userPassword.toUtf8()); 

QHttpPart uriPart; 
uriPart.setHeader(QNetworkRequest::ContentDispositionHeader, 
        QVariant("form-data; name=\"uri\"")); 
uriPart.setBody("/"); 

loginData.append(userNamePart); 
loginData.append(userPasswordPart); 
loginData.append(uriPart); 

QNetworkRequest loginRequest(loginUrl); 

// set up QNetworkAccessManager 

QNetworkReply *loginReply = networkManager->post(
      loginRequest, 
      &loginData); 
// note that the fully encoded representation does contain only ASCII characters 

QObject::connect(loginReply, &QNetworkReply::finished, [loginReply]() { 
    qDebug() << loginReply->readAll(); 
}); 

законченный сигнал Connect loginReply сек обработчика для проверки состояния HTTP и анализировать поступающие данные, используя, например, средство обработки XML в Qt. Здесь я просто отказываюсь от ответа серверов qDebug.

+0

Благодарим вас за ответ! Использовал ваш код, отрезанный, у меня есть httpstatuscode 200 и не входит в html-часть, если он может помочь в форме, содержит такой код: form enctype = "multipart/form-data" id = "loginform" method = "post" action = "/ login.cgi"/form –

+0

Вы можете добавить полную форму ('form'-tag, все поля, предпочтительно без разметки) HTML-форму на ваш вопрос? – dom0

+0

Я добавил полный код формы –

Смежные вопросы