一、钉钉官方开放文档
https://open.dingtalk.com/document/isvapp/before-you-start
在开发前需要看一遍官方开放文档的相关内容,来避免一些奇奇怪怪的问题出现,比如新旧版接口域名变更,请求方式不同、调用频率限制、是否开放对应接口权限、白名单等等。
二、开发前准备
- 首先开发使用的账号需要有钉钉管理员权限
- 在钉钉后台自建应用
- 获取应用AGENT_ID, APP_KEY, APP_SECRET
- 开放应用「通讯录管理」模块全部权限
三、实现思路
- 通过钉钉开放接口,获取到企业所有员工的用户名称与员工userId的映射关系
- 建立起员工用户名称与发送工作通知消息接口的关系
- 待对接的第三方平台上使用员工姓名作为登录账号,通过钉钉开放接口动态获取员工id,实现发送工作通知
四、代码实现
钉钉V1接口,通过手机号获取用户id
# -*- 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
钉钉V1+V2,通过python三方库将name转成拼音,使用用户名获取钉钉id
AGENT_ID = ######
APP_KEY = ######
APP_SECRET = ######
dd_domain = "https://oapi.dingtalk.com"
class DingTalkConfig:
def __init__(self):
self.access_token = self.get_token()
def get_token(self):
try:
url = f"{
dd_domain}/gettoken"
data = {
"appkey": APP_KEY,
"appsecret": APP_SECRET,
}
res_json = Requests.get(url=url, params=data)
return objectpath.Tree(res_json).execute("$.access_token")
except Exception as e:
logger.error(f"获取token失败, {
e}")
def get_depList(self):
url = f"{
dd_domain}/department/list"
data = {
"access_token": self.access_token,
}
res_json = Requests.get(url=url, params=data)
departmentids_list = list(objectpath.Tree(res_json).execute("$..*[@.name is not null].id"))
return departmentids_list
def getAll_userIds(self):
deptIds_list = self.get_depList()
userIds_list = list()
for deptId in deptIds_list:
res_json = self.get_userList(deptId)
res = res_json['result']['list']
userIds_list.extend(res)
return userIds_list
def dduserList(self):
userlist = self.getAll_userIds()
ll = []
for user in userlist:
pp = pinyin.get(user['name'], format='strip')
user.update({
'name': pp})
ll.append(user)
logger.info(f'userlist={
ll}')
return ll
def get_ddid(self, name):
try:
for user in self.dduserList():
if user['name'] == name:
return user['userid']
except Exception as e:
logger.error(f'获取钉钉用户ID错误,{
e}')