Telethon运行TG自动回复脚本报PeerUser输入实体找不到错误求助
问题原因
- 报错触发在代码第38行的
event.client.get_entity(event.from_id)调用位置,触发ValueError的核心原因是Telethon无法获取到对应ID的用户实体信息,常见触发场景有两类:- 发消息的用户和你的Telegram账号没有任何历史交互记录(没有聊天记录、没有好友关系、不在共同群组),Telethon本地没有缓存该用户的实体数据,无法直接通过ID获取信息
- 消息来自群组的匿名管理员,此时
event.from_id为None空值,直接传入get_entity方法就会抛出错误
修复方案
直接替换原有代码中的handle_new_message函数即可,修改逻辑说明:
- 新增前置判断,没有发送者ID的消息直接跳过处理
- 用Telethon内置的
event.get_sender()方法替代手动调用get_entity获取发送者信息,同时增加异常捕获,获取不到用户实体时直接跳过,不会导致程序崩溃
修改后的完整函数代码:
@client.on(events.NewMessage) async def handle_new_message(event): # 无发送者ID的消息直接跳过(比如群组匿名管理员消息) if not event.from_id: return me = await client.get_me() try: # 内置方法获取发送者、接收者实体,自动处理缓存 from_ = await event.get_sender() to_ = await event.client.get_entity(event.message.to_id) except ValueError: # 无法获取实体的消息直接跳过,避免报错终止程序 return # 以下为原有业务逻辑,无需改动 needToProceed = from_.is_self if debug_mode else not from_.is_self and (event.is_private or re.search("@"+me.username,event.raw_text)) if needToProceed: if not from_.bot and event: print(time.asctime(), '-', event.message) await sleep(1) message = "" senderList.append(to_.id) if senderList.count(to_.id) < 2: message = f"""**AUTO REPLY** \nHi @{from_.username}, \n\nMohon maaf boss saya sedang offline, mohon tunggu sebentar. \nSilahkan lihat-lihat [imacakes](https://www.instagram.com/ima_cake_cirebon) dulu untuk cuci mata. \n\n**AUTO REPLY**""" elif senderList.count(to_.id) < 3: message = f"""**AUTO REPLY** \nMohon bersabar @{from_.username}, boss saya masih offline 😒""" elif senderList.count(to_.id) < 4: message = f"""**AUTO REPLY** \n@{from_.username} Tolong bersabar yaa 😅""" else: random_number = random.randint(0,len(quizzes) - 1) question = quizzes[random_number]['question'] answer = quizzes[random_number]['answer'] message = f"""**AUTO REPLY** \n @{from_.username}, Main tebak-tebakan aja yuk 😁 \n {question} \n {answer} \n """ if message != "": await event.reply(message)
可选优化
你当前用senderList列表统计用户发送消息次数,列表会随着运行时间越来越大,统计效率会越来越低,可以替换为字典实现,只需修改两处逻辑:
- 把初始化代码
senderList = []替换为字典初始化:senderCount = {} - 把函数内的计数逻辑对应替换即可:
- 原
senderList.append(to_.id)替换为senderCount[to_.id] = senderCount.get(to_.id, 0) + 1 - 所有出现
senderList.count(to_.id)的位置都替换为senderCount[to_.id]
- 原
内容的提问来源于stack exchange,提问作者Ferdi Ansyah
相关产品推荐
相关产品推荐

