Библиотека для взаимодействия с Вконтакте API
Запись от VitaliyKrivtsov размещена 11.03.2011 в 22:27
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 01:11
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 01:11
Написал маленькую библиотеку для работы с Вконтакте API (отправка запроса и получения ответа) и Вконтакте JS API(вызов окошек).
Итак библиотека имеет один главный класс APIConnection, который является статическим. Что бы работать с Вконтакте нужно вызвать метод APIConnection#init и передать один единственный обязательный параметр - это ссылка на главный класс приложения( самого себя ).
var params:Object = new Object(); params["application"] = this; APIConnection.init( params );
Свойства класса - это все флеш-переменные, которые контакт передает в флешварс без вызова первого запроса к API.
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:
params["api_id"] = "2132800"; // id приложения params["viewer_id"] = "41138144"; // id автора params["sid"] = "e481ea64ff5f2fdc5f2736e5336a68d6dcb005176cace021595469e2628534";// sid со страницы приложения params["secret"] = "61f1c4f619"; // secret со страницы приложения
Секрет и сид нужно кажень день вытаскивать из странички приложения. А мне лениво, думаю не только мне , по лучше использовать Вконтакте API 2.0.
Для этого нужно еще добавить парочку переменных для локального тестирования:
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.
Для доступа к нему нужно вызвать APIConnection.getInstance();
За все жизнь приложения можно создать один екземпляр, да и больше не нужно. Хотя если нужно - можно и поправить.
И так можно брать ссылку из дюбого места программы.
Реализовано все методы как первого так и второго.
И добавлен от меня метод Application#post, который есть отправкой сообщения на стену. О нем нам подробно расписал Psycho Tiger в записи Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost?. Тут пояснять, что это такое не буду. Приведу лиш пример использования.
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"); }
Для того, что бы вызвать метод Вконтакте нужно:
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 ); }
добавляет вызов в очередь. Все методы реализованы в статических классах, и находятся в 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 16:35 | |
cleptoman,
Цитата:
ну не нравится мне создание нового экземпляра Call сплошь и рядом. уйти от них - не удйдешь: один запрос - один эекземпляр. но для юзера будет один коннектор (менеджер запросов), который рулит запросами и диспатчит события
Я как раз в этом направлении и двигался. Один запрос - один экземпляр, как по мне, удобно. Реализовано и 2.0 и 3.0. Ток я не пойму существенной разницы между ними? Цитата:
- а зачем вы поубирали удобный Function.apply, заменив условиями?
- а зачем в каждом методе проверяете на isWrapper? Цитата:
одно и то же приложение будет работать как контейнере так и через посредник.
Цитата:
в данном случае не понятно что в какой последовательности пихать в массив параметров.
Цитата:
перевоплощение выглядит загадочно.
Код AS3: APIConnection.vkontakte::addPar( "offset", offset.toString() ); одно неосторожное движение и все, амба..ищите ветра в поле ) я бы не добавлял параметры отдельно от запроса. может такая чехорда случиться, что мама, не горюй ) По началу я думал не использовать простран. имен, но потом решил чуть ограничить доступ к методам. Увы, это не универсальное решение. Все-таки лучше запрос формировать в классе VkontakteCall, а параметры передать как массив из статического метода. Вот ссылка на библиотеку по Вконтакте API, автор Иванн Елизарьев. Так тоже все параметры передаются таким макаром. cleptoman, спасибо за конструктивную критику. |
|
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 16:59
|
12.03.2011 18:30 | |
Как на счет weakReference?
у меня так же почему то ругнулось на: public static function reorder( aid: String, after: String, before: String, oid: String = null, <- запятая ): URLRequest { честно гря создание каждый раз нового колла мне тоже не нравится( В том же классе чтото не ясное с методом deleteAudio |
|
Обновил(-а) nOobCrafter 12.03.2011 в 18:39
|
12.03.2011 19:03 | |
ну типа
private var _sender:Function; ... if (wrapper && wrapper.external) { _sender = wrapper.external.callMethod as Function; }else{ _out = new LocalConnection(); _out.allowDomain('*'); _sender = _out.send; } |
|
Обновил(-а) cleptoman 12.03.2011 в 19:08
|
12.03.2011 21:00 | |
nOobCrafter, извиняюсь что не написал здесь, вчера запихивал классы в swc и Adobe Flash сильно ругался на синтаксические ошибки, их по всех классах насчиталось около 300, все исправил. Переименовал класс Application и пока все.
Скачать можно по ссылке as3vkontaktelib. cleptoman, больше все мне в ихнем коде не нравится эта неясность, я не знаю, что отправляю и как. Если Вам все равно как работает, то можно и так написать, тут нет проблемы. Здесь скорее вопрос удобства. |
|
Обновил(-а) VitaliyKrivtsov 12.03.2011 в 21:12
|
14.03.2011 20:38 | |
а можно как-нибудь полностью без swc обойтись? Необходимость импорта некого blooddy_crypto.swc напрягает.
|
14.03.2011 20:56 | |
Цитата:
Необходимость импорта некого blooddy_crypto.swc напрягает.
|
14.03.2011 21:10 | |
А как же playerglobal.swc? Не напрягает?
|
14.03.2011 21:24 | |
2 Anton Riot. Чем это Вас наш BlooDHounD напряг? Это дельный дятька.
|
14.03.2011 21:26 | |
О, налетели)
dimarik, меня напряг не BlooDHounD, а необходимость встраивания swc, что в CS3 не удобно делать (а иногда невозможно). |
14.03.2011 21:37 | |
прям таки невозможно?
|
14.03.2011 21:43 | |
Ну да. не далее как сегодня получил ответ от одной из беннерокрутилок для флэшек, которая предоставляется как swc - что она для всего, кроме CS3
|
15.03.2011 00:50 | |
Цитата:
она для всего, кроме CS3
|
15.03.2011 01:45 | |
Хороший совет. Можно даже googleBrain'нить
|
15.03.2011 10:43 | |
Цитата:
Хороший совет. Можно даже googleBrain'нить
|
15.03.2011 21:36 | |
Вот злые становятся люди на флешере. Меня это не радует.
|
15.03.2011 21:43 | |
Это потому, что у них велосипеда нету.
|
15.03.2011 21:48 | |
Цитата:
Это потому, что у них велосипеда нету.
Кстати, первой в выдаче гугла по запросу "как выкинуть CS3" идет ссылка на этот блог. VitaliyKrivtsov, твой блог в топе =) |
|
Обновил(-а) gloomyBrain 15.03.2011 в 21:51
|
15.03.2011 22:00 | |
еще один блог попал )
|
15.03.2011 22:04 | |
gloomyBrain, ага приятно видеть, но больше половины здешних коментов не по теме. Сначала загадили блог
инфокоре, а теперь и за мой взялися. Подскажите люди добрые (если тут есть таковые) как отправить запрос методом execute. Нужно узнать город и страну.
и что характерно не получается получить полный список стран вообще или хотябы ид страны указав при этом UA или RU или вместе вот это все. Напишите что неправильно передаю в запросе. P.S. Psycho Tiger посмотрим, может не так все как кажется. |
15.03.2011 22:44 | |
Нет-нет, дебаты были у меня.
|
03.04.2011 14:37 | |
БАГ |
Последние записи от VitaliyKrivtsov
- NameCaseLib. Склонение фамилии, имени и отчества (04.12.2011)
- Шаблон проекта для as3vkontaktelib под FlashDevelop (27.08.2011)
- Обновление as3vkontaktelib до версии .-90 (13.08.2011)
- VkontakteAPI. Разбор полётов. (18.05.2011)
- Библиотека для взаимодействия с Вконтакте API (11.03.2011)