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

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

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

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


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

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

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

image

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

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

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

https://oauth.vk.com/authorize?client_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

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

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

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

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

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

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 требует, чтобы изображение было предварительно загружено на сервера ВКонтакте. Это лишний код, который можно избежать созданием закрытого альбома и наполнением его вручную.

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

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

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

© Habrahabr.ru