微信运维交互机器人

  

运维微信交互机器人

  

前言

  
  

今年五月份参加<代码>甲骨文开发者大会,在会议上看到智能AI在运维方面的应用场景;讲师现场展现了一款能够结合上下文对话的智能AI,通过聊天方式完成运维工作。

     

会议后对该款智能AI机器人念念不忘,由于人工智能人工智能学习成本较高,寻思着是否能够写一套低配版<代码>运维交互机器人>   

思考

  

初期期望该机器人能够:

  
      <李>通过手机能够处理简单的故障李   <李>不智能但至少配置能够灵活变更李   
  

有了具体的目标,再考虑具体实现方案,主要思考几个点:

  

<强>应用载体
我期望这个<代码>载体>   

<>强安全性
涉及到运维平台,控制了运维平台就相当于控制了所有服务器,所以关系到运维平台的<代码>安全问题>   

<强>灵活性
可以通过配置文件方式进行配置,后续随着功能模块增加可以随时进行更改,考虑到使用配置文件方式可能太过单一,花里胡哨的功能可能无法满足实现,尽量考虑又能花里胡哨,又能灵活管理配置的方案。

  

<强>对话上下文
一般而言,通讯都需要一个长连接保证通信期间双方可以收发数据包;考虑到一个对话就得专门起一个线程进行通信,这样不但增加开发难度,且更消耗资源,权衡利弊后,对于上下文管理这一部分尽量选用<代码>非实时性方案去做。

  

架构

  

列出思考的几个关键点后,对整体的设计进行深入思考,几经思考后:

  
      <李>   <代码>

    采用微信企业号>   

      
        <李>有关于企业号的开发传送门。   
         李   <李>   

    安全加固

      
      
        <李>接口平台只放通腾讯服务器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 

微信运维交互机器人