

https://open.dingtalk.com/document/orgapp/create-team-space-document


需要打开的应用权限包括:知识库文档写权限、知识库读权限、知识库节点读权限、成员信息读权限
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能()
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import http.client
import json
def main(args):
# access_token = getToken()
# unnionid = getUserInfo()
# data = getNodeInfo()
# return
pass
#获取用户登录凭证
def getToken(appKey,appSecret):
conn = http.client.HTTPSConnection("api.dingtalk.com")
payload = json.dumps({
"appKey": appKey,
"appSecret": appSecret
})
headers = {
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Content-Type': 'application/json'
}
conn.request("POST", "/v1.0/oauth2/accessToken", payload, headers)
res = conn.getresponse()
data = json.loads(res.read().decode('utf-8'))
accessToken = data["accessToken"]
return accessToken
#获取用户信息
def getUserInfo(userId,access_token):
conn = http.client.HTTPSConnection("oapi.dingtalk.com")
payload = json.dumps({
"language": "zh_CN",
"userid": userId
})
headers = {
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Content-Type': 'application/json'
}
conn.request("POST", f"/topapi/v2/user/get?access_token={access_token}", payload, headers)
res = conn.getresponse()
unionid = json.loads(res.read().decode("utf-8"))['result']['unionid']
return unionid
#获取知识库空间列表
def getWordSpaceList(access_token,operatorId,spaceName):
conn = http.client.HTTPSConnection("api.dingtalk.com")
payload = ''
headers = {
'x-acs-dingtalk-access-token': access_token,
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)'
}
conn.request("GET", f"/v2.0/wiki/workspaces?operatorId={operatorId}", payload, headers)
res = conn.getresponse()
data = json.loads(res.read().decode("utf-8"))['workspaces']
result_dict = {
"workspaceId" : "",
"rootNodeId" : ""
}
for space in data:
if space['name'] == spaceName:
result_dict["workspaceId"] = space['workspaceId']
result_dict["rootNodeId"] = space['rootNodeId']
break
return result_dict
#获取知识库节点列表
def getParentNodeInfo(parentNodeId,operatorId,access_token,node_name):
conn = http.client.HTTPSConnection("api.dingtalk.com")
payload = ""
headers = {
'x-acs-dingtalk-access-token': access_token,
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)'
}
conn.request("GET", f"/v2.0/wiki/nodes?parentNodeId={parentNodeId}&operatorId={operatorId}", payload, headers)
res = conn.getresponse()
nodes = json.loads(res.read().decode("utf-8"))['nodes']
nodeId = ""
for node in nodes:
if node['type'] == 'FOLDER' and node['name'] == node_name:
nodeId = node['nodeId']
break
return nodeId
#创建知识库文档
def createDoc(appKey,appSecret,userId,spaceName,distName,docType,docName):
access_token = getToken(appKey,appSecret)
operatorId = getUserInfo(userId,access_token)
spaceInfo = getWordSpaceList(access_token,operatorId,spaceName)
workspaceId = spaceInfo['workspaceId']
parentNodeId = ""
payload = ""
conn = http.client.HTTPSConnection("api.dingtalk.com")
if distName != "":
rootNodeId = spaceInfo['rootNodeId']
parentNodeId = getParentNodeInfo(rootNodeId,operatorId,access_token,distName)
payload = json.dumps({
"name": docName,
"docType": docType,
"operatorId": operatorId,
"parentNodeId": parentNodeId,
})
else:
payload = json.dumps({
"name": docName,
"docType": docType,
"operatorId": operatorId
})
headers = {
'x-acs-dingtalk-access-token': access_token,
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Content-Type': 'application/json'
}
conn.request("POST", f"/v1.0/doc/workspaces/{workspaceId}/docs", payload, headers)
res = conn.getresponse()
data = json.loads(res.read().decode("utf-8"))
return data 
简单介绍一些这个指令要传入的参数:
appKey和appSecret:应用凭证,在开发者后台的编辑应用界面可以获取。
userId:及用户唯一标识,可以通过 https://oa.dingtalk.com/#/welcome 钉钉管理后台-通讯录 获得。spaceName需要填入知识库的名称。
distNames:是个可选项参数,如果不填入则默认在知识库根目录下创建文档,否则需要填入知识库中某个已存在的文件夹名称。
docType:填入文档的类型,目前支持文档类型,取值: DOC:文字 WORKBOOK:表格 MIND:脑图 FOLDER:文件夹。
docName:指定文档的名称

