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或者怎麼怎麼自己寫語料庫啥的了。。繼續學習。。未完待續,歡迎大家一起討論學習。
附上最新的測試公眾號,後面會一步一步完善各項功能~請各位大佬指教