Russian Qt Forum
Ноябрь 23, 2024, 20:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QNetworkAccessManager Авторизация youtube.com  (Прочитано 15155 раз)
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-код из страницы авторизации!
В чем может быть проблема?
Записан
Bepec
Гость
« Ответ #1 : Февраль 19, 2012, 11:33 »

Смотришь последние строчки и открываешь ассистант

void   appendHtml ( const QString & html )
void   appendPlainText ( const QString & text )
Записан
thechicho
Гость
« Ответ #2 : Февраль 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(кодированный урл);

пробуй, отписывай, дальше посмотрим
Записан
Bepec
Гость
« Ответ #3 : Февраль 20, 2012, 06:53 »

Та тут всё просто до безумия - он не HTML вставляет в поле, а голый текст. И потому видит исходный код страницы.

Нетворк менеджер не кодирует его. Он просто возвращает нормальный URL Подмигивающий
Записан
thechicho
Гость
« Ответ #4 : Февраль 20, 2012, 11:01 »

нифига. я кодированный вставлял, бывало не прокатывало. т.е. если на сервере стоит проверка параметров, а они еще раз кодируются менагером, в результате проверка не проходит. если декодированный давать, то норм всегда проходило. чисто опытным путем - менагер url encode делает.
Записан
ernie
Гость
« Ответ #5 : Февраль 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*)));

Записан
thechicho
Гость
« Ответ #6 : Февраль 21, 2012, 11:15 »

QByteArray postData = "Email=" + username.toUtf() + "&Passwd=" + password.toUtf() + "&service=youtube&source=source";
Записан
ernie
Гость
« Ответ #7 : Февраль 21, 2012, 13:38 »

thechicho,да можно и так:)я просто из рабочего проекта выдернул кусок.
еще source - это название приложение,я в своё время регистрировал его на youtube,не знаю,нужно ли это сейчас
Записан
Ubuntu_linux
Гость
« Ответ #8 : Март 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>

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



Записан
Ubuntu_linux
Гость
« Ответ #9 : Март 16, 2012, 13:23 »

Ребята, помогите, пожалуйста!
Записан
Ubuntu_linux
Гость
« Ответ #10 : Март 16, 2012, 19:57 »

Ах, бля! Забил  удалить символ переноса на новую строку (в auth) и из за этого не пропускало!
А так все работает!!!
Записан
Bepec
Гость
« Ответ #11 : Март 16, 2012, 19:58 »

Мы тебе помогли Улыбающийся мы переживали за тебя Улыбающийся Спасибо нам!
Записан
brucemax
Гость
« Ответ #12 : Июнь 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() делается ?  Ты там распарсиваешь полученный ответ от сервака? а как? регулярки? или что другое?
Спасибо.
Записан
Ubuntu_linux
Гость
« Ответ #13 : Июнь 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
Записан
brucemax
Гость
« Ответ #14 : Июнь 07, 2012, 09:30 »


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

Что они возвращают я догадывался) Меня реализация интереснует Непонимающий(Я вот с помощью регулярных выражений пытаюсь ключь из ответа сервака достать) А можно исходники глянуть ? Строит глазки
P.S. Я только пару дней назад начал с запросами разбираться.. а вот на таких примерах само то.. 
Вопросов туча..  как ты например узнал адрес для запроса видео ("Потом для проверки делаю запрос на список загруженых видео юзера.
https://gdata.youtube.com/feeds/api/users/default/uploads")?
Если есть какая статья об этом - пните почитать=)
« Последнее редактирование: Июнь 07, 2012, 09:38 от brucemax » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 21.