Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Социальные сети (https://forum.antichat.xyz/forumdisplay.php?f=133)
-   -   ВКонтакте API вопрос (https://forum.antichat.xyz/showthread.php?t=164762)

ErrorNeo 20.12.2009 00:35

ВКонтакте API вопрос
 
есть приложение, оно рабоатет с swf-кой(она же есть "приложение") с АПИ контакта и со скриптом на собственном сайте приложения.
Лог запросов\ответов браузера ниже.

Вопрос:
откуда берется так называемый "sig", уникальный для каждого запроса. Каким образом он "впаривается" моему браузеру, и каким образом я могу получить его минуя браузер (программно).

Во избежание вопросов - пишу программу, которая будет взаимодействовать с приложением ВК.
Все работает отлично, но есть проблемы с получением "sig", уникальных для различных акаунтов. Эти sig успешно (откуда-то) получает мой браузер, но совершенно не могу понять откуда.

Код:

GET /app685176_9239448 HTTP/1.1
Accept: */*
Accept-Language: ru
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ()
Host: vkontakte.ru
Connection: Keep-Alive
Cookie: remixchk=5; remixlang=0; remixclosed_tabs=0; remixsid=c5ed98193ed93ed93ed234a93ed2b6047dc9bf10f5325ff03f2d7307; audio_vol=38


HTTP/1.1 200 OK
<тело ответа>


POST /api.php HTTP/1.1
Accept: */*
Accept-Language: ru-RU
Referer: http://cs4682.vkontakte.ru/u3458259/5zmzki919ad.zip
x-flash-version: 10,0,12,36
Content-Type: application/x-www-form-urlencoded
Content-Length: 81
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ()
Host: api.vkontakte.ru
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: remixchk=5; remixlang=0; remixclosed_tabs=0; remixsid=c5ed98193ed93ed93ed234a93ed2b6047dc9bf10f5325ff03f2d7307; audio_vol=38

sig=2623e384b776d7db281ee7bd2a31c12b&method=getServerTime&api%5Fid=685176&v=2%2E0

HTTP/1.1 200 OK
<тело ответа>


POST /api.php HTTP/1.1
Accept: */*
Accept-Language: ru-RU
Referer: http://cs4682.vkontakte.ru/u3458259/5zmzki919ad.zip
x-flash-version: 10,0,12,36
Content-Type: application/x-www-form-urlencoded
Content-Length: 130
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ()
Host: friendorfoe.msk.ru
Connection: Keep-Alive
Cache-Control: no-cache

sig=f1a8dbefda72722a78278dea820c49e6&date=1261170000&method=getGuestsList&vid=43211696&auth%5Fkey=291d6321c94f4455b1e9f4799eb116e5

HTTP/1.1 200 OK
<тело ответа>


за решение с меня +15.

Kaimi 20.12.2009 00:52

Так в мануалах же:
Цитата:

Как создавать подпись запроса?
Параметр sig равен md5 от конкатенации следующих строк:

* viewer_id – id текущего пользователя, переданный SWF посредством flashvars при инициализации.
* пар "parameter_name=parameter_value", расположенных в порядке возрастания имени параметра (по алфавиту).
* секрета приложения api_secret (секрет Вы можете менять при редактировании страницы приложения).



sig = md5(viewer_idname1=value1name2=value2secret)


В данном случае sig равен md5("6492api_id=4method=getFriendsv=2.0secret") то есть b499ce268e9995a08b2f2aebff2488be


Eo0 20.12.2009 01:16

Всё в группе с манулами есть, почти на все вопросы ответ там нашёл.
Цитата:

и каким образом я могу получить его минуя браузер (программно).
если "secret" не известен ни как.

ErrorNeo 20.12.2009 01:20

я не читал манов(до этого).... кхм. , да, я своеобразный кодер. Но суть от этого не меняется
(собсна я тока сейчас и столкнулся с сабжем- этим вечером)

Цитата:

* viewer_id – id текущего пользователя, переданный SWF посредством flashvars при инициализации.
* пар "parameter_name=parameter_value", расположенных в порядке возрастания имени параметра (по алфавиту).
* секрета приложения api_secret (секрет Вы можете менять при редактировании страницы приложения).



sig = md5(viewer_idname1=value1name2=value2secret)


В данном случае sig равен md5("6492api_id=4method=getFriendsv=2.0secret") то есть b499ce268e9995a08b2f2aebff2488be
т.е. не являясь создателем приложения я не могу высчитать sig для нужного мне запроса?
если так, то может кто-нибудь подсказать, можно ли этот sig получить де-факто без использования флэш, одними лишь методами http запросов?
как-то же должны иметь возможность программы на дельфи взаимодействовать с этим flash-em =\

Eo0 20.12.2009 01:23

узнаёт sig флешка с запроса на сайт создателя приложеня, secret не узнаешь и не сбрутишь A-Za-z{10} если с голосами дело то вообще 20 символов.

ErrorNeo 20.12.2009 01:25

Цитата:

Сообщение от Eo0
Цитата:

и каким образом я могу получить его минуя браузер (программно).
если "secret" не известен ни как.

собственно вопрос.
браузер может имея вводные данные запросить свф-ку (она же "приложение"), и получить в ответ sig.

То же самое требуется сделать из обычной программы на дельфи, не являющейся браузером.
Вопрос в том, как... =\

зы. все "легально", т.е. нужно просто переписать то, что я могу сделать и сам в браузере - в программу средствами какого-либо компилируемого (Си\Дельфи) языка.
Программа собственно уже готова, и вопрос стал только в получении sig не-браузерными методами.

Eo0 20.12.2009 01:32

Цитата:

Сообщение от ErrorNeo
собственно вопрос.
браузер может имея вводные данные запросить свф-ку (она же "приложение"), и получить в ответ sig.

То же самое требуется сделать из обычной программы на дельфи, не являющейся браузером.
Вопрос в том, как... =\

это реально, наснифай запрос от флеш и воссоздай программой, sig меняется из-за присутствия rand но его не обязательно менять, спокойно крутил одно приложение с одинаковым sig всё работает.

ErrorNeo 20.12.2009 01:37

я воссоздаю все запросы:)
но для того, чтобы воссоздать тот самый запрос с sig для другого аккаунта, нужен другой sig {от этого - другого аккаунта} (в остальном все идентично).

Чтобы отправить в запросе sig, его предварительно нужно как-то программно получить(для этого - другого - акаунта).
Вот в этом собственно и проблема, потому как этот самый sig не передается мне изначально (сниффаю. нет никаких сигов в зепросах что я получаю. ни в одном! да и хэшей{наборов символов} этих там нет)

т.е. в первом же запросе, в приведенном мною примере, нет ничего даже отдальнно похожего на sig=2623e384b776d7db281ee7bd2a31c12b
тем не менее уже во втором запросе мой браузер шлет этот сиг в теле пост запроса.
Спрашивается - откуда мой браузер получил этот параметр со значением?)

Eo0 20.12.2009 01:40

Цитата:

Сообщение от ErrorNeo
я воссоздаю все запросы:)
но для того, чтобы воссоздать тот самый запрос с sig для другого аккаунта, нужен другой sig {от этого - другого аккаунта} (в остальном все идентично).

Чтобы отправить в запросе sig, его предварительно нужно как-то программно получить(для этого - другого - акаунта).
Вот в этом собственно и проблема, потому как этот самый sig не передается мне изначально (сниффаю. нет никаких сигов в зепросах что я получаю. ни в одном! да и хэшей{наборов символов} этих там нет)

сам с sig получается с сервера приложения не знаю почему снифер не находит,у меня эти запросы были видны,может проблема в нём?

ErrorNeo 20.12.2009 01:42

Eo0 дай плз названия сниффера, с помощью которого ты видел sig'и.
Я юзаю smartsniff, никогда не жаловался, но сколько не искал, не смог найти в запросах того, как мне передают эти значения=\

Eo0 20.12.2009 01:48

ErrorNeo, HTTP Analyzer V2, ещё может быть автор флеш решил спрятать secret прямо в нём, что крайне не рекомендуется ,есле так и не увидишь попробуй де компилировать. зы. пока такие не встречал.

ErrorNeo 20.12.2009 02:24

попробовал снифить HTTP Analyzer V3 ...
да, уловил на 1 запрос больше:

Цитата:

GET /js/lang0_0-1000.js?752 HTTP/1.1
Accept: */*
Referer: http://vkontakte.ru/app685176_9239448
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ()
Host: vkontakte.ru
Connection: Keep-Alive
Cookie: remixchk=5; remixsid=c5ed98193ed93ed93ed234a93ed2b6047dc9bf10f 5325ff03f2d7307
т.е. первым идет запрос в странице приложения, затем этот запрос, запросы
www.tns-counter.ru и counter.yadro.ru, и затем начинаются запросы с sig'ами.

Да, HTTP Analyzer их показывает. Как и smartsniff. Только вот он показывает их {sig'и} как часть отправляемых POST-данных.
И по-прежнему ни малейшего намека на то, откуда они взялись.

вот так всегда. прям как в анекдоте про то, что для того, чтобы просто вкрутить лампочку нужно как минимум 8 программистов.
:(

ErrorNeo 20.12.2009 11:56

up

[XAOC] 20.12.2009 12:37

ну раз ты не видишь что он добывается каким-то запросом, тогда скорее всего он генерируется флешкой

ErrorNeo 20.12.2009 12:48

допускаю, что этот sig как-то чем-то генерируется)
однако вопрос по его генерации вне браузера остается открытым.(

[XAOC] 20.12.2009 12:49

PHP код:

function generate_signature($viewer_id,$request_params,$api_secret)
{
sort($request_params);
foreach(
$request_params as $tempelem)
$signature .= $tempelem;
$signature $viewer_id.$signature.$api_secret;
return 
md5($signature);


переписать на дельфи думаю не будит сложно

ErrorNeo 20.12.2009 13:00

[XAOC] - это уже обсуждалось в этой теме.
Невозможно получить $viewer_id,$request_params,$api _secret , не являясь разработчиком приложения.
Точнее - невозможно получить как минимум $api _secret

Браузер получает sig как-то иначе. Допускаю, что он получает его из Флэш. Вопрос опять таки в том, как это эмулировать вне браузера

[XAOC] 20.12.2009 13:06

ну вообще-то
$viewer_id - это ид того человека от кого открыта страница с приложением
$request_params - массив из списка параметров пост-запроса

не вижу тут ничего не возможного это получить

ErrorNeo 20.12.2009 13:29

Цитата:

Сообщение от [XAOC]
ну вообще-то
$viewer_id - это ид того человека от кого открыта страница с приложением
$request_params - массив из списка параметров пост-запроса

не вижу тут ничего не возможного это получить

читаешь между строк? прежде чем отвечать на сообщение, прочти его полностью.
то, что ты написал не соответствует тому, что приведено в примере работы с АПИ(см второй пост), но даже если это было бы и так, то
все равно
невозможно получить $api _secret, не являясь разработчиком\владельцем приложения.

а без него вся процедура
generate_signature($viewer_id,$request_params,$api _secret)
не имеет смысла.

[XAOC] 20.12.2009 13:45

Цитата:

то, что ты написал не соответствует тому, что приведено в примере работы с АПИ(см второй пост), но даже если это было бы и так, то
интересно что-же не соответствует в моей функции если она работает на отлично ?

Цитата:

невозможно получить $api _secret, не являясь разработчиком\владельцем приложения.
декомпилятор в руки и вперед

ErrorNeo 20.12.2009 13:56

Цитата:

Сообщение от [XAOC]
декомпилятор в руки и вперед

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

Ап теме - хорошо, но все же, не знаешь решения - не пиши.

ps
"добыв" каким-либо образом api_secret можно не просто настроить взаимодействие с приложением, но и снять все голоса на счету приложения.
Только в данном случае мне это совершенно не требуется.
Тем более, как указывалось выше, secret_api крайне не рекомендуется хранить "в теле" приложения, потому далеко не факт, что декомпилятор поможет.

Может быть как-нибудь позже попробую, но не сейчас. Сейчас мне интересно легальное решение легальной задачи.

[XAOC] 20.12.2009 14:05

ErrorNeo, кхм, тебе только что расписал все решение, но раз оно тебя не устраивает - твои проблемы.
как вариант - переговорить с разработчиком

ErrorNeo 20.12.2009 14:09

ты написал пустоту, и эти 2 поста будут потерты как оффтоп.
если в теле запроса не содержится секрет-апи (а это рекомендуется) , то декомпилить его бесполезно.
кроме того, мне в любом случае нужно легаельное и универсальное решение, а не предложения типа "декомпиль кривые приложения\взломай базу данных контакта", и действуй от лица приложения - к чему мелочиться?! :D

[XAOC] 20.12.2009 14:18

Ты видимо плохо понимаешь взаимодействие приложений с юзером, раз достать апи-секрет для тебя приравнивается к взлому приложения.
Без этого апи не будит взаимодействия приложения с вконтактом, так или иначе КАЖДЫЙ пользователь юзающий приложение - получает его, хотя об этом и не догадывается, да возможно приложение юзает сторонний сервер, но на том стороннем сервере точно также будут генерироваться пакеты отправляемые на вконтакт, и они тоже будут генерироваться посредством апи-секрет, и в таком случае тебе точно также не нужно знать этот самый апи-секрет, надеюсь теперь моя мысль понята.

ErrorNeo 20.12.2009 15:45

реализовал то, что хотел с помошью компонента TWebbrowser в Дельфи, как бы это не было уныло.

к сожалению, то, что можно выразить кодом с использованием компонент как
Код:

unit Main;

interface
uses
  Windows, Classes, Forms, Buttons,
  StdCtrls, OleCtrls, Controls, SHDocVw;
type
  TMainForm = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
  procedure Button1Click(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation
{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://vkontakte.ru/app1234561_9416218');
end;

end.

ХЗ как выразить кодом без использования компонента TWebbrowser.

И - да, [XAOC], я ничего не декомпилил, и твой ответ действительно мне совершенно непонятен.
Секрет-апи - секретное значение, используемое при формировании всех хэшей, и оно никак не может передаваться юзеру в явном виде, иначе любой юзер смог бы (при желании) подделывать любые запросы к приложению и к АПИ от лица любых пользователей.
А это есть бред. Если ты думаешь, что это возможно - бери де-компилятор в руки, и вперед, отлаживать приложения для передачи голосов.
У тебя ведь самого достаточно знаний, чтобы понимать тот факт, что получив саеркт-апи, ты сможешь подделать любой запрос от любого юзера, и сделать в приложении любые переводы средств?

можешь не отвечать. к сожалению я сильно усомнился в твоей компетенции и практическом понимании тобой самим данного вопроса.

0ldbi4 20.12.2009 19:28

Извиняюсь за оффтоп, но вроде я понял что он имел в виду, так как api_secret всетаки обрабатывается флэшой то дисамблировав и проанализировав приложение, можно найти где он добывает api_secret это не универсально но думаю полезно
Тоесть даже если он не хранится в приложении то не проблема найти запрос выдающий его.


P.S. "белый софт" это какой то бот?)

[XAOC] 20.12.2009 21:39

Цитата:

Сообщение от ErrorNeo
Секрет-апи - секретное значение, используемое при формировании всех хэшей, и оно никак не может передаваться юзеру в явном виде, иначе любой юзер смог бы (при желании) подделывать любые запросы к приложению и к АПИ от лица любых пользователей.
А это есть бред. Если ты думаешь, что это возможно - бери де-компилятор в руки, и вперед, отлаживать приложения для передачи голосов.
У тебя ведь самого достаточно знаний, чтобы понимать тот факт, что получив саеркт-апи, ты сможешь подделать любой запрос от любого юзера, и сделать в приложении любые переводы средств?

секрет-апи не является всем что делает уникальным запрос юзера, ещё есть такая замечательная вещь как cookies ;)

Цитата:

Сообщение от ErrorNeo
можешь не отвечать. к сожалению я сильно усомнился в твоей компетенции и практическом понимании тобой самим данного вопроса.

ок, удачи тебе с извращенским эмулятором браузера...

Цитата:

Сообщение от 0ldbi4
Извиняюсь за оффтоп, но вроде я понял что он имел в виду, так как api_secret всетаки обрабатывается флэшой то дисамблировав и проанализировав приложение, можно найти где он добывает api_secret это не универсально но думаю полезно
Тоесть даже если он не хранится в приложении то не проблема найти запрос выдающий его.

Да, ты правильно понял, разве что дизассемблировать там ничего не нужно.

GlooK 20.12.2009 22:56

есть два api_secret.
1. находится на вкладке редактирования приложения
2. находится на вкладке платежи

тот секрет что находится на вкладке редактирование, вшит в флэшку и его можно получить как описал хаос выше. с помощью него можно делать запросы не входящие в метод secret.* (обычно такой секрет состоит из 8-10 символов)

а вот секрет на странице платежи (состоит примерно из 21 символа) позволяет списывать голоса с приложения и выполнять методы secure.*. Оно ТОЛЬКО у разработчика и в файлах сервера (в php, например)

ErrorNeo 20.12.2009 23:26

Цитата:

Сообщение от GlooK
есть два api_secret.
1. находится на вкладке редактирования приложения
2. находится на вкладке платежи

тот секрет что находится на вкладке редактирование, вшит в флэшку и его можно получить как описал хаос выше. с помощью него можно делать запросы не входящие в метод secret.* (обычно такой секрет состоит из 8-10 символов)

а вот секрет на странице платежи (состоит примерно из 21 символа) позволяет списывать голоса с приложения и выполнять методы secure.*. Оно ТОЛЬКО у разработчика и в файлах сервера (в php, например)

это все ставит на свои места, благодарю

не думал, что все настолько сурово...
пока тестю браузерную версию, если смысл в дальнейшей разработке будет, то значит и правда займусь декомпиляцией флеши
хотя все же как-то странно, что более "цивилизованных" методов - нет :D

ErrorNeo 20.12.2009 23:59

Цитата:

Сообщение от [XAOC]
секрет-апи не является всем что делает уникальным запрос юзера, ещё есть такая замечательная вещь как cookies ;)

кстати.
в моем случае вся "эффективная работа" работа идет вообще не с приложением контакта, а исключительно с сервером приложения.
Т.е. если бы я умел формировать sig, то смог бы вообще минуя сервера контакта достигать в нем (контакте) поставленных перед собой задач.
И куков там, естественно, никаких нет. Только sig. И зная этот sig я мог бы, насколько я понимаю, представляться приложению любым юзером, каким бы пожелал... кхм.

вообще странная система какая-то.
но если вы, ребята, так уверены, что secret_api действительно реально выдернуть из флешки....
возможно я попробую)

GlooK 21.12.2009 00:04

Цитата:

И зная этот sig я мог бы, насколько я понимаю, придставляться любым юзером, каким бы пожелал... кхм.
Имей ввиду, что кроме sig есть еще и auth_key, который уникален для каждого юзера.
А именно auth_key = md5(api_id + '_' + viewer_id + '_' + '_' + api_secret_s_vkladki_plateji)

Eo0 21.12.2009 00:09

Цитата:

Сообщение от ErrorNeo
кстати.
в моем случае вся "эффективная работа" работа идет вообще не с приложением контакта, а исключительно с сервером приложения.
Т.е. если бы я умел формировать sig, то смог бы вообще минуя сервера контакта достигать в нем (контакте) поставленных перед собой задач.
И куков там, естественно, никаких нет. Только sig. И зная этот sig я мог бы, насколько я понимаю, представляться приложению любым юзером, каким бы пожелал... кхм.

вообще странная система какая-то.
но если вы, ребята, так уверены, что secret_api действительно реально выдернуть из флешки....
возможно я попробую)

Реально, не зря написано
Цитата:

Защищенное взаимодействие обеспечивает безопасность транзакций с голосами, отсылки оповещений и обновления статусов. Стандартное взаимодействие в этих случаях невозможно: безопасность при участии клиентской стороны обеспечить невозможно, так как любой клиентский SWF-код декомпилируется.

ErrorNeo 21.12.2009 00:14

Цитата:

Сообщение от GlooK
Имей ввиду, что кроме sig есть еще и auth_key, который уникален для каждого юзера.
А именно auth_key = md5(api_id + '_' + viewer_id + '_' + '_' + api_secret_s_vkladki_plateji)

мде.
на самом деле из всей серии запросов мне нужен только один...
запрос к серверу приложения, передающий в POST запросе примерно такие данные:

Код:

sig=0578eca6d293400808e43d939b46c6a3&
uid=9295448&vname=%25D0%2590{бред из знаков процента и цифр}%25D0%25B0
&method={тут метод}&vid=41929817&auth%5Fkey=291d6a6ec2841455b1e9f4799eb116e5

тут имеют место:
1. сиг
2. id первого юзера
3. имя
4. метод
5. id второго юзера
6. аутх-кей.

...
боюсь, что аутх-кей тоже нужен :'(
и, насколько я понимаю, "сурового" способа его получения - нет.

так что, видимо, нужно искать именно "белое" решение, т.е. получать эта значения так, как их получает браузер (?т.е. хз как)

GlooK 21.12.2009 00:17

браузер получает это все со страницы приложения 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"};

ErrorNeo 21.12.2009 00:22

т.е. без эмулятора флэш тут не обойтись?)
я так понимаю http аналога данного запроса не суещствует:(

GlooK 21.12.2009 00:27

Ну как же...

1. Авторизуемся в ВК
2. Заходим на страницу http://vkontakte.ru/app123456
3. Парсим HTML и достаем viewer_id и auth_key
4. Формируем запрос POST

Dr1ver 21.12.2009 06:32

Код:

class API
{
    var firstChild;
    static var __get__stackCount, __get__timeNow;
    function API()
    {
    } // End of the function
    static function init(_secret_code, _api_id, _testMode)
    {
        apiId = _api_id || _root.api_id;
        userId = _root.user_id;
        groupId = _root.group_id;
        viewerId = _testMode || _root.viewer_id;
        viewerType = _root.viewer_type;
        isAppUser = _root.is_app_user;
        authKey = _root.auth_key;
        secretCode = _secret_code;
        APIversion = "2.0";
        if (_testMode)
        {
            testMode = true;
        } // end if
        API.getServerTime(function (_time)
        {
            var _loc1 = _time * 1000;
            var _loc2 = new Date().getTime();
            deltaT = _loc2 - _loc1;
            lastReq = _loc1;
            API.onInit(_time ? (true) : (false));
        }, null, null, true);
        setInterval(API.send, 400);
        setInterval(API.tv_send, 400);
    } // End of the function
    static function get timeNow()
    {
        var _loc2 = new Date().getTime();
        var _loc1 = _loc2 - API.deltaT;
        return (Math.floor(_loc1 / 1000));
    } // End of the function
    static function sendRequest(_method, _params, _onComplete, _obj)
    {
        _params.method = _method;
        _params.api_id = API.apiId;
        _params.v = API.APIversion;
        if (API.testMode)
        {
            _params.test_mode = 1;
        } // end if
        var _loc2 = new LoadVars();
        var _loc3 = new Array();
        for (var _loc4 in _params)
        {
            _loc2[_loc4] = _params[_loc4];
            _loc3.push(_loc4 + "=" + _params[_loc4]);
        } // end of for...in
        _loc3.sort();
        var _loc8 = API.viewerId + _loc3.join("") + API.secretCode;
        _loc2.sig = md5.encrypt(_loc8);


Последние 2 строчки - sig.

Код:

var _loc8 = API.viewerId + _loc3.join("") + API.secretCode;
        _loc2.sig = md5.encrypt(_loc8);


обьясните по человечески что такое _loc3.join("") и откуда оно берётся, всё остальное есть.


Обьясните на примере этой батвы, какой алгоритм у этого sig

ErrorNeo 21.12.2009 11:35

Цитата:

Сообщение от GlooK
Ну как же...

1. Авторизуемся в ВК
2. Заходим на страницу http://vkontakte.ru/app123456
3. Парсим HTML и достаем viewer_id и auth_key
4. Формируем запрос POST

(!!!)
да, на странице приложения действительно можно спарсить
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, видимо, команда для превращения массива в строку.

Dr1ver 21.12.2009 11:45

Цитата:

Сообщение от ErrorNeo
(!!!)

Dr1ver - sig это обычная ф-ция md5(user_id,request_params,secret_api).
Т.е., к примеру, md5 от строки
6492api_id=4method=getFriendsv=2.0secret
где 6492 - id юзера, 4 - id группы (как я понял), метод это метод, ну и v= {secret_api}


это понятно, мне бы request_params , я их в упор не вижу, я на AS переменную от функции не отличаю, а там целый класс.

ErrorNeo 21.12.2009 11:56

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