[Из песочницы] Занимаемся автоматизацией ведения паблика ВКонтакте
Здравствуйте. Меня зовут Максим. Я PHP backend разработчик. Одним из моих самых сокровенных желаний всегда было создать паблик ВКонтакте. Я видел, сколько времени на это уходило у моих друзей и знакомых. Подготовка постов, планирование записей убивали кучу и маленькую тележку свободного времени, которое можно было потратить на что-то более полезное или приятное (или и то и то).
Вопрос, а для чего вообще нужен паблик предлагаю оставить за бортом, у всех на это разные причины. Ну, а мы приступим к сути этого поста.
Для начала нам понадобится:
- VDS сервер. Сейчас они стоят буквально копейки.
- Знание PHP. А куда же без него?
- Прямые руки. Без них вообще никуда.
И так, первым делом нам необходимо получить токен, который мы будем использовать при вызове методов API ВКонтакте. Для этого переходим в раздел ВКонтакте для разработчиков. В верхнем меню выбираем пункт «Мои приложения».
Нажимаем на кнопку «Создать приложение».
Имя можем поставить любое, которое вам понравится. Платформу выбираем «Standalone-приложение». Нажимаем «Подключить приложение».
Следующим шагом нам необходимо получить, собственно, сам токен.
Для этого скопируйте в адресную строку браузера следующую ссылку, предварительно заполнив данными.
https://oauth.vk.com/authorize?client_id=
Можно в параметр «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».
Отлично, теперь у нас есть готовая консольная команда.
Следующим шагом необходимо создать закрытый альбом у себя в аккаунте ВКонтакте. Для чего это нужно — расскажу ближе к концу поста.
Возвращаемся к нашей консольной команде. Первым делом нам необходимо очистить код, убрав из него все лишнее. Например, аргументы командной строки.
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, с двумя параметрами:
- owner_id — id вашей страницы.
- 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 требует, чтобы изображение было предварительно загружено на сервера ВКонтакте. Это лишний код, который можно избежать созданием закрытого альбома и наполнением его вручную.
Отныне ваш паблик сможет существовать абсолютно самостоятельно, а вам останется думать лишь о его продвижении.
Здесь есть куда разыграться фантазии. Например, можно добавить несколько источников данных для постов, или настроить автоматизацию для нескольких пабликов. Так же стоит вынести токен в отдельное место.
Экспериментируйте и удачи вам!