Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Ошибки в ответ на запросы через api (http://www.flasher.ru/forum/showthread.php?t=185605)

spider 16.10.2012 17:36

Ошибки в ответ на запросы через api
 
Всем привет!
Пишу приложение для запуска на компе. Пытаюсь получить список друзей пользователя, которые установили конкретное приложение вконтакте. Пусть номер страницы пользователя 12345, а номер приложения api_id=123.
Посылаю вот такую команду:
Код:

http://api.vk.com/api.php?api_id=123&method=friends.getAppUsers&sid=39f92af16254e643196d6025c9d7edc3dfe1d528108ebeadeb564cf61398aa&sig=74e0e3543b81f90cd0032d25e28e1c63&v=3.0
Приходит в ответ ошибка такого плана: Error 3 : Unknown method passed: Session can be expired, revoked by user or connected with different IP address
Пробую просто хотя бы получить список всех друзей:
Код:

http://api.vk.com/api.php?api_id=123&method=friends.get&sid=39f92af16254e643196d6025c9d7edc3dfe1d528108ebeadeb564cf61398aa&sig=05690ea3e880a9b8943e91058c0063a1&v=3.0&fields=first_name
В ответ ошибка: Error 4 : Incorrect signature: server authorization
В обоих случаях считаю sig, как описано здесь.
В первом случае
Код:

sig = md5("12345api_id=123method=friends.getAppUsersv=3.0bf2af7721e")
Во втором случае получается
Код:

sig = md5("12345api_id=123fields=first_nameformat=XMLmethod=friends.getv=3.0bf2af7721e")
где bf2af7721e - secret, полученнный при авторизации по ссылке, которую уже привел выше.
Соответственно 2 вопроса: почему friends.getAppUsers вообще не воспринимается сервером и почему friends.get возвращает ошибку о неправильной подписи, если все делаю так, как написано в инструкции?
P.S. У пользователя 12345 установлено приложение 123 со всем запрашиваемыми для приложения разрешениями.
P.P.S. При этом все отлично работает, если авторизоваться по новому принципу. Но нужен именно старый метод авторизации для последующей возможности взаимодействия с приложением...

caseyryan 16.10.2012 18:14

Там у них есть одна тупость с локальным тестом при такой авторизации. Сессия истекает, и при каждом входе в контакт меняется ее ID. Проще говоря локально потестировать не меняя каждый раз ID сессии не получится
Я делал приложение пустышку, которое только и делало, что выводило все необходимые для авторизации данные, и залил его на место разрабатываемого приложения. Когда id сессии менялся, я просто запускал это приложение, брал оттуда id сессии, и добавлял перед компиляцией в свое. Не удобно, но работало.

spider 16.10.2012 18:28

Цитата:

Сообщение от caseyryan (Сообщение 1100133)
Там у них есть одна тупость с локальным тестом при такой авторизации. Сессия истекает, и при каждом входе в контакт меняется ее ID. Проще говоря локально потестировать не меняя каждый раз ID сессии не получится
Я делал приложение пустышку, которое только и делало, что выводило все необходимые для авторизации данные, и залил его на место разрабатываемого приложения. Когда id сессии менялся, я просто запускал это приложение, брал оттуда id сессии, и добавлял перед компиляцией в свое. Не удобно, но работало.

Не совсем Вас понял. Вы имеете ввиду, что меняется параметр sid? Если да, то что значит "локально потестировать не меняя каждый раз ID сессии не получится". Я же параметр sid каждый раз при запуске своего приложения получаю из строки URL браузера после того, как проходит успешная авторизация. Да и sid не влияет на генерацию sig...
UPD. Да, что смущает еще при таком механизме авторизации - это то, что параметр expire = 0. Хотя 0 скорее обозначает, что сессия никогда не закроется, чем то, что она сразу закроется при открытии) При авторизации на основе oauth expires_in = 86400, т.е. 24 часа длится максимум сессия при такой авторизации...

caseyryan 18.10.2012 17:56

Цитата:

Не совсем Вас понял. Вы имеете ввиду, что меняется параметр sid?
Да
Цитата:

Если да, то что значит "локально потестировать не меняя каждый раз ID сессии не получится"
Я имею в виду, что перед компиляцией приложения нужно указать где-то (записать в константу или переменную, например) новый id сессии
Вообще, не знаю возможно ли ее сделать "вечной", так как у меня динамический IP и сессия в любом случае обрубается при его изменении. Так что по-любому это приходится делать вручную.

п.с. А контактовская библиотека APIConnection не подходит? С ней эти действия гораздо проще делаются

Цитата:

Я же параметр sid каждый раз при запуске своего приложения получаю из строки URL браузера после того, как проходит успешная авторизация.
так приложение все-таки браузерное или
Цитата:

для запуска на компе.
?

spider 18.10.2012 18:56

Цитата:

Сообщение от caseyryan (Сообщение 1100392)
Да

Я имею в виду, что перед компиляцией приложения нужно указать где-то (записать в константу или переменную, например) новый id сессии
Вообще, не знаю возможно ли ее сделать "вечной", так как у меня динамический IP и сессия в любом случае обрубается при его изменении. Так что по-любому это приходится делать вручную.

п.с. А контактовская библиотека APIConnection не подходит? С ней эти действия гораздо проще делаются


так приложение все-таки браузерное или

?

Приложение десктопное, но в нем используется компонент WebBrowser .Net, через который пользователь вводит логин-пароль (компонент WebBrowser .net использует данные IE, поэтому, если пользователь не доверяет приложению, то перед его запуском ему достаточно авторизоваться через ослика, тогда в программе уже не надо будет вводить логин-пароль) и далее происходит авторизация по этому принципу через
Код:

http://vk.com/login.php?app=123&layout=popup&type=browser&settings=264199
В ответ в браузер приходит ссылка вида
Код:

http://vk.com/api/login_success.html#session={"mid":66748,"sid":"ea56492j61334be88e2e8e1dccd21ef8d2f4606f26add88b2e1ee313e2","secret":"733mf8a8c5","expire":0,"sig":"f7afd3db2d3a8a08c849bb038fd52173"}
с параметрами сессии. Оттуда я их десериализую как JSON, потом считаю sig, как указано по той же ссылке, и как я приводил в примере в первом сообщении... После этого метод friends.get в ответ присылает, что неверная подпись (sig), а friends.getAppUsers вообще не работает (см. подробное описание в шапке).


Часовой пояс GMT +4, время: 01:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.