sdk/dingdingSdk/dingding_wiki_team_file.py

204 lines
7.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
import requests
import sys
from typing import List
from alibabacloud_dingtalk.wiki_2_0.client import Client as dingtalkwiki_2_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.wiki_2_0 import models as wiki_models
from alibabacloud_tea_util import models as util_models
from dingding_calendars import DingTalkHelper
APP_KEY = "dinguetojbaxvvhzpk3d"
APP_SECRET = "lMFqns_ceLIcXvfLL8GKfa3ZiPKHcaZq0VbGtJXJlDuK8AEJ2WV3-PN8zv61ajm3"
def get_workspaces_details(client, token, operator_id, workspace_ids):
batch_size = 10
all_details = []
for i in range(0, len(workspace_ids), batch_size):
batch = workspace_ids[i:i+batch_size]
get_request = wiki_models.GetWorkspacesRequest(
operator_id=operator_id,
workspace_ids=batch,
option=wiki_models.GetWorkspacesRequestOption(with_permission_role=False)
)
get_headers = wiki_models.GetWorkspacesHeaders()
get_headers.x_acs_dingtalk_access_token = token
resp = client.get_workspaces_with_options(get_request, get_headers, util_models.RuntimeOptions())
details = getattr(resp.body, 'workspaces', [])
for d in details:
workspace_dict = {
"name": d.name,
"workspace_id": d.workspace_id,
"type": d.type,
"url": d.url,
"root_node_id": d.root_node_id
}
all_details.append(workspace_dict)
return all_details
def get_admin_userid(access_token: str) -> str:
url = "https://oapi.dingtalk.com/topapi/user/listadmin"
params = {"access_token": access_token}
resp = requests.get(url, params=params).json()
if resp.get("errcode") == 0:
admins = resp.get("result", [])
if admins:
# 返回第一个管理员的userid
return admins[0].get("userid", "")
else:
print("没有找到管理员")
return ""
else:
print(f"获取管理员失败: {resp}")
return ""
def get_userid_by_mobile(access_token: str, mobile: str) -> str:
url = "https://oapi.dingtalk.com/topapi/v2/user/getbymobile"
params = {"access_token": access_token}
data = {"mobile": mobile}
resp = requests.post(url, params=params, json=data)
r = resp.json()
if r.get("errcode") == 0:
print(f"✅ 获取 {mobile} 的 userId: {r['result']['userid']}")
return r["result"]["userid"]
print(f"❌ 获取 userId 失败: {r}")
return ""
def get_access_token(APP_KEY:str,APP_SECRET:str) -> str:
url = "https://oapi.dingtalk.com/gettoken"
params = {"appkey": APP_KEY, "appsecret": APP_SECRET}
resp = requests.get(url, params=params).json()
if resp.get("errcode") == 0:
print("✅ AccessToken 获取成功")
return resp["access_token"]
else:
raise Exception(f"获取AccessToken失败: {resp}")
def create_wiki_client() -> dingtalkwiki_2_0Client:
config = open_api_models.Config()
config.protocol = 'https'
config.region_id = 'central'
return dingtalkwiki_2_0Client(config)
def list_workspaces(client: dingtalkwiki_2_0Client, token: str, operator_id: str) -> List[str]:
next_token = None
all_workspace_ids = []
while True:
request = wiki_models.ListWorkspacesRequest(
operator_id=operator_id,
next_token=next_token,
max_results=30,
order_by='VIEW_TIME_DESC',
with_permission_role=False
)
headers = wiki_models.ListWorkspacesHeaders()
headers.x_acs_dingtalk_access_token = token
resp = client.list_workspaces_with_options(request, headers, util_models.RuntimeOptions())
workspaces = getattr(resp.body, 'workspaces', [])
all_workspace_ids.extend([ws.workspace_id for ws in workspaces])
next_token = getattr(resp.body, 'next_token', None)
if not next_token:
break
return all_workspace_ids
def list_all_nodes(client, operator_id, parent_node_id, token):
headers = wiki_models.ListNodesHeaders()
headers.x_acs_dingtalk_access_token = token
request = wiki_models.ListNodesRequest(
operator_id=operator_id,
parent_node_id=parent_node_id
)
try:
resp = client.list_nodes_with_options(request, headers, util_models.RuntimeOptions())
except Exception as e:
print(f"请求 ListNodes 出错: {e}")
return []
if not hasattr(resp.body, "nodes") or not resp.body.nodes:
return []
nodes = []
for node in resp.body.nodes:
node_dict = {
"name": node.name,
"node_id": node.node_id,
"type": node.type,
"url": getattr(node, "url", None),
"hasChildren": getattr(node, "has_children", False),
}
if node_dict["hasChildren"]:
node_dict["children"] = list_all_nodes(client, operator_id, node.node_id, token)
else:
node_dict["children"] = []
nodes.append(node_dict)
return nodes
def get_workspaces_details(client, token, operator_id, workspace_ids):
batch_size = 10
all_details = []
for i in range(0, len(workspace_ids), batch_size):
batch = workspace_ids[i:i+batch_size]
get_request = wiki_models.GetWorkspacesRequest(
operator_id=operator_id,
workspace_ids=batch,
option=wiki_models.GetWorkspacesRequestOption(with_permission_role=False)
)
get_headers = wiki_models.GetWorkspacesHeaders()
get_headers.x_acs_dingtalk_access_token = token
resp = client.get_workspaces_with_options(get_request, get_headers, util_models.RuntimeOptions())
details = getattr(resp.body, 'workspaces', [])
for d in details:
workspace_dict = {
"name": d.name,
"workspace_id": d.workspace_id,
"type": d.type,
"url": d.url,
"root_node_id": d.root_node_id,
"nodes": list_all_nodes(client, operator_id, d.root_node_id, token)
}
all_details.append(workspace_dict)
return all_details
def get_unionid(token, userid):
"""通过 userId 获取 unionid"""
url = "https://oapi.dingtalk.com/topapi/v2/user/get"
resp = requests.post(url, params={"access_token": token}, json={"userid": userid}).json()
if resp.get("errcode") != 0:
raise Exception(f"获取unionid失败: {resp}")
return resp["result"]["unionid"]
def main():
token = get_access_token(APP_KEY,APP_SECRET)
USERID=get_admin_userid(token)
print("userId",USERID)
operator_id = get_unionid(token, USERID)
client = create_wiki_client()
print("开始获取知识库列表...")
workspace_ids = list_workspaces(client, token, operator_id)
print(f"共获取到 {len(workspace_ids)} 个知识库ID")
print("开始获取知识库详情...")
get_workspaces_details(client, token, operator_id, workspace_ids)
if __name__ == "__main__":
main()