API是个好东西,特别是restful API是个好东西,我不是开发也就不展开讲了,我喜欢新的东西,也喜欢捯饬新的东西,最好是别人没写过的,如果都写了也就没啥意思了~~~

    

    好吧,进入正题。我想达到下面的效果,微信公众号已经变成生活的一部分了~

wKioL1bkMvXxTJ7TAADzmHEAiOI989.png

通过一些自定义的指令,通过发送微信的方式,直接以文本的格式回复得到我们需要的消息

注:因为这是本人用的没有认证的个人公众号的问题,所以不能很方便的通过接口上传图片,所以上面也就简单的显示了文本的自动回复方式,为毛不用公司企业号?因为我们公司走流程太麻烦了T_T这里就自动回复随便用~~~

  如果你是企业号或者认证了的公众号,理论上权限多的不要要的~~~

首先是微信公众号的申请~

  略。。。

再是web框架的选取,这里用的python的flask,好用的不要不要的

  因为其简单。

    

第一步简答的微信后台认证

wKiom1bkMwCjQmXqAABR2D4Hbuw073.png

  进入登录后台--->开发-->基本配置--->修改配置


配置好url地址,以及令牌,加密秘钥自动生成即可,加密机密选择兼容。

但是怎么配置url地址,以及怎么让微信回调呢?大家可以百度一下,这里直接给出代码。

#coding:utf-8
from flask import Flask,render_template,request,make_response
import time
import hashlib
app = Flask(__name__)
app.debug = True
@app.route("/wechat",methods = ["GET","POST"])
def wechat_auth():
    if request.method == 'GET':  
        if len(request.args) > 3:
            token = '你的令牌Token' 
            query = request.args  
            signature = query['signature'] 
            timestamp = query['timestamp'] 
            nonce = query['nonce']  
            echostr = query['echostr'] 
            s = [timestamp, nonce, token]  
            s.sort()  
            s = ''.join(s)
        sha1str = hashlib.sha1(s).hexdigest()
        if sha1str == signature:
            return make_response(echostr)
            else:
            return make_response("认证失败")
        else:
            return "认证失败"

微信会通过GET的方式来验证是否可用。

熟悉web.py的可参考:http://my.oschina.net/yangyanxing/blog/159215

熟悉flask的可参考:http://blog.csdn.net/linhan8/article/details/8746110

上面的代码,能够让你通过验证,验证之后你就可以启用了~~


但是现在是没什么用的,因为通过验证只是第一步嘛,我们要的是自动回复特定的信息。

注:这里只讲文本回复,语音,图文之类的需要参考微信开发文档。

首先是最简单的,发送过来什么消息,我们原样回复过去。

在上面的基础上,变成如下内容

#coding:utf-8
from flask import Flask,render_template,request,make_response
import time
import hashlib
import xml.etree.ElementTree as ET
app = Flask(__name__)
@app.route("/wechat2",methods = ["GET","POST"])
def wechat_auth():
    if request.method == 'GET':  
        if len(request.args) > 3:
            token = 'youerning' 
            query = request.args  
            signature = query['signature'] 
            timestamp = query['timestamp'] 
            nonce = query['nonce']  
            echostr = query['echostr'] 
            s = [timestamp, nonce, token]  
            s.sort()  
            s = ''.join(s)
        sha1str = hashlib.sha1(s).hexdigest()
        if sha1str == signature:
            return make_response(echostr)
            else:
            return make_response("认证失败")
        else:
            return "认证失败"
    else:
        rec = request.stream.read()
        xml_rec = ET.fromstring(rec)
        to_user = xml_rec.find("ToUserName").text
        from_user = xml_rec.find("FromUserName").text
        content  = xml_rec.find("Content").text
        xml_rep = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>"
        response = make_response(xml_rep % (from_user,to_user,str(int(time.time())),content))
        response.content_type = "application/xml"
        return response

  好吧~~其实,上面的代码其实基本上copy的,因为上面推荐的文章讲的够清晰了,我没必要狗尾续貂了。

  如果上面一切正常,那么你研究下面的内容了,我们需要一个API,有一篇写的不错,关于restful APi的文章,如下

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

  要完成一套的,我们必须要有一个中心,这个中心囊括一切可囊括的资源,监控,管理,日志上面的。通过这个中心,提供一个API可以让其他部分调取。。。

  所以上面的代码,我们要修改回复的内容就是content变量对应的内容。

所以,在将salt,zabbix,elk部分在分别封装成模块以便导入,那么这个中心就差不多了,至少一部分差不多了我也没写完,而不成熟的zabbix那一部分其实在上一篇文章已经说过了,这里就不重复了~~~

  后记:我说我我要写一个运维APP来着,但是那只是一个APP,我们要的应该是运维的一套,而这一套是基于一个中心的,这个中心我暂时认为是一个强大的API,通过这个API 我能够获取各个平台的聚合的资源,比如监控资源,日志资源,控制资源,权限资源等等。。。资源池的这个词真是太妙了,大的框架,大的项目总有资源池这样的一个概念,希望笔者后面能做成这个池子~~~有了这个池子,不管是做运维平台还是运维APP都是水到渠成的事了,好吧~~~~吹牛的一篇文章