aiogram开发Telegram机器人订阅校验功能触发Unsupported parse_mode错误求助
问题原因定位
1. 核心错误点:message.answer 传参错误
你出错的代码行是:
await message.answer(message.from_user.id, NOTSUB_MESSAGE)
message.answer() 方法是直接给当前触发消息的对话回复内容,不需要额外传递用户ID作为第一个参数,它的参数顺序为:
- 第一个参数:要发送的文本内容
- 后续可选参数:
parse_mode、reply_markup等配置项
你传入了两个参数后,aiogram会把第一个参数message.from_user.id当作要发送的文本,第二个参数NOTSUB_MESSAGE当作parse_mode的取值,而NOTSUB_MESSAGE是普通业务文本,不是Telegram支持的HTML/MarkdownV2等合法解析模式值,所以抛出Unsupported parse_mode错误。
2. 修复方案
直接修改错误行即可,两种写法二选一:
# 写法1:直接用answer回复,不需要额外传用户ID await message.answer(NOTSUB_MESSAGE) # 写法2:如果要调用send_message方法才需要显式传chat_id # await bot.send_message(chat_id=message.from_user.id, text=NOTSUB_MESSAGE)
3. 潜在隐藏BUG
你当前的订阅校验逻辑缩进错误,被包裹在了if message.from_user.username is not None的判断分支内,意味着如果用户没有设置Telegram用户名,就会直接跳过订阅校验,不会触发检查逻辑。可以把订阅校验的代码块往外提一层,和该if判断平级:
# 原有用户名更新逻辑 if message.from_user.username is not None: if message.from_user.username.lower() != get_user_id[2]: update_userx(get_user_id[1], user_login=message.from_user.username.lower()) # 订阅校验逻辑移到if外部,确保所有用户都会触发校验 if check_sub_channel(await bot.get_chat_member(chat_id=CHENNEL_ID, user_id=message.from_user.id)): await message.answer("<b>✌️ Приведствую тебя в нашем магазине ✌️</b>\n<b>👌 В нашем магазине ты купишь только качественные товары 👌</b>\n\n<b>😋 У нас ты можешь продать свой товар 😋</b>\n<b>👑 Наш магазин создан что бы продовать только проверенные товары 👑</b>\n\n<b>😘 МЫ ОТКРЫЛИСЬ 03.11.2021 году. 😘</b>\n",reply_markup=check_user_out_func(message.from_user.id)) else: await message.answer(NOTSUB_MESSAGE)
内容的提问来源于stack exchange,提问作者Boiko
相关产品推荐
相关产品推荐

