运维微信交互机器人
前言
今年五月份参加<代码>甲骨文开发者代码>大会,在会议上看到智能AI在运维方面的应用场景;讲师现场展现了一款能够结合上下文对话的智能AI,通过聊天方式完成运维工作。
引用>会议后对该款智能AI机器人念念不忘,由于人工智能人工智能学习成本较高,寻思着是否能够写一套低配版<代码>运维交互机器人> 代码;
思考
初期期望该机器人能够:
<李>通过手机能够处理简单的故障李> <李>不智能但至少配置能够灵活变更李>
有了具体的目标,再考虑具体实现方案,主要思考几个点:
<强>应用载体强>
我期望这个<代码>载体> 代码是一款常用的手机应用;现有环境中微信企业号适合干这个事情,且官网有各种API文档,实施起来不是个什么巨大挑战。<>强安全性强>
涉及到运维平台,控制了运维平台就相当于控制了所有服务器,所以关系到运维平台的<代码>安全问题> 代码不可小窥,得确保在交互过程中的安全,在交互过程中需要加密,对不信任服务器进行策略管控。<强>灵活性强>
可以通过配置文件方式进行配置,后续随着功能模块增加可以随时进行更改,考虑到使用配置文件方式可能太过单一,花里胡哨的功能可能无法满足实现,尽量考虑又能花里胡哨,又能灵活管理配置的方案。<强>对话上下文强>
一般而言,通讯都需要一个长连接保证通信期间双方可以收发数据包;考虑到一个对话就得专门起一个线程进行通信,这样不但增加开发难度,且更消耗资源,权衡利弊后,对于上下文管理这一部分尽量选用<代码>非实时性代码>方案去做。架构
列出思考的几个关键点后,对整体的设计进行深入思考,几经思考后:
<李> <代码>
采用微信企业号> 代码作为应用载体
<李>有关于企业号的开发传送门。李>
引用> 李> <李>安全加固
<李>接口平台只放通腾讯服务器IP访问。李> <李>运维平台开放接口平台白名单访问,并且采用Python <代码> itsdangerous 代码>生成安全令牌进行通信交互。李>
引用> 李> <李>程序设计思想
<李>采用<代码>树结构代码>设计模式,每个分叉为一个功能。李> <李>这样就不必担心无法完成花里胡哨的操作,又能够灵活变更。李>
引用> 李> <李>持久化存储接收信息<李>对每个用户发送的信息进行存储,并作出快速响应。李> <李> <代码>复述,代码>对于这个场景非常适用,既能够存储信息又十分高效。李>
李引用> >架构图看起来大概是这样:
实现
接收企业号信息API代码片段展示
<代码> #引用企业微信JDK 从WXcrypt。WXBizMsgCrypt进口WXBizMsgCrypt def work_weixin_api(请求): #获取微信后参数 msg_signature=request.GET。(‘msg_signature’,”) 时间戳=request.GET。get(“时间戳”,”) 现时标志=request.GET。get(“强奸犯”,”) echostr=request.GET。(‘echostr’,”) #构造微信信息解析方法 wxcpt=WXBizMsgCrypt (WXTOKEN WXENCODINGAESKEY WXCROPID) 如果请求。方法==癙OST”: eagle_branch=request.POST。get (“eagle_branch”、“大师”) 如果eagle_branch==按笫Α? request_data=https://www.yisu.com/zixun/request.body #解析接收到的文本 ret,味精=wxcpt。DecryptMsg (request_data msg_signature、时间戳 现时标志) request_xml=ET.fromstring(味精) #获取信息内容 内容=request_xml.find。text(“内容”) #获取信息类型 msg_type=request_xml.find (“MsgType”)。text #获取发送人 from_user=request_xml.find (“FromUserName”)。text 其他:=request.POST内容。(‘内容’,”) from_user=request.POST。get (‘from_user’,”) 代码>安全令牌生成
<代码> #加密 def enc_dict (d): #加密 s=URLSafeSerializer (“1234”) 圣=s.dumps (d) #加密后再生成基于时间戳的令牌 t=TimestampSigner (“4567”) ts=t.sign (st) 返回ts微信运维交互机器人