大概有这样的需求
明白这样的需求后就去 官网 找文档去了。
其实官网文档说的很清楚了。没啥需要补充的。
使用Flash启动
主要逻辑代码
from flask import Flask
# http://flask.pocoo.org/docs/0.12/api/#flask.Flask
app = Flask(__name__)
@app.route('/HelloWorld')
def hello_world():
return "Hello World!"
if __name__ == "__main__":
# http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application
app.run(host='0.0.0.0', port='5000')
用python开启flask web服务时,
也可以这样的方式来启动
if __name__ == "__main__":
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 8083))
server_socket.listen(120)
while True:
client_socket, client_address = server_socket.accept()
handle_client_process = Process(target=handle_client, args=(client_socket,))
handle_client_process.start()
client_socket.close()
然后去实现handle_client 就好了。篇幅有限。完整的代码关注公众号 罗尔街 即可获取
流程
选择 自定义机器人
然后配置其中一种安全方式即可
得到webhook地址。
也可以先构建一个curl来测试一下
curl 'https://oapi.dingtalk.com/robot/send?access_token=381c2f405e0f906fd556b27cea9f66864120860b5d8b117bb046e10b6599b050×tamp=1613211530113&secret=SEC2e67120c5e4affa1177ac25fe8dc77ba1c5b49284a9dc7e1888770bc3b76b1fc' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content": "test"}}'
主要逻辑代码
import base64
import hashlib
import hmac
import json
import time
import urllib
import urllib.parse
import requests
def sign():
timestamp = str(round(time.time() * 1000))
secret = "SECe5d17dac6060b76c01ea60aec260fe76c6e0644394b932bfffa963342bb630a1"
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign_res = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign_res
def send_ding_message(text_info):
webhook = "https://oapi.dingtalk.com/robot/send?access_token=f069339ad1fcb9410d0e96fd947d9a2bf3416451d01dc97e3ef4256c1fdb2b7a"
header = {
"Content-Type": "application/json",
"Charset": "UTF-8"
}
text = text_info
message = {
"msgtype": "text",
"text": {
"content": text
},
"at": {
# "isAtAll": False
# "atMobiles": [
# "18512345678"
# ]
"atUserIds": [
"lbkgv8q"
]
}
}
message_json = json.dumps(message)
timestamp, sign_res = sign()
webhook += "×tamp=" + timestamp + "&sign=" + sign_res
info = requests.post(url=webhook, data=message_json, headers=header)
def usage():
send_ding_message('test 1')
if __name__ == "__main__":
usage()
效果
按照链接先添加就好了
既然是需要钉钉回调我们服务的 ,所以要校验token、sign的合法性
timestamp = request.headers.get('Timestamp')
sign = request.headers.get('Sign')
if sign(timestamp) == sign:
生成规则,官方给了示例
def sign():
timestamp = str(round(time.time() * 1000))
secret = "SECe5d17dac6060b76c01ea60aec260fe76c6e0644394b932bfffa963342bb630a1"
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign_res = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign_res
当然也可以用ip段来做安全的校验
如果是企业内部网络、并非是公网,则需要用内网穿透。官方也给了示例,这里就不再重复了。