diff --git a/README.md b/README.md index 239ccdc..0801d65 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ pip install pyTelegramBotAPI pip install fastapi pip install uvicorn ``` -3. Настроить скрипт путём редактирования _Settings.json_. Обязательно указать: токен бота Telegram (можно узнать у [@BotFather](https://t.me/BotFather)) и ID группы Telegram (можно получить, переслав сообщение из группы боту [Chat ID Bot](https://t.me/chat_id_echo_bot)). -4. При необходимости, например в случае использования скрипта на хостинге активного сайта, настроить переадресацию [Nginx](https://nginx.org/). Также путём редактирования файла _MessageEditor.py_ можно задать пользовательский скрипт обработки постов. +3. Настроить скрипт путём редактирования _Settings.json_. Для добавления пользовательского скрипта обработки постов можно внести изменения в файл _MessageEditor.py_. +4. При необходимости, например в случае использования скрипта на хостинге активного сайта, настроить переадресацию [Nginx](https://nginx.org/) на свободный порт. 5. Провести валидацию сервера согласно данному [руководству](https://dev.vk.com/api/callback/getting-started#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20Callback%20API). Код подтверждения перед верификацией занести в файл настроек _Settings.json_. По умолчанию скрипт слушает `{HOST}/vtp/vk-group-wall`. -6. Открыть директорию со скриптом в терминале. Можно использовать метод `cd` и прописать путь к папке, либо запустить терминал из проводника. Активировать автопостер командой `uvicorn vtp:App --host [IP] --port [PORT]`. +6. Открыть директорию со скриптом в терминале. Можно использовать метод `cd` и прописать путь к папке, либо запустить терминал из проводника. Активировать автопостер командой `uvicorn vtp:App --host {IP} --port {PORT}`. 7. Для автоматического запуска службы рекомендуется провести инициализацию скрипта через [systemd](https://github.com/systemd/systemd) (пример [здесь](https://github.com/DUB1401/VK-Telegram-Poster/tree/main/systemd)) на Linux или путём добавления его в автозагрузку на Windows. # Settings.json @@ -34,7 +34,9 @@ ___ ```JSON "parse-mode": null ``` -Указывает способ форматирования сообщения, отправляемого в группу Telegram. Поддерживаются: _MarkdownV2_, _HTML_. +Указывает способ форматирования сообщения, отправляемого в группу Telegram. + +Поддерживаются: _MarkdownV2_, _HTML_. ___ ```JSON "confirmation-code": "" diff --git a/Source/Callback.py b/Source/Callback.py index 443875d..1fce0f4 100644 --- a/Source/Callback.py +++ b/Source/Callback.py @@ -9,12 +9,12 @@ class Callback: # >>>>> СВОЙСТВА <<<<< # #==========================================================================================# - # Глобальные настройки. - __Settings = dict() # Callback-запрос. __CallbackRequest = None # Экземпляр бота. __TelegramBot = None + # Глобальные настройки. + __Settings = dict() #==========================================================================================# # >>>>> МЕТОДЫ <<<<< # @@ -23,6 +23,10 @@ class Callback: # Экранирует символы при использовании MarkdownV2 разметки. def __EscapeCharacters(self, Post: str) -> str: Post = Post.replace('.', "\.") + Post = Post.replace('#', "\#") + Post = Post.replace('!', "\!") + Post = Post.replace('.', "\.") + Post = Post.replace('-', "\-") return Post diff --git a/systemd/README.md b/systemd/README.md new file mode 100644 index 0000000..c3fb54d --- /dev/null +++ b/systemd/README.md @@ -0,0 +1,19 @@ +# systemd +**systemd** – это подсистема инициализации и управления службами в Linux. С её помощью возможна настройка автоматического запуска сервисов и мониторинга ресурсов. + +## Порядок инициализации +1. Открыть файл _vtp.service_ и подставить в него данные о директории скрипта, а также IP и свободном порте. При необходимости произвести дополнительную настройку юнита. +2. Поместить _vtp.service_ в директорию `/etc/systemd/system`. +3. Запустить терминал и последовательно выполнить следующие команды: +``` +systemctl daemon-reload +systemctl start vtp +systemctl enable vtp +systemctl status vtp +``` +**Примечание:** В некоторых случаях для выполнения вышеперечисленных комманд необходимо дополнительно получить права суперпользователя. Для этого добавьте `sudo` в начале каждой строки. + +4. Проверить появившийся в терминале статус сервиса. Он должен выглядеть так: `Active: active (running)`. +5. Выполнить в терминале `curl {HOST}/vtp/{SOURCE}` и убедиться в работоспособности автопостера. + +_Copyright © DUB1401. 2022-2023._ diff --git a/vtp.py b/vtp.py index e4e4044..2ccb700 100644 --- a/vtp.py +++ b/vtp.py @@ -1,14 +1,10 @@ #!/usr/bin/python -# uvicorn vtp:App --reload --host 95.217.12.58 --port 444 -from starlette.responses import Response, JSONResponse -from MessageEditor import MessageEditor +from starlette.responses import Response from starlette.requests import Request from Source.Callback import Callback from fastapi import FastAPI -from typing import Union -import telebot import json import sys import os @@ -27,12 +23,14 @@ # >>>>> ЧТЕНИЕ НАСТРОЕК <<<<< # #==========================================================================================# +# Обработчик запросов FastAPI. +App = FastAPI() # Глобальные настройки. Settings = { "token": "", "group-id": "", "source": "vk-group-wall", - "parse-mode": "MarkdownV2", + "parse-mode": None, "confirmation-code": None } @@ -56,13 +54,10 @@ if type(Settings["confirmation-code"]) != str or len(Settings["confirmation-code"]) == 0: Settings["confirmation-code"] = "Confirmation code not found in settings file." -# Обработчик запросов FastAPI. -App = FastAPI() - # Проверяет доступность сервера через браузер. @App.get("/vtp/{Source}") def CheckServer(Source: str): - return JSONResponse(content = {"source": Source, "status": "OK"}) + return Response(content = "OK") # Обрабатывает запросы от серверов ВКонтакте по Callback API. @App.post("/vtp/" + Settings["source"]) @@ -79,7 +74,7 @@ async def SendMessageToGroup(CallbackRequest: Request): # Если тип запроса – новый пост. if RequestData["type"] == "wall_post_new": - ObjectCallback = Callback(Settings, RequestData) + Callback(Settings, RequestData) # Если нет поля типа, выбросить исключение. else: