钉钉知识库创建文档结合网页自动化
评论
收藏

钉钉知识库创建文档结合网页自动化

经验分享
二乔
2024-04-30 15:54·浏览量:1317
二乔
发布于 2024-04-30 15:42更新于 2024-04-30 15:541317浏览

一、背景

       最近有小伙伴问我影刀有没有操作钉钉知识库的相关指令,具体场景是已经获取完公众号上的文章文本,想要在钉钉知识库新建文档,把之前获取的文章文本复制到新建的文档中,我当时让他用桌面自动化去实现。后面在翻阅钉钉开发者文档的过程中,发现可以通过接口的形式来简单实现这个场景,理论成立、马上实践!

二、参考文档

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:指定文档的名称

四、实际使用场景

   这个接口的返回值是个字典,里面包含了这个文档的在线链接,这样我们就可以通过网页自动化结合我们键盘指令实现开头说的将获取的文章文本复制到新建的知识文档中。

大家根据上面的代码自己封装一下就可以了,有什么其他的场景或者想在钉钉实现的功能欢迎在评论区讨论~~~

收藏3
全部评论1
最新
发布评论
评论