2015-05-03 2 views
1

Я ищу страницу входа, и мне нужно создать для нее сообщение POST. Вот источник страницы входа в систему.Automate HTTPS Login

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title></title> 
<link rel="stylesheet" href="style.css" /> 
<script language="javascript" src="jquery.js"></script> 
<script type="text/javascript" language="javascript">$(document).ready(function(){});</script> 
</head> 
<body style="background-color:#FFF; background-image:url(satellite.png); background-repeat:no-repeat; background-position:top center; max-width:100%;"> 
<div id="login" > 
    <form id="auth_user_sys" name="auth_user_sys" action="index.php" method="post"> 
     <fieldset> 
      <legend>Authentication</legend> 
      <table> 
       <tr><td colspan="2">&nbsp;</td></tr> 
       <tr><td><label>* Username </label></td><td><input id="user_sys" name="user_sys" type="text"/></td></tr> 
       <tr><td><label>* Password </label></td><td><input id="user_p_sys" name="user_p_sys" type="password"/></td></tr> 
       <tr><td colspan="2" align="center"><input id="btlog" name="btlog" type="submit" value="Connection"/></td></tr> 
       <tr><td colspan="2"></td></tr> 
      </table> 
     </fieldset> 
    </form> 
</div> 
</body> 
</html> 

Я попытался и не смог до сих пор (я использую Qt):

QUrlQuery urlQuery; 
urlQuery.addQueryItem("user_sys", username); 
urlQuery.addQueryItem("user_p_sys", password); 
QString params = urlQuery.query(); 

QNetworkRequest request(url); 

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 
request.setHeader(QNetworkRequest::ContentLengthHeader, params.length()); 

pNetMgr->post(request, params.toLatin1()); 

Я говорю это не удается, потому что ответ на POST такое же, как в ответ на оригинальный ГЭТ для этого URL-адреса, а именно для источника для страницы входа.

+3

«не удалось», каким образом? какой ответ сервера вы получаете? –

+0

Хороший вопрос! Это не удалось, потому что я получаю ответ обратно с тем же HTML, что и с простым GET. В основном это просто возвращает меня обратно на страницу входа. –

ответ

0

Я понял. В разделе «Аутентификация» есть 3 «входных имени», но я только отправлял 2. Я добавил элемент «btlog» (см. Ниже), и он вернулся с набором cookie и ссылкой на страницу, которую мне нужно было отправить к.

QUrlQuery urlQuery; 
urlQuery.addQueryItem("btlog",  "Connection"); 
urlQuery.addQueryItem("user_sys", username); 
urlQuery.addQueryItem("user_p_sys", password); 
QString params = urlQuery.query(); 

QNetworkRequest request(url); 

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 
request.setHeader(QNetworkRequest::ContentLengthHeader, params.length()); 

pNetMgr->post(request, params.toLatin1()); 
+1

Приятно, это были мои следующие две догадки. Позвольте мне добавить два намека: 1. речь идет о «входных именах» не о «идентификаторах ввода». В вашем примере они совпадают, но всегда является атрибутом «name», который является ключом для этого поля. 2. Вы по-прежнему делаете ненужную копию своих данных. Измените 'pNetMgr-> post (request, QByteArray (params.toLatin1()));' to 'pNetMgr-> post (request, params.toLatin1());' –

+0

Спасибо! Я исправлю это. –

1

Во-первых, QUrlQuery заботится закодировать себя:

QString username = "aba"; 
QString password = "equals-sign:=amp:&nice"; 

QUrlQuery urlQuery; 
urlQuery.addQueryItem("user_sys", username); 
urlQuery.addQueryItem("user_p_sys", password); 
QString params = urlQuery.query(); 

qDebug() << params; 

дисплеи:

user_sys=aba&user_p_sys=equals-sign:%3Damp:%26nice 

Я задаюсь вопросом, какие типы username и password имеют в своем коде, потому что toPercentEncoding() существует только для QByteArray и QUrl. Вам нужны QStrings.

Во-вторых, params.toLatin1() уже возвращает QByteArray. Нет смысла преобразовывать его в неуправляемый указатель стиля C, а затем обратно в QByteArray. Go for

pNetMgr->post(request, params.toLatin1()); 

В-третьих, вы отправляете кодированные данные latin1. Используете ли вы имя пользователя или соглашение, содержащие символы, которые не указаны в latin1 alphabet?

+0

Спасибо за указатели! Имя пользователя и пароль были действительно QByteArrays, я поменяю их на QStrings. В этом пароле есть «@», но все. Любые другие идеи о том, что может отсутствовать в POST. Эти изменения не заставляют его работать ... –