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
... # запускаешь бота
@state_router.message(MyState.stateA)
async def process_stateA(message: Message, state: FSMContext) -> None:
data = await state.get_data()
result = message.text + str(data['some_key']) # это типа логика обработки
await message.reply(result)
def do_stuff(msgtext: str, some_value) -> str:
return msgtext + str(some_value)
@state_router.message(MyState.stateA)
async def process_stateA(message: Message, state: FSMContext) -> None:
data = await state.get_data()
result = do_stuff(message.text, data['some_key'])
await message.reply(result)