Python实现钉钉群机器人自动回复

本文介绍了如何使用云服务器和PythonFlask框架搭建一个钉钉群机器人。该机器人能响应群内的@消息,从预设的知识库中查找并回复精确的关键词,对于找不到的答案则记录在错误文件中。设置包括环境准备、创建自定义钉钉机器人、服务器部署以及代码实现和调试运行。
摘要由CSDN通过智能技术生成

一 环境准备

  • 云服务器一台,1核2G1M带宽就行。或者企业有公网IP映射到内部主机。

  • 企业内部群,需要有开发者权限。一个人可以创建测试企业。网页登录钉钉开发者后台
    选择所在的企业,如无权限,找企业钉钉管理员申请。

二 方案说明


云服务器部署python flask框架,钉钉机器人收到群 艾特 消息后会发送到这个地址,云服务器根据收到的内容将对应的回答返回给钉钉机器人接口,再由机器人发布至群里。

三 创建自定义钉钉群机器人


花点时间耐心读完官方文档 企业内部机器人群聊实现@人接入指南 非常清晰,就不再赘述。不让放链接,自己检索下。有一点注意:开发管理都填写云服务IP地址,http和https都支持。云服务器要开放相关端口,企业内部主机做好端口映射。 在这里插入图片描述

四 服务器部署

  • Python3和相基础模块的安装自行解决,windows下pycharm运行一遍就会提示你需要安装哪些模块,对应的安装到服务器就行。

服务器创建一个网站目录,需要有执行权限,目录如下:

  • main.py 执行消息接收、处理与回复(见完整代码)
  • wiki.txt 为文档库(自行编辑)
  • pic 文件夹,此文件夹存放图片,markdown支持图片,引用地址为 http://你的服务器IP地址:运行端口号/pic/1.jpg
  • error.txt 不存在的关键词会存入此处

wiki.txt 以&为分隔符,前面为问题,后面为答案,确保问题和答案在同一行。
比如,wiki.txt文档内容如下:

帮助&可用关键词有“打印机”,“无线密码”

当你再群里

@机器人 帮助

后,机器人会答复你

可用关键词有“打印机”,“无线密码”

暂时只支持精确的关键词,需要一字不差,后面有空折腾下模糊匹配。如用户@的关键词不存在,会存入error.txt

五 完整代码


都有注释,修改你的app_secret和相关端口就可以直接使用

from flask import Flask
from flask import request
from gevent import pywsgi
import hmac
import hashlib
import base64
import json
import requests

# from OpenSSL import SSL  使用https需要取消这二行注释并安装相应模块
# from flask_sslify import SSLify

app = Flask(__name__,static_folder='pic') # markdown支持图片,可以将图片放入网站目录下pic文件夹内

# sslify = SSLify(app) 使用https需要取消这二行注释并安装相应模块
# context = 'adhoc'

@app.route('/')
def index():
    return '<h1>网站升级维护中,敬请期待!</h1>'   #云服务器80端口可用,浏览器打开会显示维护页面。

# 消息数字签名计算核对
def check_sig(timestamp):
    app_secret = 'sdgdh32dzdc33DVDVCSa455566672'  # 此处填写你的机器人应用信息
    app_secret_enc = app_secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, app_secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = base64.b64encode(hmac_code).decode('utf-8')
    return sign

# 发送markdown消息,只配置了消息内容,at参数可以@发消息的人,其他参数参考官方文档。也支持text和卡片消息等。
def send_msg(message, webhook_url):
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": 'a',
            "text": message
        },
        '''
        "msgtype": "text",
        "text": {
            "content": message
        },
        '''
        "at": {
            "atUserIds": [
                ''
            ],
        }
    }
    # 利用requests发送post请求
    req = requests.post(webhook_url, json=data)

# 处理自动回复消息
def handle_info(req_data):
    # 解析用户发送消息 通讯webhook_url
    print(req_data)
    text_info = req_data['text']['content'].strip()
    webhook_url = req_data['sessionWebhook']
    # senderid = req_data['senderStaffId']
    dict1 = {}
    with open('wiki.txt', 'r', encoding='UTF8') as f:
        res = f.readlines()
        for i in res:
            list = str.split(i, '&')
            dict1[list[0]] = list[1]
        print(dict1.keys())
    if text_info in dict1.keys():
        # 调用函数,发送markdown消息
        mes = dict1[text_info]
        print('收到的信息是'+mes)
        send_msg(mes, webhook_url)
    # 不存在关键词则写入文件
    else:
        print('没有找到关键词')
        with open('error.txt', 'a', encoding='UTF8') as f:
            f.write(text_info)
            f.write('\n')
            f.close()
        send_msg('我还没有学会这个知识,回复 帮助 查看可用关键词', webhook_url)

@app.route("/", methods=["POST"])
def get_data():
    # 第一步验证:是否是post请求
    if request.method == "POST":
        print(request.headers)
        # 签名验证 获取headers中的Timestamp和Sign
        timestamp = request.headers.get('Timestamp')
        sign = request.headers.get('Sign')
        print(timestamp)
        print("原始数据是" + sign)
        a = check_sig(timestamp)
        print('校验结果是' + a)
        # 第二步验证:签名是否有效
        if check_sig(timestamp) == sign:
            # 获取数据
            req_data = json.loads(str(request.data, 'utf-8'))
            handle_info(req_data)
            print('验证通过')
        else:
            print('验证不通过')
        return str(timestamp)
    print('收到请求')
    return str(request.headers)

if __name__ == '__main__':
    # 使用https需要取消下面二行注释,并安装相应模块,别忘记注释http的内容。https为测试,暂时未更新使用wsgi模块。
    # app.run(host='0.0.0.0', port=8888,ssl_context=context,debug=True)
    # app.run(host='0.0.0.0', port=8888)
    # 使用http,指定host和运行port
    server = pywsgi.WSGIServer(('0.0.0.0', 12345), app)
    server.serve_forever()

六 调试运行


网站目录下直接运行,python3 main.py 此方法断开ssh会话也会中断当前命令。你@机器人后屏幕会有一些输出信息方便观察是否正确,测试都正常后,使用以下命令后台运行,

nohup python3 -u main.py > out.log 2>&1 &

也可以加入到开机启动项。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值