钉钉-钉盘在线文件(新建-非上传)发送
评论
收藏

钉钉-钉盘在线文件(新建-非上传)发送

经验分享
土豆
2024-04-22 16:13·浏览量:1580
土豆
发布于 2024-04-22 16:131580浏览

一、背景

现在已经有大佬写了钉钉云盘操作(没错,这里点名表扬驿站大佬),只需要根据文档操作即可完成上传文件发送到群聊和用户。但是因为钉钉开发文档的更新,接口有了V1和V2而且各种文件的接口很混乱(媒体,在线,本地)所以没有特别全面,这里补充一下非上传在线文件的接口实现,基于驿站大佬的指令基础。

二、解决方案

2.1 写接口请求

这里写了两个请求,一个获取dentryId,其实类同于文件id,但是如果用驿站大佬的发送文件指令,会新建一个副本,不是原文件(是的,这就是混乱),所以这里换了一个发送链接的接口做文件发送。可以直接新建python文件然后cv

# 使用提醒:
# 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

def main(args):
    pass

import json
import os
import requests



def send_online_url(access_token,unionId,spaceId,file_name,openConversationId):
    url_ = "https://api.dingtalk.com/v1.0/convFile/conversations/files/links/send?unionId={}".format(unionId)
    # url_ = "{}{}".format("https://api.dingtalk.com", url)
    print(url_)

    dentryId_list = get_dentryId(access_token,unionId,spaceId)["dentries"]
    dentryId = [item["id"] for item in dentryId_list if file_name in item["name"].split('.')[0]][0]
    body = {
        "spaceId" : spaceId,
        "dentryId" : dentryId,
        "openConversationId" : openConversationId
    }
    headers = {
            'Host': 'api.dingtalk.com',
            "Content-Type": "application/json",
            "x-acs-dingtalk-access-token": access_token
    }
    responses = requests.post(url_, headers=headers, json=body)

    json_data = responses.json()
    code, message = json_data.get("code", None), json_data.get("message", None)
    json_str = json.dumps(json_data, ensure_ascii=False)
    assert code is None, "接口请求异常,响应值 - {},url - {}".format(json_str, url_)
    return json_data


def get_dentryId(access_token,unionId,spaceId,):
    url_ = "https://api.dingtalk.com//v1.0/storage/spaces/{}/dentries".format(spaceId)
    # url_ = "{}{}".format("https://api.dingtalk.com", url)
    print(url_)

    body = {
        "parentId" : 0,
        "unionId" : unionId
    }
    headers = {
            'Host': 'api.dingtalk.com',
            "Content-Type": "application/json",
            "x-acs-dingtalk-access-token": access_token
    }
    responses = requests.get(url_, headers=headers, json=body)

    json_data = responses.json()
    code, message = json_data.get("code", None), json_data.get("message", None)
    json_str = json.dumps(json_data, ensure_ascii=False)
    assert code is None, "接口请求异常,响应值 - {},url - {}".format(json_str, url_)
    return json_data

2.2 主流程实现

这里稍微复杂了一点,不过你可以无视,直接照抄,基本逻辑是建立钉钉云盘连接(具体流程参考驿站大佬的文档)然后直接调用模块填参即可

填参说明(照抄版本)

access_token:dingtask_instance.get_access_token()#调用对象里的token
unionId:dingtask_instance.get_operator_id(50XXXX3855XXXX9000) #此处填入用户id,发送在线文件至群会话需要的参数这里也要用到
spaceId:24XXX29XXX5 #此处填入空间ID,获取逻辑参考文档
file_name:文件名 #文件全名,考虑到可能相似文件名这里写死了逻辑
openConversationId:dingtask_instance.get_openConversationId('chat57XXXXXec2bb9XXXXX1bfaXXXXXbd324') #群会话ID

待解决问题

这里的parentId设置了也无效,问题未知,也就是说,处理不了两层文件夹下的文件,文档太乱啦!!!

欢迎大家指出问题提供优化意见哈~

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