Pull to refresh

Публикация на стене Вконтакте средствами php

Reading time 5 min
Views 138K
Получив задачу создать автоматическую публикацию материалов сайта на стене нашей страницы Вконтакте, я обнаружил, что рецептов по этой, казалось бы, актуальной теме относительно мало.

В действительности всё оказалось довольно просто, и чтение документации по 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. Подключение происходит так:
  1. Создаем специальным образом ссылку (см. ниже) на странице connect.php нашего приложения.
  2. Открываем бразуер и логинимся Вконтакте под тем пользователем, на стене которого мы будем публиковать сообщения. Это вполне может быть тот же самый пользователь, под которым мы зарегистрировали приложение.
  3. Заходим на свою страничку connect.php и кликаем по ссылке, переходим на страницу Вконтакте.
  4. На странице Вконтакте авторизуем приложение (нажав кнопку «Разрешить»), после чего вконтакт редиректит браузер назад, на страницу connect.php, передав через url параметр code
  5. Используя параметр 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-приложения выглядит так

Вот, все оказалось достаточно просто, ставим скрипт экспорта на крон, и контент-менеджеру не придется публиковать записи вручную!
Tags:
Hubs:
+36
Comments 59
Comments Comments 59

Articles