You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyrogram Telegram Bot报错:'NoneType'对象无'from_user'属性求助

解决Pyrogram Bot中AttributeError: 'NoneType' object has no attribute 'from_user'问题

问题分析

报错核心是处理按钮回调时,尝试访问了None对象的from_user属性——非目标用户点击专属按钮时,回调查询(CallbackQuery)或其关联的消息对象可能为None,导致用户信息无法被正确获取。

解决方法

1. 先校验用户对象有效性

在回调处理函数开头,先判断from_user是否存在,避免直接访问属性引发报错:

from pyrogram import Client, filters

@app.on_callback_query()
async def handle_callback(client, callback_query):
    # 检查用户对象是否存在
    if not callback_query.from_user:
        await callback_query.answer("无法识别当前用户,请重新操作", show_alert=True)
        return
    
    # 后续业务逻辑
    user_id = callback_query.from_user.id
    # ...

2. 提前验证用户权限

针对专属按钮,先校验用户是否在允许列表内,直接拒绝非目标用户的请求:

# 维护允许使用专属按钮的用户ID列表
ALLOWED_USER_IDS = [123456789, 987654321]  # 替换为你的目标用户ID

@app.on_callback_query(filters.regex("^exclusive_btn$"))  # 匹配专属按钮的回调数据
async def handle_exclusive_button(client, callback_query):
    # 先检查用户是否存在
    if not callback_query.from_user:
        await callback_query.answer("无法识别用户", show_alert=True)
        return
    
    user_id = callback_query.from_user.id
    # 验证用户权限
    if user_id not in ALLOWED_USER_IDS:
        await callback_query.answer("你没有权限使用该功能", show_alert=True)
        return
    
    # 执行专属按钮的业务逻辑
    await callback_query.message.edit_text("专属功能已执行")

3. 避免链式访问可能为None的对象

不要直接写callback_query.message.from_user这种链式代码,分步检查中间对象是否存在:

@app.on_callback_query()
async def handle_callback(client, callback_query):
    # 检查消息对象是否存在
    if not callback_query.message:
        await callback_query.answer("关联消息已失效", show_alert=True)
        return
    
    # 检查用户对象是否存在
    user = callback_query.message.from_user
    if not user:
        await callback_query.answer("无法获取用户信息", show_alert=True)
        return
    
    user_id = user.id
    # ...

4. 异常捕获作为兜底

如果以上检查仍有遗漏,添加异常捕获防止bot崩溃:

@app.on_callback_query()
async def handle_callback(client, callback_query):
    try:
        # 业务逻辑代码
        user_id = callback_query.from_user.id
        # ...
    except AttributeError as e:
        await callback_query.answer("操作失败,请稍后重试", show_alert=True)
        print(f"回调处理错误: {str(e)}")

内容的提问来源于stack exchange,提问作者Aishik Tokdar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:45:38