Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   интеграция с вконтактом (http://www.flasher.ru/forum/showthread.php?t=196393)

fduch 23.03.2013 23:12

интеграция с вконтактом
 
Сутки уже курю доки и исходники, до сих пор неполучилось создать рабочий кусок кода, для работы с вконтактом.
Немогли бы вы написать мне кусок кода(без лишней мутотени), который просто получает от вконтакта узер_ид и фамилию с именем. Больше ничего.
Сутки уже горы ошибок и пустой экран в лучшем случае.

Код AS3:

package
{
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
    import flash.net.URLRequestMethod;
    import flash.display.*;
    import flash.events.*;
    import flash.text.TextField;
    import fl.containers.UILoader;
        import mx.utils.LoaderUtil;
 
    public class Main extends Sprite
    {
        private var api_id:Number = 3514221;// ID приложения
        private var url_loader:URLLoader;
        private var url_request:URLRequest;
        private var viewer_id;
        private var secret:String;
        private var sid:String;
        private var api_url:String;
 
        private var bdate_tf:TextField = new TextField();
        private var name_tf:TextField = new TextField();
        private var avatar:LoaderUtil = new UILoader  ;
 
        public function Main():void
        {
            // получаем данные из flashVars
            // id просматривающего приложение
            viewer_id = LoaderInfo(root.loaderInfo).parameters.viewer_id;
            // secret для генерации сигнатуры
            secret = LoaderInfo(root.loaderInfo).parameters.secret;
            // id сессии
            sid = LoaderInfo(root.loaderInfo).parameters.sid;
            // адрес API-сервиса
            api_url = LoaderInfo(root.loaderInfo).parameters.api_url;
 
            // для тестирования локально, можно прописать их здесь (брать в исходном коде страницы с приложением)
            /*
            viewer_id = '1';
            secret = 'abcd123456';
            sid = 'abcd123456abcd123456abcd123456abcd123456abcd123456abcd1234';
            api_url = 'http://api.vkontakte.ru/api.php';
            */

            // вызываем функцию получения профиля пользователя, просматривающего приложение
            getProfile(viewer_id);
        }
 
        private function getProfile(uid):void
        {
            // параметры которые будем передавать в запросе и которые нужны для формирования сигнатуры
            // параметры для формирования сигнатуры
            var request_params: Object = new Object();
            request_params.api_id = api_id;
            request_params.method = 'getProfiles';
            request_params.format = 'XML';
            request_params.v = '3.0';
            request_params.fields = 'bdate,photo_big';
            request_params.uids = uid;
 
            // параметры для отправки запроса
            var variables:URLVariables = new URLVariables();
            // часть параметров берем из request_params
            for (var j:String in request_params)
            {
                variables[j] = request_params[j];
            }
            variables['sid'] = sid;// параметр sid нужно передавать в запросе, но он не используются при создании сигнатуры
            variables['sig'] = generate_signature(request_params);// генерируем сигнатуру. Функция generate_signature описана ниже.
 
            // подготавливаем запрос
            url_request = new URLRequest(api_url);
            // данные будем отправлять POST запросом
            url_request.method = URLRequestMethod.POST;
            // добавляем параметры в запрос
            url_request.data = variables;
            // отправляем запрос
            url_loader = new URLLoader  ;
            url_loader.addEventListener(Event.COMPLETE,onComplete);
            url_loader.load(url_request);
        }
 
        // запрос выполнен
        private function onComplete(event:Event):void
        {
            var response:XML = new XML(url_loader.data);
 
            // выводим дату рождения пользователя
            var bdate = response..bdate;
            bdate_tf.text = bdate;
            bdate_tf.x = 490;
            bdate_tf.y = 380;
            addChild(bdate_tf);
 
            // выводим имя и фамилию пользователя
            name_tf.text = response..first_name + ' ' + response..last_name;
            name_tf.x = 410;
            name_tf.y = 360;
            addChild(name_tf);
 
            // выводим аватарку пользователя
            avatar.autoLoad = true;
            avatar.scaleContent = false;
            avatar.source = response..photo_big;
            avatar.move(175,10);
            addChild(avatar);
        }
 
 
        // функция генерации сигнатуры
        private function generate_signature(request_params):String
        {
            var signature = '';
            // сортируем параметры в алфавитном порядке
            var sorted_array: Array = new Array();
            for (var key in request_params)
            {
                sorted_array.push(key + "=" + request_params[key]);
            }
            sorted_array.sort();
 
            // создаем строку параметров;
            for (key in sorted_array)
            {
                signature +=  sorted_array[key];
            }
            signature = viewer_id + signature + secret;
            return MD5.encrypt(signature);
        }
        // http://flapps.ru/forum
    }
}

Вот тут вроде все просто с коментами, но не работает (((

зы: Я правильно делаю подключая МД5, как класс?

mooncar 23.03.2013 23:56

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

KumoKairo 24.03.2013 00:59

Вот тут все подробно расписано.
http://flapps.ru/forum/topic1943.html

caseyryan 24.03.2013 10:16

Цитата:

зы: Я правильно делаю подключая МД5, как класс?
К чему вообще эти танцы с бубном? Уже давно все написано в классе APIConnection

zxcv 24.03.2013 11:37

Цитата:

Сообщение от KumoKairo (Сообщение 1126512)
Вот тут все подробно расписано.
http://flapps.ru/forum/topic1943.html

Вообще ТС, судя по всему, оттуда и брал свой код.

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

fduch 24.03.2013 12:26

Цитата:

Сообщение от mooncar (Сообщение 1126504)
1. Выбирайте правильно раздел для размещения тем.
2. Писать "спасите-помогите, хелп плиз" нельзя (по крайней мере в заголовках тем), и так понятно, что вам нужна помощь, раз задаете вопрос.

Да, сори.

Добавлено через 42 секунды
Цитата:

Сообщение от KumoKairo (Сообщение 1126512)
Вот тут все подробно расписано.
http://flapps.ru/forum/topic1943.html

Я там и читал.

Добавлено через 6 минут
Цитата:

Сообщение от caseyryan (Сообщение 1126545)
К чему вообще эти танцы с бубном? Уже давно все написано в классе APIConnection

По уму наверное да, НО по этой ссылочке я первым делом и скачал исходник и читал там, и тестил его.
Оно конечно работает. НО там гора исходников, гора кода... Мне с ним придется разбираться неделю, и выкинуть оттуда 90%.
Все что я прошу, это 20-30строчек кода, которые отправляют запрос и получают ответ.
Как я понял, оно работает по томуже принципу, что и передача прием данных из php.

caseyryan 24.03.2013 13:04

Цитата:

Все что я прошу, это 20-30строчек кода, которые отправляют запрос и получают ответ.
Все просто, если использовать APIConnection
Код AS3:

// при учете, что доступ к stage уже есть, получаем flash vars
var flashVars:Object = stage.loaderInfo.parameters;
_vk = new APIConnection(flashVars); // инициализируем api connection
// вызываем метод users.get, и передаем вторым параметром объект с полями, которые хотим получить, в данном случае first_name и last_name
_vk.api("users.get", { uids: flashVars.viewer_id, fields: "first_name, last_name" }, onUserData, function(param:Object):void { trace("ERROR"); });

а в обработчике
Код AS3:

private function onUserData(param:Object):void {
      trace("имя:" + param.first_name + " фамилия: " + param.last_name);
}

Цитата:

НО по этой ссылочке я первым делом и скачал исходник и читал там, и тестил его.
Этот хлам можно выбросить. Вообще, о формировании запроса самостоятельно сейчас можно думать только при отправке его с серверной стороны. Со стороны клиента уже все сделали контактовцы

п.с. если будет приходить ошибка, первым делом нужно проверить, а включено ли приложение в настройках

fduch 24.03.2013 14:01

Ошибка вылазил в АПИСонекшене.
Вот основной код, аписонекшен присоединен как класс
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import vk.APIConnection;
 
 
  import flash.text.*;
  import flash.events.*;
 
 
 
        /**
        * ...
        * @author BJIACTb
        */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
 
 
 
                var tf = new TextField();
            tf.x = 10;
            tf.y = 50;
            tf.width = 587;
            tf.height = 349;
 
            tf.border = true;
            tf.borderColor = 0xDAE2E8;
            tf.background = true;
            tf.backgroundColor = 0xFFFFFF;
            tf.embedFonts = false;
            var format:TextFormat = new TextFormat();
                format.font = "Tahoma";
                format.color = 0x000000;
                format.size = 11;
                tf.defaultTextFormat = format;
            addChild(tf);
            //tf.appendText("Application initialized\n");
 
 
 
 
                var flashVars: Object = stage.loaderInfo.parameters as Object;
                if (flashVars.api_id) {
                        tf.appendText("\n// -- Your code for local testing:\n");
                        tf.appendText("flashVars['api_id'] = " + flashVars['api_id'] + ";\n");
                        tf.appendText("flashVars['viewer_id'] = " + flashVars['viewer_id'] + ";\n");
                        tf.appendText("flashVars['sid'] = \"" + flashVars['sid'] + "\";\n");
                        tf.appendText("flashVars['secret'] = \"" + flashVars['secret'] + "\";\n");
                        tf.appendText("// -- //\n\n");
                }
 
 
        var VK: APIConnection = new vk.APIConnection(flashVars);
 
                                // вызываем метод users.get, и передаем вторым параметром объект с полями, которые хотим получить, в данном случае first_name и last_name
        VK.api("users.get", { uids: flashVars.viewer_id, fields: "first_name, last_name" }, onUserData, function(param:Object):void { trace("ERROR"); });
 
                }
 
        }
 
}

Добавлено через 25 минут
Вот вариант, который работает
Код AS3:

VK.api('getProfiles', { uids: flashVars['viewer_id'] }, fetchUserInfo, onApiRequestFail);

Код AS3:

        private function fetchUserInfo(data: Object): void {
                for (var key: String in data[0]) {
              tf.appendText(key + "=" + data[0][key] + "\n");
 
            }
        }
Объясните плс, как оно выводит последовательно данные ласт наме уид и фирст наме.
Почему конструкция data[0][0] выдает undefined
И как в этом виде получить "фирст наме = и ласт наме =" ??

Добавлено через 38 минут
Код AS3:

private function fetchUserInfo(data: Object): void {
                for (var key: String in data[0]) {
              tf.appendText(key + "=" + data[0][key] + "\n");
 
            }
        }

Результат:
first_name=Алексей
last_name=Васильев
uid=1169781

А вот :
Код AS3:

trace("имя:" + data.first_name);

имя:undefined

Добавлено через 56 минут
Все разобрался.
Код AS3:

trace("имя: " + param[0]['first_name']);


caseyryan 24.03.2013 18:16

метод getProfiles устаревший. От него лучше отказаться, и использовать users.get
Тот вариант, что я предложил рабочий. Он выдернут из рабочего приложения для контакта


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

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