[R.M.C] 用python实现微信控制电脑端虾米音乐(2)

接上篇 用python实现微信控制电脑端虾米音乐(1)

上一篇介绍了准备工作,以及企业微信的连接。这次我们来试试让SAE接收微信用户发送的信息,做一个简单的echo程序,即回复用户发送的内容。

先简单说一下流程,当企业微信收到用户发送的消息以后,会将消息本身进行AES加密再POST到我们设置好的SAE应用的URL上。

我们首先在SAE应用的根目录下创建一个templates的文件夹,并在里面创建一个reply_text.xml

$def with (toUser,fromUser,createTime,content,msgid)
<xml>
   <ToUserName><![CDATA[$toUser]]></ToUserName>
   <FromUserName><![CDATA[$fromUser]]></FromUserName> 
   <CreateTime>$createTime</CreateTime>
   <MsgType><![CDATA[text]]></MsgType>
   <Content>$content</Content>
   <MsgId>$msgid</MsgId>
   <AgentID>1000005</AgentID>
</xml>

注意,把最后的AgentID改成你的AgentID。这个文件是回复信息时的模板。

我们来继续编辑SAE上我们之前创建的weixinInterface.py这个文件。上一次,我们只给它写了个GET方法,这个方法是当我们对SAE应用URL使用GET方法访问时会自动调用的方法。这次由于消息接收是使用POST方法传递的,所以我们这里定义一个POST方法。

def POST(self):
    # 获取URL参数
    params = web.input()

    # 获取POST的数据
    data = web.data()


    signature = params.msg_signature
    timestamp = params.timestamp
    nonce = params.nonce

    # 解密消息
    ret, msg = self.wxcpt.DecryptMsg(data, signature, timestamp, nonce)
    if ret != 0:
        print "ERR: DecryptMsg ret: " + str(ret)
        return ''
    # 这里使用print可以用来当做记录日志,也能用来Debug
    # 在SAE的日志中心的错误日志中可以看到print的内容

    xml = etree.fromstring(msg)  # 进行XML解析
    content = xml.find("Content").text  # 获得用户所输入的内容
    msgType = xml.find("MsgType").text
    fromUser = xml.find("FromUserName").text
    toUser = xml.find("ToUserName").text
    msgid = xml.find("MsgId").text

    # 使用模版产生response的内容,我们这里将toUser和fromUser反过来填写,将消息回复给发送的用户
    msg_xml = self.render.reply_text(fromUser, toUser, timestamp, content, msgid, AGENTID_RMC)
    # 将产生的数据加密
    ret, encryptmsg = self.wxcpt.EncryptMsg(str(msg_xml), nonce, timestamp)
    if ret != 0:
        print "ERR: EncryptMsg ret: " + str(ret)
        return ''
    # 将加密的数据返回给用户
    return encryptmsg

在微信上给应用发送一个消息来测试一下吧~

PS:再说一下调试的技巧,如果发送消息过去,并没有消息回复回来不要着急,很可能是代码哪里错了。我们可以在SAE的日志中心里查看错误日志,我们每发一次消息,代码就会运行一次,如果有错误产生,可以在错误日志中看到,所以每改一次代码,保存后,在微信上发送一条消息,然后刷新一下错误日志,可以帮助我们debug喔,是不是很棒棒(๑•̀ㅂ•́)و✧

错误日志如下:

用python实现微信控制电脑端虾米音乐(3)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据