通过python实现发送钉钉个人工作通知

一、钉钉官方开放文档

https://open.dingtalk.com/document/isvapp/before-you-start

在开发前需要看一遍官方开放文档的相关内容,来避免一些奇奇怪怪的问题出现,比如新旧版接口域名变更,请求方式不同、调用频率限制、是否开放对应接口权限、白名单等等。

二、开发前准备

  • 首先开发使用的账号需要有钉钉管理员权限
  • 在钉钉后台自建应用
    在这里插入图片描述
  • 获取应用AGENT_ID, APP_KEY, APP_SECRET

在这里插入图片描述 - 开放应用「通讯录管理」模块全部权限

三、实现思路

  1. 通过钉钉开放接口,获取到企业所有员工的用户名称与员工userId的映射关系
  2. 建立起员工用户名称与发送工作通知消息接口的关系
  3. 待对接的第三方平台上使用员工姓名作为登录账号,通过钉钉开放接口动态获取员工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}')

五、示例截图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43587784/article/details/130802313