Мобильная
версия

Автоматический постинг на стену VK (с фото)

Дата: Категория: PHP

У меня есть своя группа вконтакте, и в тот момент когда информации для публикации стало много, а времени на это дело мало, я решил как то оптимизировать и автоматизировать процесс.
У vk есть отличное api, изучив которое я понял что можно будет сделать абсолютно все, и недолго думая, я приступил к написанию автоматической публикации постов.


Для начала я решил сделать удобный класс для работы с api

Для особо нетерпеливых - github

Тут, думаю, не требуются какие либо описания - все предельно просто и ясно

class vk {
    private $token;
    private $count = -1;
    private static $class = null;

    public static function create($token){
        if(!self::$class){
            self::$class = new vk($token);
        }
        return self::$class;
    }

// синглтон
    private function __clone(){}
    private function __construct($token){
        $this->token = $token;
    }

    function get($method, array $data){
// ограничение контакта - не больше 3х запросов в секунду
        $this->count ++;
        if($this->count >= 3){
            $this->count = 0;
            sleep(1);
        }
        $params = array();
        foreach($data as $name => $val){
            $params[$name] = $val;
            $params['access_token'] = $this->token;
        }
        $json = file_get_contents('https://api.vk.com/method/' . $method . '?' . http_build_query($params));
        return json_decode($json);
    }
}

Так как контакт разрешает не больше 3х запросов к api в секунду я сделал в методе get проверку, а для того чтобы во всех частях кода был один экземпляр класса я сделал класс vk синглтоном (самый простой паттерн)

Следующий класс я не буду выкладывать здесь - он слишком большой, но с ним можно ознакомиться на github

Он определяет куда именно нужно постить и последовательно вызывает следующие методы.

  1. photos.getWallUploadServer - определяет сервер для загрузки фотографий
  2. photos.saveWallPhoto - загружает фотографии. После этого у нас есть ссылки на них вида "photo_([0-9]+)"
  3. wall.post - собственно сам постинг на стену.

Пример использования лежит в файле index.php, и думаю по нему вы сможете сами написать необходимые вам циклы для автоматического постинга.

Теперь немного рекомендаций по работе, и пара инструкций.

Получение токена.

Для того чтобы получить долгоиграющий токен с возможностью редактирования стены, вам нужно создать Standalone-приложение

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

С другими работать НЕ БУДЕТ!

И еще пара советов

  • Максимально можно для одной группы / пользователя 50 постов в сутки.
  • Чаще чем раз в 5 минут постить не рекомендуется - может последовать бан.
  • Фотографии в скрипте указывайте абсолютными ссылками (http://.....)

Ну вот пожалуй и все то, чем я хотел с вами поделиться.
Спасибо за внимание.

И напоследок еще раз ссылка на github

Теги: #cURL, #работа с файлами, #vk, #вконтакте, #API

Ваша оценка:

Рейтинг: 9.9 (Оценок: 18)

Комментарии (89):

Zoidberg
2017-07-10 16:00
Не грузиться картинка
Если у кого стоит php 5.6 (или выше) и не загружаются картинки: post.php ~60 строка,
заменить путь до файла: 'photo' => '@' . $name
на 'photo' => new \CURLFile('/'. $name)

это поменял не помогло
qweqwe
2017-03-24 14:04
Целый день мучился с апи, пока не нашел эту статью. Спасибо
picburg
2016-12-08 22:38
Error: Captcha needed

что за ошибка и как исправить?
Handimada.Ru
2016-11-30 17:10
Спасибо за скрипт. Всё работает. С небольшими поправками на время:

- Получение токена - https://oauth.vk.com/authorize?client_id=##########&scope=notify,photos,friends,audio,video,notes,pages,docs,status,questions,offers,wall,groups,messages,notifications,stats,ads,offline&redirect_uri=http://api.vk.com/blank.html&display=page&response_type=token

- Если у кого стоит php 5.6 (или выше) и не загружаются картинки: post.php ~60 строка,
заменить путь до файла: 'photo' => '@' . $name
на 'photo' => new \CURLFile('/'. $name)

- И текст должен поститься в юникоде.

Еще раз спасибо, самое простое вхождение в API из десятка которые делал ранее.
vita
2016-08-07 18:28
Автору спасибо. Кто нить пытался решить вопрос по загрузке несколько фоток? подскажите.
Denis
2017-05-18 11:19
@vita:Для мультипостинга нужно передавать массив ссылок на фотки и модернизировать чутка код.
index.php:
$image = array(
    'http://site.ru/img1.jpg',
    'http://site.ru/img2.png'
);

post.php:
Найти:
    function post($text, $img = null){
        if($img) {
            $data = $this->load($img);
            $img = $data->response[0]->id;
        }

Заменить на:
    function post($text, $img = null){
        if($img) {
            if(is_array($img)){
                $imgAr = array();
                foreach ($img as $src){
                    $data = $this->load($src);
                    $imgAr[] = $data->response[0]->id;
                }

                $img = implode(",", $imgAr);
            }
            else {
                $data = $this->load($img);
                $img = $data->response[0]->id;
            }
        }
Виталий
2016-05-17 07:02
ПОМОГИТЕ!
Автору огромный респект за скрипт! Все работает как надо.
Только вот не могу разобраться как сделать так что бы можно было загружать сразу несколько изображений?
Мне нужно реализовать загрузку 3-х изображений, переменные....
$image
$image2
$image3
Adrenal
2016-05-08 00:55
Если у кого стоит php 5.6 и не загружаются картинки:
post.php ~60 строка,
заменить путь до файла: 'photo' => '@' . $name
на 'photo' => new \CURLFile('/'. $name)
robot
2016-04-17 13:57
спасибо большое за ваш труд! перепробовал десяток вариантов, но заработал только ваш. код лёгкий, а значит доработка будет не сложной. не сразу запустил, т.к. были проблемы... не грузило картинку. в общем был недостаток прав (photo).

палю, как получить права:

https://oauth.vk.com/authorize?client_id=ИД ПРИЛОЖЕНИЯ&scope=offline,wall,groups,photos&redirect_uri=http://api.vkontakte.ru/blank.html&response_type=code
https://oauth.vk.com/access_token?client_id=ИД ПРИЛОЖЕНИЯ&client_secret=ЗАЩИЩЕННЫЙ КЛЮЧ ПРИЛОЖЕНИЯ&code=ОТВЕТ НА ПЕРВЫЙ ЭТАП&redirect_uri=http://api.vkontakte.ru/blank.html
marat18
2016-02-29 17:30
Народ, чтобы публиковать от имени сообщества в post.php в funtion post после "if($this->owner['type'] == 'group_id'){
            $data['owner_id'] = '-' . $data['owner_id'];
        }" пропишите такой параметр "$data['from_group'] = 1;"
marat18
2016-02-29 16:51
Дружище, тут уже спрашивали, но я что-то ответа не нашел. Та же трабла: текст записывается, но картинки нет.
И еще вопрос. Как от имени группы публиковать? Спасибо за работу)
marat18
2016-02-29 16:55
@marat18:А пардон, картинка грузится, прошу прощения, не было файла 1.png.
Еще раз спасибо)

Комментарий:

Copyright © DOC_tr 2015-2017 г. Все права защищены
Яндекс.Метрика
Перейти к мобильной версии