Python用钉钉机器人发送消息并艾特多人

您所在的位置:网站首页 钉钉怎么发信息给某个人 Python用钉钉机器人发送消息并艾特多人

Python用钉钉机器人发送消息并艾特多人

2024-03-31 09:09| 来源: 网络整理| 查看: 265

继续水文章。今天主要是吐槽一下钉钉的接口文档

前几天碰见个需求: 从jira接口查出每日未完成的任务用钉钉机器人把任务发送到钉钉工作群里,并标注是谁的任务、任务标题发送时,艾特对应的人员给每个人创建待办任务每天定时18:00触发 在这里插入图片描述

刚听到这需求,感觉是个小case,应该不麻烦。但是实操过程中,坑了我一把。今天记录一下遇到的问题。(涉及工作上的事儿,就不附全部源码了,就拿部分源码用以说明问题)

为啥说坑呢?其实主要是钉钉的官方api写的含糊不清、概念繁杂、重要的细节不讲清楚,得让你一个一个的去实,看看ta到底支持不支持。

下面是步骤: 1、编写jira查询的公共方法。略 2、编写钉钉机器人发送消息的公共方法

(钉钉支持多种格式的消息体,这里只写了markdown如何发送。其他的原理一致,照着接口文档抄就行了)

# -*- coding: utf-8 -*- import base64 import hashlib import hmac import json import os import time from urllib.parse import quote_plus import requests import dingding_get_id class Messenger: def __init__(self, token=os.getenv("DD_ACCESS_TOKEN"), secret=os.getenv("DD_SECRET")): self.timestamp = str(round(time.time() * 1000)) self.URL = "https://oapi.dingtalk.com/robot/send" self.headers = {'Content-Type': 'application/json'} secret = secret secret_enc = secret.encode('utf-8') string_to_sign = '{}\n{}'.format(self.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() self.sign = quote_plus(base64.b64encode(hmac_code)) self.params = {'access_token': token, "sign": self.sign} def send_markdown(self, title: object, text: object, atUserIds): """ 发送markdown """ data = { "msgtype": "markdown", "markdown": { "title": title, "text": text }, "at": { "atMobiles": [ ], "atUserIds": [ *atUserIds ], "isAtAll": False } } self.params["timestamp"] = self.timestamp r = requests.post( url=self.URL, data=json.dumps(data), params=self.params, headers=self.headers ) print("data:", data) print("-----------------") print(r.json()) 3、艾特钉钉用户的步骤和方法

官方文档:企业内部机器人群聊实现@人接入指南

在这里插入图片描述

这里我感觉写的挺不清楚的。 1、类型是array,java里数组的意思。但是对于python来说没有这个类型,但是可以用list列表代替。对于像我这种的新手菜鸡们来讲,不太容易理解。幸亏我之前学过点java基础,不然估计还看不懂。 2、 atMobiles参数里,写的是:消息内容text内; atUserids参数里,写的是:消息内容content中。 text和content是俩词,特容易让人理解是俩不同的东西,但是实际使用上来讲,就是指的消息内容这几个字。 3、需要跟atMobiles/atUserids参数结合使用,才有@效果。我看了三遍才明白啥意思:就是下图里的这俩参数里,消息内容必须写@+手机号(或id),然后对应的atMobiles/atUserids里,也写上对应的手机号(或id)才能显示@效果。

在这里插入图片描述

关于@这个功能,有俩疑问: 3.1、要是有多个人需要艾特怎么办?(看着atMobiles、atUserids的类型是java的数组(Python里的list),感觉可以传多个进去来实现多人艾特,但是人家接口文档就是不说) 3.2、必须手机号和id一起写才有效么?只写id不写手机号可以不?

这俩问题,他接口文档里都没写,都得自己去实验。

最终实验结果是: 3.1的答案是:传多个值进去,可以实现多人艾特 3.2不用手机号和id一起写,只用一个就行了。比如选用手机号作为艾特方式,那消息内容就写手机号,并且传atMobiles参数;反之,消息内容就写id,并且传atUserids参数。

调用发送钉钉机器人并艾特:

msg = '' for user_info in user_info_list: atuserid = user_info['userid'] msg = f"+ 经办人:@{atuserid}" dingding.send_markdown(title='所有未关闭的需求', text=msg, atUserIds=(j for j in user_id_list) )

这两句话的配合是个知识点,有空再讲 在这里插入图片描述

艾特这块的接口文档,看的最是难受,就算我笨吧。

4、创建钉钉待办任务的步骤和方法

官方文档:创建钉钉待办任务

这里出了想吐槽一下旧版sdk过于不好用(rbs)之外,没其他吐槽的。按步骤走就行。

5、定时任务的创建

5.1、可以用Jenkins持续集成 5.2、也可以用我之前写的:APScheduler定时框架 在Linux服务器上执行python定时任务(APScheduler定时框架)

The End

这几个大厂的官方API,个人感觉友好度:百度>微信>钉钉



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3