1. 程式人生 > >python3+伺服器+微信公眾號的聊天機器人

python3+伺服器+微信公眾號的聊天機器人

    寫在最前:假期想稍微自學一下python語言,在課程中實現了聊天機器人,但是那時候是從網上找的原始碼,這次想要自己一句一句試試編碼。為了利於互動,希望基於微信平臺進行開發,但是用自己的微信賬號害怕發出去奇怪的東西,現在微信都要基於手機號,小號也用不了,所以希望通過微信公眾號實現與聊天機器人的對話,廢話就到這裡~

    一,編譯環境

     這次開發我是基於python3.6 因為我一直喜歡用最新版的東西。。強迫症傷不起。。寫到一半才發現。。很多東西真的用python2.x比較好,,但是用都用了。。硬著頭皮寫下去。。

      在網上搜了很多資料,很多原始碼,大牛教程都是基於新浪sae作為後臺。。但是那個我不懂。。之前畢設有接觸過阿里雲伺服器,9.9半年,一年學生價也就120不到,還是可以接受的,,所以我就自以為是的繼續用了阿里雲伺服器作為後臺。

      首先,申請伺服器、公眾號什麼的就不說了,然後我選的是window下的系統,因為習慣..當然了也選了我可以選的最新版2012...在伺服器上安裝python3.6,安裝web.py,這部分程式碼基本上都是參考大牛教程,將幾個大佬的程式碼整合起來,然後只是把他們從python2.x移植到python3也能跑起來。

        註明:在python3下,pip install web.py不成果,版本不一樣

                   需要用pip install web.py==0.40.dev0,

                  然後,千萬別忘了去伺服器控制檯,通過安全規則把80埠放出來,因為微信公眾號發的xml包需要的url必須要80埠

      現在為驗證token成功,現在環境只需要web框架,暫時不牽扯到別的框架

     二,程式碼開發

    1,新建main.py檔案,程式主體執行語言:

import web
from handle import Handle

urls = (
    '/wx', 'Handle',
)

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()
     2,新建handle.py,這部分是程式反應的主要程式碼,當伺服器接受到指定get請求後,進行反饋的內容
import hashlib
import web




class Handle(object):
    def GET(self):
        try:
            data = web.input()
            if len(data) == 0:
                return "hello, this is handle view"
            signature = data.signature
            timestamp = data.timestamp
            nonce = data.nonce
            echostr = data.echostr
            token = "gzh2018"  # 請按照公眾平臺官網\基本配置中資訊填寫
            list1 = [token,timestamp,nonce]
            list1.sort()
            str_list1 = ''.join(list1)
            print(str_list1)
            sha1 = hashlib.sha1()
            sha1.update(str_list1.encode('utf-8'))
            hashcode = sha1.hexdigest()
            print("handle/GET func: hashcode, signature: ", hashcode, signature)
            if hashcode == signature:
                return echostr
            else:
                return ""
        except Exception as Argument:
            return Argument

        說一下這邊因為是python3的一點坑。。首先是因為list,python3 和python2 hashlib同樣的程式碼 sha1 結果不一樣

        原來教程裡的程式碼是map(sha1.update,list),但是因為在python2中map返回list,python3中map返回的則是迭代器。所以sha1加密的是一個空值,當然token怎麼驗證都不會通過的。。。所以我用以下方法實現,把排序好的list1,通過 ''.join(list1)拼接成字串,然後再sha1,就正確啦

       程式執行:

                通過cmd命令列,python main.py 80進行執行,因為要指定80埠

    三,測試回覆使用者傳送

             微信公眾號連線好了,那麼下面當然是怎麼和使用者互動啦,首先最基礎的就是怎麼獲取到使用者的資訊,怎麼將想要回復的值回覆給使用者,這裡需要用到一個小知識點~模板,Templetor: web.py 模板系統

              web.py 的模板語言叫做 Templetor,它能負責將 python 的強大功能傳遞給模板系統。

               這樣我們就可以直接把值賦給模板然後返回給使用者啦

               微信客戶端訊息回覆模板:

$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>
              獲取使用者傳送,並返回給使用者函式,只要新增在handle.py後即可
       def POST(self):
        str_xml = web.data()  # 獲得post來的資料
        xml = etree.fromstring(str_xml)  # 進行XML解析
        msgType = xml.find("MsgType").text
        fromUser = xml.find("FromUserName").text
        toUser = xml.find("ToUserName").text
        if msgType == 'text':
            content = "各部門注意這是一個測試而已,我只能告訴你你剛才傳送的是:"+ xml.find("Content").text
            render = web.template.render('templates/')
            return render.reply_text(fromUser, toUser, int(time.time()), content)
        elif msgType == 'image':
            pass
        else:
            pass
            現在基本功能就這樣啦,下面就是怎麼呼叫圖靈機器人等api或者怎麼怎麼自己寫語料庫啥的了。。繼續學習。。未完待續,歡迎大家一起討論學習。

             附上最新的測試公眾號,後面會一步一步完善各項功能~請各位大佬指教