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

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

Рейтинг: 4.67. Голосов: 3.

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.
Но, к сожалению, у меня не получилось. От сервера приходит что-то вроде 2041c53171:w, но ни 2041c53171:w, ни photo2041c53171:w как 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 и сравнивая его с прошлой версией. Добавился новый метод:
Код AS3:
// direct access to api (wall.post would not work)
public function forceDirectApiAccess(enable: Boolean = true):void {
  directApiAccess = enable;
}
Неплохо было бы рассказать им о сеттерах, но это в другой раз. Что это ещё за directApiAccess? Нехитрый CTRL+F по документу наталкивает на этот кусок:
Код AS3:
	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);
	  }
	}
Первая часть кода, выполняющиеся по условию !sendingLC || directApiAccess представляет собой блок кода из старого API. Ветка по else — новую. Чтобы вызвать ветку else нам нужно заставить directApiAccess быть false, и как-то убить sendingLC.
Первое осуществимо через метод, описанный выше. Причем недокументированный метод. Скажите мне, что может быть хуже недокументированного метода Вконтакте, необходимого для работы?
Разбираться с этим я долго не стал. У нас не так много команд, которые нужно пускать по ветке else, поэтому я сделал вот так:
Код AS3:
if (method === "wall.post") {
//здесь бывшая ветка else
}
else{
//здесь ветка оригинальной отправки
}
К счастью, такой простой фикс помог и заставил избавиться от возни с тем странным методом.

Резюмируя, можно сказать, что старый метод wall.savePost остается необходим для записей, по клику на который должно открываться попап-окно или к которому необходима картинка, сгенерерированная клиентом.
Для всех остальных вещей есть wall.post. Кстати, чтобы добавить интерактивности вроде "Пройди со мной квест!" используя wall.post придется генерировать ссылку на приложение и отправлять как часть сообщения, в которой будет содержаться, например, post_id.
Всего комментариев 13

Комментарии

Старый 05.03.2011 22:07 dimarik вне форума
dimarik
 
Аватар для dimarik
Цитата:
Сообщение от (из) к/ф Иван Васильевич меняет профессию
А ещё боремся за почётное звание дома высокой культуры быта, — это же кошмар, кошмар!
Интересно, а они прикрыли эту дырку по сбору куков? Я им писал...
Обновил(-а) dimarik 05.03.2011 в 22:23
Старый 06.03.2011 13:17 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Хм, а разве её можно прикрыть на уровне воли контактеров?

Кстати, у начальства была идея прикрутить кнопку "мне нравится" во флеш-приложения. Вот думаю, стоит ли.
Старый 06.03.2011 21:50 dimarik вне форума
dimarik
 
Аватар для dimarik
Да, конечно. Сложить головную боль по секурити на браузер (iframe).
Старый 06.03.2011 21:54 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Интересная идея, не думал в таком направлении. Запустить iframe с другого домена, чтобы JS по определению не мог иметь доступ к желанным кукам?
Старый 07.03.2011 12:30 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
спасибо за тему.

еще один метод в копилку "api" методов
photos.saveProfilePhoto
для загрузки в профиль
если его вызывать через обычный апи, то придется дергать враппер для подтверждения
а это лишний шаг
Старый 09.03.2011 23:16 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
метод forceDirectApiAccess(), скорее всего нужен для использования в тестовом режиме локально и на странице приложения не используя посредник, комментарий этого метода говорить, что метод wall.post будет не доступен. Все достаточно очевидно. Ну тогда спрашиваться зачем нужен forceDirectApiAccess(), если не получится использовать wall.post - главное нововведение - мне непонятно. Оставили бы строчку !sendingLC исключительно для локально тестирования и больше ничего не нужно.
Как по мне так перемудрили.

P.S. Задавал вопрос по методу debug() на форуме, но ответа так и не увидел.
Psycho Tiger, может Вы разобрались зачем он нужен. В документации о нем нечего не сказано. Уровень доступа public. Хотелось бы понять какие такие есть случаи, зачем нужно было бы вызывать метод снаружи класса.
Обновил(-а) VitaliyKrivtsov 09.03.2011 в 23:26
Старый 10.03.2011 00:09 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Вроде бы это обычный логгер. public он потому что у флешеров-контакта руки растут не из плеч: нужно было выпилить его из продакшна или на крайний вариант сделать internal`ом.
Старый 10.03.2011 00:39 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
Написал класс, который выполняет одновременно роль враппера в контейнере и посредника без контейнера.
По сути просто класс-обертка и конечно это все по человечески реализовано, а не а бы работало. Все реализовал в классе, что было в врапере и вроде бы все в апиконекшен, но метод debug() разобрать не смог. Выводил в лог отправку переменных. Как оказалось используется в основном лишь при возникновении событий. И зачем это все надо не понятно. НО засмущало лишь одно - все методы с приват отдельно, все с паблик отдельно. Вот и подумал, что может быть не зря с паблик доступ. Код конечно ихневский ели на троечку тянет. Сразу видно, что яваскрипта перешли на екшин. Но прочем не мне судить.
Psycho Tiger, спасибо за ответ, надеюсь так и есть.
Старый 10.03.2011 20:40 Rzer вне форума
Rzer
 
Аватар для Rzer
Код AS3:
или к которому необходима картинка, сгенерерированная клиентом.
Новым вроде как тоже можно
Старый 11.03.2011 15:02 Хемуль вне форума
Хемуль
 
Аватар для Хемуль
2 Psycho Tiger:
Спасибо за статейку, про forceDirectApiAccess было интересно почитать.

2 All:
Ребята, а скажите, может кто-то поделиться ссылкой на AS3 API какое-то для ВКонтакте, которое написано красиво, используется удобно и обновляется оперативно, в соответствии с тем, что изменяется разработчиками ВКонтакте?
Старый 25.08.2011 17:54 freezpl вне форума
freezpl
Спасибо большое, очень помогла статья! +
Старый 22.12.2011 02:05 ramshteks вне форума
ramshteks
 
Аватар для ramshteks
Вы мейловского кода их посредника еще не видели. Там вообще атас
Старый 27.08.2012 16:54 Himerets вне форума
Himerets
 
Аватар для Himerets
Огромное спасибо за статью! Очень помогла =)
 

 


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


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