码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python构建企业微信智能应答机器人(含服务器部署)


    有定制化需求可私信联系

    文章目录

    • 简介
    • 基本概念
      • corpid
      • agentid和secret
      • touser
    • 安装
    • 初试
    • 获取access_token
    • 发送应用消息
    • Python高并发服务部署——Nginx+Gunicorn+gevent+Flask+Supervisor
    • 接收消息和事件
    • 参考文献

    简介

    目标是开发一个简易机器人,能接收消息并作出回复。

    开发条件如下:

    • 企业微信超级管理员权限
    • 服务器




    基本概念

    corpid

    我的企业 → 企业ID



    agentid和secret

    应用管理 → 创建应用




    touser




    安装

    pip install requests
    
    • 1




    初试

    发送消息

    import json
    import urllib.parse
    
    import requests
    
    corpid = 'wwxxxxxxxxxxxxxxxx'  # 企业ID
    corpsecret = 'pxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  # 应用Secret
    touser = 'LxxJxxxKxx'  # 接收消息的用户
    agentid = 1000001  # 应用ID
    
    base = 'https://qyapi.weixin.qq.com'
    
    # 1.请求access_token
    access_token_api = urllib.parse.urljoin(base, '/cgi-bin/gettoken')
    params = {'corpid': corpid, 'corpsecret': corpsecret}
    response = requests.get(url=access_token_api, params=params).json()
    access_token = response['access_token']
    
    # 2.发送消息
    message_send_api = urllib.parse.urljoin(base, f'/cgi-bin/message/send?access_token={access_token}')
    data = {'touser': touser, 'msgtype': 'text', 'agentid': agentid, 'text': {'content': 'Hello World!'}}
    response = requests.post(url=message_send_api, data=json.dumps(data)).json()
    
    if response['errcode'] == 0:
        print('发送成功')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25




    获取access_token

    access_token 是调用企业微信 API 的凭证

    
    
    • 1




    发送应用消息




    Python高并发服务部署——Nginx+Gunicorn+gevent+Flask+Supervisor

    服务部署具体流程点标题

    Linux 系统分两种:

    1. RedHat 系列:Redhat、Centos、Fedora 等,包管理工具是 yum
    2. Debian 系列:Debian、Ubuntu 等,包管理工具是 apt-get

    如腾讯云的 Ubuntu 服务器

    设置安全组




    接收消息和事件

    应用管理 → 点击要接收消息的应用 → 接收消息的设置API接收

    URL 后面再确定,先随机获取 Token 和 EncodingAESKey

    安装

    pip install flask
    pip install pycryptodome
    
    • 1
    • 2

    下载代码

    wget https://raw.githubusercontent.com/sbzhu/weworkapi_python/master/callback/WXBizMsgCrypt3.py
    wget https://raw.githubusercontent.com/sbzhu/weworkapi_python/master/callback/ierror.py
    
    • 1
    • 2

    编辑代码

    vim app.py
    
    • 1

    app.py

    import time
    import xml.etree.cElementTree as ET
    
    from flask import Flask, request
    
    from WXBizMsgCrypt3 import WXBizMsgCrypt
    
    sToken = 'xxxx'  # 对应上图的Token
    sEncodingAESKey = 'xxxx'  # 对应上图的EncodingAESKey
    sReceiveId = 'xxxx'  # 对应企业ID,即corpid
    wxcpt = WXBizMsgCrypt(sToken, sEncodingAESKey, sReceiveId)
    
    app = Flask(__name__)
    
    
    @app.route('/robot/', methods=['GET', 'POST'])
    def robot():
        msg_signature = request.args.get('msg_signature')  # 企业微信加密签名
        timestamp = request.args.get('timestamp')  # 时间戳
        nonce = request.args.get('nonce')  # 随机数
        echostr = request.args.get('echostr')  # 加密字符串
    
        # 验证URL有效性
        if request.method == 'GET':
            ret, sReplyEchoStr = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr)
            if ret == 0:
                return sReplyEchoStr
            else:
                return 'ERR: VerifyURL ret:' + str(ret)
    
        # 接收消息
        if request.method == 'POST':
            ret, xml_content = wxcpt.DecryptMsg(request.data, msg_signature, timestamp, nonce)
            if ret == 0:
                root = ET.fromstring(xml_content)
                print(xml_content)
                to_user_name = root.find('ToUserName').text
                from_user_name = root.find('FromUserName').text
                create_time = root.find('CreateTime').text
                msg_type = root.find('MsgType').text
                content = root.find('Content').text
                msg_id = root.find('MsgId').text
                agent_id = root.find('AgentID').text
                print(content)
                # return content
    
                # 被动回复
                create_time = timestamp = str(int(time.time()))
                content = content.replace('吗', '').replace('?', '!').replace('?', '!')
                sReplyMsg = f'<xml><ToUserName>{to_user_name}</ToUserName><FromUserName>{from_user_name}</FromUserName><CreateTime>{create_time}</CreateTime><MsgType>text</MsgType><Content>{content}</Content><MsgId>{msg_id}</MsgId><AgentID>{agent_id}</AgentID></xml>'
                ret, sEncryptMsg = wxcpt.EncryptMsg(sReplyMsg, nonce, timestamp)
                if ret == 0:
                    pass
                else:
                    return 'ERR: EncryptMsg ret: ' + str(ret)
                return sEncryptMsg
            else:
                return 'ERR: DecryptMsg ret:' + str(ret)
    
    
    if __name__ == '__main__':
        app.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    启动程序

    python app.py
    
    • 1

    Nginx 配置

    sudo vim /etc/nginx/sites-available/default
    
    • 1

    关键内容如下

    server {
        location ^~ /robot/ {
            proxy_pass http://127.0.0.1:5000/robot/;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    重载 Nginx

    sudo nginx -s reload
    
    • 1

    用接口调试工具进行调试:建立连接 → 测试回调模式

    出现成功字样后,上面的“接收消息服务器配置”点保存




    效果




    参考文献

    1. 开发前必读 - 企业微信开发者中心
    2. 获取会话内容 - 企业微信API
    3. python3-企业微信-会话内容存档-对接Linux_C_SDK-libWeWorkFinanceSdk_C.so
    4. python对接企业微信_Python对接企业微信会话内容存档功能的实践
    5. weworkapi_python GitHub
    6. wework GitHub
    7. 如何在CentOS中安装apt-get?
    8. 腾讯云Linux连接ssh失败问题
    9. Linux安装conda并创建虚拟环境
    10. uwsgi/uWSGI/WSGI简介
    11. gunicorn vs uwsgi 性能对比,以flask run为基准
    12. Flask Web开发教程(十二)生产环境部署,基于gunicorn+nginx+supervisor的方案
    13. Nginx、Gunicorn在服务器中分别起什么作用?
    14. Flask教程(十二)项目部署
    15. 配置默认主页、目录浏览 | Nginx 入门教程
    16. 基于nginx上传一个简单的Html网页到服务器,并进行访问
    17. Nginx设置子域名解析
    18. gevent Documentation
    19. Url decode UTF-8 in Python
    20. Python构建企业微信自动消息转发服务端
    21. 在线 XML 格式化 | 菜鸟工具
    22. 关于腾讯云服务器上面的Nginx域名配置
  • 相关阅读:
    VBA技术资料MF70:从单元格文本中取消或删除上标
    自定义字符串排序(791.leetcode,string)-------------------c++实现
    springboot+vue公益慈善救助审批网站系统java
    CTFSHOW 年CTF
    阿里云轻量应用服务器和ECS服务器有什么区别?超详细对比
    js单行文本溢出显示省略号时才展示el-tooltip
    【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析
    java计算机毕业设计vue教学管理系统源码+数据库+系统+lw文档
    15. 线性代数 - 克拉默法则
    有哪些视频媒体?邀请视频媒体报道活动的好处
  • 原文地址:https://blog.csdn.net/lly1122334/article/details/120792589
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号