import requests
# 拼接请求链接
# 需要创建钉钉应用获取AppKey和AppSecret,并且赋予应用权限
AppKey = 'dingqr1yngem1iyr1qk'
AppSecret = 'AAzWs-Amawi0wyBkUMLwVQx96guf-mKLrgXx1ZRl20zXSly90GfvCaNZBrNdtuJ'
ding_token_URL = "https://oapi.dingtalk.com/gettoken?appkey=" + AppKey + "&appsecret=" + AppSecret
print('token请求地址:', ding_token_URL)
# 发送请求获取access_token
access_token = requests.get(ding_token_URL)
print("钉钉token", access_token.json()["access_token"])
# 获取部门人员信息
ding_dept_user_list = f"https://oapi.dingtalk.com/topapi/v2/user/list?access_token={access_token.json()["access_token"]}"
# 遍历获取钉钉部门信息
ding_department_list = f"https://oapi.dingtalk.com/topapi/v2/department/listsub?access_token={access_token.json()["access_token"]}"
# 获取花名册元数据
ding_smartwork_list = f"https://oapi.dingtalk.com/topapi/smartwork/hrm/roster/meta/get?access_token={access_token.json()["access_token"]}"
# 获取员工花名册字段信息
ding_rosters_list = f"https://api.dingtalk.com/v1.0/hrm/rosters/lists/query"
# 获取部门人员信息
def dept_user_list(dept_id):
json = {
"cursor": "0",
"contain_access_limit": "false",
"size": "10",
"order_field": "modify_desc",
"language": "zh_CN",
"dept_id": str(dept_id)
}
# 获取部门人员信息
get_user_info = requests.post(url=ding_dept_user_list, json=json)
for user_info in get_user_info.json()['result']['list']:
# 使用 .get() 方法安全获取字段值,避免 KeyError
dept_id_list = user_info.get("dept_id_list", [])
email = user_info.get("email", "")
job_number = user_info.get("job_number", "")
mobile = user_info.get("mobile", "")
name = user_info.get("name", "")
title = user_info.get("title", "")
userid = user_info.get("userid", "")
work_place = user_info.get("work_place", "")
extension = user_info.get("extension", "")
# 打印用户信息,仅显示存在的字段
print(
f"Dept ID List: {dept_id_list}, "
f"Email: {email if email else 'N/A'}, "
f"Job Number: {job_number if job_number else 'N/A'}, "
f"Mobile: {mobile if mobile else 'N/A'}, "
f"Name: {name if name else 'N/A'}, "
f"Title: {title if title else 'N/A'}, "
f"User ID: {userid if userid else 'N/A'}, "
f"Work Place: {work_place if work_place else 'N/A'}, "
f"extension: {extension if extension else 'N/A'}"
)
# print(user_info['dept_id_list'], user_info['email'], user_info['job_number'],
# user_info['mobile'], user_info['name'], user_info['title'], user_info['userid'], user_info['work_place'])
# 遍历获取钉钉部门信息和调用获取部门人员信息
def traverse_organization(node):
json = {
"dept_id": str(node)
}
get_dept_info = requests.post(url=ding_department_list, json=json)
for parent_id in get_dept_info.json()['result']:
print(parent_id['dept_id'], parent_id['name'], parent_id['parent_id'])
dept_user_list(parent_id['dept_id'])
traverse_organization(parent_id['dept_id'])
def active_user_list(node):
# 遍历部门和部门下人员信息
traverse_organization(str(node))
# 获取根部门下的人员信息
dept_user_list(str(node))
def hrm_roster_meta():
json = {
"agentid": str(2819356646)
}
# 获取部门人员信息
get_hrm_roster_meta = requests.post(url=ding_smartwork_list, json=json)
for roster_info in get_hrm_roster_meta.json()['result']:
print(roster_info)
def hrm_roster():
json = {
"userIdList": ["bpm88b3983895fb45a689b9628b44564f07", "2560817822832039636"],
"appAgentId": 2819356646,
"text2SelectConvert": True,
"fieldFilterList": ["姓名", "部门", "sys00-entryAge", "sys03-highestEdu"]
}
headers = {
"x-acs-dingtalk-access-token": str(access_token.json()["access_token"]),
"Content-Type": "application/json"
}
# 获取部门人员信息
get_hrm_roster_meta = requests.post(url=ding_rosters_list, json=json, headers=headers)
# print(get_hrm_roster_meta.json()['result'])
for user_info in get_hrm_roster_meta.json()['result']:
# print(len(user_info['fieldDataList']))
for i in range(len(user_info['fieldDataList'])):
print(user_info['fieldDataList'][i]['fieldValueList'][0]['value'])
# active_user_list(974463964)
hrm_roster_meta()
hrm_roster()