Автоматическая загрузка фотографий на стену в ВКонтакте

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

В прошлой статье я рассказал как простым способом и автоматически, например через cron, публиковать записи к себе на стену или на стену сообщества. В этой статье мы немного расширим наш класс Model_Vk и добавим туда несколько функций. Так же нужно в запрос получения access_token добавить scope photos, выглядеть это будет так:

http://oauth.vk.com/authorize?client_id=YOUR_CLIENT_ID&scope=wall,offline,photos&redirect_uri=http://oauth.vk.com/blank.html&response_type=token

Функция загрузки фотографии uploadImage:

public function uploadImage($file, $group_id = null) {

    $params = array();
    if( $group_id ) {
        $params['gid'] = $group_id;
    }

    //Получаем сервер для загрузки изображения
    $response = $this->method("photos.getWallUploadServer", $params);
    if( isset($response) == false ) {
        print_r($response);
        exit;
    }
    $server = $response->response->upload_url;

    //Отправляем файл на сервер
    $ch = curl_init($server);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => class_exists("CURLFile", false) ? new CURLFile($file) : "@" . $file));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; charset=UTF-8'));
    $json = json_decode(curl_exec($ch));
    curl_close($ch);

    //Сохраняем файл на стену
    $photo = $this->method("photos.saveWallPhoto", array(
        "server" => $json->server,
        "photo" => ($json->photo),
        "hash" => $json->hash,
        "gid" => $group_id
    ));

    if( isset($photo->response[0]->id) ) {
        return $photo->response[0]->id;
    } else {
        return false;
    }
}

Теперь разберем подробнее, что именно делает данная функция. На входе функция получает полный путь до файла, который необходимо загрузить и индетификатор группы (если необходимо опубликовать фотографию на стену группы). Далее методом photos.getWallUploadServer мы запрашиваем у ВКонтакте, куда нам необходимо отправлять фотографию. После получения ссылки на загрузку фотографии производим ее непосредственную отправку и получаем данные об успешной отправке. Следующим шагом мы сохраняем фотографию в альбоме стены, это нужно для того, чтобы фотография получила свой индентификатор и могла быть опубликована на стене.

Следующим шагом модифицируем файлик vk_post.php следующим образом:

<?
include "vk.php";
$access_token = "ACCESS_TOKEN";
$user_id = "USER_ID";
$image_path = "IMAGE_PATH";

//Инициализируем класс
$vk = new Model_Vk($access_token);

//Загружаем изображение
$upload_img = $vk->uploadImage($image_path);

//Публикуем пост на стену
$params = array(
    "owner_id" => $user_id,
    "message" => "Hello world!",
    "attachments" => $upload_img
);
$post = $vk->method("wall.post", $params);

Помнима, что путь к файлу изображения должен быть абсолютным в вашей файловой системе, т.е. /var/www/img/post.jpg. При публикации на стену группы в ВКонтакте в функции указываем дополнительную переменную $user_id (ID должен быть без знака минус "-"), получиться такая запись:

$upload_img = $vk->uploadImage($image_path, $user_id);

А в параметрах публикации поста, указываем уже со знаком минус "-":

$params = array(
    "owner_id" => "-" . $user_id,
    "message" => "Hello world!",
    "attachments" => $upload_img
);

Запускаем файл через консоль и смотрим на стену пользователя.

$ php vk_post.php

Если вам понравилась статья, жмакните на рекламку ниже :)

P.Nixx, 02.12.2014, 11:58