await asyncio.create_task(start_checking_price(1800))
await asyncio.create_task(some_coro(...))
не имеет смысла практически никогда! Если тебе нужно запустить корутину и дождаться результата, делаешь просто await some_coro(...)
.# ...
check_task = asyncio.create_task(start_checking_price(1800)) # нету await, мы не ждём созданную задачу!
try:
await dp.start_polling()
finally:
check_task.cancel() # отменяем корутину
# внутри start_checking_price() текущий выполняемый await выкинет исключение CancelledError
# это исключение всплывёт наружу, если мы сделаем await, и позволит отработать
# блокам finally, with и т.п. инструментам. Также можно явно поймать это исключение,
# чтобы обработать отмену корутины. Но в твоём случае это не требуется.
try:
await check_task # даём корутине отработать завершение
except asyncio.CancelledError: # ловим всплывшее CancelledError
pass # всё ок, никакие действия не требуются
await my_bot.close()
reply_to_message: Message | None
Optional. For replies in the same chat and message thread, the original message. Note that the Message object in this field will not contain further reply_to_message fields even if it itself is a reply.
from_user: User | None
Optional. Sender of the message; empty for messages sent to channels. For backward compatibility, the field contains a fake sender user in non-channel chats, if the message was sent on behalf of a chat.
while True:
await aioschedule.run_pending()
await asyncio.sleep(0.1)
async def main():
logging.basicConfig(level=logging.INFO)
async with ClientSession() as session: # сессию лучше по сто раз не создавать
check_task = asyncio.create_task(check_loop(session)) # создай её однажды и передай в check_loop
try:
bot = Bot(
token='"'
)
await dp.start_polling(bot)
finally:
check_task.cancel() # внутри check_loop() сгенерируется прерывание asyncio.CancelledError
@router.message(F.text == 'Каталог')
async def catalog(message : Message):
categories_kb = InlineKeyboardBuilder()
categories = db.get_group_name_from_db()
for category in categories:
categories_kb.add(InlineKeyboardButton(text=categories, callback_data=f'category_')) # чему-чему равен text?
return categories_kb.adjust(2).as_markup() # ты же понимаешь, что строка ниже не выпонится?
await message.answer('Выберите категорию товара:', reply_markup=await categories) # что ещё за await? categories - это список.
# или ты имел ввиду categories_kb?
SELECT * FROM Numbers ORDER BY ABS(num - заданное_число) ASC LIMIT 1
SELECT referal_id, COUNT(*) FROM users GROUP BY referal_id
import sys
from pathlib import Path
BASE_DIR = Path(sys.argv[0]).parent.resolve() # каталог скрипта
AUDIO = BASE_DIR / 'audio.mp3' # файл в каталоге скрипта
#......
async def send_songs(message):
await message.answer("Hello!")
await message.answer("World!")
audio = AUDIO.open('rb')
await bot.send_audio(message.chat.id, audio)
parse_mode (typing.Union[base.String, None]) – Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot’s message.
# Функция отображения
async def show_pages(chat_id, page):
...
# тут ты отправляешь сообщение!
sent_message = await bot.send_message(chat_id, text='Выберите страницу:', reply_markup=keyboard)
return sent_message.message_id
# Обработчик кнопок
async def callback_handler(query: types.CallbackQuery):
...
message_id = await show_page(query.message.chat.id, page=current_page) # <-- show_page() отправляет сообщение!
# Редактируем сообщение вместо отправки нового <-- не вместо, а после отправки нового
await bot.edit_message_text(chat_id=query.message.chat.id, message_id=query.message.message_id, text='Выберите страницу:',
reply_markup=InlineKeyboardMarkup()) # <-- сносишь клавиатуру у старого сообщения
# ru.py
def setup(dp):
@dp.message_handler()
async def ru_bot(message: types.Message): # да, эти функции описаны внутри setup()
...
@dp.callback_query_handler()
async def handle_callback_ru(callback_query: types.CallbackQuery):
...
# main.py
dp = ... # создаёшь диспетчер бота
import ru
ru.setup(dp) # регаешь обработчики из ru
... # запускаешь бота