Запуск нескольких ботов одновременно

Рейтинг: 1Ответов: 2Опубликовано: 27.05.2023

Решил уместить функционал нескольких ботов в один файл, так как уже много их в папке. Но проблема что из всех ботов запускается только первый в

if __name__ == '__main__':
    while True:
        try:
            bot1.polling(non_stop=True, interval=0, timeout=60)
            bot2.polling(non_stop=True, interval=0, timeout=60)
            bot3.polling(non_stop=True, interval=0, timeout=60)
        except Exception as e:
            time.sleep(2)

Запускается только bot1, функционал других не работает, как это исправить и сделать запуск сразу нескольких ботов, или это невозможно на telebot и надо переходить на aiogram? Пробовал реализацию через threading:

def bot1polling():
    bot1.polling(non_stop=True, interval=0)
def bot2polling():
    bot2.polling(non_stop=True, interval=0)
def bot2polling():
    bot3.polling(non_stop=True, interval=0)
if __name__ == '__main__':
    while True:
        try:
            bot1poll = Thread(target=bot1polling, daemon=True)
            bot1poll.start()  
            bot2poll = Thread(target=bot2polling, daemon=True)
            bot2poll.start()  
            bot3poll = Thread(target=bot3polling, daemon=True)
            bot3poll.start()  
        except Exception as e:
            time.sleep(2)

Ответы

▲ 3Принят

Попробуйте сделать так:

В начале файла:

from multiprocessing import Process

В конце файла (перезапишите код if __name__ == '__main__' этим кодом):

def start_bot1():
    bot1.polling(none_stop=True, interval=0, timeout=60)

def start_bot2():
    bot2.polling(none_stop=True, interval=0, timeout=60)

def start_bot3():
    bot3.polling(none_stop=True, interval=0, timeout=60)

if __name__ == '__main__':
    while True:
        try:
            bot_thread1 = Process(target=start_bot1, args=())
            bot_thread2 = Process(target=start_bot2, args=())
            bot_thread3 = Process(target=start_bot3, args=())

            bot_thread1.start()
            bot_thread2.start()
            bot_thread3.start()

            bot_thread1.join()
            bot_thread2.join()
            bot_thread3.join()
        except Exception as e:
            time.sleep(10)
▲ 0

Создаем список из ботов в переменной bots и потом передаем этот список в start_polling. Это код для aiogram v3

async def create_bots():
    tokens = await base.fetch("SELECT token FROM tb_bots WHERE enable = True")
    bots = {}

    for i, data in enumerate(tokens, start=1):
        token = data.get('token')
        bot_name = f"bot{i}"
        bots[bot_name] = Bot(token=token, parse_mode="HTML")

    return bots

bots = []
bots_dict = await create_bots()
for bot in bots_dict.values():
    bots.append(bot)
    await bot.delete_webhook(drop_pending_updates=True)

dp.startup.register(startup)
dp.shutdown.register(shutdown)

await dp.start_polling(*bots, polling_timeout=30000, close_bot_session=True)