Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost?
Запись от Psycho Tiger размещена 05.03.2011 в 13:09
3 февраля 2011 года на небезызвестном ресурсе vkontakte.ru произошло обновление их API: устарели методы activity.set и activity.get, но и добавился метод wall.post.
Перед началом сразу оговорюсь, что речь идёт о приложениях с посредником.
Получается, что теперь для отправки записей на стену у нас есть 2 метода:
- wall.post
- wall.savePost
В чем между ними разница?
- wall.post:
— Отправляет на стену записи в одну команду API. Не сильно важно, но удобно.
— Данный метод отображает записи от приложения в новостной ленте.
— Данный метод позволяет отправлять вместе с записью аудио- или видео-приложение.
— С этой записи невозможно открыть приложение в попап окне (в том самом, в котором обычно делают картинку и надпись "Приходи играть к нам!", по клику на которое открывается реальное приложение). По клику на картинку, что постится вместе с текстом будет открываться альбом с этой картинкой.
— post_id генерирует контакт.
— (спорный момент): В этом сообщении администрация обещала в скором времени сообщить, как же загружать картинки с клиента и отправлять на их на стену с помощью wall.post. Однако, никакой информации спустя месяц от них не поступило. Но в документации появилась интересная строчка:
Цитата:
После успешной загрузки фотографии Вы можете разместить её на стене, используя метод wall.post и указав идентификатор фотографии в параметре attachment.
- wall.savePost:
На самом деле, здесь всё наоборот.
— 3 шага для отправки записи на стену. (см. Загрузка фотографий на стену пользователя).
— Не отображает записи в новостной ленте.
— Не позволяет прицепить к записи видео- или аудио-запись.
— Открывает приложение попап окне.
— post_id у записи генерирует клиент. post_id позволяет идентифицировать сообщение среди многих других и передать какую-нибудь информацию (например, ID квеста, который просят помочь пройти: это позволяет не соединятся с сервером лишний раз, до перехода в "большое" приложение).
— Позволяет загружать фотографии с клиента.
О wall.savePost в интернете сказано достаточно много, заставить его работать у себя не вызывает затруднений. Но иначе дело обстоит с wall.post.
Дело в том, что ребята из контакта забыли сказать о том, что, оказывается, чтобы пользоваться этим методом нужно снова обновить посредник (например, отсюда).
А дальше начинаются пляски. В документации wall.post ясно сказано, что нужно вызывать JS API. Через... VK.api. Это как?
JS API обычно вызывается через VK.callMethod. VK API соответственно через VK.api.
Но просмотрев документацию дальше понимаем, что этот новый метод возвращает ошибки и вообще, ведёт себя как обычный VK.api. Недолго думая пробуем сохранить сообщение новым методом через VK.api, но получаем ошибку. В чем же дело?
А дело в том, что теперь VK.api делится на 2 части. Одна из них — старое VK API, а другая — какой-то гибрид JS API и VK API. К этому выводу я пришел, просматривая (весьма дурно пахнущий, кстати) код из их APIConnection.as и сравнивая его с прошлой версией. Добавился новый метод:
// direct access to api (wall.post would not work) public function forceDirectApiAccess(enable: Boolean = true):void { directApiAccess = enable; }
public function api(method: String, params: Object, onComplete:Function = null, onError:Function = null):void { if (!sendingLC || directApiAccess) { var options: Object = new Object(); options['params'] = params; options['onComplete'] = onComplete; options['onError'] = onError; dp.request(method, options); } else { var callId: Number = apiCallId++; apiCalls[callId] = function(data: Object):void { if (data.error) { onError(data.error); } else { onComplete(data.response); } } sendData("api", callId, method, params); } }
Первое осуществимо через метод, описанный выше. Причем недокументированный метод. Скажите мне, что может быть хуже недокументированного метода Вконтакте, необходимого для работы?
Разбираться с этим я долго не стал. У нас не так много команд, которые нужно пускать по ветке else, поэтому я сделал вот так:
if (method === "wall.post") { //здесь бывшая ветка else } else{ //здесь ветка оригинальной отправки }
Резюмируя, можно сказать, что старый метод wall.savePost остается необходим для записей, по клику на который должно открываться попап-окно или к которому необходима картинка, сгенерерированная клиентом.
Для всех остальных вещей есть wall.post. Кстати, чтобы добавить интерактивности вроде "Пройди со мной квест!" используя wall.post придется генерировать ссылку на приложение и отправлять как часть сообщения, в которой будет содержаться, например, post_id.
Всего комментариев 13
Комментарии
![]() ![]() |
|
Цитата:
Сообщение от (из) к/ф Иван Васильевич меняет профессию
А ещё боремся за почётное звание дома высокой культуры быта, — это же кошмар, кошмар!
|
|
Обновил(-а) dimarik 05.03.2011 в 22:23
|
![]() ![]() |
|
Хм, а разве её можно прикрыть на уровне воли контактеров?
Кстати, у начальства была идея прикрутить кнопку "мне нравится" во флеш-приложения. Вот думаю, стоит ли. |
![]() ![]() |
|
Да, конечно. Сложить головную боль по секурити на браузер (iframe).
|
![]() ![]() |
|
Интересная идея, не думал в таком направлении. Запустить iframe с другого домена, чтобы JS по определению не мог иметь доступ к желанным кукам?
|
![]() ![]() |
|
метод forceDirectApiAccess(), скорее всего нужен для использования в тестовом режиме локально и на странице приложения не используя посредник, комментарий этого метода говорить, что метод wall.post будет не доступен. Все достаточно очевидно. Ну тогда спрашиваться зачем нужен forceDirectApiAccess(), если не получится использовать wall.post - главное нововведение - мне непонятно. Оставили бы строчку !sendingLC исключительно для локально тестирования и больше ничего не нужно.
Как по мне так перемудрили. P.S. Задавал вопрос по методу debug() на форуме, но ответа так и не увидел. Psycho Tiger, может Вы разобрались зачем он нужен. В документации о нем нечего не сказано. Уровень доступа public. Хотелось бы понять какие такие есть случаи, зачем нужно было бы вызывать метод снаружи класса. |
|
Обновил(-а) VitaliyKrivtsov 09.03.2011 в 23:26
|
![]() ![]() |
|
Вроде бы это обычный логгер. public он потому что у флешеров-контакта руки растут не из плеч: нужно было выпилить его из продакшна или на крайний вариант сделать internal`ом.
|
![]() ![]() |
|
![]() ![]() |
|
Спасибо большое, очень помогла статья! +
|
![]() ![]() |
|
Вы мейловского кода их посредника еще не видели. Там вообще атас
|
![]() ![]() |
|
Огромное спасибо за статью! Очень помогла =)
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)