Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > VitaliyKrivtsov

Рейтинг: 5.00. Голосов: 2.

Библиотека для взаимодействия с Вконтакте API

Запись от VitaliyKrivtsov размещена 11.03.2011 в 22:27
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 01:11

Написал маленькую библиотеку для работы с Вконтакте API (отправка запроса и получения ответа) и Вконтакте JS API(вызов окошек).

Итак библиотека имеет один главный класс APIConnection, который является статическим. Что бы работать с Вконтакте нужно вызвать метод APIConnection#init и передать один единственный обязательный параметр - это ссылка на главный класс приложения( самого себя ).
Код AS3:
var params:Object = new Object();
params["application"] = this;	
APIConnection.init( params );
Класс все работу сделает сам, вытянет все флеш переменные и присвоит их свойствам APIConnection, которые реализованы с помощью сет- и гет методов.
Свойства класса - это все флеш-переменные, которые контакт передает в флешварс без вызова первого запроса к API.
Код AS3:
tf.appendText("\n// -- Your code for local testing:\n");
tf.appendText("flashVars['api_id'] = " + APIConnection.apiId + ";\n");
tf.appendText("flashVars['viewer_id'] = " + APIConnection.viewerId + ";\n");
tf.appendText("flashVars['sid'] = \"" + APIConnection.sid + "\";\n");
tf.appendText("flashVars['secret'] = \"" + APIConnection.secret+ "\";\n");
tf.appendText("// -- //\n\n");
// -- //
tf.appendText("\n// -- Application variables passed through the container:\n");
tf.appendText('"api_url" = "' + APIConnection.apiUrl + '";\n');
tf.appendText('"api_settings" = ' + APIConnection.apiSettings + ';\n');
tf.appendText('"user_id" = ' + APIConnection.userId + ';\n');
tf.appendText('"group_id" = ' + APIConnection.groupId + ';\n');
tf.appendText('"is_app_user" = ' + APIConnection.isAppUser + ';\n');
tf.appendText('"auth_key" = "' + APIConnection.authKey + '";\n');
tf.appendText('"language" = ' + APIConnection.language + ';\n');
// переменные, доступные в 	контейнере 
if ( APIConnection.swfUrl ) {
tf.appendText('"domain" = "' + APIConnection.domain + '";\n');
tf.appendText('"scale" = ' + APIConnection.scale + ';\n');
tf.appendText('"width" = ' + APIConnection.width + ';\n');
tf.appendText('"height" = ' + APIConnection.height + ';\n');
tf.appendText('"swf_url" = "' + APIConnection.swfUrl + '";\n');
tf.appendText('"debug" = ' + APIConnection.debug + ';\n');
}		
tf.appendText("// -- //\n\n");
Вот так собственно можно обращаться к нужным нам переменный и чаще всего используемым в приложении из любого места.

Что бы вызывать локально методы нужно дописать еще несколько переменных в params:
Код AS3:
params["api_id"] = "2132800"; //  id приложения 
params["viewer_id"] = "41138144"; // id автора 
params["sid"] = "e481ea64ff5f2fdc5f2736e5336a68d6dcb005176cace021595469e2628534";// sid со страницы приложения
params["secret"] = "61f1c4f619"; // secret со страницы приложения
Это добро нужно для взаимодействия с 3 версией API, что не хрена не удобно.
Секрет и сид нужно кажень день вытаскивать из странички приложения. А мне лениво, думаю не только мне , по лучше использовать Вконтакте API 2.0.
Для этого нужно еще добавить парочку переменных для локального тестирования:
Код AS3:
params["api_id"] = "2132800"; //  id приложения 
params["viewer_id"] = "41138144"; // id автора 
 
params["secret"] = "61f1c4f619"; // secret со страницы приложения, это тот что в строке "Ключ приложения:" и тут ключ.
params["test"] = true; // ну тут то понятно 
params["format"] = APIConnection.XML;// тут формат можно указать, XML и так используеться по умолчанию, можно и не указывать если используете XML. 
params["version"] = "2.0";// ну и  самое главное, указываем версию API.
В библиотеке есть класс Application, который являеться оберткой врапера и посредника.
Для доступа к нему нужно вызвать APIConnection.getInstance();
Код AS3:
var application:Application = APIConnection.getInstance( );
За все жизнь приложения можно создать один екземпляр, да и больше не нужно. Хотя если нужно - можно и поправить.
И так можно брать ссылку из дюбого места программы.
Реализовано все методы как первого так и второго.
И добавлен от меня метод Application#post, который есть отправкой сообщения на стену. О нем нам подробно расписал Psycho Tiger в записи Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost?. Тут пояснять, что это такое не буду. Приведу лиш пример использования.
Код AS3:
 
private function init(e:Event = null):void 
{
var application:Application = APIConnection.getInstance( );
application.addEventListener( VKWallPostEvent.WALL_POST_SAVE, onWallPostSave );
application.addEventListener( VKWallPostEvent.WALL_POST_CANCEL, onWallPostCancel );
application.post( APIConnection.viewerId, "test" );// параметр первый - ид пользователя, второй текст, третий не приведен, но это медиаприложение, фотка, видео и тп. 	
 
}
private function onWallPostSave( e:VKWallPostEvent ):void 
		{
			tf.appendText("Success wall.post post_id: "+e.postId+"\n");
			//tf.appendText( "e.type :"+e.type+";\n");			
		}		
		// -- //		
		private function onWallPostCancel( e:VKWallPostEvent ):void 
		{
			//tf.appendText("WallPost cancelled;\n");	
			tf.appendText("Fail wall.post error_msg: "+"["+e.code+"]"+e.message+"\n");
		}
Все красиво и понятно.

Для того, что бы вызвать метод Вконтакте нужно:
Код AS3:
var vkcall:VkontakteCall = new VkontakteCall();
			// -- //
var fields:Array = [UserField.BDATE, UserField.CITY, UserField.DOMAIN, UserField.HAS_MOBILE, UserField.NICKNAME, UserField.UID, UserField.PHOTO_BIG, UserField.UNIVERSITY_NAME];
vkcall.call( Users.getProfiles( [APIConnection.viewerId], fields ) as URLRequest );			
// -- //			
vkcall.addEventListener( VKResponseEvent.RESPONSE, responseHandler );
vkcall.addEventListener( VKErrorEvent.ERROR, errorHandler );
 
private function errorHandler(e:VKErrorEvent):void 
		{
			tf.appendText("Error: ["+e.code+"] "+e.message+"\n");
			VkontakteCall(e.target).removeEventListener( VKErrorEvent.ERROR, errorHandler );
		}
 
		private function responseHandler(e:VKResponseEvent):void 
		{
			tf.appendText("\n// -- API request result:\n");		
			tf.appendText( e.row.toString() );
			tf.appendText("// -- //\n\n");
			VkontakteCall(e.target).removeEventListener( VKResponseEvent.RESPONSE, responseHandler );
		}
Главная строчка
Код AS3:
vkcall.call( Users.getProfiles( [APIConnection.viewerId], fields ) as URLRequest );
добавляет вызов в очередь. Все методы реализованы в статических классах, и находятся в phantom.api.vkontakte.methods.*:

- phantom.api.vkontakte.methods.user.* - пакет содержат классы Audio.as,Friends.as, Notes.as, Photos.as, Users.as, Video.as, Wall.as для работы с данными пользователя, фотографиями, видеозаписями, аудиозаписями, заметками, стеной. UserField.as и UserNameCase.as содержат константы для для роботы с методом Users#getProfiles().

- phantom.api.vkontakte.methods.app.* - пакет содержит класс Аpp.as. В классе реализованы методы, не вошедшие в другие классы, а именно методы для работы с переменными Вконтакте, таблицей рекордов, сообщениями и др.

- phantom.api.vkontakte.methods.desktop.* - пакет содержат классы DesktopFriends.as, DesktopMessages.as, DesktopNewsfeed.as, DesktopPhotos.as, DesktopPolls.as, DesktopStatus.as, DesktopSubscriptions.as, DesktopWall.as для работы с методами доступными только desktop-приложениям включающее работу с личными сообщениями, друзьями, лентой новостей, фотографиями, сервисом опросов, "вечным" статусом,подписками, стеной.

- phantom.api.vkontakte.methods.execute.* - пакет содержат класс Еxecute.as, в котором реализован универсальный метод execute(), который позволяет запускать последовательность других методов.
phantom.api.vkontakte.methods.geo.* - пакет содержат класс Places.as. Реализованы методы для работы с местами.

- phantom.api.vkontakte.methods.language.* - пакет содержат класс Language.as. Реализованы методы для локализация приложений.

И тд и тп.
Пожалуй заметили, что есть и пакет, в котором реализованы все методы, которые доступны desktop-приложениям.
Вдруг захочется написать десктопное приложение.

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

Завтра залью на гугле код документацию по все классам.

А пока можно поковырятся в моем коде. Скачать можно з http://code.google.com/p/as3vkontaktelib/downloads/list. Это работоспособное приложение. Часть кода приложения стянул из вконтакте, по сути сам интерфейс.
Собственно пока все. Расскажу о багах, с которыми повстречался на пути написания библиотеки в следующей записи в блоге и в группе http://vkontakte.ru/club24681508 библиотеки Вконтакте . К сожалению, их туча. Думаю, не будет лишним.
Всего комментариев 25

Комментарии

Старый 12.03.2011 00:24 Хемуль вне форума
Хемуль
 
Аватар для Хемуль
Класс Application будет путаться с одноимённым из Flex. ^_^
Старый 12.03.2011 01:42 Котяра вне форума
Котяра
 
Аватар для Котяра
а пакеты для чего придумали?
хотя
Цитата:
В библиотеке есть класс Application, который являеться оберткой врапера и посредника.
если он является оберткой, так и назови
VKProxy или ProxyManager
Старый 12.03.2011 01:54 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
Цитата:
Класс Application будет путаться с одноимённым из Flex. ^_^
О флексе знаю очень мало, я на нем ни одного проекта не писал, по этому не знал и о существовании такого класса. Обозвал VKApplication.
Цитата:
а пакеты для чего придумали?
Котяра, лично для меня так удобней. Хотя, думаю, многие скажут зачем они надо, ведь можно посмотреть в документацию Вконтакте и запихнуть нужные параметры, всего лишь там роботы минуты дело и потом наверное много работы по написанию для каждого класса, что дурно ибо время жалко.

Я написал эти методы, рассортировал их по пакетам, точно так же как они в документации Вконтакте расписаны, если что на крайняк надо, то смотрю в ихневскую документацию. Как по мне очень удобно. Видно что и где лежит и к чему относится.

И потом, проще все-таки посмотреть в класс или лучше в документацию по классам библиотеки, чем лазить в поисках нужного метода в документации Вконтакте.
Все-таки существенное сокращение времени на поиск нужной информации.
Старый 12.03.2011 10:41 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
в данный момент тоже занимаюсь писаниной API для вконтакта.
несколько пунктов почему я, собственно заморочился:
- ну не нравится мне создание нового экземпляра Call сплошь и рядом. уйти от них - не удйдешь: один запрос - один эекземпляр. но для юзера будет один коннектор (менеджер запросов), который рулит запросами и диспатчит события
- новая версия 3.0

по сабжу:

режет глаз следующие в Application:
- а зачем вы поубирали удобный Function.apply, заменив условиями?
- а зачем в каждом методе проверяете на isWrapper?
в остальном особо различий в работе с "ихней" библиотекой не увидел

Код AS3:
var application:Application = APIConnection.getInstance( );
перевоплощение выглядит загадочно.

Код AS3:
APIConnection.vkontakte::addPar( "offset", offset.toString() );
одно неосторожное движение и все, амба..ищите ветра в поле )
я бы не добавлял параметры отдельно от запроса. может такая чехорда случиться, что мама, не горюй )

что из хорошего:
кастомные события с типизированными свойствами. но:
1.
Код AS3:
public function VKWallPostEvent( type:String, params:Array, /*code:int = 0, message:String = null, postId:int = 0,*/ bubbles:Boolean = false, cancelable:Boolean = false) 
{
	super(type, bubbles, cancelable);
	this.params = params;
	if( params[0] != undefined  ) code = params[0];		
	if( params[1] != undefined ) message = params[1];		
	if( params[2] != undefined ) postId = params[2];
}
в данном случае не понятно что в какой последовательности пихать в массив параметров.
Старый 12.03.2011 16:35 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
cleptoman,
Цитата:
ну не нравится мне создание нового экземпляра Call сплошь и рядом. уйти от них - не удйдешь: один запрос - один эекземпляр. но для юзера будет один коннектор (менеджер запросов), который рулит запросами и диспатчит события
.
Я как раз в этом направлении и двигался. Один запрос - один экземпляр, как по мне, удобно.
Реализовано и 2.0 и 3.0. Ток я не пойму существенной разницы между ними?
Цитата:
- а зачем вы поубирали удобный Function.apply, заменив условиями?
- а зачем в каждом методе проверяете на isWrapper?
вот по этой причине
Цитата:
одно и то же приложение будет работать как контейнере так и через посредник.
Проверяю где находится приложение в контейнере или работает через посредник. Как проще проверить не придумал. Захотелось универсальности. Что бы не заморачиватся с переписыванием кода.

Цитата:
в данном случае не понятно что в какой последовательности пихать в массив параметров.
это единственный случай где я такую хренотень заделал. Получается так, что при ошибке в евент попадает два парметра, при успешном - один, и их нужно добавлять поочередности, то есть если нет ошибки параметры - code:int = 0, message:String = null, не нужно передавать, а хочется что бы передавались только те которые есть, хотя сейчас полный бред пишу, что мне мешает просто передать дефолтные значения и все ясно будет, как белый день. И это один такой класс написал и Вы все-таки нашли косяк. Исправлю.

Цитата:
перевоплощение выглядит загадочно.

Код AS3:
APIConnection.vkontakte::addPar( "offset", offset.toString() );
одно неосторожное движение и все, амба..ищите ветра в поле )
я бы не добавлял параметры отдельно от запроса. может такая чехорда случиться, что мама, не горюй )
Если не использовать пространство имен, то и в массив параметров для запроса нече не получится добавить.
По началу я думал не использовать простран. имен, но потом решил чуть ограничить доступ к методам. Увы, это не универсальное решение.

Все-таки лучше запрос формировать в классе VkontakteCall, а параметры передать как массив из статического метода.

Вот ссылка на библиотеку по Вконтакте API, автор Иванн Елизарьев. Так тоже все параметры передаются таким макаром.

cleptoman, спасибо за конструктивную критику.
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 16:59
Старый 12.03.2011 18:30 nOobCrafter вне форума
nOobCrafter
Как на счет weakReference?
у меня так же почему то ругнулось на:
Код AS3:
		public static function reorder(
		                               aid: String,
		                               after: String,
		                               before: String,
		                               oid: String = null, <- запятая
		                               ): URLRequest
		{
класс phantom.api.vkontakte.methods.user.Audio
честно гря создание каждый раз нового колла мне тоже не нравится(
В том же классе чтото не ясное с методом deleteAudio
Обновил(-а) nOobCrafter 12.03.2011 в 18:39
Старый 12.03.2011 19:03 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
ну типа

Код AS3:
private var _sender:Function;
 
...
 
if (wrapper && wrapper.external) {
   _sender	= wrapper.external.callMethod as Function;
}else{
   _out	= new LocalConnection();
   _out.allowDomain('*');
   _sender				= _out.send;
}
Код AS3:
public function send(method:String , ...params):void {
   params.unshift(method);
 
   if(_out){
	params.unshift("_in_" + _connectionName);
   }
   _sender.apply(this, params);
}
Обновил(-а) cleptoman 12.03.2011 в 19:08
Старый 12.03.2011 21:00 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
nOobCrafter, извиняюсь что не написал здесь, вчера запихивал классы в swc и Adobe Flash сильно ругался на синтаксические ошибки, их по всех классах насчиталось около 300, все исправил. Переименовал класс Application и пока все.

Скачать можно по ссылке as3vkontaktelib.

cleptoman,
больше все мне в ихнем коде не нравится эта неясность, я не знаю, что отправляю и как. Если Вам все равно как работает, то можно и так написать, тут нет проблемы. Здесь скорее вопрос удобства.
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 21:12
Старый 14.03.2011 20:38 Anton Riot вне форума
Anton Riot
а можно как-нибудь полностью без swc обойтись? Необходимость импорта некого blooddy_crypto.swc напрягает.
Старый 14.03.2011 20:56 i.o. вне форума
i.o.
 
Аватар для i.o.
Цитата:
Необходимость импорта некого blooddy_crypto.swc напрягает.
чем это вас так MIT лицензия напрягает?
Старый 14.03.2011 21:10 Котяра вне форума
Котяра
 
Аватар для Котяра
А как же playerglobal.swc? Не напрягает?
Старый 14.03.2011 21:24 dimarik вне форума
dimarik
 
Аватар для dimarik
2 Anton Riot. Чем это Вас наш BlooDHounD напряг? Это дельный дятька.
Старый 14.03.2011 21:26 Anton Riot вне форума
Anton Riot
О, налетели)
dimarik, меня напряг не BlooDHounD, а необходимость встраивания swc, что в CS3 не удобно делать (а иногда невозможно).
Старый 14.03.2011 21:37 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
прям таки невозможно?
Старый 14.03.2011 21:43 Anton Riot вне форума
Anton Riot
Ну да. не далее как сегодня получил ответ от одной из беннерокрутилок для флэшек, которая предоставляется как swc - что она для всего, кроме CS3
Старый 15.03.2011 00:50 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
она для всего, кроме CS3
Может тогда проще выкинуть CS3? =)
Старый 15.03.2011 01:45 dimarik вне форума
dimarik
 
Аватар для dimarik
Хороший совет. Можно даже googleBrain'нить
Старый 15.03.2011 10:43 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
Хороший совет. Можно даже googleBrain'нить
Шутка-самосмейка? Или просто последствия кризиса среднего возраста?
Старый 15.03.2011 21:36 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Вот злые становятся люди на флешере. Меня это не радует.
Старый 15.03.2011 21:43 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
Это потому, что у них велосипеда нету.
Старый 15.03.2011 21:48 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
Это потому, что у них велосипеда нету.
Ага. Или седла на велосипеде =0

Кстати, первой в выдаче гугла по запросу "как выкинуть CS3" идет ссылка на этот блог.
VitaliyKrivtsov, твой блог в топе =)
Обновил(-а) gloomyBrain 15.03.2011 в 21:51
Старый 15.03.2011 22:00 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
еще один блог попал )
Старый 15.03.2011 22:04 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
gloomyBrain, ага приятно видеть, но больше половины здешних коментов не по теме. Сначала загадили блог
инфокоре, а теперь и за мой взялися.
Подскажите люди добрые (если тут есть таковые) как отправить запрос методом execute. Нужно узнать город и страну.
Код AS3:
'return { "city":API.getCities({"cids":[528]}),"country": API.getCountries({"code":["UA","RU"]})}
И так что получается, а получается, что город возвращает, а страну нет, просто пустой тег country,
и что характерно не получается получить полный список стран вообще или хотябы ид страны указав при этом UA или RU или вместе вот это все.
Напишите что неправильно передаю в запросе.

P.S. Psycho Tiger посмотрим, может не так все как кажется.
Старый 15.03.2011 22:44 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Нет-нет, дебаты были у меня.
Старый 03.04.2011 14:37 nOobCrafter вне форума
nOobCrafter

БАГ

Код AS3:
	public final class Wiki
----------------------------
 
		public static function get( $pid       :String,
		                            $gid       :String,									
									$need_html :Boolean = false									
		                           ):URLRequest
		{
			if ( $pid )
			   APIConnection.vkontakte::addPar( "uid", $pid);//, uid ); - было так, исправил на то что есть
 

 


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


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