调用钉钉接口发送消息

embedded/2024/12/24 2:09:17/

调用钉钉接口发送消息

通过创建钉钉开放平台创建H5小程序,通过该小程序可以实现向企业内的钉钉用户发送消息(消息是以工作通知的形式发送)

1、目前仅支持发送文本消息,相同内容的文本只能成功发送一次,但是接口返回发送成功

2、需要给小程序开放各种权限

import jsonimport objectpath
import requests# 在钉钉开放平台上创建应用后获取
AGENT_ID = None
APP_KEY = ""
APP_SECRET = ""dd_domain = "https://oapi.dingtalk.com"class DingtalkHelper():def __init__(self):self.access_token = self.get_token()def get_token(self):"""获取token:return:"""url = f"{dd_domain}/gettoken"data = {"appkey": APP_KEY,"appsecret": APP_SECRET,}res_json = requests.get(url=url, params=data).json()return objectpath.Tree(res_json).execute("$.access_token")def get_depList(self):"""获取部门列表:return:"""url = f"{dd_domain}/department/list"data = {"access_token": self.access_token,}res_json = requests.get(url=url, params=data).json()departmentIds_list = list(objectpath.Tree(res_json).execute("$..*[@.name is not null].id"))return departmentIds_listdef get_memberList(self, depId: str):"""获取部门用户userid列表:param depId::return:"""url = f"{dd_domain}/user/getDeptMember"data = {"access_token": self.access_token,"deptId": depId,}res_json = requests.get(url=url, params=data).json()return res_jsondef get_userInfo(self, userId):"""获取部门用户userid列表:param userId::return:"""url = f"{dd_domain}/user/get"data = {"access_token": self.access_token,"userid": userId,}res_json = requests.get(url=url, params=data).json()userIds_list = list(objectpath.Tree(res_json).execute("$..*[@.userid is not null].(mobile, userid)"))userInfo = userIds_list[0]return {userInfo.get("mobile"): userInfo.get("userid")}def send_ddMsg(self, userId, content):"""向企业个人发送钉钉通知:param userId::return:"""url = f"{dd_domain}/message/send?access_token={self.access_token}"body_dict = {"touser": userId,"agentid": AGENT_ID,"msgtype": "text","text": {"content": content}}res = requests.post(url=url, data=json.dumps(body_dict))print(res.text)def getAll_userIds(self):"""获取公司内所有人员的userId:return:"""deptIds_list = self.get_depList()userIds_list = list()for deptId in deptIds_list:res_json = self.get_memberList(deptId)userIds = objectpath.Tree(res_json).execute("$.userIds")userIds_list.extend(userIds)return userIds_listdef getAll_usersInfo(self):"""获取公司内所有人员的mobile和userId的映射关系表:return:"""userIds_list = self.getAll_userIds()usersInfo_dict = dict()for userId in userIds_list:userInfo = self.get_userInfo(userId)usersInfo_dict.update(userInfo)return usersInfo_dict

http://www.ppmy.cn/embedded/148226.html

相关文章

上传文件(vue3)

使用el-upload 先上传到文件服务器&#xff0c;生成url 然后点击确定按钮&#xff1a; 保存数据 <template><el-dialog top"48px" width"500" title"新增协议" :modelValue"visible" close"handleClose()">…

【LeetCode】52、N 皇后 II

【LeetCode】52、N 皇后 II 文章目录 一、递归 数组解法1.1 递归 数组解法1.2 多语言解法 二、位运算解法1.1 位运算解法2.2 多语言解法 一、递归 数组解法 1.1 递归 数组解法 // go func totalNQueens(n int) int {return f(n, 0, make([]int, n)) }// 在 [0...i-1] 行已摆放…

nodejs:nodejs的技巧有哪些

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者构建高性能的网络应用。 1.使用 require 语句时&#xff0c;尽量使用绝对路径避免模块路径冲突。 例如&#xff1a; const _ require(/path/to/your/module); 2.使用 npm 时&#xff0c;可…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

[计算机网络]唐僧的”通关文牒“NAT地址转换

1.NAT&#xff1a;唐僧的通关文牒 在古老的西游记中&#xff0c;唐僧师徒四人历经九九八十一难&#xff0c;终于取得了真经。然而&#xff0c;他们并不是一开始就获得了通关文牒&#xff0c;而是经过了重重考验&#xff0c;最终得到了国王的认可&#xff0c;才顺利通过了各个关…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

36.3 grafana-dashboard看图分析

kube-prometheus中的grafana总结 db使用 sqlit&#xff0c;volume类型为emptydir 无法持久化&#xff0c;pod扩缩就重新创建通过configMap设置的prometheus DataSource 通过 prometheus-k8s svc对应的 域名访问下面对应两个prometheus容器&#xff0c;有HA 各个dashboard通过 …

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码&#xff0c;似乎不需要关闭写入方向&#xff0c;于是注释掉&#xff08;关键&#xff09; 2、将request的变量类型从string转为string_view&#xff08;顺手…