Russian Qt Forum

Qt => Работа с сетью => Тема начата: DpoHro от Май 03, 2011, 15:22



Название: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: DpoHro от Май 03, 2011, 15:22
Первым шагом гружу, страницу авторизации твиттера.
Я правильно понимаю, что QNetworkAccessManager все куки сохранит и при формировании через него следующего запроса их в него пихать не надо?
Вот на втором этапе (авторизация) и не получается чтото ((
Пытаюсь повторить на QT, вот это: http://www.newbug.info/2010/10/twitter-oauth.html
Код на PHP работает, проверял, я же не могу авторизоваться, возвращается страница с ошибкой (

Код:
#include <QDebug>
#include <QRegExp>

#include "qrequester.h"

QRequester::QRequester(QObject *parent)
: QThread(parent)
{
m_netManager = new QNetworkAccessManager();

QReNetworkCookieJar *cookieJar = new QReNetworkCookieJar(this);

m_netManager->setCookieJar(cookieJar);

connect(m_netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

QRequester::~QRequester()
{

}

QNetworkRequest QRequester::makeRequest(QUrl _url)
{
QNetworkRequest request(_url);

request.setRawHeader("Host", "mobile.twitter.com");
request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042809 GranParadiso/3.0.10");
request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
request.setRawHeader("Accept-Language", "ru,en-us;q=0.7,en;q=0.3");
//request.setRawHeader("Accept-Encoding", "gzip,deflate");
request.setRawHeader("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
request.setRawHeader("Keep-Alive", "300");
request.setRawHeader("Connection", "keep-alive");

return request;
}

void QRequester::DoRequest()
{
QNetworkRequest request = makeRequest(QUrl("https://mobile.twitter.com/session/new"));

QNetworkReply *reply = m_netManager->get(request);
//reply->ignoreSslErrors();

m_step = STEP_AUTHPAGE;
}

void QRequester::replyFinished(QNetworkReply* _reply)
{
qDebug() << "Reply Finished!";

switch (m_step){
case STEP_AUTHPAGE:{
QString html = QString(_reply->readAll());

// Пробуем достать урл логина и токен
QRegExp rxAction = QRegExp("action=\"([a-zA-Z0-9\.\-\:\/]+)\"", Qt::CaseInsensitive);
rxAction.indexIn(html);
QString loginURL = rxAction.cap(1);

QRegExp rxToken = QRegExp("input name=\"authenticity_token\" type=\"hidden\" value=\"([a-zA-Z0-9]+)\"", Qt::CaseInsensitive);
rxToken.indexIn(html);
QString token = rxToken.cap(1);

qDebug() << "Login URL: "+loginURL;
qDebug() << "Login Token: "+token+"="+token.toLocal8Bit();

QNetworkRequest request = makeRequest(QUrl(loginURL));



QUrl postData;

QReNetworkCookieJar *cookie = qobject_cast<QReNetworkCookieJar*>(_reply->manager()->cookieJar());
QList<QNetworkCookie> cookieList = cookie->getAllCookies(); //qvariant_cast<QList<QNetworkCookie> >(_reply->header(QNetworkRequest::SetCookieHeader).toList());

qDebug() << " ----- Cookies ----- ";
request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookieList));

request.setRawHeader("authenticity_token", token.toLocal8Bit());
request.setRawHeader("username", "*****");
request.setRawHeader("password", "*****");

QNetworkReply *reply = m_netManager->post(request, postData.encodedQuery());
m_step = STEP_HOMEPAGE;
} break;
case STEP_HOMEPAGE:{
QString html = QString(_reply->readAll());
qDebug() << html;

} break;
}

}

Да, кстати, первый запрос делается ф-ей get - если использовать post - не получается.


Название: Re: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: DpoHro от Май 03, 2011, 20:32
Не могу ничем отмониторить что передается в результате,
если передаю логин/пароль в m_netManager->post(request, postData.encodedQuery());
в postData то такое впечатление что ничего не передается, сервер выдает страницу с переадресацией.


Название: Re: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: kambala от Май 03, 2011, 22:24
Тут:
Код
C++ (Qt)
QUrl postData;
 
QReNetworkCookieJar *cookie = qobject_cast<QReNetworkCookieJar*>(_reply->manager()->cookieJar());
QList<QNetworkCookie> cookieList = cookie->getAllCookies(); //qvariant_cast<QList<QNetworkCookie> >(_reply->header(QNetworkRequest::SetCookieHeader).toList());
 
qDebug() << " ----- Cookies ----- ";
request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookieList));
 
request.setRawHeader("authenticity_token", token.toLocal8Bit());
request.setRawHeader("username", "*****");
request.setRawHeader("password", "*****");
 
QNetworkReply *reply = m_netManager->post(request, postData.encodedQuery());
в последней строчке postData пустая. так и задумано?

как вариант можно подглядеть реализацию в уже существующих Qt библиотеках: http://dev.twitter.com/pages/libraries#cplusplus


Название: Re: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: DpoHro от Май 04, 2011, 07:32
Да я с postData экспериментировал в таком варианте хоть приходит нормальный ответ от твиттера, в виде страницы с ошибкой, такое ощущение что в этом варианте не доходят всеже логин пароль и токен, если же я запихиваю их в postData тогда сервер отвечает какой то страницей с редиректом на mobile.twitter.com ((

Уже голову сломал (


Название: Re: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: DpoHro от Май 04, 2011, 19:20
Народ как параметры правильно передавать POST запроса через эту фигню?

У меня стойкое ощущение что дело именно в этом.

Если оставляю в строке

Код:
QNetworkReply *reply = m_netManager->post(request, "");

data = пустой строкой, то впринципе прилетает в страница как если бы я неверно ввел логин или пароль или вообще бы не ввел ничего.

Если я туда пытаюсь чтото передать - вертается вот что:

Код:
<html><body>You are being <a href="http://mobile.twitter.com/">redirected</a>.</body></html>

То есть будто бы адресом ошибся.

Need HELP )))


Название: Re: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: DpoHro от Май 04, 2011, 21:21
Блин, вот ну надо же, все ж ведь правильно, возвращает перенаправление на главную после удачного залогинивания, а я тут голову ломаю, надо было ответ сервера прочитать, а он присылает 302 и Location - куда ))