微信机器人之邮件提醒特定的人的消息

背景

之前写的一篇文章里微信自动聊天机器人,利用图灵网的机器人进行消息回复。但是突然想到,如果特定的某人(emmm,你懂的)发消息自己却没有看见,只是个机器人来回复的话还是不太好的。所以决定增加一些功能来解决这个问题,目前优化后的微信聊天机器人实现的功能特性为:除特定的人以外的朋友来消息,微信机器人自动回复;特定的人(没错,特定的人指的就是女朋友)来消息,自动回复后可以通过邮件告知自己,并及时的进行消息的回复。

思路

还是用了itchat的库,但是之前一直认为msg['FromUserName']指的就是微信的ID账号名,所以想当然的就认为加一个判断就行了,设置一个special_name的字符串,如果msg['FromUserName']是在这个special_name这个列表里的话就直接发送邮件提醒。思路上没问题,但是没想到在判断是否为special_name的字符串的时候遇到了各种bug。首先msg['FromUserName']的提取是一个字典的形式,所以并不能直接用字符串相等进行判断。其次,我想利用UserName作为判断每一个发送方的判断依据,结果测试后却是失败的,经过调试发现,微信里每次消息的UserName都是不相同的!!由于是字典的形式,我们可以通过下列代码的格式对某对键值进行提取:

thename = itchat.search_friends(userName=msg['FromUserName'])['UserName']

为了检测与说明,我们通过下述代码将name为XXXX的信息打印出来看一看

friends_list = itchat.get_friends(update=True)
name = itchat.search_friends(name=u'XXXX')
print(name)

结果如下:

[<User: {'StarFriend': 0, 'UniFriend': 0, 'MemberCount': 0, 'ContactFlag': 1, 'HeadImgUrl': '/cgi-bin/...', 'RemarkPYQuanPin': '...', 'MemberList': <ContactList: []>, 'SnsFlag': 1, 'PYInitial': 'MRYUN', 'OwnerUin': 0, 'Sex': 0, 'Province': '', 'AppAccountFlag': 0, 'Alias': '', 'Statues': 0, 'UserName': '@d28...', 'ChatRoomId': 0, 'RemarkName': '...', 'PYQuanPin': '...', 'NickName': '...', 'EncryChatRoomId': '', 'RemarkPYInitial': '..', 'VerifyFlag': 0, 'HideInputBarFlag': 0, 'DisplayName': '', 'Signature': '', 'IsOwner': 0, 'Uin': 0, 'AttrStatus': 233509, 'City': '', 'KeyWord': ''}>]

关键的信息我已经隐去,这段像字典一样的代码就是你微通讯录里对朋友的信息的显示。UserName每次都是不同的,但是RemarkName为你备注朋友的姓名,NickName为你朋友的昵称,为了代码的持续可用性,我最后选择了RemarkName作为最后的判断标准。

更新

2018.2.28优化了代码,加入了filehelper控制程序暂停的功能。这样子跑在树莓派端,即使电脑不在身旁,也能及时控制程序暂停。

代码展示

代码请见github

posted @ 2018-02-26 00:13  MrYun  阅读(492)  评论(0编辑  收藏  举报