当前位置: 首页 > news >正文

【工具】雀语queyu文件批量下载 文档内容复刻导出

【工具】雀语queyu文件批量下载  文档内容复刻导出

文档下载

https://github.com/gxr404/yuque-dl

npm i -g yuque-dl

# url 为对应需要的知识库地址
yuque-dl "https://www.yuque.com/yuque/thyzgp"

文件批量下载

文件会按照对应的目录去批量下载  建议开3个线程以内, 多了会报错

package com.gw.coze.语雀;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class YuQue {private static final List<String> h后缀白名单 = List.of("doc", "docx", "pdf", "xlsx", "xls", "ppt", "pptx", "lake");public static void main(String[] args) throws IOException {j解析目录("D:\\Data\\1850007", "1850007", "");//		HttpRequest get = HttpUtil.createGet("https://yuque.com/r/resources/download/29853662");
//		get.header("cookie", "lang=zh-cn; yuque_ctoken=f8YKyADhODS24tmUjucwqQ_Q; _yuque_session=nkulcKtzZ1RBX6UkAEvyxrH7-y8rdQCky8P-1rxmLUPPPtGLeDG17oGBSrfLpX3A_KI7--PdqZVJ13m5ZA9m9g==; receive-cookie-deprecation=1; aliyungf_tc=dd452bcc191f007aa0351febda59f15d1d6e34fc3447c962b6e81fd6b5135501; current_theme=default; acw_tc=ac11000117550636414504842e66cbbf913d99beb9db64e70dad4e4a8ee1e1");
//
//		HttpResponse execute = get.execute();
//		String location = execute.sync().header("Location");
//		HttpUtil.downloadFile(location, "D:\\Data\\222222\\1.jpeg");}public static void j解析目录(String b保存目录地址, String book_id, String m目录Id) {String url = "";if(StrUtil.isBlank(m目录Id)){//1. 递归目录url = "https://yuque.com/api/resources?book_id={}&offset=0";}else{url = "https://yuque.com/api/resources?book_id={}&parent_id={}&offset=0";}url = StrUtil.format(url, book_id, m目录Id);HttpRequest cookie = HttpUtil.createGet(url).header("cookie", "TODO 这里放cookie");String body = cookie.execute().body();
//		System.out.println(body);JSONObject entries = JSONUtil.parseObj(body);JSONArray data = entries.getJSONArray("data");// 线程数量:停车位! 限流!Semaphore semaphore = new Semaphore(3);List<Thread> threads = new ArrayList<Thread>();int size = data.size();for (int i = 0; i < size; i++) {JSONObject jsonObject = data.getJSONObject(i);Thread thread = new Thread(() -> {try {semaphore.acquire(); // acquire() 得到j解析单个(b保存目录地址, jsonObject);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release(); // release() 释放}}, String.valueOf(i));thread.start();threads.add(thread);//开线程}//阻塞 防止最后几个没执行结束的for (Thread thread : threads) {try {thread.join();} catch (Exception e) {e.printStackTrace();}}}public static void j解析单个(String b保存目录地址, JSONObject jsonObject) {b保存目录地址 = StrUtil.trim(b保存目录地址);String type = jsonObject.getStr("type");String id = jsonObject.getStr("id");String book_id = jsonObject.getStr("book_id");String filename = jsonObject.getStr("filename");filename = StrUtil.trim(filename);String ext后缀 = jsonObject.getStr("ext");if(ext后缀 != null){ext后缀 = StrUtil.trim(ext后缀);}String j绝对路径 = StrUtil.format("{}//{}", b保存目录地址, filename);if("folder".equals(type)) {//创建目录FileUtil.mkdir(j绝对路径);//目录j解析目录(j绝对路径, book_id, id);//继续递归}else{if(!h后缀白名单.contains(ext后缀)){return;}String s = j绝对路径 + "." + ext后缀;if(FileUtil.exist(s)){return;}System.out.println(s +  "-" + jsonObject);//文件//保存起来HttpRequest get = HttpUtil.createGet("https://yuque.com/r/resources/download/" + id);get.header("cookie", "TODO 这里放cookie");HttpResponse execute = get.execute();String location = execute.sync().header("Location");if(StrUtil.isBlank(location)){get = HttpUtil.createGet("https://yuque.com/r/resources/download/" + id);get.header("cookie", "TODO 这里放cookie");execute = get.execute();location = execute.sync().header("Location");}if(StrUtil.isBlank(location)){System.out.println("下载失败" + id);return;}try {HttpUtil.downloadFile(location, j绝对路径 + "." + ext后缀);}catch (Exception e){System.out.println(j绝对路径 + "." + ext后缀);e.printStackTrace();}}}}

http://www.dtcms.com/a/329363.html

相关文章:

  • LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)(模拟)(对各位进行拆解)
  • 地球磁层全球MHD模型中模拟Dst指数的半经验方法
  • 在RHEL 9.X上安装 Docker最新版(28.3.3)
  • 嵌入式|VNC实现开发板远程Debian桌面
  • Spring 源码学习(十)—— DispatcherServlet
  • 专题:2025抖音电商与微短剧行业研究报告|附150+份报告PDF汇总下载
  • 小迪23年-32~40——java简单回顾
  • Hive 创建事务表的方法
  • 机器学习-----DBSCAN算法
  • 进阶向:Python编写自动化邮件发送程序
  • C++多态:理解面向对象的“一个接口,多种实现”
  • [AXI5]AXI协议中awsize和awlen在Vector Atomic地址膨胀中的作用
  • PCIE 配置空间 拓展能力 定义
  • Linux编程 —— framebuffer
  • AJAX学习(2)
  • AI 创作系列(30)海狸 IM:小而全、易二开、快迭代
  • 八爪鱼和影刀的区别和优缺点
  • 【题解】[CQOI2006] 洛谷P4196 凸多边形 /【模板】半平面交
  • AI时代程序员的进化:从代码工人到创意架构师-优雅草卓伊凡引言:AI浪潮下的职业重构
  • Celery在Django中的应用
  • 排序总结---保研机试极限复习
  • 亚马逊聚焦战略2.0:从资源分散到价值聚焦的商业重构逻辑
  • 北京JAVA基础面试30天打卡09
  • Java面试宝典:ZGC
  • 【自动化运维神器Ansible】playbook主机清单变量深度解析:主机变量与组变量的实战应用
  • InfluxDB数据恢复
  • 在JVM跑JavaScript脚本 | Oracle GraalJS 简介与实践
  • MySQL数据库核心操作解析
  • 数据库基础—SQL语句总结及在开发时
  • 如何使用 Ollama 在本地设置并运行 Qwen3