![]() |
ВКонтакте API вопрос
есть приложение, оно рабоатет с swf-кой(она же есть "приложение") с АПИ контакта и со скриптом на собственном сайте приложения.
Лог запросов\ответов браузера ниже. Вопрос: откуда берется так называемый "sig", уникальный для каждого запроса. Каким образом он "впаривается" моему браузеру, и каким образом я могу получить его минуя браузер (программно). Во избежание вопросов - пишу программу, которая будет взаимодействовать с приложением ВК. Все работает отлично, но есть проблемы с получением "sig", уникальных для различных акаунтов. Эти sig успешно (откуда-то) получает мой браузер, но совершенно не могу понять откуда. Код:
GET /app685176_9239448 HTTP/1.1за решение с меня +15. |
Так в мануалах же:
Цитата:
|
Всё в группе с манулами есть, почти на все вопросы ответ там нашёл.
Цитата:
|
я не читал манов(до этого).... кхм. , да, я своеобразный кодер. Но суть от этого не меняется
(собсна я тока сейчас и столкнулся с сабжем- этим вечером) Цитата:
если так, то может кто-нибудь подсказать, можно ли этот sig получить де-факто без использования флэш, одними лишь методами http запросов? как-то же должны иметь возможность программы на дельфи взаимодействовать с этим flash-em =\ |
узнаёт sig флешка с запроса на сайт создателя приложеня, secret не узнаешь и не сбрутишь A-Za-z{10} если с голосами дело то вообще 20 символов.
|
Цитата:
браузер может имея вводные данные запросить свф-ку (она же "приложение"), и получить в ответ sig. То же самое требуется сделать из обычной программы на дельфи, не являющейся браузером. Вопрос в том, как... =\ зы. все "легально", т.е. нужно просто переписать то, что я могу сделать и сам в браузере - в программу средствами какого-либо компилируемого (Си\Дельфи) языка. Программа собственно уже готова, и вопрос стал только в получении sig не-браузерными методами. |
Цитата:
|
я воссоздаю все запросы:)
но для того, чтобы воссоздать тот самый запрос с sig для другого аккаунта, нужен другой sig {от этого - другого аккаунта} (в остальном все идентично). Чтобы отправить в запросе sig, его предварительно нужно как-то программно получить(для этого - другого - акаунта). Вот в этом собственно и проблема, потому как этот самый sig не передается мне изначально (сниффаю. нет никаких сигов в зепросах что я получаю. ни в одном! да и хэшей{наборов символов} этих там нет) т.е. в первом же запросе, в приведенном мною примере, нет ничего даже отдальнно похожего на sig=2623e384b776d7db281ee7bd2a31c12b тем не менее уже во втором запросе мой браузер шлет этот сиг в теле пост запроса. Спрашивается - откуда мой браузер получил этот параметр со значением?) |
Цитата:
|
Eo0 дай плз названия сниффера, с помощью которого ты видел sig'и.
Я юзаю smartsniff, никогда не жаловался, но сколько не искал, не смог найти в запросах того, как мне передают эти значения=\ |
ErrorNeo, HTTP Analyzer V2, ещё может быть автор флеш решил спрятать secret прямо в нём, что крайне не рекомендуется ,есле так и не увидишь попробуй де компилировать. зы. пока такие не встречал.
|
попробовал снифить HTTP Analyzer V3 ...
да, уловил на 1 запрос больше: Цитата:
www.tns-counter.ru и counter.yadro.ru, и затем начинаются запросы с sig'ами. Да, HTTP Analyzer их показывает. Как и smartsniff. Только вот он показывает их {sig'и} как часть отправляемых POST-данных. И по-прежнему ни малейшего намека на то, откуда они взялись. вот так всегда. прям как в анекдоте про то, что для того, чтобы просто вкрутить лампочку нужно как минимум 8 программистов. :( |
up
|
ну раз ты не видишь что он добывается каким-то запросом, тогда скорее всего он генерируется флешкой
|
допускаю, что этот sig как-то чем-то генерируется)
однако вопрос по его генерации вне браузера остается открытым.( |
PHP код:
|
[XAOC] - это уже обсуждалось в этой теме.
Невозможно получить $viewer_id,$request_params,$api _secret , не являясь разработчиком приложения. Точнее - невозможно получить как минимум $api _secret Браузер получает sig как-то иначе. Допускаю, что он получает его из Флэш. Вопрос опять таки в том, как это эмулировать вне браузера |
ну вообще-то
$viewer_id - это ид того человека от кого открыта страница с приложением $request_params - массив из списка параметров пост-запроса не вижу тут ничего не возможного это получить |
Цитата:
то, что ты написал не соответствует тому, что приведено в примере работы с АПИ(см второй пост), но даже если это было бы и так, то все равно невозможно получить $api _secret, не являясь разработчиком\владельцем приложения. а без него вся процедура generate_signature($viewer_id,$request_params,$api _secret) не имеет смысла. |
Цитата:
Цитата:
|
Цитата:
какой декомпилятор?! Я не взламывать приложение собираюсь, а написать к нему белый софт. Sig выдается браузеру открыто и совершенно безвозмездно. Каким-то образом. У меня нет ни малейшего желания разбирать на исходный код все приложения, чтобы таким образом узнать их секрет-апи. (даже если забыть о законности этого процесса в виду такого понятия как "авторское право") Ты бы еще посоветовал мне найти способ получить доступ в базу данных ВК, и достать эти значения оттуда. Ап теме - хорошо, но все же, не знаешь решения - не пиши. ps "добыв" каким-либо образом api_secret можно не просто настроить взаимодействие с приложением, но и снять все голоса на счету приложения. Только в данном случае мне это совершенно не требуется. Тем более, как указывалось выше, secret_api крайне не рекомендуется хранить "в теле" приложения, потому далеко не факт, что декомпилятор поможет. Может быть как-нибудь позже попробую, но не сейчас. Сейчас мне интересно легальное решение легальной задачи. |
ErrorNeo, кхм, тебе только что расписал все решение, но раз оно тебя не устраивает - твои проблемы.
как вариант - переговорить с разработчиком |
ты написал пустоту, и эти 2 поста будут потерты как оффтоп.
если в теле запроса не содержится секрет-апи (а это рекомендуется) , то декомпилить его бесполезно. кроме того, мне в любом случае нужно легаельное и универсальное решение, а не предложения типа "декомпиль кривые приложения\взломай базу данных контакта", и действуй от лица приложения - к чему мелочиться?! :D |
Ты видимо плохо понимаешь взаимодействие приложений с юзером, раз достать апи-секрет для тебя приравнивается к взлому приложения.
Без этого апи не будит взаимодействия приложения с вконтактом, так или иначе КАЖДЫЙ пользователь юзающий приложение - получает его, хотя об этом и не догадывается, да возможно приложение юзает сторонний сервер, но на том стороннем сервере точно также будут генерироваться пакеты отправляемые на вконтакт, и они тоже будут генерироваться посредством апи-секрет, и в таком случае тебе точно также не нужно знать этот самый апи-секрет, надеюсь теперь моя мысль понята. |
реализовал то, что хотел с помошью компонента TWebbrowser в Дельфи, как бы это не было уныло.
к сожалению, то, что можно выразить кодом с использованием компонент как Код:
unit Main;И - да, [XAOC], я ничего не декомпилил, и твой ответ действительно мне совершенно непонятен. Секрет-апи - секретное значение, используемое при формировании всех хэшей, и оно никак не может передаваться юзеру в явном виде, иначе любой юзер смог бы (при желании) подделывать любые запросы к приложению и к АПИ от лица любых пользователей. А это есть бред. Если ты думаешь, что это возможно - бери де-компилятор в руки, и вперед, отлаживать приложения для передачи голосов. У тебя ведь самого достаточно знаний, чтобы понимать тот факт, что получив саеркт-апи, ты сможешь подделать любой запрос от любого юзера, и сделать в приложении любые переводы средств? можешь не отвечать. к сожалению я сильно усомнился в твоей компетенции и практическом понимании тобой самим данного вопроса. |
Извиняюсь за оффтоп, но вроде я понял что он имел в виду, так как api_secret всетаки обрабатывается флэшой то дисамблировав и проанализировав приложение, можно найти где он добывает api_secret это не универсально но думаю полезно
Тоесть даже если он не хранится в приложении то не проблема найти запрос выдающий его. P.S. "белый софт" это какой то бот?) |
Цитата:
Цитата:
Цитата:
|
есть два api_secret.
1. находится на вкладке редактирования приложения 2. находится на вкладке платежи тот секрет что находится на вкладке редактирование, вшит в флэшку и его можно получить как описал хаос выше. с помощью него можно делать запросы не входящие в метод secret.* (обычно такой секрет состоит из 8-10 символов) а вот секрет на странице платежи (состоит примерно из 21 символа) позволяет списывать голоса с приложения и выполнять методы secure.*. Оно ТОЛЬКО у разработчика и в файлах сервера (в php, например) |
Цитата:
не думал, что все настолько сурово... пока тестю браузерную версию, если смысл в дальнейшей разработке будет, то значит и правда займусь декомпиляцией флеши хотя все же как-то странно, что более "цивилизованных" методов - нет :D |
Цитата:
в моем случае вся "эффективная работа" работа идет вообще не с приложением контакта, а исключительно с сервером приложения. Т.е. если бы я умел формировать sig, то смог бы вообще минуя сервера контакта достигать в нем (контакте) поставленных перед собой задач. И куков там, естественно, никаких нет. Только sig. И зная этот sig я мог бы, насколько я понимаю, представляться приложению любым юзером, каким бы пожелал... кхм. вообще странная система какая-то. но если вы, ребята, так уверены, что secret_api действительно реально выдернуть из флешки.... возможно я попробую) |
Цитата:
А именно auth_key = md5(api_id + '_' + viewer_id + '_' + '_' + api_secret_s_vkladki_plateji) |
Цитата:
Цитата:
|
Цитата:
на самом деле из всей серии запросов мне нужен только один... запрос к серверу приложения, передающий в POST запросе примерно такие данные: Код:
sig=0578eca6d293400808e43d939b46c6a3&1. сиг 2. id первого юзера 3. имя 4. метод 5. id второго юзера 6. аутх-кей. ... боюсь, что аутх-кей тоже нужен :'( и, насколько я понимаю, "сурового" способа его получения - нет. так что, видимо, нужно искать именно "белое" решение, т.е. получать эта значения так, как их получает браузер (?т.е. хз как) |
браузер получает это все со страницы приложения http://vkontakte.ru/appXXXXXX
Код:
var flashVars = {"api_url":"http:\/\/api.vkontakte.ru\/api.php","api_id":XXXXXX,"api_settings":3,"viewer_id":"XXXXXX","viewer_type":2,"user_id":XXXXXX,"group_id":0,"is_app_user":"1","auth_key":"XXXXXXXXXXXXXX","language":0,"parent_language":0,"debug":0,"domain":"vkontakte.ru","scale":1,"width":"607","height":"590","swf_url":"http:\/\/cs4567.vkontakte.ru\/u45724907\/dada588219143a.zip"}; |
т.е. без эмулятора флэш тут не обойтись?)
я так понимаю http аналога данного запроса не суещствует:( |
Ну как же...
1. Авторизуемся в ВК 2. Заходим на страницу http://vkontakte.ru/app123456 3. Парсим HTML и достаем viewer_id и auth_key 4. Формируем запрос POST |
Код:
class APIПоследние 2 строчки - sig. Код:
var _loc8 = API.viewerId + _loc3.join("") + API.secretCode;обьясните по человечески что такое _loc3.join("") и откуда оно берётся, всё остальное есть. Обьясните на примере этой батвы, какой алгоритм у этого sig |
Цитата:
да, на странице приложения действительно можно спарсить api_id, viewer_id, user_id и auth_key, и несколько других параметров, передаваемых в приложение через flashVars. Ну а сразу после flashVars идет как раз адрес приложения-swf'ки. Так что проблема теперь остается только за формированием sig, для чего, видимо, потребуется декомпилить эту swf'ку. :) Dr1ver - sig это обычная ф-ция md5(user_id,request_params,secret_api). Т.е., к примеру, md5 от строки 6492api_id=4method=getFriendsv=2.0secret Насколько я понял, _loc3 это массив из параметров и их значений. Ну а join, видимо, команда для превращения массива в строку. |
Цитата:
это понятно, мне бы request_params , я их в упор не вижу, я на AS переменную от функции не отличаю, а там целый класс. |
APIversion = "2.0";
apiId = _api_id || _root.api_id; метод не нашел, но его ты ведь сам выбираешь для каждого отдельного запроса. Видимо это глобальная переменная, не указанная в твоем коде _params.method = _method; _params.api_id = API.apiId; _params.v = API.APIversion; эти 3 строки формируют массив, и он превращается в строку: api_id=4method=getFriendsv=2.0 похоже? ну а перед строкой ставится user_id - 6492, а в конце добавляется secret_api и получается 6492api_id=4method=getFriendsv=2.0secret от этого всего берется md5 и получается sig. :) вообще спс за приведенный код. наглядный |
| Время: 01:59 |