Получение информации о пользователе

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Получение информации о пользователе

Сообщение dr1emaver »

Здравствуйте, возникла проблемка с информацией о пользователе. Делал уже по выложенному коду, но дописав маленькое изменение, на которое флэш начал ругаться. Опишу свой порядок действия:
1) Создал кнопку с текстом на кнопке и сохранил в fla.
2) Создал фоновую картинку и сохранил в fla.
3) Далее создаю проект AS3 через ctrl + c и ctrl + v вставляю кнопку и фоновую картинку и размещаю на белом фоне.
4) Захожу в properties кнопки и в свойствах пишу "profile_btn"
5)Жму f9 открывается окно "действия - кадр" и вставляю туда код:

Код: Выделить всё

var api_id:Number = 2414434  ;// ID приложенияvar url_loader:URLLoader;var url_request:URLRequest;var viewer_id;var secret:String;var sid:String;var api_url:String; var bdate_tf:TextField = new TextField();var name_tf:TextField = new TextField();var avatar:UILoader = new UILoader  ; // получаем данные из 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';            */// вызываем функцию получения профиля пользователя, просматривающего приложениеprofile_btn.addEventListener(MouseEvent.CLICK,getProfile(viewer_id)); 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);} // запрос выполнен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);} // функция генерации сигнатуры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);} 

Код: Выделить всё

profile_btn.addEventListener(MouseEvent.CLICK,getProfile(viewer_id));
- в этой строчке я хочу, чтобы информация выдавалась после нажатия на кнопку profile_btn.
Компилирую ctrl+enter и получаю 3 ошибки:
строка 11 1046: Тип не найден или не является константой времени компиляции: UILoader.
строка 11 1180: Вызов предположительно неопределенного метода UILoader.
строка 31 1067: Неявное приведение значения типа void к несоответствующему типу Function.
Но тем немее програмка компилиться.Получившийся swf заливаю в вк с соответсвенно настройками "без контейнера" и "приложение включено"
Но запуская его, получаю фон и кнопку ( уже без названия, которое было написано до компиляции) и все. Жму на кнопку и ничего не происходит.
Я понимаю, что такое уже много раз обсуждалось...Я просто только начал и очень хочу разобраться..Помогите пожалуйста
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Получение информации о пользователе

Сообщение bodnar »

Код: Выделить всё

var avatar:UILoader = new UILoader  ;
без круглых скобок это дизайнерский ход?
там кажется надо этот UILoader надо в библиотеку перетащить из списка компонентов.

Второй аргумент, а именно getProfile(viewer_id), должен быть функция-слушатель события, у вас же одноименный метод возвращает void отсюда ошибка.

Код: Выделить всё

 profile_btn.addEventListener(MouseEvent.CLICK,getProfile); function getProfile(e:MouseEvent):void{trace(viewer_id);  
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

var avatar:UILoader = new UILoader ;


без круглых скобок это дизайнерский ход?
там кажется надо этот UILoader надо в библиотеку перетащить из списка компонентов.
сделал

Код: Выделить всё

 var avatar:UILoader = new UILoader (); 
а как UILoader перетащить из списка компонентов в библиотеку? Просто теже две ошибки, связанные с UILoader, остались..
Вот они :

строка 11 1046: Тип не найден или не является константой времени компиляции: UILoader.
строка 11 1180: Вызов предположительно неопределенного метода UILoader.
Написав так :

Код: Выделить всё

profile_btn.addEventListener(MouseEvent.CLICK,getProfile); function getProfile(e:MouseEvent):void{trace(viewer_id);
программа выдавала ошибку в строчке :

Код: Выделить всё

request_params.uids = uid;
Ошибку такую :
строка 44 1120: Обращение несуществующего свойства uid.
Ошибка понятна, так как поменяли аргумент в функции..
Ее я поменял на строчку :

Код: Выделить всё

request_params.uids = viewer_id;
Ошибка пропала, но хотелось бы узнать правильно это или нет ?
Загрузил это приложение в контакт, а результат тот же жму на кнопку и ничего не происходит... Почему так происходит из-за UILoader ? И еще может это связано с тем, что я в fla помещаю другие fla ?
И еще вопрос, в программе есть текстовые поля :

Код: Выделить всё

var bdate_tf:TextField = new TextField();var name_tf:TextField = new TextField();
Их я так понимаю мы инициализируем в коде, поэтому их не надо указывать на сцене ?
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

с UILoader'ом я разобрался. Ошибки те пропали. Кнопка стала нормально отображаться ( т.е. ее название, которое было написано на кнопке и пропадало после компиляции)
Но вот теперь возникли те ошибки которые тут уже встречались, но я так и не понял как их исправить.В выоде написано:
undefined
TypeError: Error #2007: Параметр url не должен быть равен нулю.
at flash.net::URLStream/load()
at flash.net::URLLoader/load()
at ex_fla::MainTimeline/getProfile()
Как их исправить я так и не понимаю..

Плюс остаются прошлые вопросы ...

Написав так :

Код: Выделить всё

profile_btn.addEventListener(MouseEvent.CLICK,getProfile); function getProfile(e:MouseEvent):void{trace(viewer_id); 
программа выдавала ошибку в строчке :

Код: Выделить всё

request_params.uids = uid;

Ошибку такую :
строка 44 1120: Обращение несуществующего свойства uid.
Ошибка понятна, так как поменяли аргумент в функции..
Ее я поменял на строчку :

Код: Выделить всё

request_params.uids = viewer_id;

Ошибка пропала, но хотелось бы узнать правильно это или нет ?
И вопрос что делает функция trace ?

Загрузил это приложение в контакт, а результат тот же жму на кнопку и ничего не происходит... может это связано с тем, что я в fla помещаю другие fla ?
И еще вопрос, в программе есть текстовые поля :

Код: Выделить всё

var bdate_tf:TextField = new TextField();var name_tf:TextField = new TextField(); 
Их я так понимаю мы инициализируем в коде, поэтому их не надо указывать на сцене ?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Получение информации о пользователе

Сообщение Александр »

dr1emaver
1. Откуда ты брал код? http://flapps.ru/forum/topic992.html ?
Там написано:
Добавляем на сцену UILoader с вкладки COMPONENTS (Window -> Components).
Этот компонент можно разместить за пределами сцены или вообще удалить со сцены. В библиотеке нужно оставить.
Это необходимо сделать, чтобы Flash подключил нужные пакеты.
2. Почему не используешь библиотеку APIConnection?
Этот урок для общего понимания как формируется сигнатура и как приложение взаимодействует с сервером api. Для взаимодействия с другими методами api проще будет использовать готовую официальную библиотеку APIConnection. Урок Использование APIConnection (getProfiles).
Будет проще http://flapps.ru/forum/topic1943.html

dr1emaver писал(а):Их я так понимаю мы инициализируем в коде, поэтому их не надо указывать на сцене ?
Эти поля создаются программно.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Получение информации о пользователе

Сообщение Александр »

Разберись с тем что такое функции в программировании и как они работают.
Было:

Код: Выделить всё

function getProfile(uid):void{ trace(uid);}
uid - передавался функции. Сейчас у тебя не передаётся, потому что функция getProfile стала событием при клике. А переменной uid у тебя нигде нет.
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

1. Откуда ты брал код? topic992.html ?
Там написано:
Добавляем на сцену UILoader с вкладки COMPONENTS (Window -> Components).
Этот компонент можно разместить за пределами сцены или вообще удалить со сцены. В библиотеке нужно оставить.
Это необходимо сделать, чтобы Flash подключил нужные пакеты.
именно оттуда.UILoader я добавил, поэтому ошибки связанные с ним убрались.
Разберись с тем что такое функции в программировании и как они работают.
Было:

Номера строк Вкл/Выкл | Показать/Скрыть | Выделить всё
function getProfile(uid):void
{
trace(uid);
}


uid - передавался функции. Сейчас у тебя не передаётся, потому что функция getProfile стала событием при клике. А переменной uid у тебя нигде нет.
Там где вызывается по клику получается, что заменяем uid на viewer_id . Поэтому разницы ведь особой и не должно быть.
Мне просто нужно, чтобы при нажатии на кнопку profile_btn появилось имя фамилия дата рождения аватар(который берется со страницы пользователя). Поэтому я хочу связать эту функцию getProfiles с кнопкой.
Вроде все должно сейчас работать, так как и поля и код вроде правильный.
но меня смущает
undefined
TypeError: Error #2007: Параметр url не должен быть равен нулю.
at flash.net::URLStream/load()
at flash.net::URLLoader/load()
at ex_fla::MainTimeline/getProfile()
и расскажите поподробней как узнать данные :

/*flashVars['api_id'] = 1728947;
flashVars['viewer_id'] = 1306422;
flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301';
flashVars['secret'] = '7ef8l6a4p8';
*/
api_id это номер приложения, когда я загружаю его ?
viewer_ id - номер моей страницы?
flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301'; - это остается неизменным?
flashVars['secret'] = '7ef8l6a4p8'; - это секретный ключ?
Если все это я помещу в коде, то я могу приложение не загружать вконтакт ,а тестировать со своего компьютера так? Я правильно понял?

На всякий случай выложу весь код

Код: Выделить всё

  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;  var api_id:Number = 2414830       ;// ID приложенияvar url_loader:URLLoader;var url_request:URLRequest;var viewer_id;var secret:String;var sid:String;var api_url:String; var bdate_tf:TextField = new TextField();var name_tf:TextField = new TextField();var avatar:UILoader = new UILoader()  ; // получаем данные из 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';            */// вызываем функцию получения профиля пользователя, просматривающего приложениеprofile_btn.addEventListener(MouseEvent.CLICK,getProfile); function getProfile(e:MouseEvent):void{   trace(viewer_id);   // параметры которые будем передавать в запросе и которые нужны для формирования сигнатуры    // параметры для формирования сигнатуры    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 = viewer_id;     // параметры для отправки запроса    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);} // запрос выполнен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);} // функция генерации сигнатуры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);} 
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Получение информации о пользователе

Сообщение Александр »

dr1emaver писал(а):Там где вызывается по клику получается, что заменяем uid на viewer_id . Поэтому разницы ведь особой и не должно быть.
Ну ты понимаешь почему это работает? Потому что viewer_id - глобальная переменная.
dr1emaver писал(а):и расскажите поподробней как узнать данные
для тестирования локально, можно прописать их здесь (брать в исходном коде страницы с приложением)
Заходи на страницу приложения и смотри исходный код.
Поиском по странице найди "sid" - в ковычках. Там же рядом secret и другие данные.
dr1emaver писал(а):Если все это я помещу в коде, то я могу приложение не загружать вконтакт ,а тестировать со своего компьютера так? Я правильно понял?
Да. Только раскомментировать не забудь.


И посмотри тему Отладка приложений, взаимодействующих с сервером (инструкция по Charles) - очень поможет при создании приложений взаимодействующих с сервером.
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

блин все равно приложение не работает =( Жму на кнопку и никакого толку.. ни имени, ни фамилии, ни даты, ни фотографии..Просто фон и кнопка..Че ж ей не нравится то ?(
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Получение информации о пользователе

Сообщение Александр »

Александр писал(а):И посмотри тему Отладка приложений, взаимодействующих с сервером (инструкция по Charles) - очень поможет при создании приложений взаимодействующих с сервером.
Запрос хотя бы отправляется?

Код работает. Проверяй что тебе возвращает сервер api.
Ответить