Python使用itchat庫實現(xiàn)微信自動回復(fù)

參考

代碼及結(jié)果

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

import requests
import itchat
import time
from threading import Timer

KEY = '8edce3ce905a4c1dbb965e6b35c3834d'

def get_response(msg):
    # 構(gòu)造發(fā)送給圖靈機器人服務(wù)器的數(shù)據(jù)
    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')
    # 為了防止服務(wù)器沒有正常響應(yīng)導(dǎo)致程序異常退出,這里用try-except捕獲了異常
    # 如果服務(wù)器沒能正常交互(返回非json或無法連接),那么就會進(jìn)入下面的return
    except:
        # 將會返回一個None
        return

def isMsgFromMyself(msgFromUserName):
    # 檢查消息發(fā)送方是否為自己
    global myName
    return myName == msgFromUserName


# 注冊文本消息回復(fù)函數(shù)
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
    global autoReplyFlag,  timerSet, noReply, t  # 狀態(tài)標(biāo)志位
    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出現(xiàn)問題的時候仍舊可以回復(fù),這里設(shè)置一個默認(rèn)回復(fù)
        defaultReply = 'I received: ' + msg['Text']
        # 如果圖靈Key出現(xiàn)問題,那么reply將會是None
        reply = get_response(msg['Text'])
        # a or b的意思是,如果a有內(nèi)容,那么返回a,否則返回b
        # 有內(nèi)容一般就是指非空或者非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("我的主人在認(rèn)真地熵減!讓我先陪你聊一會吧", UserName)
        autoReplyFlag = True
        timerSet = False

# 為了讓實驗過程更加方便(修改程序不用多次掃碼),我們使用熱啟動
itchat.auto_login()

autoReplyFlag, timerSet, noReply = False, False, False
t = 0  # 定義全局變量t, 用作觸發(fā)器使用,此行甚是丑陋;怎么才能更優(yōu)雅呢?請大神指點。
myName = itchat.get_friends(update=True)[0]['UserName']
itchat.run()

相比于原教程,此處添加了一定時間內(nèi)不回復(fù)即開啟自動回復(fù)的功能,大致原理是檢測消息發(fā)送方,如果不是自己的話就開啟就設(shè)置一個時間觸發(fā)器(學(xué)到了觸發(fā)器的用法),在規(guī)定時間內(nèi)向?qū)Ψ桨l(fā)送消息。在這期間如果自己在手機上回復(fù),那么就撤銷觸發(fā)器。整個程序的流程圖如下:

程序流程圖

聊天截圖:


聊天Demo

后期可以考慮程序監(jiān)聽日常的聊天內(nèi)容形成數(shù)據(jù),然后利用數(shù)據(jù)訓(xùn)練遞歸神經(jīng)網(wǎng)絡(luò)以形成更加智能和個性化的回復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容