一. 准备与分析
1. 钉钉开发文档地址:https://ding-doc.dingtalk.com/doc#/serverapi2/gh60vz
2. 在钉钉上自建应用,并获取到对应的AGENT_ID, APP_KEY, APP_SECRET
3. 钉钉开发接口需要设置IP白名单才能访问
4. 要实现本功能,需要对以下接口开放访问权限:获取部门列表,获取部门userid列表,获取用户详情,发送工作通知消息
5. 功能实现思路:
1)通过钉钉开放接口,获取到企业所有员工的电话号码与员工userId的映射关系
2)间接建立起员工电话号码与发送工作通知消息接口的关系
3)待对接的第三方平台上使用员工电话号码作为登录账号
即员工用电话号码在第三方平台登录后,要发送人的钉钉userid就已确定
二. 实现代码
# -*- coding: utf-8 -*- # @Time : 2020/11/22 12:32 # @Author : chinablue # @File : dingtalk_helper.py import requests import objectpath # 在钉钉上创建应用后获取 AGENT_ID = 123456 APP_KEY = "123456" APP_SECRET = "123456" dd_domain = "https://oapi.dingtalk.com" class DingtalkHelper(): def __init__(self): self.access_token = self.get_token() # 获取token def get_token(self): 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): 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_list # 获取部门用户userid列表 def get_memberList(self, depId: str): 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_json # 获取用户详情 def get_userInfo(self, userId): 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, build_url, build_result, project_num, build_person, build_time): url = f"{dd_domain}/topapi/message/corpconversation/asyncsend_v2?access_token={self.access_token}" msg = { "msgtype": "oa", "oa": { "pc_message_url": build_url, "head": { "bgcolor": "FFBBBBBB", "text": build_result }, "body": { "title": f"({build_result})Jenkins Pipeline", "form": [ { "key": "项目编号:", "value": f" {project_num}" }, { "key": "构建账号:", "value": f" {build_person}" }, { "key": "构建时间:", "value": f" {build_time}" }, { "key": "构建结果:", "value": f" {build_result}" }, ], "content": "", "image": "@lADOADmaWMzazQKA", } } } data = { "agent_id": AGENT_ID, "userid_list": userId, "msg": str(msg), } # 发送消息 requests.post(url=url, params=data) ### 获取公司内所有人员的userId def getAll_userIds(self): 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_list ### 获取公司内所有人员的mobile和userId的映射关系表 def getAll_usersInfo(self): 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
注意事项:
1)requests库和objectpath库均为python的第三方库,其中requests库用于模拟接口请求,objectpath库用于提取json中的信息
2)示例中的send_ddMsg()方法说明:主要是在一个自研平台上触发jenkins流水线后,会将jenkins构建结果通知给jenkins构建人