@bitkoljas

Как запустить несколько копий телеграм-бота на Aiogram?

Вопрос следующий, у меня есть скрипт бота Telegram написанный на Python при помощи библиотеки Aiogram. Как только я запускаю вторую копию бота, в консоли появляется следующая ошибка:

aiogram.utils.exceptions.TerminatedByOtherGetUpdates: Terminated by other getupdates request; make sure that only one bot instance is running


И текст сообщений отображается то в одном окне, то в другом, а мне нужно что бы оба окна без проблем и конфликтов читали отправленные сообщения не препятствуя друг другу.

Суть бота такова: Скрипт запускается на нескольких компьютеров одновременно (как на одном, так и на сотне) и постоянно ведут мониторинг сообщений бота. Как только в боте приходит сообщение с именем определённого компьютера, копия бота установленная на этом компьютере отвечает на запрос, а остальные копии игнорируют это сообщение. Но из за того что при запуске 2-х и более экземпляров кода вылетает ошибка, я не могу это реализовать.

Код взаимодействия с ботом:
import aiogram

__connect_key__ = 'token'
__admin_id__ = 'id'
TelegramSession = aiogram.Dispatcher(aiogram.Bot(token=__connect_key__))

@TelegramSession.message_handler()
async def Messages(message: aiogram.types.Message):
    if message['from']['id'] == __admin_id__:
        Hendler(message.text)

def Hendler(Data):
    print(Data)

if __name__ == '__main__':
    aiogram.executor.start_polling(TelegramSession, skip_updates=False)


Есть возможность это как то исправить используя именно эту библиотеку? Или же удобнее будет написать свою библиотеку по взаимодействию с ботом по API ибо таким образом не приходится сталкиваться с этой ошибкой, но это дико не удобно.
  • Вопрос задан
  • 2265 просмотров
Решения вопроса 2
SoreMix
@SoreMix Куратор тега Python
yellow
Или же удобнее будет написать свою библиотеку по взаимодействию с ботом по API ибо таким образом не приходится сталкиваться с этой ошибкой, но это дико не удобно

Ошибка телеграмом создается, а не aiogram. Бот один, не нужно запускать тысячи его копий. Меняйте логику приложения / используйте клиентский api
Ответ написан
@bitkoljas Автор вопроса
В общем придумал вот такое решение:
import requests, time, io, os
import logging

from threading import Thread

__connect_key__ = 'token'
__admin_id__ = 00000000
__delay_update__ = 0.1

logging.basicConfig(filename="Logging.log", level=logging.INFO)

def __telegram_console__():
    try:

        def __out_messages__(id = 0, mode = 'write'):
            try:
                if mode == 'write':
                    with io.open('__out_messages__', 'w') as __messages_id__:
                        __messages_id__.write(str(id))
                        return id
                else:
                    with io.open('__out_messages__', 'r') as __messages_id__:
                        return int(__messages_id__.read())
            except Exception as Error:
                if 'No such file or directory: \'__out_messages__\'' in str(Error):
                    with io.open('__out_messages__', 'w') as __messages_id__:
                        __messages_id__.write('0')
                        return 0
                logging.exception('__out_messages__')

        __messages_id__ = __out_messages__(mode = 'read')

        while True:
            time.sleep(__delay_update__)
            for Messages in requests.post(f"https://api.telegram.org/bot{__connect_key__}/getUpdates").json()['result']:
                if 'message' in Messages.keys():
                    if Messages['message']['message_id'] > __messages_id__:
                        __messages_id__ = __out_messages__(Messages['message']['message_id'])
                        if __admin_id__ == Messages['message']['from']['id']:
                            Hendler(Messages['message']['text'].split(' '))
                    elif 'edited_message' in Messages.keys():
                        __messages_id__ = __out_messages__(Messages['edited_message']['message_id'])
                        if __admin_id__ == Messages['edited_message']['from']['id']:
                            Hendler(Messages['edited_message']['text'].split(' '))

    except Exception as Error:
        logging.exception('__telegram_console__')
        __telegram_console__()

def Hendler(Command):
    pass

if __name__ == '__main__':
    Thread(target=__telegram_console__).start()
    os.system('pause')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы