feat: Replace shell env with config.ini
This commit is contained in:
		@@ -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'
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +1,2 @@
 | 
			
		||||
.env
 | 
			
		||||
config.ini
 | 
			
		||||
post_id.json
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								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`.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								data/config.example.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								data/config.example.ini
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user