diff --git a/.env.example b/.env.example deleted file mode 100644 index 3bc729d..0000000 --- a/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -export MASTODON_API_URL='https://mastodon.social/api/v1' -export MASTODON_API_ACCESS_TOKEN='your access token here' -export VK_API_URL='https://api.vk.com/method' -export VK_API_VERSION='5.131' -export VK_API_ACCESS_TOKEN='your access token here' -export VK_GROUP_DOMAIN='apiclub' diff --git a/.gitignore b/.gitignore index 4c49bd7..7332770 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env +config.ini +post_id.json diff --git a/Dockerfile b/Dockerfile index a2704d5..bcb693b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:latest RUN apk update && apk add python3 py3-pip -RUN mkdir -p /opt/vk-mastodon-bridge/data +RUN mkdir -p /opt/vk-mastodon-bridge ADD . /opt/vk-mastodon-bridge WORKDIR /opt/vk-mastodon-bridge RUN pip install --upgrade pip && pip install --requirement requirements.txt -CMD source .env; python3 vk_mastodon_bridge.py +CMD python3 vk_mastodon_bridge.py diff --git a/README.md b/README.md index 64c7ef9..1e88d70 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@ ## Известные проблемы/TODO - Не учитывается длина поста. Если исходный пост не будет укладываться в лимит символов на инстансе Mastodon'а, то неизвестно что произойдёт. Решение: надо обрезать текст поста в функции `build_post()`. -- Никак не обрабатываются вложения типов отличных от фото (`photo`) и фотоальбома (`album`). +- Никак не обрабатываются вложения типов отличных от фото (`photo`) и фотоальбома (`album`). Надо добавить хотя бы `video`. - Указывать в списке вложений в посте только те вложения, которые не были загружены в Mastodon. Пока формируется полный список вложений. -- Использовать конфиг вместо переменных окружения? +- Добавить поддержку `group_id`. ## Настройки и запуск @@ -35,28 +35,27 @@ Это всё также описано в [документации к API](https://dev.vk.com/api/access-token/implicit-flow-user). -### Переменные окружения +### Конфигуарация -Нужно задать все переменные окружения. Удобный способ — в файле `.env` и экспортировать в шэлл. +Конфигурация задаётся в файле `./data/config.ini` и разделена на три секции: `mastodon`, `vk` и `bridge`. Последний содержит параметры приложения, первые два реквизиты API. См. `./data/config.example.ini`. -| Переменная окружения | Умолчание | Пример | Описание | -| ----------------------------- | --------- |---------------------------------- | ---------------------------------------------- | -| `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 в секундах. | +| Секция | Переменная | Умолчание | Пример | Описание | +| --------- | --------------------- | --------- |---------------------------------- | ---------------------------------------------- | +| 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. | +| bridge | `POLLING_TIME` | 300 | 300 | Задержка получением постов из VK в секундах. | +| bridge | `REQUEST_DELAY` | 1 | 1 | Задержка загрузки медиа в Mastodon в секундах. | ### Запуск без Docker -Переименуйте `.env.example` в `.env` и отредактируйте значения в нём. +Переименуйте `config.example.ini` в `config.ini` и отредактируйте значения в нём. ``` pip install -r requirements.txt -source .env python vk-mastodon-bridge.py ``` @@ -79,6 +78,10 @@ sudo docker run --detach \ ## История изменений +### Next + +- Переменные окружения заменены на config.ini. + ### 0.2.1 - Исправлена публиация постов. Mastodon API мог отвечать кодом 429 из-за слишком частых загрузок медиа. Решено через добавление задержки `REQUEST_DELAY`. diff --git a/data/config.example.ini b/data/config.example.ini new file mode 100644 index 0000000..9e801c0 --- /dev/null +++ b/data/config.example.ini @@ -0,0 +1,13 @@ +[mastodon] +API_URL = https://mastodon.social/api/v1 +API_ACCESS_TOKEN = your_access_token_here + +[vk] +API_URL = https://api.vk.com/method +API_VERSION = 5.131 +API_ACCESS_TOKEN = your_access_token_here +GROUP_DOMAIN = apiclub + +[bridge] +POLLING_TIME = 300 +REQUEST_DELAY = 1 diff --git a/vk_mastodon_bridge.py b/vk_mastodon_bridge.py index aa74ce5..932aecb 100644 --- a/vk_mastodon_bridge.py +++ b/vk_mastodon_bridge.py @@ -8,16 +8,20 @@ import datetime import logging import shutil import urllib.parse +import configparser import requests -MASTODON_API_URL = os.environ['MASTODON_API_URL'] -MASTODON_API_ACCESS_TOKEN = os.environ['MASTODON_API_ACCESS_TOKEN'] -VK_API_URL = os.environ['VK_API_URL'] -VK_API_VERSION = os.environ['VK_API_VERSION'] -VK_API_ACCESS_TOKEN = os.environ['VK_API_ACCESS_TOKEN'] -VK_GROUP_DOMAIN = os.environ['VK_GROUP_DOMAIN'] +config = configparser.ConfigParser() +config.read('./data/config.ini') + +MASTODON_API_URL = config['mastodon']['API_URL'] +MASTODON_API_ACCESS_TOKEN = config['mastodon']['API_ACCESS_TOKEN'] +VK_API_URL = config['vk']['API_URL'] +VK_API_VERSION = config['vk']['API_VERSION'] +VK_API_ACCESS_TOKEN = config['vk']['API_ACCESS_TOKEN'] +VK_GROUP_DOMAIN = config['vk']['GROUP_DOMAIN'] # Set up logger logger = logging.getLogger('vk_mastodon_bridge') @@ -107,7 +111,7 @@ def post_media(file: str) -> str: + str(response.status_code) + ' ' + str(response.text)) # Sleep some seconds to prevent HTTP 429 response. try: - request_delay = int(os.environ['REQUEST_DELAY']) + request_delay = int(config['bridge']['REQUEST_DELAY']) except (KeyError, TypeError): request_delay = 1 time.sleep(request_delay) @@ -203,7 +207,7 @@ def poll(): touch_lock_file(lock_file, post_id) prev_post_id = read_lock_file(lock_file) try: - poll_time = int(os.environ['POLLING_TIME']) + poll_time = int(config['bridge']['POLLING_TIME']) except (KeyError, TypeError): poll_time = 300