一 环境准备
-
云服务器一台,1核2G1M带宽就行。或者企业有公网IP映射到内部主机。
-
企业内部群,需要有开发者权限。一个人可以创建测试企业。网页登录钉钉开发者后台
选择所在的企业,如无权限,找企业钉钉管理员申请。
二 方案说明
云服务器部署python flask框架,钉钉机器人收到群 艾特 消息后会发送到这个地址,云服务器根据收到的内容将对应的回答返回给钉钉机器人接口,再由机器人发布至群里。
三 创建自定义钉钉群机器人
花点时间耐心读完官方文档 企业内部机器人群聊实现@人接入指南 非常清晰,就不再赘述。不让放链接,自己检索下。有一点注意:开发管理都填写云服务IP地址,http和https都支持。云服务器要开放相关端口,企业内部主机做好端口映射。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2d23df46d633475583ff9d1aa630d420.png#pic_center)
四 服务器部署
- 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 &
也可以加入到开机启动项。