通过 python 获取钉钉后台人员

邯城往事 >>> 展颜笑夙愿,一笑泯恩仇 <<< 本文由博客端 https://39.97.161.115 主动推送

通过钉钉官方接口可定时同步得知企业离职人员便于认证管理同步,大大简便了人员账号的管理。

请求带有参数的 API 接口

注意请求接口白名单情况
可参考钉钉开发文档:
创建应用:
image.png

image.png

代码示例:

import requests
import json
import sys
import os
corpId="35c2365db2f1378bfd74f96b7c7a529f"
corpSecret="13dc3517caa3da9bee5e7b6b2ead8938"

headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s"%(corpId,corpSecret)

def get_token():
    try:
        res = requests.get(api_url,headers=headers)
        if res.status_code == 200:
            str_res = res.text
            token = (json.loads(str_res)).get('access_token')
            return token
    except:
        print('请求失败')

if __name__ == "__main__":
    get_token()

人名转拼音模块,暂不添加

import pypinyin
str = '崔建哲,中国,狸米,大傻,杨和苏'
pinyin_name = ''.join(pypinyin.lazy_pinyin(str))
print(pinyin_name)

分别请求部门详情部门成员详情角色详情,进行数据清洗,并且同步人员信息发送邮件

代码示例:

#!/bin/python3  env
###################################################################
#  This Script is used to sync global user from Dingding to Email #
#  Date: 2019-9                                                   #
#  Author: cuijianzhe                                             #
#  Email: 598941324@qq.com                                        #
###################################################################
import requests
import json
import pypinyin
import time
import os
import xlsxwriter
from functools import wraps
filePath = '/scripts/limi/'
workbook = xlsxwriter.Workbook(filePath + 'user_list.xlsx') #创建一个ExceL 文档
worksheet = workbook.add_worksheet()  #创建一个工作对象
worksheet.set_column('A:E',20) #设定第一列Adap E40像素
#bold = workbook.add_format({'bold':True}) #加粗
bold = workbook.add_format({
        'bold':  True,  # 字体加粗
        'border': 1,  # 单元格边框宽度
        'align': 'center',  # 水平对齐方式
        'valign': 'vcenter',  # 垂直对齐方式
        'fg_color': '#F4B084',  # 单元格背景颜色
        'text_wrap': True,  # 是否自动换行
    })
bold1 = workbook.add_format({'align': 'center'})
heading = ['姓名','Userid','手机号','职位']  #设置表头
worksheet.write_row('A1',heading,bold)
DING_URL = "https://oapi.dingtalk.com"
depart_info = {}
_username = []
_usermobile = []
_userid = []
_userposition = []
def func_timer(function):
    '''
    用装饰器实现函数计时
    :param function: 需要计时的函数
    :return: None
    '''
    @wraps(function)
    def function_timer(*args, **kwargs):
        print('[Function: 开始生成钉钉用户和所属部门]')
        t0 = time.time()
        result = function(*args, **kwargs)
        t1 = time.time()
        print('[Function: 同步完成, 耗时: {time:.2f}s]'.format(time=t1 - t0))
        return result
    return function_timer

class dingUserSync():
    def __init__(self):
        # 设置appkey和appsecret为隐藏属性
        self.__DING_USER = 'dingding'
        self.__DING_SECRET = 'dingsecret'
        self.headers = {'Content-Type': 'application/json;charset=utf-8'}
        self.token = ''
    def get_token(self):
        url = DING_URL + '/gettoken'
        param_dict = {
            'appkey': self.__DING_USER,
            'appsecret': self.__DING_SECRET,
        }

        ding_res = requests.get(url,param_dict,headers=self.headers).json()
        if ding_res.get('errcode') == 0:
            return ding_res.get('access_token')
        else:
            raise ding_res.get('errmsg')
    def get_depart_info(self):
        '''
        获取部门全部信息
        例:{'createDeptGroup': True, 'name': '何层组', 'id': 381056019, 'autoAddUser': True, 'parentid': 127811237}
        :return:
        '''
        if not self.token:
            self.token = self.get_token()
        url = DING_URL + '/department/list'
        ding_ret = requests.get(url, {'access_token': self.token}).json()
        if ding_ret.get('errcode') == 0:
            return ding_ret.get('department')
        else:
            raise '错误信息为:%s,尝试刷新token信息' % ding_ret.get('errmsg')
    @staticmethod
    def pinyin_transfer(name=None):
        pinyin_name = ''.join(pypinyin.lazy_pinyin(name))
        return pinyin_name
    def get_depart_user(self, depart_id):
        if not self.token:
            self.token = self.get_token()
        param_dict = {
            'access_token': self.token,
            'department_id': depart_id
        }
        url = DING_URL + '/user/simplelist'
        depart_user_res = json.loads(requests.get(url, param_dict).text)
        if depart_user_res.get('errcode') == 0:
            #返回值实例:[{'name': '宫琳', 'userid': '054940691023503691'}, {'name': '张浩', 'userid': '084637391724299533'}]
            return depart_user_res.get('userlist')

    def get_user_info(self):
        if not self.token:
            self.token = self.get_token()
        url = DING_URL + '/user/get?'
        for depart in self.get_depart_info():
            depart_id,depart_name = depart.get('id'),depart.get('name')
            depart_info[depart_name] = depart_id

        for info in depart_info:
            user_info = self.get_depart_user(depart_info[info])
            for user in user_info:
                _username.append(user.get('name'))
                _userid.append(user.get('userid'))

        for userid in _userid:
            '''
            将_name_list转换成str,保存到本地
            '''
            param_dict = {
                'access_token': self.token,
                'userid': userid
            }
            userinfo_res = json.loads(requests.get(url, param_dict).text)
            _userposition.append(userinfo_res.get('position'))
            _usermobile.append(userinfo_res.get('mobile'))

def getNameInfo():
    dingUserSync().get_user_info()
    worksheet.write_column('A2', _username, bold1)
    worksheet.write_column('B2', _userid, bold1)
    worksheet.write_column('C2', _usermobile, bold1)
    worksheet.write_column('D2', _userposition, bold1)
    workbook.close()
    if "userOld" in os.listdir(filePath):
        with open(filePath + 'userOld','r',encoding='utf-8') as oldname:
            oldListName = oldname.read().split(',')[:-1]
        addName = [nameValue for nameValue in _username if nameValue not in oldListName]  # 入职人员
        leaveName = [nameValue for nameValue in oldListName if nameValue not in _username]  #离职人员
        # 更新本地人员信息
        with open(filePath + 'userOld', 'w', encoding='utf-8') as new_name:
            for newinfo in _username:
                new_name.write(str(newinfo + ','))
        return addName,leaveName,oldListName
    else:
        with open(filePath + 'userOld', 'w', encoding='utf-8') as new_name:
            for newinfo in _username:
                new_name.write(str(newinfo + ','))

@func_timer
def _email():
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    from email.mime.multipart import MIMEMultipart
    date = time.strftime('%Y-%m-%d',time.localtime())
    my_sender = 'noreply@163.com'
    my_pass = 'mypassword'
    my_user = ['noreply@qq.com',]
    UserList = getNameInfo()
    body = """
    日期:%s,昨日入职%s人,名单:(%s),离职%s个,名单:(%s),昨天公司总人数%s个,现在公司总人数%s个.
    """%(date,len(UserList[0]),','.join(UserList[0]),len(UserList[1]),','.join(UserList[1]),len(UserList[2]),len(_username))
    msg = MIMEMultipart()   #构造附件
    fujian = MIMEText(open(filePath + 'user_list.xlsx','rb').read(),'base64','utf-8')
    fujian['Content-Type'] = 'application/octet-stream'
    fujian["Content-Disposition"] = 'attachment; filename="user_list.xlsx"'
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    msg.attach(fujian)
    msg['From'] = formataddr(["limiUserRsync", my_sender])
    msg['To'] = ','.join(my_user)
    msg['Subject'] = '人员同步'
    server = smtplib.SMTP_SSL("smtp.163.com", 465)
    server.login(my_sender, my_pass)
    server.sendmail(my_sender, msg['To'].split(','), msg.as_string())
    server.quit()

if __name__ == "__main__":
    _email()

同步一些工具可行可改可适配可认证……

查看邮件信息(附件构造为 Excel 或者 txt 文本文件):

image.png
image.png
image.png

  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    13 引用 • 67 回帖 • 495 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    445 引用 • 622 回帖 • 538 关注
6 操作
cuijianzhe 在 2020-08-13 16:18:19 更新了该帖
cuijianzhe 在 2020-08-09 08:52:05 更新了该帖
cuijianzhe 在 2020-08-08 14:27:41 更新了该帖
cuijianzhe 在 2019-09-24 13:46:48 更新了该帖 cuijianzhe 在 2019-09-24 13:46:26 更新了该帖 cuijianzhe 在 2019-09-22 13:30:26 更新了该帖

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Eddie
    捐赠者

    @88250 他的代码里面是不是看到秘钥什么的了?

    3 回复
  • 88250

    可能是测试用的吧……

  • cuijianzhe
    捐赠者 作者

    看到的也是假的doge

  • csfwff
    捐赠者

    huaji 上次留的就是真的

  • Ever

    把秘钥隐藏吧。

    1 回复
  • cuijianzhe
    捐赠者 作者

    这个密钥无法使用的,是个假的huaji

    1 回复
  • Eddie
    捐赠者

    那图片里面的呢?

  • cuijianzhe
    捐赠者 作者

    import socket

请输入回帖内容 ...