youfou / wxpy

微信机器人 / 可能是最优雅的微信个人号 API ✨✨
http://wxpy.readthedocs.io
MIT License
13.97k stars 2.38k forks source link

TypeError: unhashable type: 'Chats' #8

Closed qcrao closed 7 years ago

qcrao commented 7 years ago

测试图灵机器人的出错信息: img_20170318_175339

怎么解决?谢谢~~

youfou commented 7 years ago

看上去应该是你注册消息时用了错误的参数。

Bot.register() 方法的第一个参数,不可为 Chats,因为 Chats 并非具体的聊天对象类,而是多个聊天对象合集的类,本质上是个 list

如果需要注册所有的聊天对象,该参数应留空,或为 None 或为 bot.chats() (但通常没必要这么写)

qcrao commented 7 years ago

对,我传了一个list进去,list里面有4个Friend。

改成传Friend就OK了。

如果我想对多个朋友使用图灵机器人,是否只需要def多个函数就可以了,然后分别传参?

youfou commented 7 years ago

不需要,传一个包含需要监听的聊天对象的列表进去就可以了。但不应该报错。 麻烦发一下你的代码。

qcrao commented 7 years ago
from wxpy import *
bot = Bot()
my_friend = []
my_friend.append(bot.friends().search('XXX'))
my_friend.append(bot.friends().search('XXX'))
my_friend.append(bot.friends().search('XXX'))
my_friend.append(bot.friends().search('XXX'))

tuling = Tuling(api_key='c8fb9fcf82ab45b089dcbef18181e4e5')

# 使用图灵机器人自动回复指定好友
@bot.register(my_friend)
def reply_my_friend(msg):
    tuling.do_reply(msg)

bot.start()
youfou commented 7 years ago

.search() 得到的结果是 Chats(list) 类型 所以注册时,my_friend 是一个由 4 个 Chats(list) 组成的 list: [[xxx], [xxx], [xxx], [xxx]]

应把每个 bot.friends().search('XXX') 改为 ensure_one(bot.friends().search('XXX'))

youfou commented 7 years ago

关于 ensure_one 的用法 http://wxpy.readthedocs.io/zh/latest/utils.html#wxpy.ensure_one

qcrao commented 7 years ago

好的,了解,谢谢~~