PHP

Отправка сообщения с изображением на стену группы VK через PHP

Для начала вы должны быть авторизированы в VK и являться администратором группы. Далее нужно создать приложение.

Создание приложения

Создаем Standalone-приложение на https://vk.com/apps?act=manage

В настройках приложения включаем Open API, указываем адрес своего сайта и базовый домен, там же находится ID приложения и защищенный ключ.

Получаем access token

Этап 1: нужно получить права и секретный код. Формируем URL подставляя данные своего приложения и вставляем его в браузер. В ответе получаем код.

https://oauth.vk.com/authorize?client_id=ID_ПРИЛОЖЕНИЯ&display=page
&redirect_uri=https://api.vk.com/blank.html&scope=offline,wall,photos
&response_type=code&v=5.60

Этап 2: запрашиваем access_token. Формируем новый URL, подставив client_id, client_secret и полученный выше код. В ответе получаем access_token.

https://oauth.vk.com/access_token?client_id=ID_ПРИЛОЖЕНИЯ
&client_secret=ЗАЩИЩЕННЫЙ_КЛЮЧ&redirect_uri=https://api.vk.com/blank.html
&code=СЕКРЕТНЫЙ_КОД

PHP код

$group_id     = 'ID_ПРИЛОЖЕНИЯ';
$access_token = 'ACCESS_TOKEN';
$message      = 'Hello, world!';
$image        = __DIR__ . '/logo.png';

// Получение сервера vk для загрузки изображения.
$res = json_decode(file_get_contents(
    'https://api.vk.com/method/photos.getWallUploadServer?group_id='
    . $group_id . '&access_token=' . $access_token
));

if (!empty($res->response->upload_url)) {
    // Отправка изображения на сервер.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $res->response->upload_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@' . $image));

    // Начиная с версии PHP 5.5 файлы отправляются через класс CurlFile:
    //curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => new CurlFile($image)));

    $res = json_decode(curl_exec($ch));
    curl_close($ch);

    if (!empty($res->server)) {
        // Сохранение фото в группе.
        $res = json_decode(file_get_contents(
            'https://api.vk.com/method/photos.saveWallPhoto?group_id=' . $group_id
            . '&server=' . $res->server . '&photo='
            . stripslashes($res->photo) . '&hash='
            . $res->hash . '&access_token=' . $access_token
        ));

        if (!empty($res->response[0]->id)) {
            // Отправляем сообщение.
            $params = array(
                'access_token' => $access_token,
                'owner_id'     => '-' . $group_id, 
                'from_group'   => '1', 
                'message'      => $message,
                'attachments'  => $res->response[0]->id
            );

            file_get_contents(
                'https://api.vk.com/method/wall.post?' . http_build_query($params)
            );
        }
    }
}

Возможные проблемы

  • PHP ошибка: Warning: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

    Функция file_get_contents() не может подключится по https, нужно включить PHP модуль openSSL.

  • PHP ошибка: Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in...

    Начиная с версии PHP 5.5 файлы отправляются через класс CURLFile.

  • API возвращает ошибку - error_code: 14, error_msg: Captcha needed

    Это происходит из-за слишком частых запросов к API или у учетной записи VK был отвязан номер мобильного телефона.

16 ноября 2016