Страница 1 из 1

Отправка сообщения на стену с внешнего сайта (wall.post)

Добавлено: 07 июл 2012, 19:35
Александр
Отправка сообщения на стену пользователя с внешнего сайта (wall.post)

В этой статье не будет приведено готового кода. Будут описаны варианты, при которых отправка сообщений с внешнего сайта работает и не работает.

Для начала посмотрим официальную документацию ВКонтакте API.
Нам нужно выбрать тип приложения и узнать как работать с методом wall.post.


Выбираем тип приложения

Изображение

Приложения ВКонтакте (Flash/IFrame)
Интерактивные приложения используют API ВКонтакте для глубокой интеграции с сайтом.

Очевидно, что Flash/IFrame приложения - это не то что нужно в данном случае.
Однако из приложения внутри ВКонтакте, метод wall.post работает из Flash и IFrame приложений.


Standalone/Mobile приложения
Запускаются в виде обыкновенных программ на устройстве пользователя — компьютере или смартфоне.

Это тоже не то что нужно.
Такое приложение должно иметь доступ к управлению Web-браузером. Управлять браузером с внешнего сайта не получится.

Кто-то игнорирует понимание что такое Standalone-приложение и пытается использовать этот вид авторизации для внешнего сайта - Авторизация клиентских приложений.

Сразу же в описании видим:
Для доступа к API ВКонтакте из любого Standalone-приложения предусмотрен механизм клиентской авторизации на базе протокола OAuth 2.0. В качестве клиента может выступать любое Desktop/мобильное приложение, имеющее доступ к управлению Web-браузером (например, компонент UIWebView при создании приложения для iOS).
Логично, что с внешнего сайта мы не сможем управлять браузером.
Если всё-таки не верить документации и попытаться использовать эту авторизацию на сайте и думать логически, то после переадресации на страницу http://oauth.vk.com/blank.html# - браузер находится уже не на сервере со скриптом разработчика, поэтому считать этот url не получится.
Если же подобный url открывается в отдельном приложении со своим объектом браузера, то этот url можно считать программно, обратившись к свойствам окна браузера. На PHP такое обращение не выполнить.

Вывод: такой вариант не подходит для отправки сообщений на стену пользователя с внешнего сайта.


Виджеты и сторонние сайты
Набор виджетов ВКонтакте для сторонних сайтов позволит моментально добавить к Вашему проекту социальную составляющую. Также возможна более глубокая интеграция через Open API или OAuth 2.0.

Мы хотим использовать методы на стороннем сайте, значит теоретически это то что нам нужно.
Если не требуется какой-то особой отправки сообщений на стены пользователей, то вполне подойдут виджеты «Мне нравится» или Share.

Если по каким-то причинам эти виджеты не подходят, то вероятно нужно использовать Open API или OAuth 2.0.



Open API
О работе с Open API ВКонтакте описано в теме Open API ВКонтакте.
Авторизация проходит. Некоторые методы API успешно вызываются.

Попробуем вызвать метод wall.post. Для начала почитаем о нём в документации http://vk.com/developers.php?oid=-1&p=wall.post
Для вызова этого метода из Desktop приложений - приложение должно иметь права с битовой маской, содержащей 8192. (Подробнее о получении прав)
Данный метод доступен также Flash и IFrame приложениям, использующим функцию VK.api в Javascript API.
Про сайты ничего не сказано. Посмотрим какие права должно иметь приложение для использования этого метода.
+8192 Доступ к обычным и расширенным методам работы со стеной.
Внимание, данное право доступа недоступно для сайтов (игнорируется при попытке авторизации).
http://vk.com/developers.php?oid=-1&p=% ... 0%B8%D0%B9

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

При запросе прав доступа в списке запрашиваемых прав есть доступ к стене. Было ли оно проигнорировано?

Изображение
Мое приложение называется «Flapps.ru Open API»

Попробуем вызвать метод wall.post.
Появилось окно
Изображение
Добавление записи на стену
Приложение Flapps.ru Open API предлагает разместить у Вас на стене и в новостях у Ваших друзей следующую запись.
Hello!
Нажимаем "Разместить запись".

Сообщение опубликовано на стене! У сообщения есть подпись с названием приложения "через Flapps.ru Open API".
Изображение

Open API - используется для внешнего сайта? Тогда почему публикация на стену произошла, несмотря на описание в документации о том что данное право доступа недоступно для сайтов?

Вывод: при использовании авторизации Open API можно публиковать сообщения на стену пользователя.
Может ли случится так, что метод перестанет работать через Open API? Этого я сказать не могу. Сейчас метод работает.



OAuth 2.0
О том как работать с OAuth 2.0 описано в теме Серверная авторизация ВКонтакте на базе протокола OAuth 2.0.
Авторизация проходит без проблем, многие методы API работают.

Но при вызове метода wall.post сервер API возвращает ошибку:
Permission to perform this action is denied for non-standalone applications
Если перевести на русский, то можно понять, что это действие запрещено использовать с сервера для не standalone-приложений.

Вывод: OAuth 2.0 не подходит для отправки сообщений на стену пользователя с внешнего сайта.




Дополнительная информация

Из официальной группы разработчиков приложений для ВКонтакте
Метод wall.post, позволяющий Desktop-приложениям размещать записи на стенах пользователей, теперь доступен для Flash- и IFrame-приложений, использующих Flash-посредник и IFrame API соответственно.

Помимо простого текста к каждой записи может быть прикреплена фотография, видео или аудиозапись, ранее загруженная на сервера ВКонтакте. При этом записи, размещаемые на стене автора, будут попадать в новостную ленту.

Обратите внимание, что метод wall.post может быть вызван только при помощи функции VK.api, встроенной в библиотеку Flash-посредника или IFrame API. Такой подход позволяет нам выводить окно с предварительным просмотром публикуемой записи, всегда давая пользователю возможность подтвердить или отклонить это действие.
http://vkontakte.ru/topic-1_24039123


Почему возникают такие сложности с отправкой записей на стену с внешнего сайта

ВКонтакте API при публикации требует от пользователя подтверждения размещения записи на стене.
На мой взгляд, так сделано для безопасности. Чтобы не использовали это для рассылки спама.
Если отправка происходит из приложения внутри ВКонтакте - пользователь видит окно подтверждения.
Если пытаются отправить с внешнего сайта, то такое окно не выводится. Это не реализовано ВКонтакте при публикации с внешнего сайта.
Если отправка происходит из Standalone приложения, то она происходит без подтверждения, т.к. можно предположить, что авторизация произошла через http://oauth.vk.com/blank.html# приложением, которое пользователь сознательно установил.



Другие варианты публикации записей на стене пользователя с внешнего сайта

- Использовать виджеты «Мне нравится» или Share.

- Создать отдельное Iframe/Flash приложение внутри ВКонтакте для публикации на стене пользователя.
С внешнего сайта открывать это приложение на новой странице. Пользователь установит приложение и подтвердит публикацию.

- Авторизовать пользователя по логину и паролю на своем сайте. Не использовать API, а использовать curl и т.п.
Это плохой вариант из-за запроса пароля у пользователей и из-за того что такой способ может перестать работать из-за изменений скриптов сайта Вконтакте. Этот способ нарушает правила пользования сайтом ВКонтакте.


Если вам есть что дополнить о публикации на стене пользователя с внешнего сайта, то пишите в этой теме.

Re: Отправка сообщения на стену с внешнего сайта (wall.post)

Добавлено: 10 июл 2012, 11:04
azzzi
спасибо очень познавательно разжевано)

получается использовать расширенные методы айпи с внешнего сайте невозможно?

надо делать свой софт, в котором можно будет считать с http://api.vk.com/blank.html токен?

эх печально)) придется еще с++ выучить))) или на девил студиа можно замутить такое?

Re: Отправка сообщения на стену с внешнего сайта (wall.post)

Добавлено: 13 июл 2012, 20:52
Александр
azzzi писал(а):или на девил студиа можно замутить такое?
Там сможешь вытащить значение из адресной строки? Тогда можешь попробовать.

Re: Отправка сообщения на стену с внешнего сайта (wall.post)

Добавлено: 25 сен 2012, 09:44
freekontakt
исходник можна посмотреть ? плиз

Re: Отправка сообщения на стену с внешнего сайта (wall.post)

Добавлено: 26 сен 2012, 22:13
Александр
freekontakt
В первом сообщении в тексте указаны ссылки на уроки с исходниками. Надо только почитать...