Russian Qt Forum

Qt => Работа с сетью => Тема начата: vdmitij от Февраль 19, 2012, 02:48



Название: QNetworkAccessManager Авторизация youtube.com
Отправлено: vdmitij от Февраль 19, 2012, 02:48
Пытаюсь авторизироваться на ютубе. Выходит, примерно, такой код:
Код:
void MainWindow::on_loginButton_clicked()
{
    ui->loginButton->setEnabled(false);
    QNetworkAccessManager *manager = new QNetworkAccessManager(0);
    QNetworkRequest request;

    request.setUrl(QUrl("https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Dru_RU%26next%3D%252F%253Fnoredirect%253D1&hl=ru_RU&ltmpl=sso"));
    request.setRawHeader("Host", "accounts.google.com");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20120112 Firefox/9.0");
    request.setRawHeader("Accept", "text/html");
    request.setRawHeader("Accept-Charset", "windows-1251,utf-8;");
    request.setRawHeader("Referer", "http://www.youtube.com/");
    qDebug() << "manager";
    QNetworkReply *reply = manager->get(request);

    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*)));
}

void MainWindow::finishedSlot(QNetworkReply *reply)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(0);
    QString replyHtml = QString::fromUtf8(reply->readAll());

    QRegExp dsh("id=\"dsh\" value=\"(.*)\""); dsh.setPatternSyntax(QRegExp::RegExp2);  dsh.setMinimal(true); dsh.indexIn(replyHtml);
    QString dshStr = dsh.cap(1);

    QRegExp galx("name=\"GALX\".*value=\"(.*)\""); galx.setPatternSyntax(QRegExp::RegExp2); galx.setMinimal(true); galx.indexIn(replyHtml);
    QString galxStr = galx.cap(1);

    ui->plainTextEdit->appendPlainText(dshStr);
    ui->plainTextEdit->appendPlainText(galxStr);

    QNetworkRequest request;
    request.setUrl(QUrl("https://accounts.google.com/ServiceLoginAuth"));
    QByteArray  postData;
        postData.append("continue=http://www.youtube.com/signin?action_handle_signin=true&nomobiletemp=1&hl=ru_RU&next=%2F");
        postData.append("service=youtube");
        postData.append("uilel=3");
        postData.append("dsh="+dshStr);
        postData.append("ltmpl=sso");
        postData.append("hl=ru_RU");
        postData.append("ltmpl=sso");
        postData.append("GALX="+galxStr);
        postData.append("pstMsg=1");
        postData.append("dnConn=");
        postData.append("checkConnection=youtube:487:1");
        postData.append("checkedDomains=youtube");
        postData.append("timeStmp=");
        postData.append("secTok=");
        postData.append("Email=email");
        postData.append("Passwd=passwd");
        postData.append("signIn=Войти");
        postData.append("rmShown=1");
    QNetworkRequest request2;

    request2.setUrl(QUrl("https://accounts.google.com/ServiceLoginAuth"));
    request2.setRawHeader("Host", "accounts.google.com");
    request2.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20120112 Firefox/9.0");
    request2.setRawHeader("Accept", "text/html");
    request2.setRawHeader("Accept-Charset", "windows-1251,utf-8;");
    request2.setRawHeader("Referer", "https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Dru_RU%26next%3D%252F%253Fnoredirect%253D1&hl=ru_RU&ltmpl=sso");
    qDebug() << "manager";
    reply = manager->post(request2, postData);

    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot2(QNetworkReply*)));
}

void MainWindow::finishedSlot2(QNetworkReply *reply)
{
    ui->plainTextEdit->appendPlainText(QString::fromUtf8(reply->readAll()));
    ui->plainTextEdit->appendPlainText(reply->rawHeader("Set-Cookie"));
}
Но! В plainTextEdit добавляется html-код из страницы авторизации!
В чем может быть проблема?


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Bepec от Февраль 19, 2012, 11:33
Смотришь последние строчки и открываешь ассистант

void   appendHtml ( const QString & html )
void   appendPlainText ( const QString & text )


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: thechicho от Февраль 20, 2012, 00:06
урл должен быть декодированным, менагер его походу сам кодирует.
https://accounts.google.com/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http://www.youtube.com/signin?action_handle_signin=true&nomobiletemp=1&hl=ru_RU&next=/?noredirect=1&hl=ru_RU&ltmpl=sso
либо пиши QUrl::fromPercentEncoding(кодированный урл);

пробуй, отписывай, дальше посмотрим


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Bepec от Февраль 20, 2012, 06:53
Та тут всё просто до безумия - он не HTML вставляет в поле, а голый текст. И потому видит исходный код страницы.

Нетворк менеджер не кодирует его. Он просто возвращает нормальный URL ;)


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: thechicho от Февраль 20, 2012, 11:01
нифига. я кодированный вставлял, бывало не прокатывало. т.е. если на сервере стоит проверка параметров, а они еще раз кодируются менагером, в результате проверка не проходит. если декодированный давать, то норм всегда проходило. чисто опытным путем - менагер url encode делает.


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: ernie от Февраль 21, 2012, 05:48
День добрый.Мне кажется у вас какой-то странный адрес для логина на youtube,мой код для авторизации :

QNetworkRequest request;
    request.setUrl(QUrl(QString("https://www.google.com/youtube/accounts/ClientLogin")));
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    QString username = Config::getValue("username");
    QString password = Config::getValue("password");
    QString r = QString("Email=%1&Passwd=%2&service=youtube&source=source").arg(username,password);
    QByteArray reqString(r.toUtf8());
    m_networkManager = new QNetworkAccessManager();
    QNetworkReply *reply = m_networkManager->post(request,reqString);
    reply->ignoreSslErrors();
    connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleNetworkReply(QNetworkReply*)));



Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: thechicho от Февраль 21, 2012, 11:15
QByteArray postData = "Email=" + username.toUtf() + "&Passwd=" + password.toUtf() + "&service=youtube&source=source";


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: ernie от Февраль 21, 2012, 13:38
thechicho,да можно и так:)я просто из рабочего проекта выдернул кусок.
еще source - это название приложение,я в своё время регистрировал его на youtube,не знаю,нужно ли это сейчас


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Март 14, 2012, 20:46
Здраствуйте, я вот отправляю запрос для того что бы залогиниться.

В ответ получаю как и положено:

SID=DQAAALQAAAA6wx7byZp-s4BizDqS1OaT21j9dmY6wMjexpQdNC3
LSID=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_0vh-4XbUedCN9XTZ
Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

Потом для проверки делаю запрос на список загруженых видео юзера.

https://gdata.youtube.com/feeds/api/users/default/uploads

с подстановкой в хедер запроса
Authorization: GoogleLogin auth=<authentication_token>
X-GData-Key: key=<developer_key>

Код
C++ (Qt)
request.setRawHeader("Content-Type","application/atom+xml");
   request.setRawHeader("Authorization","GoogleLogin auth="+getAuthToken().toUtf8());
   request.setRawHeader("GData-Version","2");
   request.setRawHeader("X-GData-Key","key="+getAuthKey().toUtf8());

но в ответ получаю: 302 Moved
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com">here</A>.
</BODY></HTML>

В чем дело? в кого работает?





Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Март 16, 2012, 13:23
Ребята, помогите, пожалуйста!


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Март 16, 2012, 19:57
Ах, бля! Забил  удалить символ переноса на новую строку (в auth) и из за этого не пропускало!
А так все работает!!!


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Bepec от Март 16, 2012, 19:58
Мы тебе помогли :) мы переживали за тебя :) Спасибо нам!


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: brucemax от Июнь 06, 2012, 17:10
Код
C++ (Qt)
request.setRawHeader("Content-Type","application/atom+xml");
   request.setRawHeader("Authorization","GoogleLogin auth="+getAuthToken().toUtf8());
   request.setRawHeader("GData-Version","2");
   request.setRawHeader("X-GData-Key","key="+getAuthKey().toUtf8());

но в ответ получаю: 302 Moved
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com">here</A>.
</BODY></HTML>
...

А можно узнать что у тебя в функциях getAuthToken() и getAuthKey() делается ?  Ты там распарсиваешь полученный ответ от сервака? а как? регулярки? или что другое?
Спасибо.


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Июнь 07, 2012, 01:51
Код
C++ (Qt)
request.setRawHeader("Content-Type","application/atom+xml");
   request.setRawHeader("Authorization","GoogleLogin auth="+getAuthToken().toUtf8());
   request.setRawHeader("GData-Version","2");
   request.setRawHeader("X-GData-Key","key="+getAuthKey().toUtf8());

но в ответ получаю: 302 Moved
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com">here</A>.
</BODY></HTML>
...

А можно узнать что у тебя в функциях getAuthToken() и getAuthKey() делается ?  Ты там распарсиваешь полученный ответ от сервака? а как? регулярки? или что другое?
Спасибо.
getAuthKey() - возвращает ключ девелопера, который надо зарегистрировать.
getAuthToken()  - ето  Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: brucemax от Июнь 07, 2012, 09:30

getAuthKey() - возвращает ключ девелопера, который надо зарегистрировать.
getAuthToken()  - ето  Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

Что они возвращают я догадывался) Меня реализация интереснует ???(Я вот с помощью регулярных выражений пытаюсь ключь из ответа сервака достать) А можно исходники глянуть ? ::)
P.S. Я только пару дней назад начал с запросами разбираться.. а вот на таких примерах само то.. 
Вопросов туча..  как ты например узнал адрес для запроса видео ("Потом для проверки делаю запрос на список загруженых видео юзера.
https://gdata.youtube.com/feeds/api/users/default/uploads")?
Если есть какая статья об этом - пните почитать=)


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Июнь 07, 2012, 12:44
Есть официальный манул от гугла для ютуба https://developers.google.com/youtube/reference?hl=ru Вот главный источник информации!
Принцип действия getAuthToken() следующий:

Поскольку мы имеем следующую структуру ответа:
Цитировать
SID=DQAAALQAAAA6wx7byZp-s4BizDqS1OaT21j9dmY6wMjexpQdNC3
LSID=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_0vh-4XbUedCN9XTZ
Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

то я просто в QString  нахожу индексы "Auth=" и "\n"  , а потом вырезаю нужный участок строки. И готово!
Реализацию скину вечером, если надо.....



Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: brucemax от Июнь 07, 2012, 14:31
Есть официальный манул от гугла для ютуба https://developers.google.com/youtube/reference?hl=ru Вот главный источник информации!
Принцип действия getAuthToken() следующий:

Поскольку мы имеем следующую структуру ответа:
Цитировать
SID=DQAAALQAAAA6wx7byZp-s4BizDqS1OaT21j9dmY6wMjexpQdNC3
LSID=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_0vh-4XbUedCN9XTZ
Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

то я просто в QString  нахожу индексы "Auth=" и "\n"  , а потом вырезаю нужный участок строки. И готово!
Реализацию скину вечером, если надо.....

Даже на русском языке! Спасибо большое! И за реализацию буду примного благодарен, всегда полезно посмотреть как надо правильно кодить)


Название: Re: QNetworkAccessManager Авторизация youtube.com
Отправлено: Ubuntu_linux от Июнь 07, 2012, 18:20
Есть официальный манул от гугла для ютуба https://developers.google.com/youtube/reference?hl=ru Вот главный источник информации!
Принцип действия getAuthToken() следующий:

Поскольку мы имеем следующую структуру ответа:
Цитировать
SID=DQAAALQAAAA6wx7byZp-s4BizDqS1OaT21j9dmY6wMjexpQdNC3
LSID=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_0vh-4XbUedCN9XTZ
Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

то я просто в QString  нахожу индексы "Auth=" и "\n"  , а потом вырезаю нужный участок строки. И готово!
Реализацию скину вечером, если надо.....

Даже на русском языке! Спасибо большое! И за реализацию буду примного благодарен, всегда полезно посмотреть как надо правильно кодить)
Во!
Код
C++ (Qt)
void Service::authFinished(){
   QString str_reply=authReply->readAll();
   QString m_auth;
   int start=0,end=0;
   if(str_reply.indexOf("Auth=")!=-1){
       start=str_reply.indexOf("Auth=")+5;
       end=str_reply.indexOf("\n",start);
       m_auth=str_reply.mid(start,end).simplified();
       qDebug()<<"### Auth="<<m_auth;
       setAuthToken(m_auth);
       emit authDone();
   }// if done
}