Python微信公衆號接入圖靈機器人

微信公衆號配置


網上大部分都是用itchat插件。微信公衆號官網上的代碼複製下來格式會亂掉。對於python這樣嚴格依賴格式的語言簡直是噩夢。這裏沒有使用itchat,而是使用request直接post請求圖靈api

微信公衆平臺

後臺配置
 

後臺配置

Python配置

[官方文檔]


安裝依賴庫:


1、[Python2.7] python3版本的web.py有一些bug,無法使用。安裝完以後配置環境變量。用pip安裝依賴庫

pip install web.py
pip install hashlib
pip install time
pip install requests

 

主入口:Main.py

 

# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle  #引入Handle.py模塊,這個模塊在之後寫。

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

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()


處理文件:Handle.py

 

# -*- coding=utf-8 -*-
import hashlib
import reply
import receive
import web
import robot #robot.py在之後寫即可
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 = "微信公衆號上的token值"

   list = [token, timestamp, nonce]
   list.sort()
   sha1 = hashlib.sha1()
   map(sha1.update, list)
   hashcode = sha1.hexdigest()
   if hashcode == signature:
    return echostr
   else:
    return ""
  except Exception as Argument:
   return Argument
 def POST(self):
        try:
            webData = web.data()
            print("Handle Post webdata is ", webData)
            recMsg=receive.parse_xml(webData)
            if isinstance(recMsg, receive.Msg):
                toUser = recMsg.FromUserName
                fromUser = recMsg.ToUserName
                if recMsg.MsgType=='text':
                    content = recMsg.Content
                    rpyMsg= robot.get_response(content)
                    print rpyMsg
                    replyMsg = reply.TextMsg(toUser, fromUser,rpyMsg)
                    return replyMsg.send()
                if recMsg.MsgType == 'image':
                    mediaId = recMsg.MediaId
                    replyMsg = reply.ImageMsg(toUser, fromUser, mediaId)
                    return replyMsg.send()
            else:
                print("none handler yet")
                return "success"
        except Exception as Argument:
            print Argment
            return "fail"

回覆接口:reply.py

# -*- coding=utf-8 -*-
import time
class Msg(object):
    def __init__(self):
        pass
    def send(self):
        return "success"
class TextMsg(Msg):
    def __init__(self, toUserName, fromUserName, content):
        self.__dict = dict()
        self.__dict['ToUserName'] = toUserName
        self.__dict['FromUserName'] = fromUserName
        self.__dict['CreateTime'] = int(time.time())
        self.__dict['Content'] = content
    def send(self):
        XmlForm = """
        <xml>
        <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
        <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
        <CreateTime>{CreateTime}</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[{Content}]]></Content>
        </xml>
        """
        return XmlForm.format(**self.__dict)
class ImageMsg(Msg):
    def __init__(self, toUserName, fromUserName, mediaId):
        self.__dict = dict()
        self.__dict['ToUserName'] = toUserName
        self.__dict['FromUserName'] = fromUserName
        self.__dict['CreateTime'] = int(time.time())
        self.__dict['MediaId'] = mediaId
    def send(self):
        XmlForm = """
        <xml>
        <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
        <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
        <CreateTime>{CreateTime}</CreateTime>
        <MsgType><![CDATA[image]]></MsgType>
        <Image>
        <MediaId><![CDATA[{MediaId}]]></MediaId>
        </Image>
        </xml>
        """
        return XmlForm.format(**self.__dict)

註冊免費的小機器人

在[圖靈機器人官網](http://www.tuling123.com)註冊自己的小機器人,並記住你的apikey
 

圖靈機器人apikey

 請求圖靈機器人api接口:robot.py

# -*- coding=utf-8 -*-
import requests

KEY = "圖靈機器人官網的apikey"

def get_response(msg):
    apiUrl = 'http://www.tuling123.com/openapi/api'
    data = {
        'key'    : KEY,
        'info'   : msg,
        'userid' : '機器人名',
    }
    try:
        r = requests.post(apiUrl, data=data).json()
        return r.get('text').encode("utf-8")
    except:
        return msg
    return msg

最後,運行主入口

python main.py 


效果測試:

個人微信公衆號:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章