Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как узнать id сообщения и обратиться к нему в другом хендлере?

Александр Полежайкин Ученик (95), на голосовании 1 месяц назад
В хендлере с командой 'check_creator'.
Сообщение начинается так await message.reply(...) - Как узнать его id и обратиться к нему в хендлере, который снизу. Нужно ответить на это же сообщение, но после выполнения условий в хендлере 'sub_check'


 from aiogram import Bot, Dispatcher, types 
from aiogram.utils import executor
from keyboards import sub_verification_menu

API_TOKEN = '' # Замените на свой токен
GROUP_ID = # Замените на ID вашей группы (куда необходимо подписаться)


bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)


def sub_verification(chat_member):
if chat_member["status"] != "left":
return True
else:
return False


@dp.message_handler(commands=['check_creator'])
async def check_creator(message: types.Message):
admins = await bot.get_chat_administrators(chat_id=message.chat.id)
creator_id = next(admin.user.id for admin in admins if admin.is_chat_creator)
member = await bot.get_chat_member(GROUP_ID, creator_id)
if member.status in ('member', 'administrator', 'creator'):
await bot.send_message(creator_id, text="Создатель группы является участником.")
else:
await message.reply("I can't work. The subscription to the bot has ended..\n\n_Only the owner of this group can renew the subscription in private messages with the bot_", parse_mode="Markdown") #Как обратиться к этому сообщение в хендлере, который ниже
await bot.send_message(creator_id, text="Ваша подписка закончилась.\n\nПользователи вашей группы просят продлить её", reply_markup=sub_verification_menu)




@dp.callback_query_handler(text="sub_check")
async def sub_check(message: types.Message):
await bot.delete_message(message.from_user.id, message.message.message_id)
if sub_verification(await bot.get_chat_member(chat_id="", user_id=message.from_user.id)):
await bot.send_message(message.from_user.id, "Ботом теперь можно пользоваться в вашей группе.")
else:
await bot.send_message(message.from_user.id, "Чтобы получить доступ к боту, подпишись на канал", reply_markup=sub_verification_menu)


if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Голосование за лучший ответ
Тот, кто был повешен Мудрец (15123) 2 месяца назад
Если ты общаешься с сообщениями, то тогда тебе уже не помочь. ?
Александр ПолежайкинУченик (95) 2 месяца назад
Не понимаю, я пару дней изучаю ботов. Объясните о чем вы, пожалуйста
Тот, кто был повешен Мудрец (15123) Александр Полежайкин, ну, ты пишешь, что ты общаешься с сообщениями, ну типа шизофреники только, по-моему, общаются с неодушевлёнными вещами.
epifan Мыслитель (6825) 2 месяца назад
Чтобы узнать id сообщения и обратиться к нему в другом хендлере, вы можете использовать следующий подход:
  1. В хендлере check_creator, сохраните id сообщения после его отправки.
  2. Используйте глобальную переменную или хранилище данных (например, словарь) для хранения id сообщения.
  3. В хендлере sub_check, получите сохраненный id сообщения и используйте его для ответа.

Вот как можно модифицировать ваш код:

 from aiogram import Bot, Dispatcher, types 
from aiogram.utils import executor
from keyboards import sub_verification_menu

API_TOKEN = '' # Замените на свой токен
GROUP_ID = # Замените на ID вашей группы (куда необходимо подписаться)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Словарь для хранения id сообщений
message_ids = {}

def sub_verification(chat_member):
return chat_member["status"] != "left"

@dp.message_handler(commands=['check_creator'])
async def check_creator(message: types.Message):
admins = await bot.get_chat_administrators(chat_id=message.chat.id)
creator_id = next(admin.user.id for admin in admins if admin.is_chat_creator())
member = await bot.get_chat_member(GROUP_ID, creator_id)
if member.status in ('member', 'administrator', 'creator'):
await bot.send_message(creator_id, text="Создатель группы является участником.")
else:
sent_message = await message.reply("I can't work. The subscription to the bot has ended..\n\n_Only the owner of this group can renew the subscription in private messages with the bot_", parse_mode="Markdown")
# Сохраняем id сообщения
message_ids[creator_id] = sent_message.message_id
await bot.send_message(creator_id, text="Ваша подписка закончилась.\n\nПользователи вашей группы просят продлить её", reply_markup=sub_verification_menu)

@dp.callback_query_handler(text="sub_check")
async def sub_check(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.delete_message(callback_query.from_user.id, callback_query.message.message_id)
if sub_verification(await bot.get_chat_member(chat_id=GROUP_ID, user_id=callback_query.from_user.id)):
await bot.send_message(callback_query.from_user.id, "Ботом теперь можно пользоваться в вашей группе.")
# Получаем id сохраненного сообщения
original_message_id = message_ids.get(callback_query.from_user.id)
if original_message_id:
# Отвечаем на оригинальное сообщение
await bot.send_message(callback_query.message.chat.id, "Подписка продлена!", reply_to_message_id=original_message_id)
else:
await bot.send_message(callback_query.from_user.id, "Чтобы получить доступ к боту, подпишись на канал", reply_markup=sub_verification_menu)

if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Похожие вопросы