python+tornado实现微信公众平台与服务器交互

在写完 监控自动化碎碎念 后 ,在网上有找手机APP平台与服务器进行交互的相关资料 。而目前使用人数较多的手机APP里 ,同时官方提供API较好的只有微信和易信 。易信的相关资料相对少些,毕竟平台没有微信大 。在查找通过微信与服务器之间进行交互时,有幸看到了如下的一篇内容,现摘录过来。

具体实现的效果:

weixin-robot

python实现的代码如下:

# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
import hashlib
import commands
import xml.etree.ElementTree as ET
import time
def checksignature(signature, timestamp, nonce):
    args = []
    args.append('Your Token') ####这里输入你的Token
    args.append(timestamp)
    args.append(nonce)
    args.sort()
    mysig = hashlib.sha1(''.join(args)).hexdigest()
    return mysig == signature
class MainHandler(tornado.web.RequestHandler):
    def get(self):    ########验证时用
        signature = self.get_argument('signature')
        timestamp = self.get_argument('timestamp')
        nonce = self.get_argument('nonce')
        echostr = self.get_argument('echostr')
        if checksignature(signature, timestamp, nonce):
            self.write(echostr)
        else:
            self.write('fail')
    def post(self): #######简单接收和发送消息
        body = self.request.body
        data = ET.fromstring(body)
        tousername = data.find('ToUserName').text
        fromusername = data.find('FromUserName').text
        createtime = data.find('CreateTime').text
        msgtype = data.find('MsgType').text
        content = data.find('Content').text
        msgid = data.find('MsgId').text
        #print 'fromusername: %s' % fromusername
        #print 'tousername: %s' % tousername
        #print 'createtime: %s' % createtime
        #print 'msgtype: %s' % msgtype
        #print 'msgid: %s' % msgid
        if content.strip() in ('ls','pwd','w','uptime'):
            result = commands.getoutput(content)
        else:
            result = '不可以哦!!!'
        textTpl = """<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            </xml>"""
        out = textTpl % (fromusername, tousername, str(int(time.time())), msgtype, result)
        self.write(out)
application = tornado.web.Application([
    (r"/", MainHandler),
])
if __name__ == "__main__":
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()

这里实现的功能有点类似于webshell ,不过功能相对较弱,同时对安全认证块上也没有认证 。虽然看上去有点鸡肋,不过提供了一种思路。据从业内的了解上看,已经有很多公司确实在告警上实现了微信接口,不过仅仅只是做通知,并不做查询。

发表回复

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