利用itchat库,使用python脚本对微信消息监听,提取转账信息进行处理
昨天一个朋友提出了一个问题,他业务上有好多微信转账,需要实时统计并转发给相关部门(我的天,又是相关部门),于是我们就一起做这个功能,之所以敢拿出来,就是因为太简单了,大家可以一学就会的那种。
前导知识:itchat、re(正则表达式)、time 这里面包含的链接都是比较好的博客和教程,大家不熟悉可以补一下前导知识
这个小功能主要点在于如何获取微信转账的信息,以及如何从信息中读出这是这时转账还是收款,是谁给谁的。
通过查看微信的转账消息,微信定义的类型是note(通知)类型,其中里面有个paysubtype参数,当这条转账消息是A发给B,则在B的消息类型中paysubtype=3,则在A中paysubtype=1,如此说来转账消息的发送是paysubtype=1,接收是paysubtype=3。这样依赖就好办了…
但是为什么上面不说是转账,而是说的是转账消息,因为你收钱的时候也会产生一条消息,其中paysubtype=1,也就是说转账消息是发送的,我的天,这不是成我给别人转账了吗?
同时限制了接收人必须是自己,那么关系就理清了
转账消息的提取就是这样子了,接下来是消息发送格式:
付款人:XXX 时间:2017/3/9 19:54:23 金额:xx.xx元 付款说明:其实是转账说明
提取好友名字(备注名(RemarkName)优先,昵称(NickName)其次) 时间解析 提取转账金额 提取付款说明。这些都跟提取好友名字一样简单,甚至更简单,这就是正则式的强大
登录方式上,设置了hotreload短时间掉线可以重连而不用扫码(我朋友测试说两分钟…),设置命令行显示二维码,可以在树莓派等机器上挂着,或者手机上部署个linux挂着。
代码存档:
import re import time import itchat from itchat.content import * # 定义为全局 方便修改 money_receiver = "" mycount = "" @itchat.msg_register([NOTE]) def text_reply(msg): pay_type = 0 pay_type = re.search(".*\<paysubtype\>(.*?)\<\/paysubtype\>.*", msg['Content']).group(1) touser = itchat.search_friends(userName=msg['ToUserName']) # 这里必须得改成你的微信昵称,用于判断是别人给你转的钱 # pay_type是交易类型:1是发送 3是接收 if touser['NickName'] == mycount and int(pay_type) == 1: # 获取时间,异常处理 try: mytime = time.localtime() # 这儿获取的是本地时间 money_time = mytime.tm_year.__str__() + "/" + mytime.tm_mon.__str__() + "/" + mytime.tm_mday.__str__() + " " + mytime.tm_hour.__str__() + ":" + mytime.tm_min.__str__() + ":" + mytime.tm_sec.__str__() except: None if money_time is None: money_time = r"读取时间失败,请手动查询" # 获取转账人 转账金额 temp_name = itchat.search_friends(userName=msg['FromUserName']) if temp_name['RemarkName'] is not None: # 备注名优先 money_friend = temp_name['RemarkName'] elif temp_name['NickName'] is not None: # 昵称其次 money_friend = temp_name['NickName'] else: money_friend = r"" try: money_count = re.search(r"(.*?)向你转账(.*?)元", msg['Text']).group(2) except: None if money_friend is None: money_friend = r"读取转账人失败,请手动查询" if money_count is None: money_count = r"读取转账金额失败,请手动查询" # 获取转账说明 try: money_detial = re.search(".*\<pay_memo\>\<!\[CDATA\[(.*?)\]\].*", msg['Content']).group(1) except: None if money_detial is None: money_detial = r"无" try: msg_backup = r"付款人:%s 时间:%s 金额:%s元 付款说明:%s" % ( money_friend.__str__(), money_time.__str__(), money_count.__str__(), money_detial.__str__()) itchat.send(r"付款人:%s " r"时间:%s " r"金额:%s元 " r"付款说明:%s" % ( money_friend.__str__(), money_time.__str__(), money_count.__str__(), money_detial.__str__()), toUserName=money_receiver) except: #若消息发送失败,尝试将失败消息发送到文件助手,并输出到控制台 itchat.send(r"消息发送失败:" + msg_backup, toUserName='filehelper') print(r"消息发送失败:" + msg_backup) if __name__ == '__main__': # 设置接收人 必须是微信号,如果是写死的可以在这儿实现 # 并且全局变量和主函数里的变量要注释掉 # money_receiver = 'filehelper' # mycount="假装有count" money_receiver = input(r"请输入转账信息接收人(e.x.zookeeper_01)>") mycount = input(r"请输入收款主体账号昵称(e.x.壳子)>") # 白底黑字为-1 黑底白字为1 # 树莓派设为2 win10设为1 大家自己测试 # 控制台不关,可以一直运行 itchat.auto_login(hotReload=True, enableCmdQR=1) itchat.run()