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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt и Vkontakte API  (Прочитано 12257 раз)
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?
Записан
SimpleSunny
Гость
« Ответ #1 : Октябрь 13, 2010, 21:50 »

А еще лучше QNetworkAccessManager.
Просто шлите POST или GET запрос с указанными параметрами на указанный адрес Улыбающийся
Записан
core
Гость
« Ответ #2 : Октябрь 13, 2010, 22:30 »

ок. попробую. Если чего, буду сюда отписыватся об результатах. Может еще кому полезно будет
Записан
stump
Гость
« Ответ #3 : Октябрь 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.


Записан
core
Гость
« Ответ #4 : Октябрь 14, 2010, 00:21 »

Спасибо, stump
А если юзать  QNetworkAccessManager, как написал SimpleSunny, то как тогда? И еще - любым способом - как передать сразу логин и пароль в запрос?
Записан
CuteBunny
Гость
« Ответ #5 : Октябрь 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 - класс уже устарел, и тролли не рекомендуют его к использованию
   
Записан
Denjs
Гость
« Ответ #6 : Октябрь 29, 2010, 20:34 »

возможно вам это сможет помочь (в качестве примера работы с post и иже с ними):
   
"мини Бот для MediaWiki" на QT: http://www.prog.org.ru/index.php?topic=15336.msg101397#msg101397
Записан
toggetit
Гость
« Ответ #7 : Апрель 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/
Записан
toggetit
Гость
« Ответ #8 : Апрель 22, 2011, 13:43 »

Всё, нашёл в чём была ошибка - забыл в QUrl указать протокол http://
Затупил, да.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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