2022-08-28 16:53:36 +03:00
|
|
|
|
# VK-Toot
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Кросспостинг из [VK](https://vk.com) в [Mastodon](https://joinmastodon.org/).
|
|
|
|
|
Это приложение будет дублировать посты из паблика или публичной группы VK в
|
|
|
|
|
аккаунт Mastodon.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
Пример аккаунта бота: [@jrokku@mas.to](https://mas.to/@jrokku)
|
|
|
|
|
|
|
|
|
|
## Как это работает
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Скрипт согласно заданному промежутку времени (см. ниже `POLLING_TIME`) ходит в
|
|
|
|
|
API VK и забирает оттуда самый свежий пост, запоминает его ID в файл. Затем
|
|
|
|
|
ходит в API Mastodon и создаёт новый пост, который содержит оригинальный текст
|
|
|
|
|
поста, ссылку на оригинальный пост, ссылки на каждое вложение из оригинального
|
|
|
|
|
поста.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
2022-06-10 19:47:04 +03:00
|
|
|
|
## Известные проблемы/TODO
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- Не учитывается длина поста. Если исходный пост не будет укладываться в
|
|
|
|
|
лимит символов на инстансе Mastodon'а, то пост не опубликуется. Решение:
|
|
|
|
|
надо обрезать текст поста в функции `build_post()`. Логика сложнее, чем
|
|
|
|
|
кажется, поэтому я жду озарения.
|
|
|
|
|
- Никак не обрабатываются вложения типов отличных от фото (`photo`) и
|
|
|
|
|
фотоальбома (`album`). Надо добавить хотя бы `video`.
|
|
|
|
|
- Указывать в списке вложений в посте только те вложения, которые не были
|
|
|
|
|
загружены в Mastodon. Пока формируется полный список вложений.
|
2022-07-07 19:46:34 +03:00
|
|
|
|
- Добавить поддержку `group_id`.
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- Добавить флаг `SHOW_ATTACHMENTS_LIST` для возможности скрытия списка
|
|
|
|
|
вложений из текста.
|
|
|
|
|
- Добавить `mastodon.POST_CHAR_LIMIT` для обрезки текста относительно лимита
|
|
|
|
|
инстанса.
|
2022-06-10 19:47:04 +03:00
|
|
|
|
|
2022-06-07 19:09:21 +03:00
|
|
|
|
## Настройки и запуск
|
|
|
|
|
|
|
|
|
|
### API Mastodon
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Для получения токена API Mastodon достаточно добавить приложение в своём
|
|
|
|
|
профиле (Preferences -> Development). Из разрешений достаточно `write` для
|
|
|
|
|
создания постов, ничего другого бридж делать не умеет.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Здесь параметр `client_id` равняется `APP_ID` приложения, `scope=offline`
|
|
|
|
|
задаёт нулевой (бесконечный) срок жизни токена.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
При переходе по ссылке произойдёт редирект на страницу с подтверждением
|
|
|
|
|
выдачи доступа приложению и далее редирект на страницу с предупреждением.
|
|
|
|
|
Нас интересует значение query-параметра `access_token` в адресной строке.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
Это всё также описано в [документации к API](https://dev.vk.com/api/access-token/implicit-flow-user).
|
|
|
|
|
|
2022-07-07 19:46:34 +03:00
|
|
|
|
### Конфигуарация
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Конфигурация задаётся в файле `./data/config.toml` и разделена на три секции:
|
|
|
|
|
`mastodon`, `vk` и `bridge`. Последний содержит параметры приложения, первые
|
|
|
|
|
два реквизиты API. См. `./data/config.example.toml`.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
#### 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, то следует увеличить эту цифру.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
### Запуск без Docker
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Переименуйте `config.example.toml` в `config.toml` и отредактируйте его.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
```
|
2022-06-10 19:47:04 +03:00
|
|
|
|
pip install -r requirements.txt
|
2022-08-28 16:53:36 +03:00
|
|
|
|
python vk_toot.py
|
2022-06-07 19:09:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Docker
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
Переименуйте `config.example.toml` в `config.toml` и отредактируйте его.
|
|
|
|
|
|
2022-06-07 19:09:21 +03:00
|
|
|
|
Сборка образа:
|
|
|
|
|
|
|
|
|
|
```
|
2022-08-28 16:53:36 +03:00
|
|
|
|
sudo docker build -t vk-toot:0.3.0 .
|
2022-06-07 19:09:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Запуск контейнера:
|
|
|
|
|
|
|
|
|
|
```
|
2022-08-28 16:53:36 +03:00
|
|
|
|
sudo docker run \
|
|
|
|
|
--detach \
|
|
|
|
|
--name vk-toot \
|
|
|
|
|
--volume /opt/vk-toot/data:/opt/vk-toot/data \
|
|
|
|
|
vk-toot:0.3.0
|
2022-06-07 19:09:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## История изменений
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
### 0.3.0
|
2022-07-07 19:46:34 +03:00
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- BREAKING! Приложение переименовано в vk-toot.
|
|
|
|
|
- BREAKING! Вместо переменных окружения теперь используется config.toml. Для
|
|
|
|
|
изменения параметров больше не нужна пересборка контейнера.
|
|
|
|
|
- Улучшено логирование.
|
2022-07-07 19:46:34 +03:00
|
|
|
|
|
2022-07-07 09:01:14 +03:00
|
|
|
|
### 0.2.1
|
|
|
|
|
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- Исправлена публиация постов. Mastodon API мог отвечать кодом 429 из-за
|
|
|
|
|
слишком частых загрузок медиа. Решено через добавление задержки
|
|
|
|
|
`REQUEST_DELAY`.
|
2022-07-07 09:01:14 +03:00
|
|
|
|
- Исправлена ошибка при посте статуса с менее чем 4-я вложениями.
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- Файл `./data/last_post_id` теперь содержит JSON и называется
|
|
|
|
|
`./data/post_id.json`. ID хранится в единственном поле `post_id`.
|
2022-07-07 09:01:14 +03:00
|
|
|
|
- Имя модуля теперь не содержит дефисов.
|
|
|
|
|
- Добавлено логирование. Лог пишется в STDOUT.
|
|
|
|
|
|
2022-06-07 19:09:21 +03:00
|
|
|
|
### 0.2.0
|
|
|
|
|
|
|
|
|
|
- Реализована загрузка вложений в Mastodon (до 4-х штук). Только изображения.
|
|
|
|
|
- Обновлён путь до приложения в Dockerfile.
|
2022-08-28 16:53:36 +03:00
|
|
|
|
- Изменено место хранения файла `last_post_id`, теперь он в директории
|
|
|
|
|
`data/`, откуда его можно удобно монтировать как Docker volume.
|
2022-06-07 19:09:21 +03:00
|
|
|
|
|
|
|
|
|
### 0.1.0
|
|
|
|
|
|
|
|
|
|
Initial release.
|