This repository has been archived on 2022-08-28. You can view files and clone it, but cannot push or open issues or pull requests.
vk-mastodon-bridge/README.md
2022-08-28 17:50:50 +03:00

103 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

!ВНИМАНИЕ! **Этот репозиторий больше не будет обновляться**. Дальше проект будет развиваться под названием **[vk-toot](/ge/vk-toot)**.
---
# vk-mastodon-bridge
Бридж для кросспостинга из [VK](https://vk.com) в [Mastodon](https://joinmastodon.org/). Это приложение будет дублировать посты из паблика или публичной группы VK в аккаунт Mastodon.
Пример аккаунта бота: [@jrokku@mas.to](https://mas.to/@jrokku)
## Как это работает
Скрипт согласно заданному промежутку времени (см. ниже `POLLING_TIME`) ходит в API VK и забирает оттуда самый свежий пост, запоминает его ID в файл. Затем ходит в API Mastodon и создаёт новый пост, который содержит оригинальный текст поста, ссылку на оригинальный пост, ссылки на каждое вложение из оригинального поста.
## Известные проблемы/TODO
- Не учитывается длина поста. Если исходный пост не будет укладываться в лимит символов на инстансе Mastodon'а, то неизвестно что произойдёт. Решение: надо обрезать текст поста в функции `build_post()`.
- Никак не обрабатываются вложения типов отличных от фото (`photo`) и фотоальбома (`album`).
- Указывать в списке вложений в посте только те вложения, которые не были загружены в Mastodon. Пока формируется полный список вложений.
- Использовать конфиг вместо переменных окружения?
## Настройки и запуск
### 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](https://dev.vk.com/api/access-token/implicit-flow-user).
### Переменные окружения
Нужно задать все переменные окружения. Удобный способ — в файле `.env` и экспортировать в шэлл.
| Переменная окружения | Умолчание | Пример | Описание |
| ----------------------------- | --------- |---------------------------------- | ---------------------------------------------- |
| `MASTODON_API_URL` | нет | https://mastodon.social/api/v1 | URL адрес API Mastodon. |
| `MASTODON_API_ACCESS_TOKEN` | нет | | Ключ API Mastodon. |
| `VK_API_URL` | нет | https://api.vk.com/method | URL API VK. |
| `VK_API_VERSION` | нет | 5.131 | Версия VK API. |
| `VK_API_ACCESS_TOKEN` | нет | | Ключ API VK. |
| `VK_GROUP_DOMAIN` | нет | apiclub | slug адрес группы/паблика VK. |
| `POLLING_TIME` | 300 | 300 | Задержка получением постов из VK в секундах. |
| `REQUEST_DELAY` | 1 | 1 | Задержка загрузки медиа в Mastodon в секундах. |
### Запуск без Docker
Переименуйте `.env.example` в `.env` и отредактируйте значения в нём.
```
pip install -r requirements.txt
source .env
python vk-mastodon-bridge.py
```
### Docker
Сборка образа:
```
sudo docker build -t vk-mastodon-bridge:0.2.1 .
```
Запуск контейнера:
```
sudo docker run --detach \
--name vk-mastodon-bridge \
--volume /opt/vk-mastodon-bridge/data:/opt/vk-mastodon-bridge/data \
vk-mastodon-bridge:0.2.1
```
## История изменений
### 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.