使用python调用钉钉开放接口,现实给员工单独发送钉钉通知消息

一. 准备与分析

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构建人

posted @ 2020-11-22 19:44  后来者2012  阅读(6408)  评论(0编辑  收藏  举报