Skip to content

Commit

Permalink
Add: simultaneous bots using
Browse files Browse the repository at this point in the history
  • Loading branch information
DUB1401 committed Sep 27, 2023
1 parent 35cd0a1 commit 1083e0f
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 50 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ ___
```JSON
"token": ""
```
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Токен должен быть уникальным для каждого источника.
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников.
___
```JSON
"target": ""
Expand Down Expand Up @@ -132,7 +132,7 @@ ___
```JSON
"token": ""
```
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Токен должен быть уникальным для каждого источника.
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников.
___
```JSON
"target": ""
Expand Down
43 changes: 43 additions & 0 deletions Source/BotsManager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import logging
import telebot

# Менеджер подключений к ботам.
class BotsManager:

# Конструктор.
def __init__(self):

#---> Генерация динамических свойств.
#==========================================================================================#
# Хранилище активных ботов.
self.__Bots = dict()
# Данные о подключениях к ботам.
self.__ConnectionsData = dict()

# Создаёт новое подключение к боту.
def createBotConnection(self, Token: str, Source: str, Target: str):

# Если бот с таким токеном ещё не инициализирован.
if Token not in self.__Bots.keys():

try:
# Инициализация бота.
self.__Bots[Token] = telebot.TeleBot(Token)

except Exception as ExceptionData:
# Запись в лог ошибки: не удалось инициализировать бота.
logging.error("Incorrect bot token. Exception: " + str(ExceptionData))

# Заполнение данных о подключении.
self.__ConnectionsData[Token] = {
"sources": list(),
"targets": list()
}

# Дополнение информации о подключении.
self.__ConnectionsData[Token]["sources"].append(Source)
self.__ConnectionsData[Token]["targets"].append(Target)

# Возвращает экземпляр бота по токену.
def getBot(self, Token: str) -> telebot.TeleBot:
return self.__Bots[Token]
49 changes: 29 additions & 20 deletions Source/Callback.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from telebot.types import InputMediaDocument, InputMediaPhoto, InputMediaVideo
from Source.Configurator import Configurator
from Source.BotsManager import BotsManager
from MessageEditor import MessageEditor
from Source.Functions import *
from threading import Thread
Expand All @@ -15,12 +16,14 @@ class Callback:
def __SenderThread(self):
# Запись в лог отладочной информации: поток очереди отправки запущен.
logging.debug("Callback API sender thread started.")

# Пока сообщение не отправлено.
while True:

# Если в очереди на отправку есть сообщения.
if len(self.__MessagesBufer) > 0:
# Конфигурация источника.
Config = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])
# Список медиа-вложений.
MediaGroup = list()

Expand All @@ -37,7 +40,7 @@ def __SenderThread(self):
InputMediaDocument(
open("Temp/" + self.__MessagesBufer[0]["attachments"][Index]["filename"], "rb"),
caption = self.__MessagesBufer[0]["text"] if Index == 0 else "",
parse_mode = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])["parse-mode"] if Index == 0 else None
parse_mode = Config["parse-mode"] if Index == 0 else None
)
)

Expand All @@ -48,7 +51,7 @@ def __SenderThread(self):
InputMediaPhoto(
open("Temp/" + self.__MessagesBufer[0]["attachments"][Index]["filename"], "rb"),
caption = self.__MessagesBufer[0]["text"] if Index == 0 else "",
parse_mode = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])["parse-mode"] if Index == 0 else None
parse_mode = Config["parse-mode"] if Index == 0 else None
)
)

Expand All @@ -59,7 +62,7 @@ def __SenderThread(self):
InputMediaVideo(
open("Temp/" + self.__MessagesBufer[0]["attachments"][Index]["filename"], "rb"),
caption = self.__MessagesBufer[0]["text"] if Index == 0 else "",
parse_mode = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])["parse-mode"] if Index == 0 else None
parse_mode = Config["parse-mode"] if Index == 0 else None
)
)

Expand All @@ -68,18 +71,18 @@ def __SenderThread(self):
# Если есть вложения.
if len(MediaGroup) > 0:
# Отправка медиа группы.
self.__TelegramBots[self.__MessagesBufer[0]["source"]].send_media_group(
self.__Bots.getBot(self.__MessagesBufer[0]["token"]).send_media_group(
self.__MessagesBufer[0]["target"],
media = MediaGroup
)

else:
# Отправка текстового сообщения.
self.__TelegramBots[self.__MessagesBufer[0]["source"]].send_message(
self.__Bots.getBot(self.__MessagesBufer[0]["token"]).send_message(
self.__MessagesBufer[0]["target"],
self.__MessagesBufer[0]["text"],
parse_mode = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])["parse-mode"],
disable_web_page_preview = self.__Configurations.getConfig(self.__MessagesBufer[0]["source"])["disable-web-page-preview"]
parse_mode = Config["parse-mode"],
disable_web_page_preview = Config["disable-web-page-preview"]
)

except telebot.apihelper.ApiTelegramException as ExceptionData:
Expand Down Expand Up @@ -108,31 +111,34 @@ def __SenderThread(self):

else:
# Запись в лог отладочной информации: поток очереди отправки оставновлен.
logging.debug("Sender thread stopped.")
logging.debug("Callback API sender thread stopped.")
# Остановка потока.
break

# Отправляет сообщение в группу Telegram через буфер ожидания.
def __SendMessage(self, PostObject: dict, Source: str):
# Состояние: есть ли запрещённые слова в посте.
HasBlacklistWords = False
# Конфигурация источника.
Config = self.__Configurations.getConfig(Source)
# Объект сообщения.
MessageStruct = {
"source": Source,
"target": self.__Configurations.getConfig(Source)["target"],
"token": Config["token"],
"target": Config["target"],
"text": None,
"attachments": list()
}

# Экранировать символы при указанной разметке MarkdownV2.
if self.__Configurations.getConfig(Source)["parse-mode"] == "MarkdownV2":
if Config["parse-mode"] == "MarkdownV2":
PostObject["text"] = EscapeCharacters(PostObject["text"])

# Обработка текста поста пользовательским скриптом.
PostObject["text"] = MessageEditor(PostObject["text"] if PostObject["text"] != None else "", Source)

# Для каждого запрещённого слова проверить соответствие словам поста.
for ForbiddenWord in self.__Configurations.getConfig(Source)["blacklist"]:
for ForbiddenWord in Config["blacklist"]:
for Word in PostObject["text"].split():

# Если пост содержит запрещённое слово, то игнорировать его.
Expand All @@ -143,7 +149,7 @@ def __SendMessage(self, PostObject: dict, Source: str):
if PostObject["text"] != None and PostObject["text"] != "" and HasBlacklistWords == False:

# Если включена очистка тегов, то удалить упоминания из них.
if self.__Configurations.getConfig(Source)["clean-tags"] == True:
if Config["clean-tags"] == True:
PostObject["text"] = CleanTags(PostObject["text"])

# Обрезка текста поста до максимально дозволенной длинны.
Expand Down Expand Up @@ -176,8 +182,8 @@ def __SendMessage(self, PostObject: dict, Source: str):
self.__Sender = Thread(target = self.__SenderThread, name = "VK-Telegram Poster (Callback API sender)")
self.__Sender.start()

# Конструктор: задаёт глобальные настройки и обработчик конфигураций.
def __init__(self, Settings: dict, ConfiguratorObject: Configurator):
# Конструктор: задаёт глобальные настройки, обработчик конфигураций и менеджер подключений к ботам.
def __init__(self, Settings: dict, ConfiguratorObject: Configurator, BotsManagerObject: BotsManager):

#---> Генерация динамических свойств.
#==========================================================================================#
Expand All @@ -189,17 +195,20 @@ def __init__(self, Settings: dict, ConfiguratorObject: Configurator):
self.__PostsEditorsThreads = list()
# Глобальные настройки.
self.__Settings = Settings.copy()
# Менеджер подключений к ботам.
self.__Bots = BotsManagerObject
# Очередь отложенных сообщений.
self.__MessagesBufer = list()
# Список экземпляров бота.
self.__TelegramBots = dict()

# Запуск потока обработки буфера сообщений.
self.__Sender.start()

# Инициализация экзепляров бота.
for Target in self.__Configurations.getConfigsNames("Callback"):
self.__TelegramBots[Target] = telebot.TeleBot(self.__Configurations.getToken(Target))
# Инициализация экзепляров ботов.
for ConfigName in self.__Configurations.getConfigsNames("Callback"):
# Конфигурация источника.
Config = self.__Configurations.getConfig(ConfigName)
# Инициализация подключения к боту.
self.__Bots.createBotConnection(Config["token"], ConfigName, Config["target"])

# Добавляет сообщение в очередь отправки.
def AddMessageToBufer(self, CallbackRequest: dict, Source: str):
Expand Down
Loading

0 comments on commit 1083e0f

Please sign in to comment.