Crossposting from VK to Mastodon
Go to file
2022-08-28 17:05:32 +03:00
data upd config example 2022-08-28 17:05:32 +03:00
.gitignore v0.3.0 2022-08-28 16:53:36 +03:00
Dockerfile v0.3.0 2022-08-28 16:53:36 +03:00
README.md v0.3.0 2022-08-28 16:53:36 +03:00
requirements.txt v0.3.0 2022-08-28 16:53:36 +03:00
vk_toot.py v0.3.0 2022-08-28 16:53:36 +03:00

VK-Toot

Кросспостинг из VK в Mastodon. Это приложение будет дублировать посты из паблика или публичной группы VK в аккаунт Mastodon.

Пример аккаунта бота: @jrokku@mas.to

Как это работает

Скрипт согласно заданному промежутку времени (см. ниже POLLING_TIME) ходит в API VK и забирает оттуда самый свежий пост, запоминает его ID в файл. Затем ходит в API Mastodon и создаёт новый пост, который содержит оригинальный текст поста, ссылку на оригинальный пост, ссылки на каждое вложение из оригинального поста.

Известные проблемы/TODO

  • Не учитывается длина поста. Если исходный пост не будет укладываться в лимит символов на инстансе Mastodon'а, то пост не опубликуется. Решение: надо обрезать текст поста в функции build_post(). Логика сложнее, чем кажется, поэтому я жду озарения.
  • Никак не обрабатываются вложения типов отличных от фото (photo) и фотоальбома (album). Надо добавить хотя бы video.
  • Указывать в списке вложений в посте только те вложения, которые не были загружены в Mastodon. Пока формируется полный список вложений.
  • Добавить поддержку group_id.
  • Добавить флаг SHOW_ATTACHMENTS_LIST для возможности скрытия списка вложений из текста.
  • Добавить mastodon.POST_CHAR_LIMIT для обрезки текста относительно лимита инстанса.

Настройки и запуск

API Mastodon

Для получения токена API Mastodon достаточно добавить приложение в своём профиле (Preferences -> Development). Из разрешений достаточно write для создания постов, ничего другого бридж делать не умеет.

API VK

Нужно добавить приложение на https://dev.vk.com. Будет получен APP_ID.

Для получения бессрочного токена перейти по ссылке следующего вида:

https://oauth.vk.com/authorize?client_id=12345678&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=offline&response_type=token&v=5.131

Здесь параметр client_id равняется APP_ID приложения, scope=offline задаёт нулевой (бесконечный) срок жизни токена.

При переходе по ссылке произойдёт редирект на страницу с подтверждением выдачи доступа приложению и далее редирект на страницу с предупреждением. Нас интересует значение query-параметра access_token в адресной строке.

Это всё также описано в документации к API.

Конфигуарация

Конфигурация задаётся в файле ./data/config.toml и разделена на три секции: mastodon, vk и bridge. Последний содержит параметры приложения, первые два реквизиты API. См. ./data/config.example.toml.

Mastodon (mastodon)

VK (vk)

  • API_URL: https://api.vk.com/method URL API VK.
  • API_VERSION: 5.131 Версия VK API.
  • API_ACCESS_TOKEN: Ключ API VK.
  • GROUP_DOMAIN: slug адрес группы/паблика VK. Пример: apiclub.

Настройки VK-Toot (bridge)

  • POLLING_TIME: 300 Задержка получения постов из VK в секундах.
  • REQUEST_DELAY: 1 Задержка загрузки медиа в Mastodon в секундах. Если Возникают ошибки 429 Too Many Requests, то следует увеличить эту цифру.

Запуск без Docker

Переименуйте config.example.toml в config.toml и отредактируйте его.

pip install -r requirements.txt
python vk_toot.py

Docker

Переименуйте config.example.toml в config.toml и отредактируйте его.

Сборка образа:

sudo docker build -t vk-toot:0.3.0 .

Запуск контейнера:

sudo docker run \
    --detach \
    --name vk-toot \
    --volume /opt/vk-toot/data:/opt/vk-toot/data \
    vk-toot:0.3.0

История изменений

0.3.0

  • BREAKING! Приложение переименовано в vk-toot.
  • BREAKING! Вместо переменных окружения теперь используется config.toml. Для изменения параметров больше не нужна пересборка контейнера.
  • Улучшено логирование.

0.2.1

  • Исправлена публиация постов. Mastodon API мог отвечать кодом 429 из-за слишком частых загрузок медиа. Решено через добавление задержки REQUEST_DELAY.
  • Исправлена ошибка при посте статуса с менее чем 4-я вложениями.
  • Файл ./data/last_post_id теперь содержит JSON и называется ./data/post_id.json. ID хранится в единственном поле post_id.
  • Имя модуля теперь не содержит дефисов.
  • Добавлено логирование. Лог пишется в STDOUT.

0.2.0

  • Реализована загрузка вложений в Mastodon (до 4-х штук). Только изображения.
  • Обновлён путь до приложения в Dockerfile.
  • Изменено место хранения файла last_post_id, теперь он в директории data/, откуда его можно удобно монтировать как Docker volume.

0.1.0

Initial release.