Занимаемся автоматизацией ведения паблика ВКонтакте

Здравствуйте. Меня зовут Максим. Я PHP backend разработчик. Одним из моих самых сокровенных желаний всегда было создать паблик ВКонтакте. Я видел, сколько времени на это уходило у моих друзей и знакомых. Подготовка постов, планирование записей убивали кучу и маленькую тележку свободного времени, которое можно было потратить на что-то более полезное или приятное (или и то и то).


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


Для начала нам понадобится:


  1. VDS сервер. Сейчас они стоят буквально копейки.
  2. Знание PHP. А куда же без него?
  3. Прямые руки. Без них вообще никуда.

И так, первым делом нам необходимо получить токен, который мы будем использовать при вызове методов API ВКонтакте. Для этого переходим в раздел ВКонтакте для разработчиков. В верхнем меню выбираем пункт «Мои приложения».


Нажимаем на кнопку «Создать приложение».


image


Имя можем поставить любое, которое вам понравится. Платформу выбираем «Standalone-приложение». Нажимаем «Подключить приложение».


Следующим шагом нам необходимо получить, собственно, сам токен.


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


https://oauth.vk.com/authorize?client_id=<id_созданного_приложения_(вкладка_настройки_в_приложении)>&scope=photo,wall,offline&redirect_uri=https://oauth.vk.com/blank.html&response_type=token

Можно в параметр «scope» добавить offline. По факту, токен будет жить вечно (ну или до изменения пароля от аккаунта ВКонтакте).


После того, как Вы выполните данный запрос, в адресной строке увидите параметр «access_token», который нам и нужен. Сохраните его и пока далеко не убирайте.


Теперь пришло время, наконец-таки, заняться построением системы. Писать все это дело мы будем на Symfony 4.


Устанавливаем symfony в текущую папку.


composer create-project symfony/skeleton .

Так же установим maker-bundle, который позволит генерировать консольные команды в «один клик».


composer require symfony/maker-bundle --dev

И установим официальный PHP SDK от ВКонаткте.


composer require vkcom/vk-php-sdk

Теперь сгенерируем первую консольную команду.


php bin/console make:command

У нас спросят, как мы ее хотим назвать? Можно назвать ее просто «app:vk-post».


image


Отлично, теперь у нас есть готовая консольная команда.


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


image


Возвращаемся к нашей консольной команде. Первым делом нам необходимо очистить код, убрав из него все лишнее. Например, аргументы командной строки.


<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class TestCommand extends Command
{
    protected static $defaultName = 'app:test';

    protected function configure()
    {
        $this
            ->setDescription('VK Automation')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);

        // здесь будем писать код.

        $io->success('Success!');
    }
}

Импортируем VK PHP SDK.


$vk = new VK\Client\VKApiClient();

Внутри метода execute() начинаем писать рабочий код.


// В конструктор передаем версию API VK
$vk = new VKApiClient('5.73');

А теперь вспоминаем про наш закрытый альбом. Он нужен для того, чтобы хранить в нем все изображения, которые мы будем постить на стену. Поэтому предварительно добавьте 10-15 изображений в закрытый альбом. У меня, например, паблик цитатник, соответственно наполнять альбом буду изображениями с цитатами.


API Вконакте позволяем получить список всех изображений из Вашего альбома посредством вызова метода photos.get, с двумя параметрами:


  1. owner_id — id вашей страницы.
  2. album_id — id закрытого альбома.

ID альбома можно получить перейдя в него: https://vk.com/album196**5146_260977**. Последние цифры, после знака подчеркивания и будут являться id альбома.


Теперь пишем код, который позволил бы получить список всех фотографий из альбома.


$photos = $vk->photos()->get($access_token, [
                'owner_id' => '196******',
                'album_id' => '26097****'
            ]);

В переменной $access_token лежит наш токен, который я просил вас далеко не убирать.


Метод вернет массив всех фотографий из вашего закрытого альбома. Формат возвращаемых данных в JSON может быть таким.


{
    "response": {
        "count": 8,
        "items": [
            {
                "id": 456258500,
                "album_id": 26097****,
                "owner_id": 1967****,
                "photo_75": "https://pp.userapi.com/c849528/v849528304/df4d6/v6csVqSA3uU.jpg",
                "photo_130": "https://pp.userapi.com/c849528/v849528304/df4d7/eb6_DbdeU8M.jpg",
                "photo_604": "https://pp.userapi.com/c849528/v849528304/df4d8/4BkYfRNmWwE.jpg",
                "photo_807": "https://pp.userapi.com/c849528/v849528304/df4d9/P2zc6j04xt4.jpg",
                "width": 806,
                "height": 730,
                "text": "",
                "date": 1546514839
            },
            {
                "id": 456258501,
                "album_id": 26097****,
                "owner_id": 19675****,
                "photo_75": "https://pp.userapi.com/c845323/v845323304/16887a/1XWNUVIUX4s.jpg",
                "photo_130": "https://pp.userapi.com/c845323/v845323304/16887b/6O8lVeX0x0k.jpg",
                "photo_604": "https://pp.userapi.com/c845323/v845323304/16887c/7Evr6J_eLGM.jpg",
                "photo_807": "https://pp.userapi.com/c845323/v845323304/16887d/5EMMMPmj37Y.jpg",
                "width": 800,
                "height": 533,
                "text": "",
                "date": 1546514843
            },
    ]
}

Внутри массива items будут лежать все наши фотографии.


Отлично, фотографии мы получили, а что дальше? Теперь их необходимо запостить на стену паблика.


Это делается при помощи вызова метода wall.post.


$vk->wall()->post($access_token, [
                'owner_id' => '-7188****', // id вашего паблика
                'attachments' => "photo19675****_" . $photos['items'][mt_rand(0, $photos['count']-1)]['id'], // photo<id_аккаунта>_<id_фотографии>
            ]);

id паблика получить тоже не сложно. Просто добавьте аватарку и откройте ее: https://vk.com/********?z=photo-**718825485**_456239371%2Falbum-7188****_0%2Frev. ID выделил жирным.


Поле attachmnet должно иметь особый формат.


В нашем примере, я выбираю рандомное фото из закрытого альбома и прикрепляю его к посту.


Итоговый код будет выглядеть так:


<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class VkPostCommand extends Command
{
    protected static $defaultName = 'app:vk-post';

    protected function configure()
    {
        $this
            ->setDescription('VK Automation')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);

        $access_token = 'yourAccessToken';

        $vk = new VKApiClient('5.73');

        $photos = $vk->photos()->get($access_token, [
            'owner_id' => '19675****',
            'album_id' => '26097****'
        ]);

        $response = $vk->wall()->post($access_token, [
            'owner_id' => '-7188****',
            'attachments' => "photo19675****_" . $photos['items'][mt_rand(0, $photos['count']-1)]['id'],
        ]);

        $io->success('Success.');
    }
}

После того, как выполним код в консоли.


php bin/console app:vk-post

Мы увидим, как в наш паблик была опубликована картинка на стену.


Можно усовершенствовать систему и добавить возможность случайного выбора типа поста, картинка или текст. Но откуда брать цитаты? Я нашел как минимум 2 открытых API. Наверняка и вы сможете найти источник данных под свои нужды.


Теперь нам необходимо задеплоить код на наш VDS сервер, установить фреймворк через composer и настроить выполнение команды по крону.


Выполните эту команду на Вашем сервере:


crontab -e

Вас попросят выбрать редактор, я предпочитаю nano.


Откроется файл. Добавьте в его конец:


*/45 * * * * /путь/до/вашего/кода bin/console app:vk-post


Теперь осталось наблюдать и наслаждаться проделанной работой.


Почему я использовал закрытый альбом? Метод wall.post требует, чтобы изображение было предварительно загружено на сервера ВКонтакте. Это лишний код, который можно избежать созданием закрытого альбома и наполнением его вручную.


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


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


Экспериментируйте и удачи вам!

Поделиться публикацией

Комментарии 16

    +5
    созданием закрытого альбома и наполнением его вручную

    Чем это принципиально отличается от создания отложенных записей на стене?


    можно добавить несколько источников данных для постов
    паблик сможет существовать абсолютно самостоятельно

    И в итоге получается ещё один ненужный паблик, на сто процентов состоящий из ворованных мемасиков?

      0

      Тоже не понял что там автоматизировать

        –2

        Спасибо за Ваш комментарий. Чем это отличается от наполнения отложек? Тем, что мы можем сесть, один раз заполнить этот альбом, например, 10000 изображениями, и забыть о нем вообще. А по поводу самого контента. Никто не говорит, что эти картинки нужно воровать. Это могут быть и ваши авторские. Я привел лишь для примера.

          0
          получается ещё один ненужный паблик, на сто процентов состоящий из ворованных мемасиков?

          Справедливости ради, такой «автоматический паблик» сможет сам забирать информацию из других ваших источников, например канала в тытрубе, твиттера, фэйсбука… твича или стима. То есть достаточно вам опубликовать своё «творчество» только на одном ресурсе, вместо двух. Ещё он может быть агрегатором информации по какой-то теме и т.п.

          То есть да, в большинстве случаев это всё стопудово «переукрал у переукравшего», но это не значит, что это не нужно и не пригодится, и настоящим творцам.
            +1

            Согласен с Вами. Это лишь инструмент. Все зависит от того, как им будут пользоваться.

            0
            Хорошие вопросы. Я не автор поста, но у меня есть примерно такой же паблик, который автомагически, раз в час постит аудиорассказы из серии Модели Для Сборки

            Отложенные записи — это полуавтоматизация, то есть, сейчас мы потратим 3 часа времени и потом неделю ничего не будем делать. В моем случае, это было лишним, потому что у меня уже есть сервер (и прикрученное к нему Android приложение), который хранит в себе 1400 рассказов с нормальной мета-инфой, возможностью стримить аудиодорожку, создавать закладки и прочее

            Поэтому, я просто прикрутил к нему эндпоинт, отдающий случайный рассказ и рядом написал маленькое java приложение, которое дергает за этот эндпоинт, а скачанный контент заливает на стенку ВК. В итоге, получился паблик, где раз в час стабильно подливается новый рассказ, а я за всем этим делом совершенно не слежу уже почти год. Отложенными постами такого не добьешься

            P.S. По поводу уникальности, вы правы, контент на 100% не авторский. Что не помешало мне спросить у Дмитрия Миксира (парень, который занимается интернет-движухой в МДС-коллективе) разрешения и выяснить, что никто не против

            P.P.S я когда-то писал об этом, но для хабра контент получился слабоват и я закинул пост к себе в уютный бложек
            +6

            Пхп бэкэнд… Обсуждение пабликов вк…
            Верните мне мой 2007 ))

              0
              .
                –5
                Сокровенное желание? Да что ты вообще знаешь о сокровенных желаниях, мальчик? У тебя небось и друзья из разряда «у меня вконтакте сто друзей!!1», само слово обесценили. И это на хабре, тьфу…
                  +3
                  Публикация не о «сокровенном желании». Публикация о том, как можно автоматизировать ведение паблика. Для некоторых это может быть интересной темой, многие на этом зарабатывают на хлеб с маслом.
                    –7
                    Многие и на сером SEO на хлеб с икрой зарабатывают, что не отменяет порицания таких людей. А публикация — детский сад, штаны на лямках, из серии «как помигать светодиодом на ардуино».
                      +5
                      Даже для того, чтобы помигать светодиодом нужны определенные знания и навыки. Совсем не грех делиться и такими знаниями. Не стоит быть столь категоричным и грубым.
                  +1

                  А почему нельзя просто обычный файл дергать через крон, зачем симфони?


                  И загрузка файлов в ВК — дело максимум 10 строк кода, берём по апишке откуда то и заливаем, и не надо руками загружать из с закрытый альбом.

                    0
                    Спасибо за конструктивную критику. Вы правы, можно и обычный PHP файл, но фреймворк стоит взять на перспективу, наверняка в будущем появится работа с БД, или нужно будет подключить библиотеку для работы с чьим-нибудь API. На основе фреймворка это будет сделать проще и быстрее. А по поводу второй части Вашего комментария. Действительно, кода будет не много. Но эти картинки нужно откуда-то брать. Если будут лежать на сервере, будут захламлять диск, а если грузить откуда-то, то такое место ещё нужно найти, при том не нарушив ничьих авторских прав, если картинки не Ваши. По мне, загрузить фото в закрытый альбом себе — будет проще. Но каждый решает сам.
                      0
                      в чем проблема композером подключить ОРМку или либу от АПИ без использования фреймворка? Не вижу смысла разворачивать такого монстра если это не интерпрайз
                        0

                        Спасибо за Ваш комментарий. Последний Symfony 4 крайне легковесен. Поэтому выбрал его.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое