ВКонтакте API вопрос

Discussion in 'Социальные сети' started by ErrorNeo, 19 Dec 2009.

  1. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    не мели чуш.
    какой декомпилятор?!
    Я не взламывать приложение собираюсь, а написать к нему белый софт.
    Sig выдается браузеру открыто и совершенно безвозмездно.
    Каким-то образом.
    У меня нет ни малейшего желания разбирать на исходный код все приложения, чтобы таким образом узнать их секрет-апи.
    (даже если забыть о законности этого процесса в виду такого понятия как "авторское право")
    Ты бы еще посоветовал мне найти способ получить доступ в базу данных ВК, и достать эти значения оттуда.

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

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

    Может быть как-нибудь позже попробую, но не сейчас. Сейчас мне интересно легальное решение легальной задачи.
     
    #21 ErrorNeo, 20 Dec 2009
    Last edited: 20 Dec 2009
  2. [XAOC]

    [XAOC] New Member

    Joined:
    6 Oct 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    ErrorNeo, кхм, тебе только что расписал все решение, но раз оно тебя не устраивает - твои проблемы.
    как вариант - переговорить с разработчиком
     
  3. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    ты написал пустоту, и эти 2 поста будут потерты как оффтоп.
    если в теле запроса не содержится секрет-апи (а это рекомендуется) , то декомпилить его бесполезно.
    кроме того, мне в любом случае нужно легаельное и универсальное решение, а не предложения типа "декомпиль кривые приложения\взломай базу данных контакта", и действуй от лица приложения - к чему мелочиться?! :D
     
  4. [XAOC]

    [XAOC] New Member

    Joined:
    6 Oct 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Ты видимо плохо понимаешь взаимодействие приложений с юзером, раз достать апи-секрет для тебя приравнивается к взлому приложения.
    Без этого апи не будит взаимодействия приложения с вконтактом, так или иначе КАЖДЫЙ пользователь юзающий приложение - получает его, хотя об этом и не догадывается, да возможно приложение юзает сторонний сервер, но на том стороннем сервере точно также будут генерироваться пакеты отправляемые на вконтакт, и они тоже будут генерироваться посредством апи-секрет, и в таком случае тебе точно также не нужно знать этот самый апи-секрет, надеюсь теперь моя мысль понята.
     
  5. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    реализовал то, что хотел с помошью компонента TWebbrowser в Дельфи, как бы это не было уныло.

    к сожалению, то, что можно выразить кодом с использованием компонент как
    Code:
    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], я ничего не декомпилил, и твой ответ действительно мне совершенно непонятен.
    Секрет-апи - секретное значение, используемое при формировании всех хэшей, и оно никак не может передаваться юзеру в явном виде, иначе любой юзер смог бы (при желании) подделывать любые запросы к приложению и к АПИ от лица любых пользователей.
    А это есть бред. Если ты думаешь, что это возможно - бери де-компилятор в руки, и вперед, отлаживать приложения для передачи голосов.
    У тебя ведь самого достаточно знаний, чтобы понимать тот факт, что получив саеркт-апи, ты сможешь подделать любой запрос от любого юзера, и сделать в приложении любые переводы средств?

    можешь не отвечать. к сожалению я сильно усомнился в твоей компетенции и практическом понимании тобой самим данного вопроса.
     
    #25 ErrorNeo, 20 Dec 2009
    Last edited: 20 Dec 2009
  6. 0ldbi4

    0ldbi4 Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    264
    Likes Received:
    51
    Reputations:
    10
    Извиняюсь за оффтоп, но вроде я понял что он имел в виду, так как api_secret всетаки обрабатывается флэшой то дисамблировав и проанализировав приложение, можно найти где он добывает api_secret это не универсально но думаю полезно
    Тоесть даже если он не хранится в приложении то не проблема найти запрос выдающий его.


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

    [XAOC] New Member

    Joined:
    6 Oct 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    секрет-апи не является всем что делает уникальным запрос юзера, ещё есть такая замечательная вещь как cookies ;)

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

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

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    есть два api_secret.
    1. находится на вкладке редактирования приложения
    2. находится на вкладке платежи

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

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

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    это все ставит на свои места, благодарю

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

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    кстати.
    в моем случае вся "эффективная работа" работа идет вообще не с приложением контакта, а исключительно с сервером приложения.
    Т.е. если бы я умел формировать sig, то смог бы вообще минуя сервера контакта достигать в нем (контакте) поставленных перед собой задач.
    И куков там, естественно, никаких нет. Только sig. И зная этот sig я мог бы, насколько я понимаю, представляться приложению любым юзером, каким бы пожелал... кхм.

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

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    Имей ввиду, что кроме sig есть еще и auth_key, который уникален для каждого юзера.
    А именно auth_key = md5(api_id + '_' + viewer_id + '_' + '_' + api_secret_s_vkladki_plateji)
     
  12. Eo0

    Eo0 Member

    Joined:
    12 Sep 2009
    Messages:
    62
    Likes Received:
    8
    Reputations:
    0
    Реально, не зря написано
     
  13. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    мде.
    на самом деле из всей серии запросов мне нужен только один...
    запрос к серверу приложения, передающий в POST запросе примерно такие данные:

    Code:
    sig=0578eca6d293400808e43d939b46c6a3&
    uid=9295448&vname=%25D0%2590{бред из знаков процента и цифр}%25D0%25B0
    &method={тут метод}&vid=41929817&auth%5Fkey=291d6a6ec2841455b1e9f4799eb116e5
    тут имеют место:
    1. сиг
    2. id первого юзера
    3. имя
    4. метод
    5. id второго юзера
    6. аутх-кей.

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

    так что, видимо, нужно искать именно "белое" решение, т.е. получать эта значения так, как их получает браузер (?т.е. хз как)
     
    #33 ErrorNeo, 20 Dec 2009
    Last edited: 20 Dec 2009
  14. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    браузер получает это все со страницы приложения http://vkontakte.ru/appXXXXXX

    Code:
    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"};
    
     
  15. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    т.е. без эмулятора флэш тут не обойтись?)
    я так понимаю http аналога данного запроса не суещствует:(
     
  16. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    Ну как же...

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

    Dr1ver Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    83
    Likes Received:
    80
    Reputations:
    14
    Code:
    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.

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

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


    Обьясните на примере этой батвы, какой алгоритм у этого sig
     
    #37 Dr1ver, 21 Dec 2009
    Last edited: 21 Dec 2009
  18. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    (!!!)
    да, на странице приложения действительно можно спарсить
    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, видимо, команда для превращения массива в строку.
     
    #38 ErrorNeo, 21 Dec 2009
    Last edited: 21 Dec 2009
  19. Dr1ver

    Dr1ver Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    83
    Likes Received:
    80
    Reputations:
    14

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

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    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. :)
    вообще спс за приведенный код. наглядный
     
    #40 ErrorNeo, 21 Dec 2009
    Last edited: 21 Dec 2009