Всем привет! В этой статье расскажу свой путь по написанию bot-а(скрипта) для репоста постов из ВК на другие платформы.

Ознакомиться с проектом можете на Github, по ссылке.

Если кратко (цель проекта)

Index.php - при появлении новой записи на стене группы ВК - записывает их в БД

toTG.php\toFB.php\toOK.php - проверяют в БД наличие неопубликованных записей и если записи есть - публикуют их и делает отметку в БД.

Предыстория

Все началось лет 10 назад, когда студентом пытался на найти квартиру через VK. Но паблика недвижимости для моего города - не нашлось. Я подумал - это ниша и создал группу для поиска недвижимости. На текущий момент в группе около 10.000 подписчиков.

Прошло много времени, я начал работать в IT как QA, постиг много азов и решил, пора расширятся на другие платформы, но было лень (а лень двигатель прогресса) публиковать все новости в других соц.сетях и меседжерах вручную и я решил это немного автоматизировать. Что вышло - читайте ниже.

В этой статье мы рассмотрим пример для публикации записей из VK на различных платформах, таких как Telegram, Facebook и Одноклассники. Мы будем использовать Docker, официальные SDK и API.

Подготовка окружения

Подключаемся к серверу по SSH

Обновляем все на сервере

sudo apt update
sudo apt upgrade

Устанавливаем Docker

Установите необходимые пакеты для поддержки HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Добавляем официальный ключ Docker GPG:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Добавляем официальный репозиторий Docker:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновляем индексы пакетов еще раз:

sudo apt update

И наконец ставим Docker:

sudo apt install docker-ce docker-ce-cli containerd.io

Проверяем, что Docker успешно установлен, запустив простую команду:

sudo docker run hello-world

Устанавливаем Git

sudo apt install git

После завершения установки проверяем, что Git установлен правильно, выполнив команду:

git --version

Копируем проект к себе на сервер

Git clone git@github.com:Antoha-94/flat_polotsk_novopolotsk

Выполняем инструкцию из файла README.md

Краткая выдержка:

  1. Редактируем под себя файл .env(делаем его из примера: .env.example )

  2. Редактируем файлы конфига nginx

  3. Выполняем:

docker compose exec php bash
  1. Ставим в контейнере PHP - composer, выполнив

 composer install
  1. Билдуем контейнеры Docker

docker-compose up -d --build

Настраиваем соц.сети\меседжеры

Из файла config.example.ini делаем свой файл config.ini - это файл с подключениями к БД и нашими токенами от VK, Telegram, Facebook и odnoklassniki

Нам нужно настроить доступ к API каждой социальной сети\меседжера\БД. Для этого нам понадобится указать в файлике config.ini следующие данные:

  • [Database] - указываем подключения к БД

    • servername - ip по которому подключаемся в базе

    • username - имя пользователя

    • password - пароль

    • dbname - название БД

  • [VK] - переходим в настройки группы(управление) -> работа с API -> Callback API и заполняем инфу о сервере, секретный ключ и берем значение " Строка, которую должен вернуть сервер". Все записываем в config.ini файл.

    • confirmation_token: значение указанное в "Строка, которую должен вернуть сервер"

    • token: значение указанное в " Секретный ключ:"

    • post_type: в моем случае "post"

  • [Telegram] - создает своего бота через BotFather, добавляем его в канал(предполагается что он уже создан) telegram куда будем репостить посты из ВК. Вносим в config.ini следущее:

    • api_key: Ключ бота Telegram.

    • chat_id: Идентификатор чата или канала, куда мы будем отправлять сообщения.

  • [Facebook] - регистрируемся в кабинете разработчика Facebook: https://developers.facebook.com/async/registration и создаем приложение на странице: https://developers.facebook.com/apps

    В config.ini вносим:

    • app_id: Идентификатор приложения Facebook.

    • app_secret: Секретный ключ приложения Facebook.

    • page_id: Идентификатор страницы Facebook, на которую мы будем репостить записи.

    • user_access_token: Токен доступа пользователя с необходимыми разрешениями.

  • [OK] (Одноклассники) - создаем группу куда будем репостить посты из ВК. Регистрируемся в https://ok.ru/devaccess и создаем своем приложение (подробнее здесь: https://apiok.ru/dev/app/create)

    В config.ini вносим:

    • access_token: Вечный access_token в приложении

    • private_key: Закрытый ключ приложения.

    • public_key: Публичный ключ приложения.

    • session_key: Сессионный ключ в приложении.

    • group_id: Идентификатор группы Одноклассники, на которую мы будем репостить записи.

7. Размечаем таблицу fromvk в БД, выполнив в PHPmyAdmin SQL:

CREATE TABLE fromvk ( id int(11) NOT NULL, text text DEFAULT NULL, photo text DEFAULT NULL, signer_id text DEFAULT NULL, IsRepostToTelegram tinyint(1) NOT NULL DEFAULT 0, IsRepostToInstagram tinyint(1) NOT NULL DEFAULT 0, IsRepostToFacebook tinyint(1) NOT NULL DEFAULT 0, IsRepostToViber tinyint(1) DEFAULT 0, IsRepostToOK tinyint(1) DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Настраиваем расписание в Сrone

Открываем файл Crone c расписанием:

crontab -e

Настраиваем как часто будет происходить проверка в БД на наличие неперерепощеных записей в telegram, facebook, ok. Рекомендую ставить одинаковое расписание для всех 3 фалов. В примере ниже - проверка каждую минуту + логирование в файл cron.log

* * * * * cd /root/simple-docker-php-main && docker compose exec php php toTG.php >> /root/simple-docker-php-main/cron.log 2>&1
* * * * * cd /root/simple-docker-php-main && docker compose exec php php toFB.php >> /root/simple-docker-php-main/cron.log 2>&1
* * * * * cd /root/simple-docker-php-main && docker compose exec php php toOK.php >> /root/simple-docker-php-main/cron.log 2>&1

Тестируем, что все работает

  1. Публикуем запись в группе ВК.

  2. Ждем не более минуты, пока отработает расписание Crone

  3. Проверяем, что записи появились в соц.сетях\меседжерах

Жду ваших пул реквестов с улучшениями, код пока что сыроват, но работает! :-)

Комментарии (2)


  1. FanatPHP
    11.07.2023 12:44
    +4

    Традиционно, Хабр считается не очень подходящей площадкой для публикации сыроватого кода. Я даже не буду комментировать какие-то отдельные недостатки, там всё плохо.


    Кроме того, надо стараться писать о том, о чем собирались. Текст представляет собой инструкцию по установке, которой место в репозитории. А обещанный "рассказ о своем пути по написанию bot-а(скрипта)" фактически сводится к фразе "и я решил это немного автоматизировать".


  1. SiGGthror
    11.07.2023 12:44
    +1

    Я присоединюсь к коментатору выше, код не смотрел, но докерфайл с php, docker-compose и установка compose через docker run php bash несколько удручает.

    Один вопрос - зачем хранить все сообщение в БД если фактически нам надо хранить id записей которые мы уже репостнули?