Python Aiogram消息过滤器失效,报TypeError: unhashable type: 'list'错误求助
解决Telegram消息过滤函数的TypeError问题
错误原因分析
你遇到的TypeError: unhashable type: 'list',是因为json.load(open('slova.json'))读取的内容里包含列表类型元素,而列表属于不可哈希类型,无法直接转换成集合(set)。
比如你的slova.json如果是这种嵌套结构就会触发错误:
[["违规词1"], ["违规词2"], ["敏感词"]]
正常应该是扁平的字符串数组:
["违规词1", "违规词2", "敏感词"]
修复步骤
1. 修正JSON文件结构
优先确保slova.json是扁平的字符串列表,如上面的正确示例。如果必须保留嵌套结构,就需要在代码里先展开嵌套列表。
2. 修正代码逻辑
替换你原来的集合转换和判断代码,改成下面的写法:
import json # 读取并处理词汇列表 with open('slova.json', 'r', encoding='utf-8') as f: words_data = json.load(f) # 处理可能的嵌套列表,转成扁平的字符串列表 flat_words = [] for item in words_data: if isinstance(item, list): flat_words.extend(item) else: flat_words.append(item) # 转成集合用于快速匹配(可选,去重+提速) filtered_words = set(flat_words) # 判断是否有过滤词汇,执行删除逻辑 if filtered_words: # 假设message是Telegram收到的消息对象 message_text = message.text.lower() # 检查消息是否包含任何过滤词汇 if any(word.lower() in message_text for word in filtered_words): message.delete()
3. 简化判断逻辑(可选)
不需要转成集合也能判断是否有过滤词汇,直接判断列表是否非空更直观:
if flat_words: # 执行过滤逻辑 pass
额外优化建议
- 用
with语句读取文件,确保文件自动关闭,避免资源泄漏。 - 统一转成小写比较,避免因为大小写差异漏掉违规内容。
- 如果过滤词汇是完整单词,用集合交集判断会更快:
message_words = set(message.text.lower().split()) if message_words & filtered_words: message.delete()
内容的提问来源于stack exchange,提问作者Holodilnik
相关产品推荐
相关产品推荐

