Название: Авторизация в Твиттере, не могу обнаружить проблему ((
Отправлено: 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 - куда ))
|