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

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

Меня зовут Максим. Здравствуйте. Одним из моих самых сокровенных желаний всегда было создать паблик ВКонтакте. Я 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 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 альбома. ID альбома можно получить перейдя в него: https://vk.com/album196**5146_260977**.

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

$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_фотографии> ]);

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

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

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

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Внедряйте статический анализ в процесс, а не ищите с его помощью баги

Написать эту статью меня сподвигло большое количество материалов о статическом анализе, всё чаще попадающихся на глаза. Во-первых, это блог PVS-studio, который активно продвигает себя на Хабре при помощи обзоров ошибок, найденных их инструментом в проектах с открытым кодом. Недавно PVS-studio ...

[Перевод] Как рендерится кадр Rise of the Tomb Raider

Rise of the Tomb Raider (2015 год) — это сиквел превосходного перезапуска Tomb Raider (2013 год). Лично я нахожу обе части интересными, потому что они отошли от стагнирующей оригинальной серии и рассказали историю Лары заново. В этой игре, как и ...