# DownMD **Repository Path**: ziangu/downmd ## Basic Information - **Project Name**: DownMD - **Description**: 个人自用的一个项目,一个自动化工具,旨在扫描指定目录下的 Markdown 文件,识别其中的附件链接,并根据配置自动下载附件。同时,工具会重写 Markdown 内容,将下载后的本地路径替换原链接,并标记已处理的链接。 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-05 - **Last Updated**: 2026-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: Markdown ## README # 📥 Markdown 附件下载与替换工具 本项目是一个自动化工具,旨在扫描指定目录下的 Markdown 文件,识别其中的附件链接,并根据配置自动下载附件。同时,工具会重写 Markdown 内容,将下载后的本地路径替换原链接,并标记已处理的链接。 ## 📂 项目结构 项目采用模块化设计,将配置、核心逻辑、用户代理池和输出结果分离。 ```text ProjectRoot/ ├── config/ │ ├── config.ini # 主配置文件(线程数、路径、报告设置) │ └── user_agents.json # 请求头 User-Agent 池 ├── core/ │ ├── downloader.py # 多线程下载核心逻辑 │ ├── parser.py # Markdown 解析与链接替换逻辑 │ ├── report_generator.py # 报告生成逻辑 │ └── utils.py # 通用工具类(文件夹生成、文件读写) ├── docs/ # [默认输入] 待处理的 Markdown 文件目录 ├── logs/ # 日志文件目录 ├── result/ # [默认输出] 处理后的文件及下载附件目录 ├── main.py # 程序入口 └── README.md # 项目说明文档 ``` ## ⚙️ 配置说明 ### 1. 主配置 (config/config.ini) 在此文件中配置运行参数,包括输入输出路径、并发线程数以及是否生成统计报告。 ```ini [settings] # 下载线程数 (建议 1-10 之间) thread_count = 5 # 是否生成处理报告 (True/False) generate_report = True # 输入目录路径 (支持相对路径) input_path = ./docs # 输出目录路径 (支持相对路径) output_path = ./result # 下载失败重试次数 retry_count = 3 # 日志配置 # 是否输出日志到文件 (True/False) log_to_file = True # 是否输出日志到控制台 (True/False) log_to_console = True # 日志目录路径 (支持相对路径) log_dir = ./logs # 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) log_level = INFO [servers] # 文件服务器列表(逗号分隔) file_servers = github.com,raw.githubusercontent.com,gitlab.com,bitbucket.org,sourceforge.net,codeberg.org,gitea.com,notabug.org,sr.ht # 图片服务器列表(逗号分隔) image_servers = imgur.com,i.imgur.com,picsum.photos,unsplash.com,images.unsplash.com,pixabay.com,cdn.pixabay.com,pexels.com,images.pexels.com,freepik.com,images.freepik.com,imagekit.io,cloudinary.com,res.cloudinary.com,imgbb.com,i.ibb.co,postimg.cc,i.postimg.cc,photobucket.com,i.photobucket.com,tinypic.com,i.tinypic.com,imagevenue.com,i.imagevenue.com,imagebam.com,i.imagebam.com,imagehosting.com,i.imagehosting.com # 报告版权信息 copyright = © 2026 DownMD - Markdown附件下载与替换工具 # 报告版本号 version = 1.0.0 [replace] # 替换后的标记文字 mark_text = "链接已替换" ``` ### 2. User-Agent 配置 (config/user_agents.json) 为了模拟不同的请求环境,工具支持配置多个 User-Agent。程序运行时会随机或轮询读取此处的配置。 ```json { "agents": [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", "Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (iPad; CPU OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (Linux; Android 11; SM-G998U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36", "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" ] } ``` ## 🚀 功能特性 ### 1. 灵活的输入输出配置 - **默认行为**:程序默认读取项目根目录下的 `docs` 文件夹。 - **自定义路径**:可通过修改 `config.ini` 中的 `input_path` 和 `output_path` 来指定任意目录。 - **单文件支持**:支持直接处理单个 Markdown 文件。 - **结果输出**:所有处理后的 Markdown 文件和下载的附件将统一保存到 `result` 文件夹(或配置指定的输出路径)。 ### 2. 多线程下载 - 支持配置 `thread_count`,允许同时下载多个附件,显著提升处理大量文件时的效率。 - 每个线程处理不同的 Markdown 文件,确保并行处理的效率。 ### 3. 智能链接判断 - **文件链接判断**:自动识别带有文件后缀的链接。 - **服务器判断**:自动识别文件服务器(如 github.com)和图片服务器(如 imgur.com)的链接。 - **内部链接判断**:识别相对路径或绝对路径的文件链接。 ### 4. 智能目录与文件组织 - **基于附件生成文件夹**:程序会根据附件的归属或文件名,在下载目录中自动生成对应的子文件夹进行分类存储。 - **请求隔离**:每个下载任务可关联特定的 User-Agent(从 JSON 配置中读取),确保请求的多样性和隐蔽性。 ### 5. 内容替换与高亮标记 - **链接替换**:自动识别 Markdown 中的标准链接语法 `[文本](URL)`。 - **状态标记**:一旦链接被识别并处理(下载成功),原链接文本将被替换为配置中定义的标记(默认为 **“链接已替换”**)。 - **样式增强**:标记文字将自动应用 Markdown 的加粗语法。 ### 6. 详细的报告生成 - **上下布局**:报告采用上下布局,包含统计信息和链接列表。 - **统计信息**:显示总文件数、处理总链接数、剩余文件数、成功下载数、失败下载数。 - **链接列表**:包含替换链接列表、下载成功列表、失败下载列表。 - **恢复链接**:支持在报告中恢复被替换的链接。 ### 7. 强大的日志系统 - **分级日志**:支持 DEBUG、INFO、WARNING、ERROR、CRITICAL 五个级别的日志。 - **多输出**:支持同时输出日志到文件和控制台。 - **详细信息**:包含文件处理、线程信息、下载请求内容等详细日志。 ## 🔄 处理流程逻辑 1. **初始化**: - 读取 `config/config.ini` 获取路径和线程设置。 - 加载 `config/user_agents.json` 到内存。 - 检查并创建输出目录 (`result`) 和日志目录 (`logs`)。 2. **扫描与解析**: - 遍历 `input_path` 下所有的 `.md` 文件。 - 使用正则表达式提取 Markdown 链接。 - 判断链接类型(文件链接或非文件链接)。 3. **下载与组织**: - 根据配置启动线程池。 - 对文件链接(有后缀、文件服务器、图片服务器)进行下载尝试。 - 根据附件信息创建对应的子文件夹。 - 携带随机 User-Agent 发起下载请求。 4. **重写与标记**: - 下载成功后,获取本地相对路径。 - 将原 Markdown 内容中的链接替换为:`**[链接已替换](./local/path/file.ext)**`。 - 对非文件链接,直接标记为替换链接。 5. **生成报告**: - 如果 `generate_report = True`,在处理结束后生成一份包含成功/失败记录的 HTML 报告。 - 报告中包含所有替换的链接,并支持恢复操作。 ## 🛠️ 快速开始 1. 确保已安装 Python 3.8+。 2. 安装依赖: ```bash pip install requests ``` 3. 将待处理的 Markdown 文件放入 `docs` 文件夹。 4. 运行主程序: ```bash python main.py ``` 5. 查看 `result` 文件夹获取处理结果,查看 `result/report.html` 获取详细报告。 ## 📝 注意事项 - **网络连接**:下载附件需要稳定的网络连接,对于大型附件可能需要较长时间。 - **权限问题**:确保程序有足够的权限读写文件和创建目录。 - **配置文件**:修改配置文件后,确保格式正确,特别是服务器列表的逗号分隔格式。 - **User-Agent**:定期更新 User-Agent 池,以避免被目标服务器识别为爬虫。 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request 来改进这个项目!