Python使用itchat库实现微信自动回复

参考

  • 手把手教你扩展个人微信号(1)
  • 手把手教你扩展个人微信号(2)
  • 微信实现图灵机器人自动回复
    以上前两篇为itchat作者写的关于原理和使用的教程,第三篇为官方提供的教程。主要参照第三篇文章实现。

代码及结果

#!/usr/bin/env python  
# encoding: utf-8  

import requests
import itchat
import time
from threading import Timer

KEY = '8edce3ce905a4c1dbb965e6b35c3834d'

def get_response(msg):
    # 构造发送给图灵机器人服务器的数据
    apiUrl = 'http://www.tuling123.com/openapi/api'
    data = {
        'key'    : KEY,
        'info'   : msg,
        'userid' : 'wechat-robot',
    }
    try:
        r = requests.post(apiUrl, data=data).json()
        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
        return r.get('text')
    # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
    # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
    except:
        # 将会返回一个None
        return

def isMsgFromMyself(msgFromUserName):
    # 检查消息发送方是否为自己
    global myName
    return myName == msgFromUserName


# 注册文本消息回复函数
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
    global autoReplyFlag,  timerSet, noReply, t  # 状态标志位
    print(msg['Text'])
    if isMsgFromMyself(msg['FromUserName']):
        print("Replied!!")
        autoReplyFlag = False
        noReply = False
        try:
            t.cancel()
            print("Timer Canceled")
            timerSet = False
        except:
            pass
        return None

    if autoReplyFlag:
           # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
        defaultReply = 'I received: ' + msg['Text']
        # 如果图灵Key出现问题,那么reply将会是None
        reply = get_response(msg['Text'])
        # a or b的意思是,如果a有内容,那么返回a,否则返回b
        # 有内容一般就是指非空或者非None,你可以用`if a: print('True')`来测试
        return reply or defaultReply
    else:
        noReply = True
        if not timerSet:
            # if time.time()-noReplyStartTime >= 120:
            print("Timer setting")
            t = Timer(12, sendBusyStatus, [msg['FromUserName']])
            t.start()
            timerSet = True

def sendBusyStatus(UserName):
    global noReply, autoReplyFlag, timerSet
    print("Timer Working!")
    if noReply:
        itchat.send("我的主人在认真地熵减!让我先陪你聊一会吧", UserName)
        autoReplyFlag = True
        timerSet = False

# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
itchat.auto_login()

autoReplyFlag, timerSet, noReply = False, False, False
t = 0  # 定义全局变量t, 用作触发器使用,此行甚是丑陋;怎么才能更优雅呢?请大神指点。
myName = itchat.get_friends(update=True)[0]['UserName']
itchat.run()

相比于原教程,此处添加了一定时间内不回复即开启自动回复的功能,大致原理是检测消息发送方,如果不是自己的话就开启就设置一个时间触发器(学到了触发器的用法),在规定时间内向对方发送消息。在这期间如果自己在手机上回复,那么就撤销触发器。整个程序的流程图如下:

Python使用itchat库实现微信自动回复_第1张图片
程序流程图

聊天截图:


Python使用itchat库实现微信自动回复_第2张图片
聊天Demo

后期可以考虑程序监听日常的聊天内容形成数据,然后利用数据训练递归神经网络以形成更加智能和个性化的回复。

你可能感兴趣的:(Python使用itchat库实现微信自动回复)