vk-toot/README.md
2022-08-28 16:53:36 +03:00

141 lines
6.8 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
Кросспостинг из [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`). Надо добавить хотя бы `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](https://dev.vk.com/api/access-token/implicit-flow-user).
### Конфигуарация
Конфигурация задаётся в файле `./data/config.toml` и разделена на три секции:
`mastodon`, `vk` и `bridge`. Последний содержит параметры приложения, первые
два реквизиты API. См. `./data/config.example.toml`.
#### Mastodon (`mastodon`)
* `API_URL`: URL адрес API Mastodon. Пример: **https://mastodon.social/api/v1**
* `API_ACCESS_TOKEN`: Ключ API 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.