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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:15:56