Получив задачу создать автоматическую публикацию материалов сайта на стене нашей страницы Вконтакте, я обнаружил, что рецептов по этой, казалось бы, актуальной теме относительно мало.
В действительности всё оказалось довольно просто, и чтение документации по API часто помогает сэкономить время.
Для того чтобы получить доступ к API контакта из php-скрипта, нужно начать с клика по кнопке “Подключить сайт” на странице для разработчиков.
На следующей форме надо выбрать опцию «Standalone-приложение» и ввести название, например, Auto app. После клика по кнопке «Подключить приложение» вам придется ввести код. Он в течение минуты придет в виде смски на мобильный, указанный в профиле пользователя, под которым вы залогинены. Отлично, теперь у вас есть standalone-приложение, информацию о котором в дальнейшем можно редактировать на страничке «Приложения», кликнув по ссылке «настройки».
На новой странице не забудьте ввести реальный адрес сайта, базовый домен и сохранить изменения; если оставить эти поля пустыми, контакт не будет публиковать ваши «автоматические» посты.

Теперь, после того, как приложение создано, мы можем получить 2 важных значения для конфигурации приложения — защищенный ключ и ID приложения, которые нам понадобятся для работы.
Создадим на своем проекте папку приложения, например, my_folder/.
Также для удобства создадим 3 файла, из которых и будет состоять наше standalone-приложение:
сonfig.php – подключаемый конфиг, в который мы положим защищенный ключ и ID приложения, а также ID пользователя, на стене которого мы будем публиковать наши посты.
connect.php — простая страничка для стандартной процедуры подключения приложения к странице пользователя.
export.php — скрипт, который непосредственно будет постить наши материалы.
Так будет выглядеть сложный код нашего конфигурационного файла:
Теперь нам надо подключить приложение к странице пользователя Вконтакте, используя механизм авторизации на базе протокола OAuth 2.0. Подключение происходит так:
Вот простой вариант страницы connect.php:
Для того чтобы работала конструкция json_decode(file_get_contents('https://...')), на сервере должна быть установлена версия php 5.x c поддержкой openssl.
Строка запроса ссылки «авторизация Вконтакте» собирается из следующих параметров:
client_id – ID нашего приложения Вконтакте, которое мы уже прописали в конфигурационном файле;
scope — запрашиваемые права доступа приложения, которые можно перечислять через запятую. В данном случае приложение запрашивает доступ к API со стороннего сервера в любое время (offline) и wall – доступ к методам работы со стеной;
redirect_uri – абсолютная ссылка на страницу подключения connect.php, на которую будет передан параметр code;
responce_type – code.
Теперь, после того, как access_token получен, мы можем приступить к публикации материалов на стене.
Запускаем скрипт, и если мы нигде не ошиблись, получаем такой результат:

Подобным образом можно формировать запросы и для использования других методов API. Строка запроса собирается так:
api.vkontakte.ru/method + название метода + ID пользователя в контакте + полученный ранее токен + перечень параметров соответствующего метода API.
В приведенном примере обязательным параметром является message – это собственно текст, публикуемый на стене Вконтакте. Текст должен быть в кодировке UTF-8, если вы по-прежнему работаете с windows-1251, используйте такое преобразование:
Так как наш текст и ссылка являются частью строки запроса url, не забываем использовать кодирование urlencode.
Если мы хотим запостить только текст, без ссылки, то, в случае успеха сервер пришлет ответ такого вида
{«response»:{«post_id»:1}}
Для того чтобы рядом с сообщением на стене была опубликована ссылка, к строке запроса необходимо добавить attachment=$link, где $link — это абсолютная ссылка на существующую страницу вашего сайта. В таком случае запись публикуется отложено (за несколько секунд ли меньше секунды), а с сервера приходит ответ вида
{«response»:{«processing»:1}}
Подробнее о методе wall.post можно почитать на странице документации.
Не отправляйте запросы на сервер слишком часто. В большинстве случаев лимита в один запрос в минуту вполне достаточно, иначе сервер вернет вам ошибку «Captcha is needed» и публикация будет временно приостановлена.
Результат работы standalone-приложения выглядит так
Вот, все оказалось достаточно просто, ставим скрипт экспорта на крон, и контент-менеджеру не придется публиковать записи вручную!
В действительности всё оказалось довольно просто, и чтение документации по API часто помогает сэкономить время.
Для того чтобы получить доступ к API контакта из php-скрипта, нужно начать с клика по кнопке “Подключить сайт” на странице для разработчиков.
На следующей форме надо выбрать опцию «Standalone-приложение» и ввести название, например, Auto app. После клика по кнопке «Подключить приложение» вам придется ввести код. Он в течение минуты придет в виде смски на мобильный, указанный в профиле пользователя, под которым вы залогинены. Отлично, теперь у вас есть standalone-приложение, информацию о котором в дальнейшем можно редактировать на страничке «Приложения», кликнув по ссылке «настройки».
На новой странице не забудьте ввести реальный адрес сайта, базовый домен и сохранить изменения; если оставить эти поля пустыми, контакт не будет публиковать ваши «автоматические» посты.

Теперь, после того, как приложение создано, мы можем получить 2 важных значения для конфигурации приложения — защищенный ключ и ID приложения, которые нам понадобятся для работы.
Создадим на своем проекте папку приложения, например, my_folder/.
Также для удобства создадим 3 файла, из которых и будет состоять наше standalone-приложение:
сonfig.php – подключаемый конфиг, в который мы положим защищенный ключ и ID приложения, а также ID пользователя, на стене которого мы будем публиковать наши посты.
connect.php — простая страничка для стандартной процедуры подключения приложения к странице пользователя.
export.php — скрипт, который непосредственно будет постить наши материалы.
Так будет выглядеть сложный код нашего конфигурационного файла:
<?php
* конфигурация standalone приложения Вконтакте
* ID приложения и ключ можно получить на странице редактирования приложения, или после добавления
*/
$vkontakteApplicationId = '12345';
$vkontakteKey ='сюда надо скопировать защищенный ключ вашего приложения';
// ID юзера, к которому должно подключаться приложение
$vkontakteUserId='12345';
Теперь нам надо подключить приложение к странице пользователя Вконтакте, используя механизм авторизации на базе протокола OAuth 2.0. Подключение происходит так:
- Создаем специальным образом ссылку (см. ниже) на странице connect.php нашего приложения.
- Открываем бразуер и логинимся Вконтакте под тем пользователем, на стене которого мы будем публиковать сообщения. Это вполне может быть тот же самый пользователь, под которым мы зарегистрировали приложение.
- Заходим на свою страничку connect.php и кликаем по ссылке, переходим на страницу Вконтакте.
- На странице Вконтакте авторизуем приложение (нажав кнопку «Разрешить»), после чего вконтакт редиректит браузер назад, на страницу connect.php, передав через url параметр code
- Используя параметр code, делаем запрос к контакту по протоколу https и получаем access_token – токен, который мы сохраним в текстовом файле (к примеру) и будем в дальнейшем использовать при публикации сообщений на стене. В процессе публикации для авторизации приложения при передаче данных, нам уже не понадобятся секретный ключ и id нашего приложения, и параметр code. Мы будем использовать только полученный токен.
Вот простой вариант страницы connect.php:
<?php
require 'config.php';
if (!empty($_GET['code'])){
// вконтакт присылает нам код
$vkontakteCode=$_GET['code'];
// получим токен
$sUrl = "https://api.vkontakte.ru/oauth/access_token?client_id=$vkontakteApplicationId&client_secret=$vkontakteKey&code=$vkontakteCode";
// создадим объект, содержащий ответ сервера Вконтакте, который приходит в формате JSON
$oResponce = json_decode(file_get_contents($sUrl));
$fp = fopen('token.txt', 'w');
fputs($fp, $oResponce->access_token);
fclose($fp);
}
?>
<a href="http://api.vkontakte.ru/oauth/authorize?client_id=<?=$vkontakteApplicationId?>&scope=offline,wall&redirect_uri=http://<?=$sYourDomain?>/my_folder/connect.php&response_type=code">Авторизация Вконтакте</a>
Для того чтобы работала конструкция json_decode(file_get_contents('https://...')), на сервере должна быть установлена версия php 5.x c поддержкой openssl.
Строка запроса ссылки «авторизация Вконтакте» собирается из следующих параметров:
client_id – ID нашего приложения Вконтакте, которое мы уже прописали в конфигурационном файле;
scope — запрашиваемые права доступа приложения, которые можно перечислять через запятую. В данном случае приложение запрашивает доступ к API со стороннего сервера в любое время (offline) и wall – доступ к методам работы со стеной;
redirect_uri – абсолютная ссылка на страницу подключения connect.php, на которую будет передан параметр code;
responce_type – code.
Теперь, после того, как access_token получен, мы можем приступить к публикации материалов на стене.
<?php
require 'config.php';
$vkontakteAccessToken = file_get_contents('token.txt');
/**
…......
ваш код, где вы получаете текст, ссылку поста или другие значения
*/
// строка запроса к серверу Вконтакте
$sRequest = "https://api.vkontakte.ru/method/wall.post?owner_id=$vkontakteUserId=&access_token=$vkontakteAccessToken&message=$text&attachment=$link";
// ответ от Вконтакте
$oResponce = json_decode(file_get_contents($sRequest));
Запускаем скрипт, и если мы нигде не ошиблись, получаем такой результат:

Подобным образом можно формировать запросы и для использования других методов API. Строка запроса собирается так:
api.vkontakte.ru/method + название метода + ID пользователя в контакте + полученный ранее токен + перечень параметров соответствующего метода API.
В приведенном примере обязательным параметром является message – это собственно текст, публикуемый на стене Вконтакте. Текст должен быть в кодировке UTF-8, если вы по-прежнему работаете с windows-1251, используйте такое преобразование:
$text = urlencode(iconv( 'windows-1251', 'utf-8' , $text));
Так как наш текст и ссылка являются частью строки запроса url, не забываем использовать кодирование urlencode.
Если мы хотим запостить только текст, без ссылки, то, в случае успеха сервер пришлет ответ такого вида
{«response»:{«post_id»:1}}
Для того чтобы рядом с сообщением на стене была опубликована ссылка, к строке запроса необходимо добавить attachment=$link, где $link — это абсолютная ссылка на существующую страницу вашего сайта. В таком случае запись публикуется отложено (за несколько секунд ли меньше секунды), а с сервера приходит ответ вида
{«response»:{«processing»:1}}
Подробнее о методе wall.post можно почитать на странице документации.
Не отправляйте запросы на сервер слишком часто. В большинстве случаев лимита в один запрос в минуту вполне достаточно, иначе сервер вернет вам ошибку «Captcha is needed» и публикация будет временно приостановлена.
Результат работы standalone-приложения выглядит так
Вот, все оказалось достаточно просто, ставим скрипт экспорта на крон, и контент-менеджеру не придется публиковать записи вручную!