Russian Qt Forum

Qt => Работа с сетью => Тема начата: core от Октябрь 13, 2010, 19:00



Название: Qt и Vkontakte API
Отправлено: core от Октябрь 13, 2010, 19:00
Пишу небольшой плеер с возможностью  поиска аудио вконтакте и добавления в плейлист, скачивания. Но для начала, я так понимаю, нужо авторизоваться. Вот что пишут на их сайте:

Код:
Вход и получение сессии
Для получения сессии Вам необходимо внутри Вашего приложения создать элемент управления, который будет содержать внутри себя браузер (например UIWebView при создании iPhone приложения). После этого для входа необходимо будет направить браузер в созданном элементе управления на следующий URL
http://vkontakte.ru/login.php

и передать описанные ниже параметры в POST или GET запросе:

Название параметра
Обязательный
Описание
app  ID вашего приложения
layout Указывает тип дизайна страницы авторизации. На данный момент поддерживаются следующие типы
         popup - для приложений, запускаемых на обычных компьютерах, ноутбуках и нетбуках
         touch - для приложений, запускаемых на коммуникаторах, смартфонах и iPhone
type Указывает каким образом передается значение сессии. На данный момент поддерживаются следующие типы
browser - сессия передается в редиректе в виде хеша
settings Битовая маска настроек доступа приложения, которые необходимо проверить при авторизации пользователя и запросить, в случае отсутствия необходимых.

В случае успешной авторизации браузер пользователя будет перенаправлен на страницу http://vkontakte.ru/api/login_success.html и в идентификаторе URI-фрагмента (якорной ссылке) будет передана информация о сессии в формате JSON.

В случае отмены авторизации пользователем, браузер будет перенаправлен на страницу http://vkontakte.ru/api/login_failure.html.

Например, если пользователь авторизировался, используя следующий URL-адрес
http://vkontakte.ru/login.php?app=1862639&layout=popup&type=browser&settings=130

то при успешной авторизации встроенный в приложении браузер будет перенаправлен на следующий URL-адрес:
http://vkontakte.ru/api/login_success.html#session={"mid":66748,"sid":"ea56492j61334be88e2e8e1dccd21ef8d2f4606f26add88b2e1ee313e2","secret":"733mf8a8c5","expire":0,"sig":"f7afd3db2d3a8a08c849bb038fd52173"}

где в session записаны параметры сессии в формате JSON.

Ниже описано значение каждого их параметров сессии:

Параметр
Значение
expire Время истечения сессии в формате UNIX
mid ID пользователя в ВКонтакте
secret Специально сгенерированный секрет сессии
sid Идентификатор сессии

У кого есть пример авторизации vkontakte на qt ?  Судя по описанию, нужно юзать QWebView (?)? Или здесь как-то можно использовать QHttp?


Название: Re: Qt и Vkontakte API
Отправлено: SimpleSunny от Октябрь 13, 2010, 21:50
А еще лучше QNetworkAccessManager.
Просто шлите POST или GET запрос с указанными параметрами на указанный адрес :)


Название: Re: Qt и Vkontakte API
Отправлено: core от Октябрь 13, 2010, 22:30
ок. попробую. Если чего, буду сюда отписыватся об результатах. Может еще кому полезно будет


Название: Re: Qt и Vkontakte API
Отправлено: stump от Октябрь 13, 2010, 23:22
Судя по описанию, нужно юзать QWebView (?)? Или здесь как-то можно использовать QHttp?

Код:
QWebView *view = new QWebView();
view->load(QUrl("http://vkontakte.ru/login.phpapp=1862639&layout=popup&type=browser&settings=130"));


Вводишь логин, пароль... а потом ловишь изменение url по сигналу QWebView::urlChanged ( const QUrl & url )...
В новом url содержатся параметры сессии, которые нужно использовать при обращении к VK API.




Название: Re: Qt и Vkontakte API
Отправлено: core от Октябрь 14, 2010, 00:21
Спасибо, stump
А если юзать  QNetworkAccessManager, как написал SimpleSunny, то как тогда? И еще - любым способом - как передать сразу логин и пароль в запрос?


Название: Re: Qt и Vkontakte API
Отправлено: CuteBunny от Октябрь 29, 2010, 16:15
1. QNetworkAccessManager // у него я юзал метод get - естественно GET-запрос
2. QNetworkRequest //сам запрос запрос
3. QUrl //урл

Код:
MyDialog::MyDialog(QWidget *parent) : QDialog(parent), ui(new Ui::MyDialog)
{
...

    QNetworkAccessManager *pManager = new QNetworkAccessManager(this);    //создал манагера где-то в конструкторе класса диалогового окна
    connect(pManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); //соединил со слотом, который будет обрабатывать запрос

...
}

Код:
void MyDialog::sendRequest()
{
...

      QNetworkRequest request;
      request.setUrl(QUrl(tr("http://win.mail.ru/cgi-bin/auth?Login=sclerotic-paranoic&Domain=mail.ru&Password=%1").arg("123")); //здесь формирую запрос и урл
      pManager->get(request); //делаю GET-запрос

...
}

Код:
void MyDialog::replyFinished(QNetworkReply * reply)
{
...
    QByteArray bytes = reply->readAll(); //вот здесь выйдет и ответ, у меня было html страница mail.ru
    //TODO: обрабатываем результат
    reply->deleteLater(); //вроде нужно по документации по завершению обработки
...
}

В документации все превосходно написано... QHttp - класс уже устарел, и тролли не рекомендуют его к использованию
   


Название: Re: Qt и Vkontakte API
Отправлено: Denjs от Октябрь 29, 2010, 20:34
возможно вам это сможет помочь (в качестве примера работы с post и иже с ними):
   
"мини Бот для MediaWiki" на QT: http://www.prog.org.ru/index.php?topic=15336.msg101397#msg101397


Название: Re: Qt и Vkontakte API
Отправлено: toggetit от Апрель 21, 2011, 15:50
Господа, подскажите, что может быть - работаю с вКонтакте API - после авторизации посылаю ему реквест с нужными параметрами, получаю QNetworkReply, а он пустой... Я его просто в qDebug вывожу и ничего нет... совсем ничего...
Код:
        QUrl *request = new QUrl("api.vkontakte.ru/api.php");

        request->addQueryItem("api_id", "бла-бла-бла");
        request->addQueryItem("method", "бла-бла-бла");
        qDebug()<<result["mid"].toString()+"бла-бла-бла" + result["secret"].toString();
        qDebug()<<getSig(result["mid"].toString()+"бла-бла-бла" + result["secret"].toString());
        request->addQueryItem("sid", result["sid"].toString());
        request->addQueryItem("sig", getSig(result["mid"].toString()+"бла-бла-бла" + result["secret"].toString()));
        request->addQueryItem("v", "3.0");


        manager = new QNetworkAccessManager(this);
        QNetworkRequest req(*request);
        reply = manager->get(req);

        connect(reply, SIGNAL(finished()), SLOT(temp()));

и далее в слоте temp()
Код:
        QByteArray arr = reply->readAll();
        qDebug()<<arr;

reply - это, естественно, QNetworkReply
Да и вообще - по всякому выводил - ничего нет... пусто...
При этом делаю всё те же запросы браузером - вКонтактик отдаёт XML-ку с нужной инфой, т.е. браузер её отображает, следовательно или не дожидается моя прога ответа или ещё чего-то... Форумчане, подскажите, где могла собака порыться)))

P.S. result[bla-bla] - это QVariantMap, результат парсинга JSON'а с помощью qt-json
P.P.S. Руководствовался данной статьёй  http://habrahabr.ru/blogs/qt_software/115397/


Название: Re: Qt и Vkontakte API
Отправлено: toggetit от Апрель 22, 2011, 13:43
Всё, нашёл в чём была ошибка - забыл в QUrl указать протокол http://
Затупил, да.