微信转账实时统计并转发信息保存

利用itchat库,使用python脚本对微信消息监听,提取转账信息进行处理


昨天一个朋友提出了一个问题,他业务上有好多微信转账,需要实时统计并转发给相关部门(我的天,又是相关部门),于是我们就一起做这个功能,之所以敢拿出来,就是因为太简单了,大家可以一学就会的那种。

前导知识:itchatre正则表达式)、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()

发表评论

电子邮件地址不会被公开。 必填项已用*标注