• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Как запустить функцию с бесконечным циклом в отдельном потоке для телеграмм бота на библиотеке aiogram 3

Ali_Pythonist

Member
21.02.2024
14
0
BIT
101
Привет у меня есть телеграмм бот по определённой команде он запускает бесконечный цикл который проверяет текущее время с временем из базы данных но у меня проблема в том что если я запускаю эту функцию то весь функционал бота становится недоступным как мне запустить эту функцию в отдельном потоке что бы при её работе был доступен весь основной функционал бота код ниже.

2024-05-15_17-37-27.png
Вот код с диспетчером.

Python:
import asyncio
import logging
import sys
from Routers.bot_send_photo import hello
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message
from token_bot import token
from threading import Thread
from Routers.add_dell_all_photo import bot_router_photo
from Routers.bot_send_photo import bot_router_send_photo
from Keyboard.keyboard_optional import admin_optional

bot = Bot(token=token)
dp = Dispatcher()
dp.include_routers(bot_router_photo, bot_router_send_photo)

@dp.message(CommandStart())
async def bot_start(message: Message):
    await message.answer(text='Привет вот функции для администратора.', reply_markup=admin_optional)

async def main():
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)

if __name__ == '__main__':
    logging.basicConfig(
        level=logging.INFO,
        stream=sys.stdout,
        format="%(asctime)s - [%(levelname)s] -  %(name)s - "
               "(%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
    )
    asyncio.run(main())

Вот код с файла bot_send_photo
Python:
import sqlite3 as sq
import datetime
from time import sleep
from aiogram import Bot
from aiogram.filters import Command
from aiogram.types import Message
from aiogram import Router
from aiogram.types import BufferedInputFile
from threading import Thread
from FiltersBot.chat_type import ChatTypeFilter
from FiltersBot.admin_filter import IsAdmin

bot_router_send_photo = Router()
bot_router_send_photo.message.filter(ChatTypeFilter(chat_types=['private']))
lst_admin = [6320259544]

@bot_router_send_photo.message(Command("remind"), IsAdmin(lst_admin))
async def hello(message: Message, bot: Bot):
    await message.answer(text='Планировщик запущен.')
    with sq.connect('sq_bot.db') as time_photo:
        id = -4152120133
        cur = time_photo.cursor()
        time = cur.execute("""SELECT time FROM data_photo""").fetchall()
        photo = cur.execute("""SELECT photo FROM data_photo""").fetchall()
        photo_name = cur.execute("""SELECT photo_name FROM data_photo""").fetchall()
        while True:
            time_now = datetime.datetime.now().time()
            time_string = f'{time_now.hour}:{time_now.minute}'
            for n, p in zip(photo_name, photo):
                for i in range(len(time)):
                    if time_string in time[i][0]:
                        await bot.send_photo(chat_id=id, photo=BufferedInputFile(filename=n[0], file=p[0]))
            sleep(60)
 

Вложения

  • 2024-05-15_17-37-06.png
    2024-05-15_17-37-06.png
    63,7 КБ · Просмотры: 72

Luxkerr

Редактор Форума
28.10.2023
252
110
BIT
5 419
Как я понял, ты импортировал класс Thread, но так и не использовал его. Он в свою очередь позволяет запускать функции в отдельных потоках, не мешая друг другу.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!