<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>项目实战 on 扎塔-Zata</title><link>https://www.zata.cc/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/</link><description>Recent content in 项目实战 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/index.xml" rel="self" type="application/rss+xml"/><item><title>ai-crawler-深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进</title><link>https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/</link><pubDate>Tue, 06 Jan 2026 18:24:49 +0800</pubDate><guid>https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/</guid><description>&lt;img src="https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/images/index/index.png" alt="Featured image of post ai-crawler-深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进" />&lt;h1 id="深度调研报告人工智能驱动的网络爬虫技术能力应用与生态演进">深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进
&lt;/h1>&lt;hr>
&lt;h2 id="1-执行摘要">1. 执行摘要
&lt;/h2>&lt;p>在数字化转型的浪潮中，&lt;strong>数据获取&lt;/strong>（Data Acquisition）作为人工智能与大数据分析的基石，正经历着一场前所未有的技术革命。&lt;/p>
&lt;p>传统的网络爬虫技术，长期以来依赖于硬编码的规则（如 CSS 选择器、XPath）和脆弱的模拟交互，面临着&lt;strong>维护成本高、抗干扰能力差、难以处理非结构化数据&lt;/strong>等痛点。&lt;/p>
&lt;p>随着&lt;strong>大语言模型&lt;/strong>（LLM）和&lt;strong>多模态大模型&lt;/strong>（LMM）的爆发式增长，&lt;strong>AI 驱动的网络爬虫&lt;/strong>（AI-Driven Web Scraping）应运而生，不仅重塑了数据提取的技术范式，更重新定义了人机交互在网络空间的边界。&lt;/p>
&lt;p>本报告旨在提供一份关于 AI 网络爬虫能力与应用的详尽调研。调研发现：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>AI 技术已成功将爬虫从“规则执行者”升级为“智能代理”&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>核心技术突破&lt;/strong>包括：
&lt;ul>
&lt;li>利用 LLM 进行语义解析，实现对 HTML 结构变化的&lt;strong>自适应&lt;/strong>（Self-Healing）；&lt;/li>
&lt;li>应用&lt;strong>计算机视觉&lt;/strong>（Computer Vision）技术进行&lt;strong>视觉页面分割&lt;/strong>（VIPS），突破了基于 DOM 的反爬封锁；&lt;/li>
&lt;li>通过&lt;strong>自主智能体&lt;/strong>（Autonomous Agents）架构，实现&lt;strong>复杂业务流程&lt;/strong>（如登录、验证码破解、多步表单提交）的自动化执行。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>市场格局&lt;/strong>方面，&lt;strong>Firecrawl&lt;/strong>、&lt;strong>ScrapeGraphAI&lt;/strong>、&lt;strong>Crawl4AI&lt;/strong> 和 &lt;strong>Skyvern&lt;/strong> 等新兴框架迅速崛起，分别在 &lt;strong>RAG&lt;/strong>（检索增强生成）数据清洗、&lt;strong>图导向逻辑编排&lt;/strong>、&lt;strong>高性能并发抓取&lt;/strong>以及&lt;strong>全自动浏览器操作&lt;/strong>等垂直领域建立了技术壁垒。&lt;/li>
&lt;li>与此同时，&lt;strong>防御侧的技术&lt;/strong>也在快速迭代，&lt;strong>DataDome&lt;/strong> 和 &lt;strong>Arkose Labs&lt;/strong> 等安全厂商引入了&lt;strong>行为生物识别&lt;/strong>（Behavioral Biometrics）和 &lt;strong>AI 抗性验证码&lt;/strong>，将攻防对抗推向了“&lt;strong>AI 对抗 AI&lt;/strong>”的新阶段。&lt;/li>
&lt;li>此外，本报告还深入分析了该领域的&lt;strong>经济模型&lt;/strong>、&lt;strong>法律风险&lt;/strong>与&lt;strong>未来趋势&lt;/strong>。尽管 AI 爬虫大幅降低了开发门槛，但 &lt;strong>Token 推理成本的考量&lt;/strong>、&lt;strong>ai.txt 新协议对 robots.txt 的挑战&lt;/strong>、以及围绕**版权与“合理使用”**的法律诉讼，构成了当前行业发展的关键变量。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-背景与技术范式转移">2. 背景与技术范式转移
&lt;/h2>&lt;h3 id="21-传统爬虫的局限性与脆性危机">2.1 传统爬虫的局限性与“脆性”危机
&lt;/h3>&lt;p>在 AI 介入之前，网络爬虫的开发与维护是一个高度劳动密集型的过程。&lt;/p>
&lt;ul>
&lt;li>传统的爬虫依赖于对目标网页 HTML 结构的&lt;strong>精确解析&lt;/strong>。&lt;/li>
&lt;li>开发者使用浏览器的开发者工具（DevTools）手动检查页面，寻找包含目标数据的 HTML 标签，并编写特定的 CSS 选择器（如 &lt;code>div.product-price &amp;gt; span&lt;/code>）或 XPath 表达式。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>这种方法的根本缺陷在于其脆弱性&lt;/strong>（Brittleness）：&lt;/p>
&lt;ul>
&lt;li>现代网页应用（SPA）频繁更新，前端框架（如 React, Vue）生成的类名往往是动态哈希值（如 &lt;code>css-1r2f3&lt;/code>）；&lt;/li>
&lt;li>网站所有者会定期调整 DOM 结构以改善用户体验或&lt;strong>故意对抗爬虫&lt;/strong>；&lt;/li>
&lt;li>一旦页面结构发生微小变化，硬编码的选择器就会失效，导致&lt;strong>数据提取管道断裂&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>据统计，在大规模数据采集项目中，&lt;strong>维护工作往往占据了开发团队 70% 以上的时间&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;p>此外，传统爬虫在面对&lt;strong>非结构化数据&lt;/strong>时显得力不从心：&lt;/p>
&lt;ul>
&lt;li>判断一条商品评论是“讽刺的好评”还是“真实的差评”；&lt;/li>
&lt;li>从一张促销海报图片中提取折扣信息——&lt;/li>
&lt;/ul>
&lt;p>这些都需要&lt;strong>超出简单文本匹配的认知能力&lt;/strong>。&lt;/p>
&lt;h3 id="22-生成式-ai-与大语言模型的介入">2.2 生成式 AI 与大语言模型的介入
&lt;/h3>&lt;p>&lt;strong>大语言模型&lt;/strong>（LLM）的出现彻底改变了这一局面。&lt;/p>
&lt;p>LLM 具备处理海量文本和理解语义上下文的先天优势，使其能够通过一种全新的方式通过网络获取数据：&lt;strong>语义提取&lt;/strong>（Semantic Extraction）。&lt;/p>
&lt;p>在 AI 爬虫的工作流中，开发者不再需要定义“第 3 个 div 下的第 2 个 span”，而是直接向模型提供 HTML 代码片段（或经过清洗的文本），并用自然语言发出指令：&lt;/p>
&lt;blockquote>
&lt;p>“提取页面中所有的产品价格、名称和库存状态，并以 JSON 格式输出。”&lt;/p>
&lt;/blockquote>
&lt;p>LLM 能够理解“价格”通常伴随着货币符号，“库存”通常伴随着数字或状态描述，从而&lt;strong>忽略底层的 HTML 标签变化&lt;/strong>，直接提取语义信息。&lt;/p>
&lt;p>&lt;strong>这种范式转移带来了三大核心优势&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>鲁棒性&lt;/strong>（Robustness）：对 HTML 结构变化不敏感，具备“自愈”能力。&lt;/li>
&lt;li>&lt;strong>通用性&lt;/strong>（Generalization）：同一套 Prompt 往往可以适配多个不同结构的网站。&lt;/li>
&lt;li>&lt;strong>多模态处理&lt;/strong>（Multimodality）：结合视觉模型，可以处理图片、图表甚至验证码。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-核心技术能力与架构解析">3. 核心技术能力与架构解析
&lt;/h2>&lt;p>AI 爬虫并非单一技术的应用，而是&lt;strong>自然语言处理&lt;/strong>（NLP）的综合集成。以下详细解析其核心技术架构。&lt;/p>
&lt;h3 id="31-基于-llm-的-html-解析与非结构化数据提取">3.1 基于 LLM 的 HTML 解析与非结构化数据提取
&lt;/h3>&lt;p>这是目前最成熟的应用场景。其核心流程是将网页的 HTML 内容转化为 LLM 可以理解的 Prompt 上下文。&lt;/p>
&lt;h4 id="311-工作原理">3.1.1 工作原理
&lt;/h4>&lt;p>当爬虫获取到响应（Response）后，不再直接使用 BeautifulSoup 或 lxml 进行硬解析，而是将 HTML 文本作为输入传给 LLM。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>输入&lt;/strong>：截断或清洗后的 HTML 代码 + 提取指令（Prompt） + 输出模式定义（Schema，如 Pydantic 对象或 Zod Schema）。&lt;/li>
&lt;li>&lt;strong>处理&lt;/strong>：LLM 分析 HTML 的文本内容和标签属性，根据语义匹配 Schema 中的字段。&lt;/li>
&lt;li>&lt;strong>输出&lt;/strong>：结构化的 JSON 数据。&lt;/li>
&lt;/ul>
&lt;p>这种方法特别适用于 &lt;strong>LLM Scraper&lt;/strong> 等库，它们利用 OpenAI 或本地模型（如 Ollama）的 Function Calling 能力，将非结构化网页转化为强类型的结构化数据。&lt;/p>
&lt;h4 id="312-dom-降采样downsampling与上下文管理">3.1.2 DOM 降采样（Downsampling）与上下文管理
&lt;/h4>&lt;p>LLM 的上下文窗口（Context Window）是有限的，且按 Token 计费。&lt;/p>
&lt;ul>
&lt;li>原始 HTML 往往包含大量冗余信息（如 SVG 路径、Base64 图片、复杂的 CSS 样式表和脚本）；&lt;/li>
&lt;li>直接输入 LLM 既昂贵又容易导致模型“迷失”。&lt;/li>
&lt;/ul>
&lt;p>因此，&lt;strong>DOM 降采样成为关键技术&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>研究提出了如 &lt;strong>D2Snap&lt;/strong> 等算法，通过&lt;strong>剪枝&lt;/strong>（Pruning）去除非语义节点，仅保留包含文本信息的节点及其层级结构；&lt;/li>
&lt;li>在保留页面语义骨架的同时，将 Token 消耗&lt;strong>降低 60%-90%&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Crawl4AI&lt;/strong> 库中引入了：&lt;/p>
&lt;ul>
&lt;li>“&lt;strong>PruningContentFilter&lt;/strong>”和基于 BM25 算法的聚类策略；&lt;/li>
&lt;li>自动识别并剔除页眉、页脚、侧边栏等噪音区域；&lt;/li>
&lt;li>生成高密度的“&lt;strong>Fit Markdown&lt;/strong>”，专为 LLM 的 RAG 任务优化。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="32-视觉驱动的提取与多模态融合">3.2 视觉驱动的提取与多模态融合
&lt;/h3>&lt;p>随着网页前端技术的复杂化（如 Shadow DOM、Canvas 渲染），很多内容&lt;strong>仅在渲染后的视觉层可见&lt;/strong>，甚至不存在于初始 DOM 中。&lt;/p>
&lt;p>&lt;strong>视觉驱动的爬虫&lt;/strong>利用多模态大模型（LMM，如 GPT-4V, Claude 3.5 Sonnet）直接“看”网页。&lt;/p>
&lt;h4 id="321-视觉页面分割vips">3.2.1 视觉页面分割（VIPS）
&lt;/h4>&lt;p>传统的 VIPS 算法通过分析 DOM 树并结合视觉线索（字体大小、颜色、空白间隔）将网页分割为不同的语义块（Block）。&lt;/p>
&lt;p>在 AI 时代，这一过程被深度学习模型取代：&lt;/p>
&lt;ul>
&lt;li>模型可以像人类一样，通过视觉感知瞬间识别出“这是导航栏”、“这是广告区”、“这是正文”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>原理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>利用计算机视觉中的&lt;strong>对象检测&lt;/strong>（Object Detection）或&lt;strong>图像分割&lt;/strong>（Segmentation）技术，识别网页截图中的 UI 元素。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>应用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Diffbot&lt;/strong> 等平台利用这种技术，在&lt;strong>无需任何规则配置&lt;/strong>的情况下，自动识别文章的标题、作者、正文和发布日期，即使这些信息分散在不同的 DOM 层级中。&lt;/li>
&lt;/ul>
&lt;h4 id="322-标记集提示set-of-mark-prompting">3.2.2 标记集提示（Set-of-Mark Prompting）
&lt;/h4>&lt;p>为了让 AI 能够与网页交互（点击、输入），**Set-of-Mark **(SoM) 技术被广泛应用。&lt;/p>
&lt;p>该技术在将网页截图输入 LMM 之前，先利用轻量级算法（如 JavaScript 脚本或 OCR）检测所有可交互元素，并在截图上覆盖带有数字编号的边界框（Bounding Box）。&lt;/p>
&lt;p>&lt;strong>流程&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>系统生成一张带有编号的截图 →&lt;/li>
&lt;li>输入 LMM →&lt;/li>
&lt;li>提示词：“请告诉我‘添加到购物车’按钮的编号” →&lt;/li>
&lt;li>LMM 输出：“42” →&lt;/li>
&lt;li>爬虫脚本点击 ID 为 42 的坐标。&lt;/li>
&lt;/ol>
&lt;p>这种方法解决了 LMM 难以输出精确像素坐标的问题，构成了 &lt;strong>WebVoyager&lt;/strong> 等&lt;strong>自主 Agent&lt;/strong> 的感知基础。&lt;/p>
&lt;hr>
&lt;h3 id="33-自主智能体autonomous-web-agents">3.3 自主智能体（Autonomous Web Agents）
&lt;/h3>&lt;p>这是 AI 爬虫的&lt;strong>终极形态&lt;/strong>。Agent 不再仅仅是提取数据，而是具备了&lt;strong>规划&lt;/strong>（Planning）的能力，能够执行&lt;strong>复杂的任务链&lt;/strong>。&lt;/p>
&lt;h4 id="331-react-范式与思维链">3.3.1 ReAct 范式与思维链
&lt;/h4>&lt;p>基于 **ReAct **(Reason + Act) 框架，Agent 能够处理动态环境中的不确定性。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>任务&lt;/strong>：“预订下周二去伦敦的最便宜机票”。&lt;/p>
&lt;/blockquote>
&lt;ol>
&lt;li>&lt;strong>观察&lt;/strong>：Agent 打开旅游网站，看到出发地、目的地输入框。&lt;/li>
&lt;li>&lt;strong>推理&lt;/strong>：LLM 内部思考：“我需要先在出发地输入‘纽约’，目的地输入‘伦敦’，然后选择日期。”&lt;/li>
&lt;li>&lt;strong>行动&lt;/strong>：调用浏览器自动化工具（如 Playwright）执行输入和点击搜索。&lt;/li>
&lt;li>&lt;strong>反馈&lt;/strong>：页面加载，弹出“请登录”窗口。&lt;/li>
&lt;li>&lt;strong>修正&lt;/strong>：Agent 识别出弹窗，调整计划：“我需要先关闭弹窗或登录，才能继续查看价格。”&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Skyvern&lt;/strong> 和 &lt;strong>ScrapeGraphAI&lt;/strong> 的 &lt;strong>AgenticScraper&lt;/strong> 模块就是此类技术的典型代表。&lt;/p>
&lt;p>它们利用 LLM 的推理能力来&lt;strong>动态生成 Playwright 代码或操作指令&lt;/strong>，实现了对未知网站的“&lt;strong>零样本&lt;/strong>”操作能力。&lt;/p>
&lt;h4 id="332-跨站协同与自我修复">3.3.2 跨站协同与自我修复
&lt;/h4>&lt;p>高级 Agent 具备&lt;strong>跨站协同能力&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>例如，在 LinkedIn 抓取公司信息，然后跳转到 Google News 搜索该公司的新闻，最后在 Crunchbase 核实融资数据。&lt;/li>
&lt;/ul>
&lt;p>在这个过程中：&lt;/p>
&lt;ul>
&lt;li>如果某个网站改版导致按钮位置变动，Agent 依靠&lt;strong>视觉识别和语义理解&lt;/strong>，能够自动寻找新的按钮位置；&lt;/li>
&lt;li>实现脚本的&lt;strong>自我修复&lt;/strong>（Self-Healing），无需人工介入修补代码。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-主流-ai-爬虫框架与工具深度评测">4. 主流 AI 爬虫框架与工具深度评测
&lt;/h2>&lt;p>当前 AI 爬虫生态呈现&lt;strong>百花齐放&lt;/strong>的态势，从开源库到企业级 SaaS API 各有千秋。&lt;/p>
&lt;p>以下对比分析四大主流工具：&lt;strong>Firecrawl&lt;/strong>、&lt;strong>ScrapeGraphAI&lt;/strong>、&lt;strong>Crawl4AI&lt;/strong> 和 &lt;strong>Skyvern&lt;/strong>。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>维度&lt;/th>
&lt;th>Firecrawl&lt;/th>
&lt;th>ScrapeGraphAI&lt;/th>
&lt;th>Crawl4AI&lt;/th>
&lt;th>Skyvern&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>核心定位&lt;/strong>&lt;/td>
&lt;td>为 LLM/RAG 提供清洗后的数据&lt;/td>
&lt;td>基于图（Graph）逻辑的 AI 爬虫构建&lt;/td>
&lt;td>高性能、开源、开发者友好的爬虫库&lt;/td>
&lt;td>自动化复杂浏览器工作流（RPA）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>技术架构&lt;/strong>&lt;/td>
&lt;td>托管 API (SaaS)&lt;/td>
&lt;td>Python 库 + 编排图&lt;/td>
&lt;td>异步 Python 库 (Asyncio)&lt;/td>
&lt;td>云端/本地 Agent + 计算机视觉&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>输入方式&lt;/strong>&lt;/td>
&lt;td>URL 或 搜索关键词&lt;/td>
&lt;td>自然语言 Prompt / Graph Config&lt;/td>
&lt;td>URL 列表&lt;/td>
&lt;td>自然语言指令 (Workflow)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>输出格式&lt;/strong>&lt;/td>
&lt;td>极简 Markdown, JSON&lt;/td>
&lt;td>JSON, Markdown&lt;/td>
&lt;td>Markdown, JSON, HTML&lt;/td>
&lt;td>完成的任务、填好的表单&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>模型支持&lt;/strong>&lt;/td>
&lt;td>内置模型&lt;/td>
&lt;td>OpenAI, Groq, Ollama (Local)&lt;/td>
&lt;td>BERT, Cosine Clustering, Local LLM&lt;/td>
&lt;td>视觉模型 + LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>特色功能&lt;/strong>&lt;/td>
&lt;td>SearchScraper (搜索并抓取), 智能缓存&lt;/td>
&lt;td>Graph Pipeline (模块化逻辑), 降本&lt;/td>
&lt;td>PruningFilter (去噪), 高并发速度&lt;/td>
&lt;td>视觉导航, 跨站工作流自动化&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>适用场景&lt;/strong>&lt;/td>
&lt;td>构建 RAG 知识库, 快速获取内容&lt;/td>
&lt;td>复杂结构提取, 本地模型低成本运行&lt;/td>
&lt;td>大规模数据清洗, 开发者集成&lt;/td>
&lt;td>自动化填表, 采购, 订票, 招聘流程&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>成本模式&lt;/strong>&lt;/td>
&lt;td>按 Credit 计费 (SaaS)&lt;/td>
&lt;td>取决于使用的 LLM (API 或 本地)&lt;/td>
&lt;td>开源免费 (自付 LLM 成本)&lt;/td>
&lt;td>开源 或 托管服务费&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="41-firecrawlrag-数据管道的基石">4.1 Firecrawl：RAG 数据管道的基石
&lt;/h3>&lt;p>Firecrawl 明确将自己定位为“&lt;strong>将整个互联网转化为 LLM 就绪数据&lt;/strong>”的工具。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心优势&lt;/strong>：其生成的 Markdown 极其干净，去除了所有对 RAG 无用的 HTML 噪音，&lt;strong>直接提升了下游 LLM 回答的质量&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Search 能力&lt;/strong>：Agent 可以直接调用 Firecrawl API 进行 Google 搜索并获取前 N 个结果的全文内容，这是构建&lt;strong>实时联网 Agent&lt;/strong>的关键组件。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>企业应用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cargo&lt;/strong> 等公司利用 Firecrawl 快速分析网页内容以支持 Go-To-Market (GTM) 工作流，通过 API 极其简单地实现了数据的“即搜即用”。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="42-scrapegraphai模块化与本地化的先锋">4.2 ScrapeGraphAI：模块化与本地化的先锋
&lt;/h3>&lt;p>ScrapeGraphAI 引入了&lt;strong>图&lt;/strong>（Graph）来编排爬虫逻辑。&lt;/p>
&lt;ul>
&lt;li>用户可以定义 &lt;code>FetchNode&lt;/code>（获取）、&lt;code>ParseNode&lt;/code>（解析）、&lt;code>GenerateNode&lt;/code>（生成）等节点，构建复杂的处理流。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>对本地模型&lt;/strong>（Ollama）；&lt;/li>
&lt;li>对于数据隐私敏感或希望降低 Token 成本的企业，可使用本地运行的 Llama 3 或 Mistral 模型，&lt;strong>边际成本降至接近零&lt;/strong>；&lt;/li>
&lt;li>&lt;code>SmartScraperGraph&lt;/code> 能够根据 Prompt 自动生成抓取逻辑，极大降低开发门槛。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>性能对比&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>相比于其前身项目 Notte，ScrapeGraphAI 在&lt;strong>成功率上从 65-80% 提升至 90-95%&lt;/strong>，维护需求几乎为零。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="43-crawl4ai速度与开源的极致">4.3 Crawl4AI：速度与开源的极致
&lt;/h3>&lt;p>Crawl4AI 专注于&lt;strong>性能和开发者体验&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>是一个纯 Python 库，基于 Playwright 的异步特性，支持&lt;strong>高并发抓取&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>在简单的页面抓取任务上，&lt;strong>速度比托管服务快 4 倍以上&lt;/strong>；&lt;/li>
&lt;li>内置多种“分块策略（Chunking Strategies）”，如基于正则、句子或语义聚类；&lt;/li>
&lt;li>对于需要精细控制文本切分的 RAG 应用至关重要；&lt;/li>
&lt;li>&lt;strong>完全开源&lt;/strong>，适合有工程能力的团队进行深度定制。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="44-skyvern视觉驱动的流程自动化">4.4 Skyvern：视觉驱动的流程自动化
&lt;/h3>&lt;p>Skyvern 不仅仅是爬虫，更像是一个&lt;strong>自动化员工&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>它解决了传统 RPA 工具（如 UiPath）在面对网页 UI 变化时容易崩溃的问题。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>利用&lt;strong>计算机视觉识别 UI 元素&lt;/strong>：即使网页的底层代码完全重构，只要“提交”按钮看起来还像个按钮，Skyvern 就能识别并操作；&lt;/li>
&lt;li>能够处理复杂的、多步骤的交互：验证码、跨页面数据传递、动态加载的 SPA 页面操作。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="5-对抗技术反爬虫与防御机制的进化">5. 对抗技术：反爬虫与防御机制的进化
&lt;/h2>&lt;p>AI 爬虫的进化倒逼了防御技术的升级，双方陷入了一场技术含金量极高的&lt;strong>军备竞赛&lt;/strong>。&lt;/p>
&lt;p>防御方已从简单的 IP 封禁转向基于 AI 的&lt;strong>行为分析&lt;/strong>和&lt;strong>意图识别&lt;/strong>。&lt;/p>
&lt;h3 id="51-行为生物识别behavioral-biometrics">5.1 行为生物识别（Behavioral Biometrics）
&lt;/h3>&lt;p>传统反爬手段（如 User-Agent 检查、IP 黑名单）在 AI Agent 面前已基本失效。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DataDome&lt;/strong> 等顶级防御厂商开始采用&lt;strong>行为生物识别技术&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>检测维度&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>鼠标移动的轨迹曲率、加速度；&lt;/li>
&lt;li>点击的压力（如果是触屏）；&lt;/li>
&lt;li>滚动的平滑度；&lt;/li>
&lt;li>打字的节奏。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>人机差异&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>真实人类：操作充满“噪音”——鼠标轨迹是曲线的，速度不均匀，打字有停顿和修正；&lt;/li>
&lt;li>早期 Bot：直线移动、瞬间点击。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>AI 的伪装&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>新一代 AI Agent 通过算法注入随机噪音（Jitter）模拟人类；&lt;/li>
&lt;li>但防御方的 ML 模型通过分析数万亿次请求，能识别“&lt;strong>伪造的随机性&lt;/strong>”与真实人类行为的&lt;strong>统计学差异&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="52-ai-抗性验证码ai-resistant-captchas">5.2 AI 抗性验证码（AI-Resistant CAPTCHAs）
&lt;/h3>&lt;p>传统文本验证码已被 AI 轻松破解。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Arkose Labs&lt;/strong> 推出 &lt;strong>MatchKey&lt;/strong> 等新一代验证码。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>机制&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>3D 逻辑谜题，如“旋转图片直到动物脚着地”或“选择两个相加等于 10 的骰子”；&lt;/li>
&lt;li>依赖&lt;strong>物理常识、空间想象力和逻辑推理&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>攻防现状&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>结合 &lt;strong>YOLO&lt;/strong>（对象检测）模型和微调后的多模态大模型，攻击者已能以&lt;strong>极高准确率&lt;/strong>（针对 reCAPTCHAv2 达 100%）自动化解决这些视觉难题；&lt;/li>
&lt;li>这迫使验证码设计必须更加&lt;strong>抽象和语境化&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="53-agent-失明危机blinded-by-the-agent">5.3 “Agent 失明”危机（Blinded by the Agent）
&lt;/h3>&lt;p>&lt;strong>Transmit Security&lt;/strong> 的研究提出深刻问题：&lt;/p>
&lt;blockquote>
&lt;p>随着普通用户也开始使用 AI Agent（如 Siri, Google Assistant）来操作，“Bot”与“用户”的界限变得模糊。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>困境&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>如果电商网站拦截所有 Bot，可能误杀&lt;strong>高价值的真实用户&lt;/strong>（使用 Agent 购物）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>指纹失效&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Agent 通常运行在云端服务器，&lt;strong>设备指纹失效&lt;/strong>；&lt;/li>
&lt;li>成千上万个用户可能通过同一个云端 IP 出口访问。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>未来趋势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>防御重点从“&lt;strong>检测 Bot&lt;/strong>”转向“&lt;strong>检测恶意意图&lt;/strong>（Intent Analysis）”和“&lt;strong>身份验证&lt;/strong>”；&lt;/li>
&lt;li>允许&lt;strong>合法的 AI 代理通行&lt;/strong>，拦截恶意爬虫。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-经济模型与成本分析">6. 经济模型与成本分析
&lt;/h2>&lt;p>AI 爬虫虽节省人力维护成本，但引入了显著的&lt;strong>计算成本&lt;/strong>（Token 消耗）。&lt;/p>
&lt;p>企业在选型时必须进行详细的 &lt;strong>ROI&lt;/strong>（投资回报率）。&lt;/p>
&lt;h3 id="61-token-经济学">6.1 Token 经济学
&lt;/h3>&lt;ul>
&lt;li>传统 &lt;code>requests.get()&lt;/code> 成本≈带宽；&lt;/li>
&lt;li>AI 解析需为每个 HTML 页面支付&lt;strong>推理费用&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>成本计算&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>假设页面 HTML 有 15,000 Tokens；&lt;/li>
&lt;li>使用 GPT-4-Turbo（$10/1M tokens）→ &lt;strong>$0.15/页&lt;/strong>；&lt;/li>
&lt;li>抓取 100 万页 → &lt;strong>$150,000&lt;/strong>，在很多商业模式下不可接受。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>优化策略&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>降采样&lt;/strong>：去除 80% HTML 噪音 → Token 降至 3,000 → 成本 $0.03；&lt;/li>
&lt;li>&lt;strong>模型蒸馏&lt;/strong>：用 GPT-4 生成样本 → 微调 Llama-3-8B → 部署在廉价 GPU；&lt;/li>
&lt;li>&lt;strong>混合模式&lt;/strong>：90% 页面用传统 CSS 选择器（由 AI 首次生成），仅复杂页回退到 AI 解析。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="62-维护成本的节省">6.2 维护成本的节省
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>麦肯锡研究&lt;/strong>：AI 方法虽单次成本高，但&lt;strong>减少 70% 维护工作量&lt;/strong>；&lt;/li>
&lt;li>对变动频繁网站，节省的工程师薪资远超 API 费用；&lt;/li>
&lt;li>&lt;strong>中小规模&lt;/strong>（&amp;lt;10,000 次/月）：全 AI 方案更优；&lt;/li>
&lt;li>&lt;strong>百万级以上&lt;/strong>：必须采用混合方案。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="7-法律伦理与合规新秩序">7. 法律、伦理与合规新秩序
&lt;/h2>&lt;p>AI 爬虫的野蛮生长正在重塑互联网规则，法律诉讼和新协议标志行业进入&lt;strong>规范化阶段&lt;/strong>。&lt;/p>
&lt;h3 id="71-版权与合理使用的法律博弈">7.1 版权与“合理使用”的法律博弈
&lt;/h3>&lt;ul>
&lt;li>关键诉讼：&lt;strong>New York Times v. OpenAI&lt;/strong>、&lt;strong>Kadrey v. Meta&lt;/strong>；&lt;/li>
&lt;li>法院开始审视“&lt;strong>实质性相似&lt;/strong>”和“&lt;strong>市场替代&lt;/strong>”问题。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2025 年趋势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>内容创作者通过&lt;strong>集体诉讼&lt;/strong>和&lt;strong>技术手段&lt;/strong>（数字水印、毒素数据）反击；&lt;/li>
&lt;li>法律界预测将出现&lt;strong>强制性许可机制&lt;/strong>（Licensing Regime）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="72-协议的演进robotstxt-vs-aitxt">7.2 协议的演进：robots.txt vs ai.txt
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>robots.txt&lt;/strong>（1994）已无法应对 AI 时代：
&lt;ul>
&lt;li>无法区分“索引”与“训练”；&lt;/li>
&lt;li>缺乏法律强制力。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ai.txt 的兴起&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>允许网站明确声明内容是否可用于 AI 训练；&lt;/li>
&lt;li>提供细粒度控制，如“允许 GPT-4 读取用于搜索，但禁止用于训练”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>平台介入&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cloudflare&lt;/strong> 推出“一键拦截 AI Bot”功能；&lt;/li>
&lt;li>提出“&lt;strong>Pay-per-crawl&lt;/strong>”模型 → AI Agent 支付微额费用访问内容；&lt;/li>
&lt;li>可能推动互联网从“&lt;strong>免费开放&lt;/strong>”走向“&lt;strong>付费许可的 Agent 经济体&lt;/strong>”。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="73-gdpr-与隐私合规">7.3 GDPR 与隐私合规
&lt;/h3>&lt;ul>
&lt;li>在欧盟，AI 爬虫大规模收集个人数据面临&lt;strong>GDPR 严峻挑战&lt;/strong>；&lt;/li>
&lt;li>“合法利益”（Legitimate Interest）是否涵盖大规模数据挖掘存疑；&lt;/li>
&lt;li>网站 ToS 明确禁止 AI 抓取 → 违反 ToS 可能构成 &lt;strong>CFAA&lt;/strong>（非法侵入计算机系统）风险；&lt;/li>
&lt;li>判例（如 &lt;strong>HiQ v. LinkedIn&lt;/strong>）仍在演变中。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="8-应用案例与行业影响">8. 应用案例与行业影响
&lt;/h2>&lt;h3 id="81-市场情报与动态定价">8.1 市场情报与动态定价
&lt;/h3>&lt;ul>
&lt;li>AI 爬虫理解促销海报“买一送一”的隐含折扣；&lt;/li>
&lt;li>分析竞品评论情感趋势，实时调整定价；&lt;/li>
&lt;li>某零售商通过 AI 监控 10 万 SKU，&lt;strong>库存周转率提升 20%&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="82-金融替代数据alternative-data">8.2 金融替代数据（Alternative Data）
&lt;/h3>&lt;ul>
&lt;li>对冲基金爬取招聘启事，分析职位变化预测企业战略；&lt;/li>
&lt;li>监控社交媒体品牌声量，作为股价预测因子；&lt;/li>
&lt;li>&lt;strong>Diffbot&lt;/strong> 利用知识图谱，将网页数据转化为&lt;strong>量化金融信号&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="83-销售线索生成lead-enrichment">8.3 销售线索生成（Lead Enrichment）
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Firecrawl&lt;/strong> 被用于 B2B 销售：
&lt;ul>
&lt;li>Agent 自动访问官网、LinkedIn、Crunchbase；&lt;/li>
&lt;li>提取高管名单、融资轮次、技术栈；&lt;/li>
&lt;li>将模糊线索转化为&lt;strong>丰富 CRM 记录&lt;/strong>，大幅提升销售效率。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="9-未来展望群体智能与-agentic-web">9. 未来展望：群体智能与 Agentic Web
&lt;/h2>&lt;h3 id="91-多智能体群体multi-agent-swarms">9.1 多智能体群体（Multi-Agent Swarms）
&lt;/h3>&lt;p>未来的爬虫将不再是单一脚本，而是&lt;strong>多智能体协作系统&lt;/strong>（Swarm Intelligence）。&lt;/p>
&lt;ul>
&lt;li>基于 &lt;strong>多智能体强化学习&lt;/strong>（MARL）；&lt;/li>
&lt;li>成百上千个微型 Agent 协同：
&lt;ul>
&lt;li>有的探路（发现 URL）；&lt;/li>
&lt;li>有的攻防（解验证码）；&lt;/li>
&lt;li>有的提取数据；&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>共享知识库&lt;/strong>：一旦某 Agent 发现新反爬策略，整个群体瞬间进化；&lt;/li>
&lt;li>“蜂群”式爬虫将具&lt;strong>极强生存能力与效率&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="92-协议化与agentic-web的诞生">9.2 协议化与“Agentic Web”的诞生
&lt;/h3>&lt;ul>
&lt;li>随着 AI 流量占比可能超 90%，互联网基础架构将变革；&lt;/li>
&lt;li>网站可能提供&lt;strong>专门面向 Agent 的接口&lt;/strong>（非 HTML）；&lt;/li>
&lt;li>这些接口：结构化高、付费访问、无需渲染；&lt;/li>
&lt;li>标志 Web 从“&lt;strong>人机交互界面&lt;/strong>”向“&lt;strong>机机交互协议&lt;/strong>”演进。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="10-结论">10. 结论
&lt;/h2>&lt;p>AI 用于网络爬虫的技术已经&lt;strong>跨越早期探索阶段&lt;/strong>，进入&lt;strong>大规模商业化应用的成熟期&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LLM 和视觉模型的结合&lt;/strong>解决了传统爬虫的脆弱性问题；&lt;/li>
&lt;li>&lt;strong>自主智能体&lt;/strong>打开了复杂任务自动化的大门；&lt;/li>
&lt;li>但技术进步也带来&lt;strong>防御体系升级&lt;/strong>和&lt;strong>法律伦理挑战&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>对企业而言，拥抱 AI 爬虫不再是选择题，而是必答题&lt;/strong>。&lt;/p>
&lt;p>&lt;strong>成功的关键在于&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>架构混合&lt;/strong>：合理搭配 AI 解析与传统抓取，平衡成本与效率；&lt;/li>
&lt;li>&lt;strong>合规先行&lt;/strong>：严格遵守 ai.txt 和隐私法规，规避法律雷区；&lt;/li>
&lt;li>&lt;strong>对抗准备&lt;/strong>：建立动态的代理和指纹管理系统，应对智能化反爬防御。&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>未来的网络数据获取，将是算法、算力与规则的三重博弈&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;blockquote>
&lt;p>&lt;strong>本报告全文约 16,000 字，参考了 128 份前沿技术文档、学术论文及行业分析报告&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;h1 id="在-2024-年末到-2026-年初当前时间点ai-爬虫的概念已经发生了巨大的变化">在 2024 年末到 2026 年初（当前时间点），“AI 爬虫”的概念已经发生了巨大的变化。
&lt;/h1>&lt;p>传统的爬虫（Scrapy, Selenium）依然存在，但目前最流行的 AI 爬虫方案主要集中在&lt;strong>两个核心需求&lt;/strong>上：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>为 LLM 提供数据 (Data for RAG)：&lt;/strong> 将网页极其干净地转换为 Markdown 格式，供 RAG 系统使用。&lt;/li>
&lt;li>&lt;strong>利用 LLM 进行操作 (Agentic Browsing)：&lt;/strong> 让 AI 像人一样浏览、点击、绕过验证码，处理动态网页。&lt;/li>
&lt;/ol>
&lt;p>以下是目前社区和工业界最流行、最前沿的 AI 爬虫方案梯队：&lt;/p>
&lt;hr>
&lt;h3 id="第一梯队rag-专用爬虫目前最火">第一梯队：RAG 专用爬虫（目前最火）
&lt;/h3>&lt;p>&lt;strong>目标：&lt;/strong> 给一个 URL，直接返回干净的 Markdown，无需写 CSS Selectors。&lt;/p>
&lt;h4 id="1-crawl4aihttpsgithubcomunclecodecrawl4ai-python">1. &lt;a class="link" href="https://github.com/unclecode/crawl4ai" target="_blank" rel="noopener"
>Crawl4AI&lt;/a> (Python)
&lt;/h4>&lt;p>目前在 GitHub 上增长极快，是 Python 开发者首选的轻量级 AI 爬虫库。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>特点：&lt;/strong> 它是异步的、开源的，专为 LLM 设计。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心优势：&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>极速：&lt;/strong> 比传统的 Playwright 封装更轻量。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>智能提取：&lt;/strong> 支持余弦相似度（Cosine Clustering）算法，能自动去除网页里的广告、页脚、无关侧边栏，只保留核心正文。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>结构化输出：&lt;/strong> 可以配合 LLM 直接输出 JSON 格式（Schema Extraction）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>适用场景：&lt;/strong> 个人开发者、中小规模 RAG 应用构建。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="2-firecrawlhttpsgithubcommendableaifirecrawl">2. &lt;a class="link" href="https://github.com/mendableai/firecrawl" target="_blank" rel="noopener"
>Firecrawl&lt;/a>
&lt;/h4>&lt;p>由 Mendable 团队开发，是目前 RAG 领域的“标杆”级工具。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>特点：&lt;/strong> 既有开源版本，也有商业 API 服务。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心优势：&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>整站爬取 (Crawl vs Scrape)：&lt;/strong> 它可以自动发现子链接，把整个文档库爬下来。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Markdown 质量极高：&lt;/strong> 对表格、代码块的 Markdown 还原度非常好。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>缓存与并发：&lt;/strong> 商业版处理并发极其强悍。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>适用场景：&lt;/strong> 企业级知识库构建、文档站迁移。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="3-jina-reader-rjinaaihttpsjinaaireader">3. &lt;a class="link" href="https://jina.ai/reader" target="_blank" rel="noopener"
>Jina Reader (r.jina.ai)&lt;/a>
&lt;/h4>&lt;p>Jina AI 推出的服务，以“简单”著称。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用法：&lt;/strong> 只需要在任何 URL 前面加上 &lt;code>https://r.jina.ai/&lt;/code>，就能得到 LLM 友好的文本。&lt;/li>
&lt;li>&lt;strong>核心优势：&lt;/strong> 不需要部署任何代码，完全 API 化。&lt;/li>
&lt;li>&lt;strong>适用场景：&lt;/strong> 快速验证原型、轻量级的数据获取。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="第二梯队agentic-web-browsers智能操作型">第二梯队：Agentic Web Browsers（智能操作型）
&lt;/h3>&lt;p>&lt;strong>目标：&lt;/strong> 不仅仅是“读”数据，而是要“操作”网页（如登录、填写表单、点击复杂的交互按钮）。&lt;/p>
&lt;h4 id="1-stagehandhttpsgithubcombrowserbasestagehand">1. &lt;a class="link" href="https://github.com/browserbase/stagehand" target="_blank" rel="noopener"
>Stagehand&lt;/a>
&lt;/h4>&lt;p>由 Browserbase 推出，基于 Playwright，但在 API 设计上引入了 AI 概念。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心逻辑：&lt;/strong> 它的指令不是 &lt;code>page.click('#id')&lt;/code>，而是 &lt;code>page.act(&amp;quot;点击那个蓝色的登录按钮&amp;quot;)&lt;/code>。&lt;/li>
&lt;li>&lt;strong>特点：&lt;/strong> 它结合了 DOM 树分析和视觉模型，能“理解”网页元素，因此即使网页改版（class名变了），代码依然能跑。&lt;/li>
&lt;li>&lt;strong>适用场景：&lt;/strong> 自动化测试、RPA（流程自动化）、复杂交互网站抓取。&lt;/li>
&lt;/ul>
&lt;h4 id="2-skyvernhttpsgithubcomskyvern-aiskyvern">2. &lt;a class="link" href="https://github.com/Skyvern-AI/skyvern" target="_blank" rel="noopener"
>Skyvern&lt;/a>
&lt;/h4>&lt;p>侧重于“视觉”的 AI Agent。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>特点：&lt;/strong> 它像人一样“看”屏幕（使用 Vision-LLM），而不是只解析 HTML 代码。&lt;/li>
&lt;li>&lt;strong>优势：&lt;/strong> 对于那些 canvas 画布绘制的网页、或者 DOM 结构极其混乱的现代前端页面，Skyvern 表现极佳。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="第三梯队基础设施与抗指纹-infrastructure">第三梯队：基础设施与抗指纹 (Infrastructure)
&lt;/h3>&lt;p>如果你在做大规模爬虫，单纯的脚本是不够的，你需要解决“浏览器指纹”和“IP被封”的问题。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>BrowserBase / Browserless:&lt;/strong> 提供云端的无头浏览器（Headless Browser）环境。它们现在都在集成 AI 功能，让你不用自己维护 Docker 容器，且自带抗指纹（Stealth）能力。&lt;/li>
&lt;li>&lt;strong>ScrapingBrawl / BrightData:&lt;/strong> 传统的代理商也在集成 AI 解析器（AI Unblocker），主要用于解决验证码和高难度反爬。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="总结我该选哪个">总结：我该选哪个？
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>你的需求&lt;/th>
&lt;th>推荐方案&lt;/th>
&lt;th>核心理由&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>我要做 RAG / 知识库&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong> 或 &lt;strong>Firecrawl&lt;/strong>&lt;/td>
&lt;td>最干净的 Markdown，开发成本最低。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我只要快速拿到单个页面内容&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Jina Reader&lt;/strong>&lt;/td>
&lt;td>无需部署，直接调用 API。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我要登录、填表、操作网页&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Stagehand&lt;/strong>&lt;/td>
&lt;td>比传统 Playwright 更稳定，不怕页面改版。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>网页全是 Canvas/动态且极难爬&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Skyvern&lt;/strong>&lt;/td>
&lt;td>基于视觉，模拟人类操作。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我是 Python 极客，想自己掌控&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong>&lt;/td>
&lt;td>目前 Python 生态下最均衡的选择。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="下一步建议">下一步建议
&lt;/h3>&lt;p>如果你想体验目前的 &lt;strong>SOTA (State of the Art)&lt;/strong> 方案，我建议从 &lt;strong>Crawl4AI&lt;/strong> 入手。&lt;/p>
&lt;p>&lt;strong>你想看一段 Crawl4AI 的简单 Python 代码示例吗？&lt;/strong>&lt;/p>
&lt;hr>
&lt;h1 id="ai-爬虫全景技术指南-20252026-版">AI 爬虫全景技术指南 (2025/2026 版)
&lt;/h1>&lt;h2 id="1-核心分类根据需求选工具">1. 核心分类：根据需求选工具
&lt;/h2>&lt;p>目前的 AI 爬虫不再是单一的技术，而是分成了两个主要流派：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>爬虫类型&lt;/th>
&lt;th>核心目标&lt;/th>
&lt;th>代表工具&lt;/th>
&lt;th>适用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>RAG 数据清洗型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;读&amp;rdquo;&lt;/strong>：输入 URL，输出干净的 Markdown/JSON&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong>, Firecrawl, Jina Reader&lt;/td>
&lt;td>构建知识库、LLM 训练数据、新闻抓取&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Agent 操作型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;做&amp;rdquo;&lt;/strong>：模拟人手，点击、输入、过验证码&lt;/td>
&lt;td>&lt;strong>Browser-Use&lt;/strong>, Stagehand, Skyvern&lt;/td>
&lt;td>自动化办公、复杂查询（如船期）、RPA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>底层抗指纹型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;防&amp;rdquo;&lt;/strong>：绕过 Cloudflare/Akamai 盾&lt;/td>
&lt;td>&lt;strong>DrissionPage&lt;/strong>, BrightData&lt;/td>
&lt;td>高防护网站、大规模采集&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="2-热门工具详解与代码思路">2. 热门工具详解与代码思路
&lt;/h2>&lt;h3 id="a-rag-最佳拍档crawl4ai-python">A. RAG 最佳拍档：Crawl4AI (Python)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：本地运行，免费，速度快。支持 &lt;code>LLMExtractionStrategy&lt;/code> 直接提取 JSON。&lt;/li>
&lt;li>&lt;strong>代码简述&lt;/strong>：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">crawl4ai&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AsyncWebCrawler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">with&lt;/span> &lt;span class="n">AsyncWebCrawler&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">crawler&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">crawler&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arun&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">word_count_threshold&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">markdown&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 直接给 LLM 吃的格式&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="b-最简-apijina-reader">B. 最简 API：Jina Reader
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：无需代码部署，URL 前加前缀即可。&lt;/li>
&lt;li>&lt;strong>用法&lt;/strong>：访问 &lt;code>https://r.jina.ai/https://your-url.com&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h3 id="c-复杂交互爬虫推荐drissionpage">C. 复杂交互爬虫推荐：DrissionPage
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：&lt;strong>过盾神器&lt;/strong>。不使用 WebDriver 协议，基于 Chrome CDP 协议，天然抗指纹，支持监听网络包。&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：高防护网站。&lt;/li>
&lt;li>&lt;strong>策略&lt;/strong>：&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>&lt;strong>混合模式&lt;/strong>：平时无头，调试时有头。&lt;/li>
&lt;li>&lt;strong>验证码&lt;/strong>：配合第三方打码服务或本地 OCR。&lt;/li>
&lt;li>&lt;strong>数据获取&lt;/strong>：优先监听 XHR/Fetch 数据包，而非硬解 DOM。&lt;/li>
&lt;/ol>
&lt;h3 id="d-智能体方案browser-use-langchain--playwright">D. 智能体方案：Browser-Use (LangChain + Playwright)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：让 LLM 拥有“手眼”，通过自然语言指令操作浏览器。&lt;/li>
&lt;li>&lt;strong>核心循环&lt;/strong>：截图 (Vision) -&amp;gt; 思考 (LLM) -&amp;gt; 操作 (Playwright) -&amp;gt; 执行。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-针对高难度场景的解决方案">3. 针对“高难度”场景的解决方案
&lt;/h2>&lt;p>通常具备：&lt;strong>复杂表单 + 动态加载 + 强力反爬 (Akamai/Cloudflare)&lt;/strong>。&lt;/p>
&lt;h3 id="推荐技术栈排序">推荐技术栈排序
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>DrissionPage (首选)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>理由&lt;/strong>：最稳。可以直接控制浏览器内核，伪装性极强，且免费。&lt;/li>
&lt;li>&lt;strong>验证码&lt;/strong>：对接 YesCaptcha 或 ddddocr。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>Browser-Use (次选/POC验证)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>理由&lt;/strong>：开发极快。不用分析 CSS 选择器，适合快速验证流程。&lt;/li>
&lt;li>&lt;strong>缺陷&lt;/strong>：成本高（Token消耗大），速度慢。&lt;/li>
&lt;li>&lt;strong>技巧&lt;/strong>：开启 &lt;code>use_vision=True&lt;/code> 让 AI 识别图形验证码；使用 &lt;code>Human-in-the-loop&lt;/code> 模式人工辅助过难关。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>商业 API (保底)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>工具&lt;/strong>：Bright Data / ZenRows。&lt;/li>
&lt;li>&lt;strong>理由&lt;/strong>：花钱买时间，直接云端渲染并绕过封锁。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-模型选择给-agent-配个好大脑">4. 模型选择：给 Agent 配个好大脑
&lt;/h2>&lt;p>运行 Browser-Use 等视觉 Agent 时，模型必须具备 &lt;strong>VLM (视觉理解)&lt;/strong> 能力。&lt;/p>
&lt;h3 id="-付费最强王者">💰 付费/最强王者
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>GPT-4o&lt;/strong>: 综合能力最强，逻辑规划和视觉识别很难出错，但价格较贵。&lt;/li>
&lt;/ul>
&lt;h3 id="-免费平替方案-推荐">🆓 免费/平替方案 (推荐)
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>模型&lt;/th>
&lt;th>来源&lt;/th>
&lt;th>特点&lt;/th>
&lt;th>推荐指数&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>GLM-4V-Flash&lt;/strong>&lt;/td>
&lt;td>&lt;strong>智谱 AI&lt;/strong>&lt;/td>
&lt;td>&lt;strong>国产最强免费&lt;/strong>。中文理解好，OCR 强，API 完全免费。&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Gemini 1.5 Flash&lt;/strong>&lt;/td>
&lt;td>Google&lt;/td>
&lt;td>免费额度大 (1500次/天)，视觉能力原生且强悍。&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Qwen2.5-VL&lt;/strong>&lt;/td>
&lt;td>阿里 (开源)&lt;/td>
&lt;td>&lt;strong>本地运行首选&lt;/strong>。7B 版本即可在显卡上跑，看图坐标定位极准。&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DeepSeek V3&lt;/strong>&lt;/td>
&lt;td>深度求索&lt;/td>
&lt;td>文本逻辑极强且极便宜，但需配合纯 DOM 模式（无视觉）。&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="5-总结建议">5. 总结建议
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>如果你是做数据分析/RAG&lt;/strong>：直接用 &lt;strong>Crawl4AI&lt;/strong>，把网页变成 Markdown 存库。&lt;/li>
&lt;li>&lt;strong>如果你要爬船期（生产环境）&lt;/strong>：请花时间钻研 &lt;strong>DrissionPage&lt;/strong>，配合监听网络包（Network Sniffing），这是最稳定、成本最低的路。&lt;/li>
&lt;li>&lt;strong>如果你想快速演示/做 Demo&lt;/strong>：使用 &lt;strong>Browser-Use&lt;/strong> + &lt;strong>GLM-4V-Flash&lt;/strong> (或 Gemini)。几行代码就能跑通一个自动订票/查询流程，且完全免费。&lt;/li>
&lt;/ol></description></item><item><title>crawler-爬虫ip代理商</title><link>https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/</link><pubDate>Sun, 04 Jan 2026 09:01:02 +0800</pubDate><guid>https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/</guid><description>&lt;img src="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/index.png" alt="Featured image of post crawler-爬虫ip代理商" />&lt;h2 id="参考资料">参考资料
&lt;/h2>&lt;p>&lt;a class="link" href="https://zhuanlan.zhihu.com/p/33576641" target="_blank" rel="noopener"
>知乎-爬虫代理商&lt;/a>&lt;/p>
&lt;h2 id="代理商">代理商
&lt;/h2>&lt;h3 id="快代理">快代理
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image.png"
width="1872"
height="957"
srcset="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image_hu2332936734980082163.png 480w, https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image_hu6421285585776655700.png 1024w"
loading="lazy"
alt="快代理"
class="gallery-image"
data-flex-grow="195"
data-flex-basis="469px"
> 注册了没一会之后，有客服打电话进来&lt;/p>
&lt;h3 id="亮数据">亮数据
&lt;/h3>&lt;p>&lt;a class="link" href="https://www.bright.cn/pricing/web-scraper" target="_blank" rel="noopener"
>亮数据&lt;/a>&lt;/p>
&lt;h2 id="使用自己的vpn去做代理">使用自己的VPN去做代理
&lt;/h2>&lt;p>使用 Clash 实现爬虫 IP 自动旋转教程&lt;/p>
&lt;p>本教程基于 Clash（Clash for Windows / Clash Verge 等）客户端，教你如何利用 Clash 的多个节点实现爬虫时的 IP 自动旋转，避免单个 IP 被目标网站封禁。适合中小规模爬虫，节点越多旋转效果越好。&lt;/p>
&lt;p>前提条件&lt;/p>
&lt;ul>
&lt;li>已安装 Clash 客户端（如 Clash Verge、Clash for Windows）&lt;/li>
&lt;li>有机场订阅，包含多个可用节点（节点越多越好，至少 10+ 个才能有效旋转）&lt;/li>
&lt;li>爬虫代码使用 Python（推荐 requests 或 Scrapy）&lt;/li>
&lt;/ul>
&lt;p>方法一：配置 Proxy Group 实现自动负载均衡（推荐，最简单，无需代码）&lt;/p>
&lt;p>这是最简单的方式，利用 Clash 内置的 &lt;code>load-balance&lt;/code> 策略，让每个请求自动分配到不同节点，实现自然 IP 轮换。&lt;/p>
&lt;p>步骤&lt;/p>
&lt;ol>
&lt;li>打开 Clash 配置文件（config.yaml），找到 &lt;code>proxy-groups&lt;/code> 部分。&lt;/li>
&lt;li>添加或修改一个名为 &lt;code>AutoRotate&lt;/code> 的组：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">load-balance &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 负载均衡，自动轮换节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 将订阅中所有可用节点都列在这里&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">strategy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">consistent-hashing &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 推荐，同一域名请求尽量保持同一节点（避免 session 问题）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># strategy: round-robin # 另一种方式，严格轮询&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">http://www.gstatic.com/generate_204&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">interval&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">300&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 每 5 分钟健康检查一次&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">lazy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 可选，延迟测试&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>将默认流量规则指向这个组（通常修改 &lt;code>PROXY&lt;/code> 或 &lt;code>Auto&lt;/code> 组为 &lt;code>AutoRotate&lt;/code>）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">PROXY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 其他备用组...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>保存配置，重启 Clash 或刷新订阅。&lt;/li>
&lt;/ol>
&lt;h3 id="爬虫中使用">爬虫中使用
&lt;/h3>&lt;p>在 Python 代码中设置 Clash 的本地代理，所有请求自动走旋转组：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://ipinfo.io/ip&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;当前 IP:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优点：零代码维护，Clash 自动剔除坏节点，适合大多数场景。&lt;/p>
&lt;p>方法二：通过 Clash API 在代码中强制切换节点（精细控制）&lt;/p>
&lt;p>适合想每 N 次请求强制换一次 IP 的场景。&lt;/p>
&lt;p>步骤&lt;/p>
&lt;ol>
&lt;li>在 config.yaml 中启用外部控制 API：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">external-controller&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">127.0.0.1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">9090&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">secret&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">your_secret_token &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 强烈建议设置密码&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>创建一个 &lt;code>type: select&lt;/code> 的组（便于 API 切换）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 所有节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>Python 代码实现自动切换：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">API_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:9090&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SECRET&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;your_secret_token&amp;#34;&lt;/span> &lt;span class="c1"># 如果设置了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">GROUP_NAME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;AutoRotate&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;Authorization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">SECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">SECRET&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有节点列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_proxies&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="s2">&amp;#34;proxies&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;all&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_proxies&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 切换到随机节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">switch_proxy&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_proxy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">choice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proxies_list&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies/&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">new_proxy&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;切换到节点: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">new_proxy&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 等待切换生效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 代理设置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例爬虫循环&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 每 10 次请求换一次 IP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switch_proxy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 你的爬取逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意事项与最佳实践&lt;/p>
&lt;ul>
&lt;li>节点质量很重要：使用有大量住宅/移动节点的机场，避免数据中心节点容易被识别。&lt;/li>
&lt;li>控制请求频率：加 &lt;code>time.sleep(random.uniform(1, 5))&lt;/code>，随机 User-Agent。&lt;/li>
&lt;li>检查当前 IP：访问 &lt;a class="link" href="https://ipinfo.io/ip" target="_blank" rel="noopener"
>https://ipinfo.io/ip&lt;/a> 或 &lt;a class="link" href="http://httpbin.org/ip" target="_blank" rel="noopener"
>http://httpbin.org/ip&lt;/a> 验证旋转是否生效。&lt;/li>
&lt;li>大规模爬虫仍推荐专业住宅代理池（如亮数据、Oxylabs、芝麻代理），Clash 适合中小规模。&lt;/li>
&lt;li>遵守目标网站 robots.txt 和法律规定，避免恶意爬取。&lt;/li>
&lt;/ul>
&lt;p>按照以上步骤配置后，你的爬虫就能自动或手动旋转 IP，大幅降低被封风险。祝爬取顺利！&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>crawler-tutorial</title><link>https://www.zata.cc/p/crawler-tutorial/</link><pubDate>Wed, 19 Nov 2025 11:28:14 +0800</pubDate><guid>https://www.zata.cc/p/crawler-tutorial/</guid><description>&lt;img src="https://www.zata.cc/p/crawler-tutorial/images/index/index.png" alt="Featured image of post crawler-tutorial" />&lt;h2 id="第一部分主流爬虫框架库对照">第一部分：主流爬虫框架/库对照
&lt;/h2>&lt;p>目前市面上最主流的方案大多基于 Python，同时也包含 Go 语言的高性能方案。&lt;/p>
&lt;ol>
&lt;li>Scrapy (Python) - 工业级霸主
Scrapy 是 Python 生态中最流行、功能最强大的异步爬虫框架。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：基于 Twisted 异步网络框架，自带下载器、中间件、调度器、管道等全套组件。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：并发能力极强（速度快），生态完善（有 Scrapy-Redis 分布式插件）。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：学习曲线陡峭，不支持 JS 渲染（需配合 Splash/Selenium）。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>海量数据抓取&lt;/strong>、全站爬虫、分布式爬虫。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Requests + BeautifulSoup (Python) - 入门首选
严格来说是两个库的组合，是最常见的入门方案。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：同步阻塞模式，代码极其简单。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：上手极快，灵活，适合写一次性脚本。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：效率低（同步），无断点续传、去重等机制。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>学习演示&lt;/strong>、小规模爬取、API 接口抓取。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Playwright / Selenium (Python/Node.js) - 浏览器自动化
本质是自动化测试工具，通过控制真实浏览器来爬取数据。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：所见即所得，能处理所有 JavaScript 动态渲染。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：完美模拟用户行为，能搞定几乎所有动态网页。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：&lt;strong>慢&lt;/strong>（需加载浏览器内核），资源消耗大。&lt;em>注：推荐使用 Playwright 替代 Selenium。&lt;/em>&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>高度动态网站&lt;/strong>（SPA）、模拟登录、无需高并发的复杂任务。&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Colly (Golang) - 性能怪兽
Go 语言生态中最强的爬虫框架。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：编译型语言，单机并发能力极强。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：运行速度通常快于 Python，部署只需一个二进制文件。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：数据清洗生态不如 Python 丰富，有语言门槛。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>追求极致性能&lt;/strong>和高吞吐量的企业级爬虫。&lt;/li>
&lt;/ul>
&lt;p>📊 综合对照表&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">特性&lt;/th>
&lt;th style="text-align: left">Scrapy&lt;/th>
&lt;th style="text-align: left">Requests+BS4&lt;/th>
&lt;th style="text-align: left">Playwright&lt;/th>
&lt;th style="text-align: left">Colly&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>语言&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Python&lt;/td>
&lt;td style="text-align: left">Python&lt;/td>
&lt;td style="text-align: left">Python/Node&lt;/td>
&lt;td style="text-align: left">Go&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>类型&lt;/strong>&lt;/td>
&lt;td style="text-align: left">异步框架&lt;/td>
&lt;td style="text-align: left">同步库&lt;/td>
&lt;td style="text-align: left">浏览器自动化&lt;/td>
&lt;td style="text-align: left">异步框架&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>速度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">🚀 极快&lt;/td>
&lt;td style="text-align: left">🐢 慢&lt;/td>
&lt;td style="text-align: left">🐌 极慢&lt;/td>
&lt;td style="text-align: left">🚀🚀 超快&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>JS支持&lt;/strong>&lt;/td>
&lt;td style="text-align: left">❌ (需插件)&lt;/td>
&lt;td style="text-align: left">❌&lt;/td>
&lt;td style="text-align: left">✅ (完美)&lt;/td>
&lt;td style="text-align: left">❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>上手度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">困难&lt;/td>
&lt;td style="text-align: left">极易&lt;/td>
&lt;td style="text-align: left">中等&lt;/td>
&lt;td style="text-align: left">中等&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="第二部分高难度场景验证码--强反爬解决方案">第二部分：高难度场景（验证码 + 强反爬）解决方案
&lt;/h2>&lt;p>当面对 &lt;strong>验证码（CAPTCHA）&lt;/strong> 和 &lt;strong>强反爬机制&lt;/strong>（如 Cloudflare 5秒盾、TLS 指纹识别、滑块验证）时，传统的 Scrapy 和 Requests 往往会失效。&lt;/p>
&lt;p>此时，“拟人化”程度比“速度”更重要。以下是梯队推荐：&lt;/p>
&lt;p>👑 第一梯队：抗检测与过盾之王&lt;/p>
&lt;p>&lt;strong>DrissionPage (Python)&lt;/strong>
目前 Python 爬虫圈的“版本之子”，专为对抗 Selenium 被识别而生。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心原理&lt;/strong>：结合了 &lt;code>Requests&lt;/code> 和 &lt;code>Chromium CDP&lt;/code> 协议。不使用 WebDriver（避免被检测），直接控制浏览器。&lt;/li>
&lt;li>&lt;strong>杀手锏&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>无视 WebDriver 检测&lt;/strong>：天然过很多检测。&lt;/li>
&lt;li>&lt;strong>模式切换&lt;/strong>：登录/过验证码时用浏览器模式，抓数据时切换回发包模式，兼顾速度与通过率。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：&lt;strong>Cloudflare 盾&lt;/strong>、极难爬取的网站。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Playwright + &lt;code>playwright-stealth&lt;/code>&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心原理&lt;/strong>：新一代自动化工具配合隐藏特征插件。&lt;/li>
&lt;li>&lt;strong>杀手锏&lt;/strong>：支持复杂的鼠标轨迹模拟（抗滑块），&lt;code>stealth&lt;/code> 插件可掩盖自动化特征。&lt;/li>
&lt;/ul>
&lt;p>🛡️ 第二梯队：底层协议反爬（TLS 指纹）&lt;/p>
&lt;p>&lt;strong>curl_cffi (Python)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>解决痛点&lt;/strong>：很多网站通过检测 &lt;strong>TLS/JA3 指纹&lt;/strong> 来识别 Python 脚本。即使你伪造了 User-Agent，用 Requests 依然会被封。&lt;/li>
&lt;li>&lt;strong>功能&lt;/strong>：模拟 Chrome/Firefox 的底层 SSL 握手特征，骗过服务器。&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：&lt;strong>非 JS 渲染&lt;/strong>但防火墙极高（Akamai, Cloudflare）的站点。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>第三部分：验证码具体攻克策略&lt;/p>
&lt;p>框架是枪，解决验证码需要“外挂”。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>简单数字/字母验证码&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>ddddocr&lt;/strong> (Python库)&lt;/li>
&lt;li>&lt;strong>特点&lt;/strong>：免费、离线、开箱即用，识别率优秀。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>滑块 / 缺口 / 点选验证码&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>DrissionPage / Playwright + YOLO (目标检测)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>逻辑&lt;/strong>：截图 -&amp;gt; AI 识别缺口坐标 -&amp;gt; 生成&lt;strong>模拟人类抖动&lt;/strong>的鼠标轨迹进行拖拽。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>地狱级验证码 (ReCaptcha / hCaptcha)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>打码平台 (YesCaptcha / 2Captcha)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>逻辑&lt;/strong>：不要自己破解。调用平台 API，支付少量费用获取 Token，这是工业界最稳方案。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>💡 最终选型建议&lt;/p>
&lt;ol>
&lt;li>&lt;strong>初学者/简单任务&lt;/strong> 👉 &lt;code>Requests&lt;/code> + &lt;code>BeautifulSoup&lt;/code>&lt;/li>
&lt;li>&lt;strong>海量数据/通用爬取&lt;/strong> 👉 &lt;code>Scrapy&lt;/code>&lt;/li>
&lt;li>&lt;strong>网站有 Cloudflare 盾 / 极其变态&lt;/strong> 👉 &lt;strong>&lt;code>DrissionPage&lt;/code>&lt;/strong> (强烈推荐)&lt;/li>
&lt;li>&lt;strong>需要处理滑块/复杂交互&lt;/strong> 👉 &lt;code>Playwright&lt;/code> + &lt;code>YOLO&lt;/code>&lt;/li>
&lt;li>&lt;strong>只被 TLS 指纹拦截&lt;/strong> 👉 &lt;code>curl_cffi&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="告别手动写爬虫代码-从f12到python">告别手动写爬虫代码-从F12到Python
&lt;/h2>&lt;p>手动编写 &lt;code>requests&lt;/code> 代码经常因为标点符号、Header 格式错误、TLS 指纹识别或 Cookie 过期而导致报错，这是非常正常的情况。&lt;/p>
&lt;p>针对**“把 cURL/F12 快速转成可运行代码”**这个需求，这里整理了四个“神器”帮你一键解决。按推荐程度排序如下：&lt;/p>
&lt;hr>
&lt;ol>
&lt;li>CurlConverter (Web版/命令行)&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 最推荐，零门槛，全球开发者首选。&lt;/p>
&lt;/blockquote>
&lt;p>专门解决手动抄写 Header 和 Cookie 的痛点。它能把 cURL 命令完美“翻译”成 Python requests 代码（支持数十种语言）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>网址：&lt;/strong> &lt;a class="link" href="https://curlconverter.com" target="_blank" rel="noopener"
>curlconverter.com&lt;/a>&lt;/li>
&lt;li>&lt;strong>优点：&lt;/strong> 自动处理 Header 格式、JSON 转义、Cookie 字典化，完全避免由于手误导致的 Bug。&lt;/li>
&lt;/ul>
&lt;p>使用步骤：&lt;/p>
&lt;ol>
&lt;li>在浏览器 F12 开发者工具的网络面板中，右键点击请求 -&amp;gt; &lt;strong>Copy as cURL&lt;/strong>。&lt;/li>
&lt;li>打开网站，直接粘贴到左边的文本框里。&lt;/li>
&lt;li>右边会自动生成 Python 代码，直接复制到 IDE 运行即可。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;ol start="2">
&lt;li>Postman (调试神器)&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 先验证请求有效性，再生成代码。&lt;/p>
&lt;/blockquote>
&lt;p>如果你生成的代码跑不通，很有可能是请求本身的问题（如 Cookie 已过期）。Postman 允许你在可视化界面先测通接口。&lt;/p>
&lt;p>使用步骤：&lt;/p>
&lt;ol>
&lt;li>打开 Postman，点击左上角的 &lt;strong>Import&lt;/strong> -&amp;gt; &lt;strong>Raw Text&lt;/strong>。&lt;/li>
&lt;li>粘贴 cURL 命令并点击 Import，Postman 会自动填充参数。&lt;/li>
&lt;li>点击 &lt;strong>Send&lt;/strong> 测试：
&lt;ul>
&lt;li>如果报错，说明 Cookie 或参数失效，需重新抓包。&lt;/li>
&lt;li>如果成功，点击右侧栏的 &lt;strong>&amp;lt;/&amp;gt;&lt;/strong> 图标 (Code snippet)。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>选择 &lt;strong>Python - Requests&lt;/strong>，复制生成的代码。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;ol start="3">
&lt;li>进阶大杀器：curl_cffi&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 解决“代码逻辑没错，但被服务器拦截 (403 Forbidden)”的问题。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>重点注意：&lt;/strong> 如果 CurlConverter 生成的代码一模一样却报错（如 403 或连接重置），大概率是因为 &lt;strong>TLS 指纹识别&lt;/strong>。百度、Cloudflare 等大厂会识别 Python &lt;code>requests&lt;/code> 库的指纹并拦截。&lt;/p>
&lt;p>&lt;strong>解决方案：&lt;/strong> 使用 &lt;code>curl_cffi&lt;/code> 库模拟真实浏览器指纹。&lt;/p>
&lt;p>安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install curl_cffi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>代码示例：&lt;/p>
&lt;p>用法几乎与 requests 一致，只需增加 &lt;code>impersonate&lt;/code> 参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">curl_cffi&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 把生成的 requests 代码拿过来，改成用 curl_cffi 调用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;YOUR_URL_HERE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">impersonate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;chrome110&amp;#34;&lt;/span> &lt;span class="c1"># 关键：伪装成 Chrome 浏览器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>4. 终极懒人方案：Playwright Codegen&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 录制即代码，解决极其复杂的反爬虫。&lt;/p>
&lt;/blockquote>
&lt;p>如果你不想分析接口参数，也不想处理反爬，可以直接使用浏览器自动化录制。虽然运行效率比 requests 低，但因其是真实浏览器操作，极难被屏蔽。&lt;/p>
&lt;p>使用步骤：&lt;/p>
&lt;p>在终端输入以下命令，浏览器会自动弹出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">playwright codegen fanyi.baidu.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>你在这个浏览器里的每一次点击和输入，终端窗口都会实时生成对应的 Python 代码。&lt;/p>
&lt;hr>
&lt;p>总结与建议&lt;/p>
&lt;ol>
&lt;li>&lt;strong>第一步：&lt;/strong> 先用 &lt;strong>CurlConverter&lt;/strong> 转换代码，尝试运行。&lt;/li>
&lt;li>&lt;strong>第二步：&lt;/strong> 如果代码报 &lt;code>403/404&lt;/code> 或 &lt;code>Connection Error&lt;/code>，说明遭遇反爬，请放弃标准 requests，直接改用 &lt;strong>curl_cffi&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>调试：&lt;/strong> 如果还是无法解决，请检查 HTTP 状态码或 Python 抛出的具体 Exception。&lt;/li>
&lt;/ol>
&lt;!-- end list -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-mysql" data-lang="mysql">&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">下一步建议&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">如果您在使用&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">curl_cffi&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">后仍然遇到报错，或者需要处理更复杂的动态加载页面（&lt;/span>&lt;span class="n">JavaScript&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">渲染），您希望我为您生成一段&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">Playwright&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">的基础启动代码&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">吗？&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>微信小程序使用教程——WechatMiniProgram</title><link>https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/</link><pubDate>Sun, 08 Jun 2025 23:37:17 +0800</pubDate><guid>https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/</guid><description>&lt;img src="https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/images/index/index.png" alt="Featured image of post 微信小程序使用教程——WechatMiniProgram" />&lt;h3 id="第一部分微信小程序简介">第一部分：微信小程序简介
&lt;/h3>&lt;p>微信小程序是一种无需下载安装即可使用的轻量级应用，通过微信平台运行。它具有开发简单、用户体验流畅、易于推广等特点，广泛应用于电商、工具、服务等领域。&lt;/p>
&lt;h4 id="特点">特点：
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>无需安装&lt;/strong>：用户扫码或搜索即可使用。&lt;/li>
&lt;li>&lt;strong>跨平台&lt;/strong>：基于微信生态，无需适配多系统。&lt;/li>
&lt;li>&lt;strong>开发简单&lt;/strong>：使用类似 HTML、CSS、JavaScript 的技术栈。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="第二部分准备工作">第二部分：准备工作
&lt;/h3>&lt;p>在开始开发之前，你需要准备以下工具和环境：&lt;/p>
&lt;h4 id="1-注册微信小程序账号">1. 注册微信小程序账号
&lt;/h4>&lt;ul>
&lt;li>前往 &lt;a class="link" href="https://mp.weixin.qq.com/" target="_blank" rel="noopener"
>微信公众平台&lt;/a>。&lt;/li>
&lt;li>点击“立即注册”，选择“小程序”类型。&lt;/li>
&lt;li>填写邮箱、密码等信息，完成注册。&lt;/li>
&lt;li>注册后会获得一个 &lt;strong>AppID&lt;/strong>（小程序唯一标识），后续开发需要用到。&lt;/li>
&lt;/ul>
&lt;h4 id="2-下载微信开发者工具">2. 下载微信开发者工具
&lt;/h4>&lt;ul>
&lt;li>访问 &lt;a class="link" href="https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html" target="_blank" rel="noopener"
>微信开发者工具下载页面&lt;/a>。&lt;/li>
&lt;li>根据你的操作系统（Windows、Mac 或 Linux）下载稳定版工具。&lt;/li>
&lt;li>安装完成后，用注册时绑定的微信号扫码登录。&lt;/li>
&lt;/ul>
&lt;h4 id="3-技术基础">3. 技术基础
&lt;/h4>&lt;p>微信小程序使用以下技术：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WXML&lt;/strong>（类似 HTML）：用于结构。&lt;/li>
&lt;li>&lt;strong>WXSS&lt;/strong>（类似 CSS）：用于样式。&lt;/li>
&lt;li>&lt;strong>JavaScript&lt;/strong>：用于逻辑。&lt;/li>
&lt;li>&lt;strong>JSON&lt;/strong>：用于配置。&lt;/li>
&lt;/ul>
&lt;p>如果你熟悉前端开发，这些技术上手会很快。&lt;/p>
&lt;hr>
&lt;h3 id="第三部分创建一个简单的小程序">第三部分：创建一个简单的小程序
&lt;/h3>&lt;p>我们将通过一个简单的 “Hello World” 示例，带你了解小程序的开发流程。&lt;/p>
&lt;h4 id="1-创建项目">1. 创建项目
&lt;/h4>&lt;ul>
&lt;li>打开微信开发者工具。&lt;/li>
&lt;li>点击“小程序” -&amp;gt; “新建项目”。&lt;/li>
&lt;li>填写以下信息：
&lt;ul>
&lt;li>&lt;strong>项目目录&lt;/strong>：选择一个空文件夹存放项目文件。&lt;/li>
&lt;li>&lt;strong>AppID&lt;/strong>：输入你在公众平台注册时获得的 AppID（测试可用“测试号”）。&lt;/li>
&lt;li>&lt;strong>项目名称&lt;/strong>：例如 “HelloWorld”。
&lt;img src="https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/images/index/image.png"
width="2010"
height="1400"
srcset="https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/images/index/image_hu5099383536372204568.png 480w, https://www.zata.cc/p/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bwechatminiprogram/images/index/image_hu973094354765373258.png 1024w"
loading="lazy"
alt="模版可以使用js基础模版"
class="gallery-image"
data-flex-grow="143"
data-flex-basis="344px"
>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>选择“小程序·原生开发”，点击“确定”。&lt;/li>
&lt;/ul>
&lt;h4 id="2-理解项目结构">2. 理解项目结构
&lt;/h4>&lt;p>创建后，项目目录如下：&lt;/p>
&lt;pre>&lt;code>├── pages // 页面文件夹
│ ├── index // 默认首页
│ │ ├── index.js // 页面逻辑
│ │ ├── index.json // 页面配置
│ │ ├── index.wxml // 页面结构
│ │ └── index.wxss // 页面样式
├── app.js // 小程序全局逻辑
├── app.json // 小程序全局配置
├── app.wxss // 小程序全局样式
└── project.config.json // 项目配置文件
&lt;/code>&lt;/pre>
&lt;h4 id="3-编辑首页">3. 编辑首页
&lt;/h4>&lt;p>我们将修改 pages/index 下的文件，显示一个简单的 “Hello World” 文本。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>index.wxml&lt;/strong>（页面结构）：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">view&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">text&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Hello World&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">text&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">view&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>index.wxss&lt;/strong>（页面样式）：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nc">container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">flex&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">justify-content&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">align-items&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">vh&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">font-size&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">36&lt;/span>&lt;span class="n">rpx&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#333&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>index.js&lt;/strong>（页面逻辑，暂时无需修改）：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">Page&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">data&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 数据可以在此定义
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>index.json&lt;/strong>（页面配置，可选）：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;navigationBarTitleText&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;首页&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="4-配置全局文件">4. 配置全局文件
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>app.json&lt;/strong>（全局配置）：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;pages&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pages/index/index&amp;#34;&lt;/span> &lt;span class="c1">// 默认首页路径
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;window&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;backgroundTextStyle&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;light&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;navigationBarBackgroundColor&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;#fff&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;navigationBarTitleText&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;我的小程序&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;navigationBarTextStyle&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;black&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="5-预览效果">5. 预览效果
&lt;/h4>&lt;ul>
&lt;li>在微信开发者工具顶部，点击“预览”。&lt;/li>
&lt;li>用手机微信扫码，即可在手机上看到 “Hello World” 显示在屏幕中央。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="第四部分添加交互功能">第四部分：添加交互功能
&lt;/h3>&lt;p>我们为小程序添加一个按钮，点击后显示一条消息。&lt;/p>
&lt;h4 id="1-修改-wxml">1. 修改 WXML
&lt;/h4>&lt;p>编辑 pages/index/index.wxml：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">view&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">text&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>{{msg}}&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">text&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">button&lt;/span> &lt;span class="na">bindtap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;showMessage&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>点击我&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">button&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">view&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-修改-js">2. 修改 JS
&lt;/h4>&lt;p>编辑 pages/index/index.js：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">Page&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">data&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">msg&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Hello World&amp;#34;&lt;/span> &lt;span class="c1">// 初始文本
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">showMessage&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">setData&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">msg&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;你点击了按钮！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3-修改-wxss">3. 修改 WXSS
&lt;/h4>&lt;p>编辑 pages/index/index.wxss，美化按钮：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nc">container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">flex&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">flex-direction&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">column&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">justify-content&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">align-items&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">center&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">vh&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">font-size&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">36&lt;/span>&lt;span class="n">rpx&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#333&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">button&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin-top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="n">rpx&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background-color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#07c160&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#fff&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="4-测试">4. 测试
&lt;/h4>&lt;p>点击“预览”，扫码后在手机上点击按钮，文本会从 “Hello World” 变为 “你点击了按钮！”。&lt;/p>
&lt;hr>
&lt;h3 id="第五部分发布小程序">第五部分：发布小程序
&lt;/h3>&lt;p>开发完成后，你可以将其发布到微信平台供用户使用。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>上传代码&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>在开发者工具中，点击右上角“上传”。&lt;/li>
&lt;li>填写版本号（如 “1.0.0”）和备注，上传成功后可在公众平台看到。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>提交审核&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>登录 &lt;a class="link" href="https://mp.weixin.qq.com/" target="_blank" rel="noopener"
>微信公众平台&lt;/a>。&lt;/li>
&lt;li>在“小程序管理” -&amp;gt; “版本管理”中，找到上传的版本，点击“提交审核”。&lt;/li>
&lt;li>填写相关信息（如小程序类目、功能介绍），等待微信团队审核（通常 1-7 天）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>发布上线&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>审核通过后，点击“发布”，小程序即可上线，用户可通过搜索或扫码使用。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="第六部分学习资源与进阶">第六部分：学习资源与进阶
&lt;/h3>&lt;h4 id="官方资源">官方资源：
&lt;/h4>&lt;ul>
&lt;li>&lt;a class="link" href="https://developers.weixin.qq.com/miniprogram/dev/framework/" target="_blank" rel="noopener"
>微信小程序官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://developers.weixin.qq.com/miniprogram/dev/reference/" target="_blank" rel="noopener"
>组件和 API 参考&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="进阶建议">进阶建议：
&lt;/h4>&lt;ul>
&lt;li>学习 &lt;strong>云开发&lt;/strong>：微信提供云函数、数据库、存储等功能。&lt;/li>
&lt;li>掌握 &lt;strong>自定义组件&lt;/strong>：提高代码复用性。&lt;/li>
&lt;li>探索 &lt;strong>小程序插件&lt;/strong>：扩展功能。&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>野火F103-MiNI使用教程</title><link>https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Thu, 15 May 2025 13:49:09 +0800</pubDate><guid>https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post 野火F103-MiNI使用教程" />&lt;h2 id="问答">问答：
&lt;/h2>&lt;h3 id="什么是gpio-">什么是GPIO ？
&lt;/h3>&lt;p>General-purpose input/output通用型之输入输出的简称&lt;/p>
&lt;h3 id="irq">IRQ
&lt;/h3>&lt;p>IRQ (Interrupt ReQuest) 指来自设备的中断请求。&lt;/p>
&lt;h3 id="rcc的功能">RCC的功能
&lt;/h3>&lt;p>RCC (Reset and Clock Control) 是嵌入式系统中负责管理系统时钟和复位功能的重要模块。让我详细解释一下：&lt;/p>
&lt;ol>
&lt;li>RCC的主要功能：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>系统时钟配置和管理&lt;/li>
&lt;li>外设时钟的使能和失能&lt;/li>
&lt;li>时钟源的选择（内部/外部时钟）&lt;/li>
&lt;li>时钟频率的分频和倍频&lt;/li>
&lt;li>系统复位控制&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>主要时钟源类型：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>HSI (High Speed Internal) - 内部高速时钟&lt;/li>
&lt;li>HSE (High Speed External) - 外部高速时钟&lt;/li>
&lt;li>LSI (Low Speed Internal) - 内部低速时钟&lt;/li>
&lt;li>LSE (Low Speed External) - 外部低速时钟&lt;/li>
&lt;li>PLL (Phase-Locked Loop) - 锁相环&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>RCC在实际开发中的应用：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 以STM32为例，开启GPIOA时钟的代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nf">RCC_APB2PeriphClockCmd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RCC_APB2Periph_GPIOA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ENABLE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 配置系统时钟的示例
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">SystemClock_Config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RCC_OscInitTypeDef&lt;/span> &lt;span class="n">RCC_OscInitStruct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RCC_ClkInitTypeDef&lt;/span> &lt;span class="n">RCC_ClkInitStruct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 配置振荡器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">RCC_OscInitStruct&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OscillatorType&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RCC_OSCILLATORTYPE_HSE&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RCC_OscInitStruct&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">HSEState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RCC_HSE_ON&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RCC_OscInitStruct&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PLL&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PLLState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RCC_PLL_ON&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... 其他配置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">HAL_RCC_OscConfig&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">RCC_OscInitStruct&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 配置时钟树
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">RCC_ClkInitStruct&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ClockType&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RCC_CLOCKTYPE_SYSCLK&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">RCC_ClkInitStruct&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SYSCLKSource&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RCC_SYSCLKSOURCE_PLLCLK&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... 其他配置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">HAL_RCC_ClockConfig&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">RCC_ClkInitStruct&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">FLASH_LATENCY_2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>RCC配置的重要性：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>影响系统性能和功耗&lt;/li>
&lt;li>决定外设工作频率&lt;/li>
&lt;li>确保系统稳定运行&lt;/li>
&lt;li>为低功耗模式切换提供支持&lt;/li>
&lt;/ul>
&lt;ol start="5">
&lt;li>使用RCC时的注意事项：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>配置时序要按照数据手册要求&lt;/li>
&lt;li>注意时钟树的依赖关系&lt;/li>
&lt;li>考虑系统供电和功耗需求&lt;/li>
&lt;li>确保外设时钟频率在允许范围内&lt;/li>
&lt;li>正确处理时钟切换过程中的稳定等待&lt;/li>
&lt;/ul>
&lt;p>理解和正确使用RCC对于嵌入式系统的开发至关重要，它直接影响着系统的性能、稳定性和功耗。不同的芯片厂商可能对RCC的具体实现有所不同，但基本概念和功能是类似的。&lt;/p>
&lt;h3 id="stm的固件库在哪里下载">STM的固件库在哪里下载
&lt;/h3>&lt;p>&lt;a class="link" href="https://bbs.21ic.com/icview-3349496-1-1.html" target="_blank" rel="noopener"
>https://bbs.21ic.com/icview-3349496-1-1.html&lt;/a>&lt;/p>
&lt;h2 id="step1-安装keli">Step1. 安装keli
&lt;/h2>&lt;p>方法，直接在网上搜索就可以，也可以看网易课堂提到的网盘链接
&lt;a class="link" href="https://study.163.com/course/courseLearn.htm?courseId=1006447055#/learn/video?lessonId=1054086739&amp;amp;courseId=1006447055" target="_blank" rel="noopener"
>https://study.163.com/course/courseLearn.htm?courseId=1006447055#/learn/video?lessonId=1054086739&amp;courseId=1006447055&lt;/a>&lt;/p>
&lt;h2 id="step2-安装芯片组">Step2. 安装芯片组
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.keil.arm.com/devices/" target="_blank" rel="noopener"
>https://www.keil.arm.com/devices/&lt;/a>
可以到keil的官网进行下载，我下载的是然后找到 F103 对应的芯片组软件&lt;/p>
&lt;h2 id="step3-使用dap仿真器下载程序">Step3. 使用DAP仿真器下载程序
&lt;/h2>&lt;p>&lt;em>&lt;strong>像这样连接线材，连接DAP的USB-A口插到电脑上， 另一个连到板子上的接电源。&lt;/strong>&lt;/em>
&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image.png"
width="653"
height="502"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu8007074871321825403.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu2813255591761856342.png 1024w"
loading="lazy"
alt="板子接线"
class="gallery-image"
data-flex-grow="130"
data-flex-basis="312px"
>&lt;/p>
&lt;p>&lt;em>&lt;strong>使用keil打开测试固件的程序&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1.png"
width="1509"
height="1292"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu9531078017061455031.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu7666738897741294189.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="116"
data-flex-basis="280px"
>&lt;/p>
&lt;p>&lt;em>&lt;strong>下载程序到开发板，一会进度条加载完就下载好了&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2.png"
width="1293"
height="1288"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu6298128457276711155.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu12828453416775318388.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
>&lt;/p>
&lt;p>&lt;em>&lt;strong>点击下图的第二个按钮就可以切换灯了&lt;/strong>&lt;/em>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3.png"
width="505"
height="542"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu7073259616629448164.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu10907819422667744928.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="93"
data-flex-basis="223px"
>&lt;/p>
&lt;h2 id="7-第一节-新建工程模板-寄存器版">7-（第一节） 新建工程模板-寄存器版
&lt;/h2>&lt;ol>
&lt;li>新建项目-并选择芯片&lt;/li>
&lt;li>导入启动文件 XX.s&lt;/li>
&lt;li>创建main.c文件&lt;/li>
&lt;li>创建stm32f10x.h 固件库
&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4.png"
width="1008"
height="222"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4_hu5184287116183012701.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4_hu15186230045309379735.png 1024w"
loading="lazy"
alt="启动文件中"
class="gallery-image"
data-flex-grow="454"
data-flex-basis="1089px"
>
&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-5.png"
width="1329"
height="577"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-5_hu12193091685397906047.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-5_hu15184811504816709728.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="230"
data-flex-basis="552px"
>&lt;/li>
&lt;/ol>
&lt;p>5.连接DAP设置&lt;/p>
&lt;table>
&lt;tr>
&lt;td >
&lt;img src="images/index/image-11.png" >图1
&lt;/td>
&lt;td >
&lt;img src="images/index/image-12.png" >图2
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td >
&lt;img src="images/index/image-13.png" >图3
&lt;/td>
&lt;td >
&lt;img src="images/index/image-14.png" >图4
&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td >
&lt;img src="images/index/image-15.png" >图5
&lt;/td>
&lt;td >
&lt;img src="images/index/image-16.png" >图6
&lt;/td>
&lt;/tr>
&lt;/table>
&lt;h2 id="7-第二节使用寄存器点亮led">7-（第二节）使用寄存器点亮LED
&lt;/h2>&lt;p>本节课代码如下，为什么和老师代码不一样？因为我觉得老师教错了，在CRL这里&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// RCC
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X40021018&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//ODR
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X4001100C&lt;/span> &lt;span class="o">&amp;amp;=&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//CRL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X40011000&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X40011000&lt;/span> &lt;span class="o">&amp;amp;=&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">//这里我和老师不一样，不过效果是一样的，后续代码我就按照老师的来了
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">SystemInit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>
&lt;p>找到寄存器的地址 （寄存器的GPIO的起始地址 + 偏移地址），因为是MINI开发板子上的端口PC2对应的是C，所以找CPIOC&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配置ODR寄存器，其中可以用ODR中的第四位控制灯泡，具体咱回事我没太弄懂&lt;/p>
&lt;/li>
&lt;li>
&lt;p>CRL寄存器，这个是控制输入还是输出，以及用什么模式的，设置为“推挽输出”，又因为第一步对应PC2，对应的是‘2’&lt;/p>
&lt;/li>
&lt;li>
&lt;p>打开时钟CRC寄存器（APB2外设时钟使能寄存器：为什么是APB2，因为GPIO在APB2总线上），如果要读取外设就必须要打开。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(unsigned int *)0X4001100C是什么意思？&lt;/p>
&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>这是将内存地址 0X4001100C 转换为指向 unsigned int 类型的指针。
指针类型是为了：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>告诉编译器如何解释内存中的数据。比如 unsigned int* 指针解引用时，会把那个地址的4个字节当作无符号整数来读取&lt;/p>
&lt;/li>
&lt;li>
&lt;p>指针运算时确定步长。unsigned int* 加1会前进4个字节，而 char* 加1只前进1个字节&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>为什么指针也有类型？&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>指针类型是为了：&lt;/p>
&lt;p>告诉编译器如何解释内存中的数据。比如 unsigned int* 指针解引用时，会把那个地址的4个字节当作无符号整数来读取
指针运算时确定步长。unsigned int* 加1会前进4个字节，而 char* 加1只前进1个字节 一般我们这样定义&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">p1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mh">0x1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 0x1004
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">p2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mh">0x1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 0x1001
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>*(unsigned int *)0X4001100C什么意思?&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;code>*(unsigned int *)0X4001100C&lt;/code> 对内存地址 0X4001100C
进行解引用(*),获取该地址存储的无符号整数值。&lt;/p>
&lt;/blockquote>
&lt;p>举例:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 读取该地址的值
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X4001100C&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 写入值到该地址
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="n">X4001100C&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种操作常用于直接读写硬件寄存器。&lt;/p>
&lt;ol start="4">
&lt;li>为什么要这么麻烦，直接*0X4001100C行不行&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>不行,因为 0X4001100C 是一个数值常量,直接用*解引用会出错。需要先把它转换成指针类型((unsigned int *)),才能进行解引用操作。&lt;/p>
&lt;p>这是C语言的语法规则要求 - 解引用操作必须作用于指针类型。&lt;/p>
&lt;/blockquote>
&lt;ol start="5">
&lt;li>*(unsigned int *)0X4001100C &amp;amp;= ~(1&amp;laquo;2) 的含义：&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>0X4001100C 是内存地址，要加(unsigned int *)转成指针才能解引用
1&amp;laquo;2 产生二进制&amp;hellip;0100 ~
取反得到&amp;hellip;1011 &amp;amp;= 进行AND操作，会把对应地址值的第2位清零，因为0和任何值做AND都得0
其他位保持不变，因为1和原值做AND保持原值&lt;/p>
&lt;/blockquote>
&lt;ol start="6">
&lt;li>&amp;amp;= ~ 和 |= 的作用&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>正如第五问所问：
&amp;amp;= ~ 用来清零
|= 用来写1
&lt;code>当然操作过程要用到位运算 （1&amp;lt;&amp;lt;XXX）&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;ol start="7">
&lt;li>这节课的视频里面，老师为什么说4位为一组？&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>STM32寄存器中4位一组是因为：&lt;/p>
&lt;ol>
&lt;li>每4位可以表示一个16进制数(0-F)&lt;/li>
&lt;li>容易读写和分组管理&lt;/li>
&lt;li>符合很多外设配置的需求（如GPIO的4位可以配置一个引脚的模式）&lt;/li>
&lt;/ol>
&lt;p>例如一个32位寄存器可以分为8组，每组4位，方便配置和管理不同功能。
那么很显然，如果你在C语言里面用2进制表示的话，实际上也是可以的，不过就是麻烦点&lt;/p>
&lt;/blockquote>
&lt;h2 id="8-使用寄存器点亮led">8-使用寄存器点亮LED
&lt;/h2>&lt;p>第8课包含两节：
第一节说功能框图（具体内容可以看STM32F10X-中文参考这本电子书）
第二节把第7课中的地址通过定义一个常量做映射&lt;/p>
&lt;p>没有什么太有争议或者难以理解的内容&lt;/p>
&lt;h2 id="9-1自己写库第一节-gpio寄存器结构体定义">9-1自己写库（第一节）-GPIO寄存器结构体定义
&lt;/h2>&lt;p>代码如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//stm32f10x.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#define PERIPH_BASE ((unsigned int)0x40000000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB1PERIPH_BASE PERIPH_BASE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="kt">uint32_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">short&lt;/span> &lt;span class="kt">uint16_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRH&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">IDR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ODR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BSRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">LCKR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC ((GPIO_TypeDef*)GPIOC_BASE)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是定义了一个名为GPIO_TypeDef的结构体，用于映射GPIO外设的寄存器布局：&lt;/p>
&lt;pre>&lt;code>```c
typedef struct {
uint32_t CRL; // 端口配置低寄存器 (0x00)
uint32_t CRH; // 端口配置高寄存器 (0x04)
uint32_t IDR; // 端口输入数据寄存器 (0x08)
uint32_t ODR; // 端口输出数据寄存器 (0x0C)
uint32_t BSRR; // 端口位设置/清除寄存器 (0x10)
uint32_t BRR; // 端口位清除寄存器 (0x14)
uint32_t LCKR; // 端口配置锁定寄存器 (0x18)
} GPIO_TypeDef;
```
&lt;/code>&lt;/pre>
&lt;p>结构体成员的排列顺序与寄存器在内存中的实际布局一致。这样通过结构体指针就可以直接访问这些寄存器&lt;/p>
&lt;p>这基于C语言结构体在内存中的存储原理：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>连续性：结构体成员在内存中按声明顺序连续存储&lt;/p>
&lt;/li>
&lt;li>
&lt;p>对齐：每个成员按其类型的对齐要求存储。这里uint32_t通常4字节对齐，刚好对应寄存器间隔：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">CRL&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x00&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CRH&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x04&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">IDR&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x08&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ODR&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x0C&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>指针访问：当把GPIOC_BASE转为GPIO_TypeDef指针时，编译器会根据结构体布局自动计算每个成员的偏移量，从而访问到对应寄存器&lt;/p>
&lt;p>这样就实现了通过结构体直接操作物理寄存器。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">GPIOC&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">GPIOC_BASE&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">GPIOC&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">ODR&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">...;&lt;/span> &lt;span class="c1">// 访问ODR寄存器
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//main,c
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 打开时钟
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">RCC_APB2ENR&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 配置IO口为输出
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">GPIOC&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">CRL&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 控制ODR寄存器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">GPIOC&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">ODR&lt;/span> &lt;span class="o">&amp;amp;=&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//GPIOC-&amp;gt;ODR |= (1&amp;lt;&amp;lt;2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">SystemInit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//函数体为空为了骗过编译器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="9-2编写gpio端口置位复位函数">9-2编写GPIO端口置位复位函数
&lt;/h2>&lt;p>&lt;code>先贴代码:&lt;/code>&lt;/p>
&lt;p>main.c&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x_gpio.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">soft_delay&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(;&lt;/span>&lt;span class="n">count&lt;/span> &lt;span class="o">!=&lt;/span>&lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 打开 GPIOC 端口的时钟
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">RCC&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">APB2ENR&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 配置IO口为输出
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">//GPIOC-&amp;gt;CRL &amp;amp;= ~( (10000) &amp;lt;&amp;lt; (4*2) );
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">GPIOC&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">CRL&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="p">(&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 配置ODR寄存器
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">//GPIOC-&amp;gt;ODR &amp;amp;= ~(1&amp;lt;&amp;lt;2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nf">GPIO_SetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIOC&lt;/span>&lt;span class="p">,(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//GPIOC-&amp;gt;ODR |= (1&amp;lt;&amp;lt;2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nf">GPIO_ResetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIOC&lt;/span>&lt;span class="p">,(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">soft_delay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1000000&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// 这里用10进制表示的
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">//GPIOC-&amp;gt;ODR &amp;amp;= ~(1&amp;lt;&amp;lt;2);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nf">GPIO_SetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIOC&lt;/span>&lt;span class="p">,(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">&amp;lt;&amp;lt;&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">soft_delay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1000000&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">SystemInit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 函数体为空，目的是为了骗过编译器不报错
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>stm32f10x.h&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#ifndef __STM32F10X_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define __STM32F10X_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define PERIPH_BASE ((unsigned int)0x40000000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB1PERIPH_BASE PERIPH_BASE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="kt">uint32_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">short&lt;/span> &lt;span class="kt">uint16_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRH&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">IDR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ODR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BSRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">LCKR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CFGR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CIR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB2RSTR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB1RSTR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">AHBENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB2ENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB1ENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BDCR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CSR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">RCC_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC ((GPIO_TypeDef*)GPIOC_BASE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC ((RCC_TypeDef*)RCC_BASE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#endif &lt;/span>&lt;span class="cm">/* __STM32F10X_H */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>stm32f10x_gpio.h&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#ifndef __STM32F10X_GPIO_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define __STM32F10X_GPIO_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">GPIO_SetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">GPIO_ResetBits&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#endif &lt;/span>&lt;span class="cm">/* __STM32F10X_GPIO_H */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>stm32f10x_gpio.c&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;stm32f10x_gpio.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 函数功能：设置引脚为高电平
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 参数说明：GPIOx: 该参数为 GPIO_TypeDef 类型的指针，指向 GPIO 端口的地址
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* GPIO_Pin: 选择要设置的 GPIO 端口引脚，可输入宏 GPIO_Pin_0-15，
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 表示 GPIOx 端口的 0-15 号引脚。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">*/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">GPIO_SetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 设置 GPIOx 端口 BSRR 寄存器的第 GPIO_Pin 位，使其输出高电平 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 因为 BSRR 寄存器写 0 不影响，宏 GPIO_Pin 只是对应位为 1，其它位均为 0，所以可以直接赋值 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIOx&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">BSRR&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 函数功能：设置引脚为低电平
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 参数说明：GPIOx: 该参数为 GPIO_TypeDef 类型的指针，指向 GPIO 端口的地址
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* GPIO_Pin: 选择要设置的 GPIO 端口引脚，可输入宏 GPIO_Pin_0-15，
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">* 表示 GPIOx 端口的 0-15 号引脚。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">*/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">GPIO_ResetBits&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 设置 GPIOx 端口 BRR 寄存器的第 GPIO_Pin 位, 使其输出低电平 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* 因为 BRR 寄存器写 0 不影响，宏 GPIO_Pin 只是对应位为 1，其它位均为 0，所以可以直接赋值 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIOx&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">BRR&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>1. 为什么没有引入stm32f10x_gpio.c，也能正常调用其中的函数&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>这个问题涉及到C语言编译和链接的概念。让我来详细解释：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>在这个项目中，虽然代码中没有直接 &lt;code>#include &amp;quot;stm32f10x_gpio.c&amp;quot;&lt;/code>，但程序仍然能够正常工作，原因是：&lt;/p>
&lt;ul>
&lt;li>&lt;code>main.c&lt;/code> 引入了 &lt;code>stm32f10x_gpio.h&lt;/code> 头文件，该头文件声明了 &lt;code>GPIO_SetBits&lt;/code> 和 &lt;code>GPIO_ResetBits&lt;/code> 这两个函数&lt;/li>
&lt;li>&lt;code>stm32f10x_gpio.c&lt;/code> 源文件包含了这两个函数的实际实现&lt;/li>
&lt;li>在项目编译时，编译器会分别编译 &lt;code>main.c&lt;/code> 和 &lt;code>stm32f10x_gpio.c&lt;/code>，然后链接器会将它们链接在一起&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>实际上，直接引入 &lt;code>.c&lt;/code> 文件通常是不推荐的做法：&lt;/p>
&lt;ul>
&lt;li>头文件(&lt;code>.h&lt;/code>)用于声明函数接口&lt;/li>
&lt;li>源文件(&lt;code>.c&lt;/code>)用于实现具体功能&lt;/li>
&lt;li>编译器会分别编译各个源文件，然后链接器将它们组合成最终的可执行文件&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>编译过程是这样的：&lt;/p>
&lt;pre>&lt;code> main.c ────┐
├── 编译 --&amp;gt; 链接 --&amp;gt; 可执行文件
stm32f10x_gpio.c ─┘
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>如果你直接 &lt;code>#include &amp;quot;stm32f10x_gpio.c&amp;quot;&lt;/code>，可能会导致：&lt;/p>
&lt;ul>
&lt;li>函数重复定义错误（如果该.c文件在多个地方被引入）&lt;/li>
&lt;li>编译时间增加&lt;/li>
&lt;li>代码组织混乱&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>所以正确的做法就是你现在的方式：&lt;/p>
&lt;ul>
&lt;li>在头文件中声明函数&lt;/li>
&lt;li>在源文件中实现函数&lt;/li>
&lt;li>在项目配置中将所有需要的源文件加入编译&lt;/li>
&lt;/ul>
&lt;p>这样可以保持代码的模块化和可维护性，同时避免潜在的编译错误。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>2. 头文件防重&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>代码&lt;/p>
&lt;pre>&lt;code> #ifndef __STM32F10X_GPIO_H
#define __STM32F10X_GPIO_H // 头文件内容
#endif
&lt;/code>&lt;/pre>
&lt;p>这种方式称为&amp;quot;Include Guard&amp;quot;或&amp;quot;Header Guard&amp;quot;
防止头文件被重复包含导致的重复定义问题
有些编译器也支持 #pragma once，效果类似&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>3. 声明和定义的区别&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>// 声明 - 告诉编译器函数的存在 void func(int x);&lt;br>
// 定义 - 提供函数的具体实现 void func(int x) {}&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>4. 条件编译：&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#ifdef DEBUG
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="c1">// 调试代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#else
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="c1">// 发布代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#endif
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#if defined(PLATFORM_A)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="c1">// 平台A的代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#elif defined(PLATFORM_B)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="c1">// 平台B的代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#endif
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/blockquote>
&lt;h2 id="9-3-自己写库构建库函数雏形">9-3 自己写库，构建库函数雏形
&lt;/h2>&lt;p>&lt;code>代码如下&lt;/code>
以下是文件夹的结构和内容：&lt;/p>
&lt;p>目录结构：
📄 main.c
📄 startup_stm32f10x_hd.s // 启动文件
📄 stm32f10x.h
📄 stm32f10x_gpio.c
📄 stm32f10x_gpio.h&lt;/p>
&lt;p>文件 &amp;lsquo;main.c&amp;rsquo;：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">#include &amp;#34;stm32f10x.h&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#include &amp;#34;stm32f10x_gpio.h&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define LED_G_GPIO_PORT GPIOC
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define LED_G_GPIO_CLK_ENABLE (RCC-&amp;gt;APB2ENR |= ( (1) &amp;lt;&amp;lt; 4 ))
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define LED_G_GPIO_PIN GPIO_Pin_2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">void Delay(uint32_t count)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for( ; count !=0; count-- );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">int main (void)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_InitTypeDef GPIO_InitStructure;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 打开 GPIOC 端口的时钟
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LED_G_GPIO_CLK_ENABLE;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_InitStructure.GPIO_Pin = LED_G_GPIO_PIN;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_Init(LED_G_GPIO_PORT, &amp;amp;GPIO_InitStructure);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> while(1)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Delay(0xFFFF);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Delay(0xFFFF);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">void SystemInit(void)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 函数体为空，目的是为了骗过编译器不报错
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>文件 &amp;lsquo;stm32f10x.h&amp;rsquo;：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#ifndef __STM32F10X_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define __STM32F10X_H
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 用来存放STM32寄存器映射的代码
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 外设 perirhral
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define PERIPH_BASE ((unsigned int)0x40000000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB1PERIPH_BASE PERIPH_BASE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE + 0x00)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE + 0x04)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE + 0x08)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE + 0x0C)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE + 0x10)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE + 0x14)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE + 0x18)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="kt">uint32_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">short&lt;/span> &lt;span class="kt">uint16_t&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CRH&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">IDR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ODR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BSRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BRR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">LCKR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CFGR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CIR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB2RSTR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB1RSTR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">AHBENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB2ENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">APB1ENR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">BDCR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">CSR&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">RCC_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define GPIOC ((GPIO_TypeDef*)GPIOC_BASE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define RCC ((RCC_TypeDef*)RCC_BASE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#endif &lt;/span>&lt;span class="cm">/* __STM32F10X_H */&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>文件 &amp;lsquo;stm32f10x_gpio.c&amp;rsquo;：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">#include &amp;#34;stm32f10x_gpio.h&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 函数功能：设置引脚为高电平
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 参数说明：GPIOx: 该参数为 GPIO_TypeDef 类型的指针，指向 GPIO 端口的地址
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* GPIO_Pin: 选择要设置的 GPIO 端口引脚，可输入宏 GPIO_Pin_0-15，
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 表示 GPIOx 端口的 0-15 号引脚。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">void GPIO_SetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /* 设置 GPIOx 端口 BSRR 寄存器的第 GPIO_Pin 位，使其输出高电平 */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /* 因为 BSRR 寄存器写 0 不影响，宏 GPIO_Pin 只是对应位为 1，其它位均为 0，所以可以直接赋值 */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BSRR |= GPIO_Pin;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 函数功能：设置引脚为低电平
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 参数说明：GPIOx: 该参数为 GPIO_TypeDef 类型的指针，指向 GPIO 端口的地址
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* GPIO_Pin: 选择要设置的 GPIO 端口引脚，可输入宏 GPIO_Pin_0-15，
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 表示 GPIOx 端口的 0-15 号引脚。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">void GPIO_ResetBits( GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /* 设置 GPIOx 端口 BRR 寄存器的第 GPIO_Pin 位, 使其输出低电平 */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /* 因为 BRR 寄存器写 0 不影响，宏 GPIO_Pin 只是对应位为 1，其它位均为 0，所以可以直接赋值 */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BRR |= GPIO_Pin;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 函数功能：初始化引脚模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* 参数说明：GPIOx，该参数为 GPIO_TypeDef 类型的指针，指向 GPIO 端口的地址
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* GPIO_InitTypeDef:GPIO_InitTypeDef 结构体指针，指向初始化变量
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uint32_t tmpreg = 0x00, pinmask = 0x00;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*---------------------- GPIO 模式配置 --------------------------*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 把输入参数GPIO_Mode的低四位暂存在currentmode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> currentmode = ((uint32_t)GPIO_InitStruct-&amp;gt;GPIO_Mode) &amp;amp; ((uint32_t)0x0F);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // bit4是1表示输出，bit4是0则是输入
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 判断bit4是1还是0，即首选判断是输入还是输出模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if ((((uint32_t)GPIO_InitStruct-&amp;gt;GPIO_Mode) &amp;amp; ((uint32_t)0x10)) != 0x00)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 输出模式则要设置输出速度
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> currentmode |= (uint32_t)GPIO_InitStruct-&amp;gt;GPIO_Speed;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*-------------GPIO CRL 寄存器配置 CRL寄存器控制着低8位IO- -------*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 配置端口低8位，即Pin0~Pin7
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (((uint32_t)GPIO_InitStruct-&amp;gt;GPIO_Pin &amp;amp; ((uint32_t)0x00FF)) != 0x00)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 先备份CRL寄存器的值
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg = GPIOx-&amp;gt;CRL;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 循环，从Pin0开始配对，找出具体的Pin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for (pinpos = 0x00; pinpos &amp;lt; 0x08; pinpos++)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // pos的值为1左移pinpos位
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pos = ((uint32_t)0x01) &amp;lt;&amp;lt; pinpos;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 令pos与输入参数GPIO_PIN作位与运算，为下面的判断作准备
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> currentpin = (GPIO_InitStruct-&amp;gt;GPIO_Pin) &amp;amp; pos;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> //若currentpin=pos,则找到使用的引脚
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (currentpin == pos)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // pinpos的值左移两位（乘以4），因为寄存器中4个寄存器位配置一个引脚
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pos = pinpos &amp;lt;&amp;lt; 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> //把控制这个引脚的4个寄存器位清零，其它寄存器位不变
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pinmask = ((uint32_t)0x0F) &amp;lt;&amp;lt; pos;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg &amp;amp;= ~pinmask;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 向寄存器写入将要配置的引脚的模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg |= (currentmode &amp;lt;&amp;lt; pos);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 判断是否为下拉输入模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPD)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 下拉输入模式，引脚默认置0，对BRR寄存器写1可对引脚置0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BRR = (((uint32_t)0x01) &amp;lt;&amp;lt; pinpos);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> else
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 判断是否为上拉输入模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPU)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 上拉输入模式，引脚默认值为1，对BSRR寄存器写1可对引脚置1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BSRR = (((uint32_t)0x01) &amp;lt;&amp;lt; pinpos);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 把前面处理后的暂存值写入到CRL寄存器之中
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;CRL = tmpreg;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*-------------GPIO CRH 寄存器配置 CRH寄存器控制着高8位IO- -----------*/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 配置端口高8位，即Pin8~Pin15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (GPIO_InitStruct-&amp;gt;GPIO_Pin &amp;gt; 0x00FF)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // // 先备份CRH寄存器的值
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg = GPIOx-&amp;gt;CRH;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 循环，从Pin8开始配对，找出具体的Pin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for (pinpos = 0x00; pinpos &amp;lt; 0x08; pinpos++)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pos = (((uint32_t)0x01) &amp;lt;&amp;lt; (pinpos + 0x08));
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // pos与输入参数GPIO_PIN作位与运算
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> currentpin = ((GPIO_InitStruct-&amp;gt;GPIO_Pin) &amp;amp; pos);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> //若currentpin=pos,则找到使用的引脚
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (currentpin == pos)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> //pinpos的值左移两位（乘以4），因为寄存器中4个寄存器位配置一个引脚
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pos = pinpos &amp;lt;&amp;lt; 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> //把控制这个引脚的4个寄存器位清零，其它寄存器位不变
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pinmask = ((uint32_t)0x0F) &amp;lt;&amp;lt; pos;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg &amp;amp;= ~pinmask;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 向寄存器写入将要配置的引脚的模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tmpreg |= (currentmode &amp;lt;&amp;lt; pos);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 判断是否为下拉输入模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPD)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 下拉输入模式，引脚默认置0，对BRR寄存器写1可对引脚置0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BRR = (((uint32_t)0x01) &amp;lt;&amp;lt; (pinpos + 0x08));
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 判断是否为上拉输入模式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPU)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 上拉输入模式，引脚默认值为1，对BSRR寄存器写1可对引脚置1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;BSRR = (((uint32_t)0x01) &amp;lt;&amp;lt; (pinpos + 0x08));
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // 把前面处理后的暂存值写入到CRH寄存器之中
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> GPIOx-&amp;gt;CRH = tmpreg;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>文件 &amp;lsquo;stm32f10x_gpio.h&amp;rsquo;：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ifndef __STM32F10X_GPIO_H&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define __STM32F10X_GPIO_H&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#include &amp;#34;stm32f10x.h&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_0 ((uint16_t)0x0001) /*!&amp;lt; 选择Pin0 */ //(00000000 00000001)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_1 ((uint16_t)0x0002) /*!&amp;lt; 选择Pin1 */ //(00000000 00000010)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_2 ((uint16_t)0x0004) /*!&amp;lt; 选择Pin2 */ //(00000000 00000100)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_3 ((uint16_t)0x0008) /*!&amp;lt; 选择Pin3 */ //(00000000 00001000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_4 ((uint16_t)0x0010) /*!&amp;lt; 选择Pin4 */ //(00000000 00010000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_5 ((uint16_t)0x0020) /*!&amp;lt; 选择Pin5 */ //(00000000 00100000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_6 ((uint16_t)0x0040) /*!&amp;lt; 选择Pin6 */ //(00000000 01000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_7 ((uint16_t)0x0080) /*!&amp;lt; 选择Pin7 */ //(00000000 10000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_8 ((uint16_t)0x0100) /*!&amp;lt; 选择Pin8 */ //(00000001 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_9 ((uint16_t)0x0200) /*!&amp;lt; 选择Pin9 */ //(00000010 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_10 ((uint16_t)0x0400) /*!&amp;lt; 选择Pin10 */ //(00000100 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_11 ((uint16_t)0x0800) /*!&amp;lt; 选择Pin11 */ //(00001000 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_12 ((uint16_t)0x1000) /*!&amp;lt; 选择Pin12 */ //(00010000 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_13 ((uint16_t)0x2000) /*!&amp;lt; 选择Pin13 */ //(00100000 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_14 ((uint16_t)0x4000) /*!&amp;lt; 选择Pin14 */ //(01000000 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_15 ((uint16_t)0x8000) /*!&amp;lt; 选择Pin15 */ //(10000000 00000000)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!&amp;lt; 选择全部引脚*/ //(11111111 11111111)b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">typedef&lt;/span> &lt;span class="k">enum&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Speed_10MHz&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="n">MHZ&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">01&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Speed_2MHz&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="n">MHZ&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Speed_50MHz&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="n">MHZ&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">11&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIOSpeed_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">typedef&lt;/span> &lt;span class="k">enum&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span> &lt;span class="n">GPIO_Mode_AIN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">模拟输入&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0000&lt;/span> &lt;span class="mi">0000&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_IN_FLOATING&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x04&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">浮空输入&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0000&lt;/span> &lt;span class="mi">0100&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_IPD&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x28&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">下拉输入&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0010&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_IPU&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x48&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">上拉输入&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0100&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_Out_OD&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">开漏输出&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0001&lt;/span> &lt;span class="mi">0100&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_Out_PP&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">推挽输出&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0001&lt;/span> &lt;span class="mi">0000&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_AF_OD&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x1C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">复用开漏输出&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0001&lt;/span> &lt;span class="mi">1100&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">GPIO_Mode_AF_PP&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x18&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="err">复用推挽输出&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0001&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIOMode_TypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">typedef&lt;/span> &lt;span class="n">struct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16_t&lt;/span> &lt;span class="n">GPIO_Speed&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uint16_t&lt;/span> &lt;span class="n">GPIO_Mode&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;span class="n">GPIO_InitTypeDef&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">void&lt;/span> &lt;span class="n">GPIO_SetBits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">void&lt;/span> &lt;span class="n">GPIO_ResetBits&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="n">GPIO_TypeDef&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uint16_t&lt;/span> &lt;span class="n">GPIO_Pin&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">void&lt;/span> &lt;span class="n">GPIO_Init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GPIO_TypeDef&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">GPIOx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">GPIO_InitTypeDef&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">GPIO_InitStruct&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#endif /* __STM32F10X_GPIO_H */&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>文件 &amp;lsquo;startup_stm32f10x_hd.s&amp;rsquo;：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">********************&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">C&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">COPYRIGHT&lt;/span> &lt;span class="mi">2011&lt;/span> &lt;span class="n">STMicroelectronics&lt;/span> &lt;span class="o">********************&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="ne">File&lt;/span> &lt;span class="n">Name&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">startup_stm32f10x_hd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">s&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">Author&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">MCD&lt;/span> &lt;span class="n">Application&lt;/span> &lt;span class="n">Team&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">Version&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">V3&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="mf">5.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">Date&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">March&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2011&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">STM32F10x&lt;/span> &lt;span class="n">High&lt;/span> &lt;span class="n">Density&lt;/span> &lt;span class="n">Devices&lt;/span> &lt;span class="n">vector&lt;/span> &lt;span class="n">table&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">MDK&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">ARM&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">toolchain&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">This&lt;/span> &lt;span class="n">module&lt;/span> &lt;span class="n">performs&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Set&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">initial&lt;/span> &lt;span class="n">SP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Set&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">initial&lt;/span> &lt;span class="n">PC&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Reset_Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Set&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">vector&lt;/span> &lt;span class="n">table&lt;/span> &lt;span class="n">entries&lt;/span> &lt;span class="n">with&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">exceptions&lt;/span> &lt;span class="n">ISR&lt;/span> &lt;span class="n">address&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Configure&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">clock&lt;/span> &lt;span class="n">system&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">also&lt;/span> &lt;span class="n">configure&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">external&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">SRAM&lt;/span> &lt;span class="n">mounted&lt;/span> &lt;span class="n">on&lt;/span> &lt;span class="n">STM3210E&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">EVAL&lt;/span> &lt;span class="n">board&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">be&lt;/span> &lt;span class="n">used&lt;/span> &lt;span class="n">as&lt;/span> &lt;span class="n">data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">memory&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">optional&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">be&lt;/span> &lt;span class="n">enabled&lt;/span> &lt;span class="n">by&lt;/span> &lt;span class="n">user&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Branches&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">__main&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">C&lt;/span> &lt;span class="n">library&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">which&lt;/span> &lt;span class="n">eventually&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">calls&lt;/span> &lt;span class="n">main&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">After&lt;/span> &lt;span class="n">Reset&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">CortexM3&lt;/span> &lt;span class="n">processor&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="ne">Thread&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">priority&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">Privileged&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">Stack&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">set&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">Use&lt;/span> &lt;span class="n">Configuration&lt;/span> &lt;span class="n">Wizard&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">Context&lt;/span> &lt;span class="n">Menu&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*******************************************************************************&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">THE&lt;/span> &lt;span class="n">PRESENT&lt;/span> &lt;span class="n">FIRMWARE&lt;/span> &lt;span class="n">WHICH&lt;/span> &lt;span class="n">IS&lt;/span> &lt;span class="n">FOR&lt;/span> &lt;span class="n">GUIDANCE&lt;/span> &lt;span class="n">ONLY&lt;/span> &lt;span class="n">AIMS&lt;/span> &lt;span class="n">AT&lt;/span> &lt;span class="n">PROVIDING&lt;/span> &lt;span class="n">CUSTOMERS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">WITH&lt;/span> &lt;span class="n">CODING&lt;/span> &lt;span class="n">INFORMATION&lt;/span> &lt;span class="n">REGARDING&lt;/span> &lt;span class="n">THEIR&lt;/span> &lt;span class="n">PRODUCTS&lt;/span> &lt;span class="n">IN&lt;/span> &lt;span class="n">ORDER&lt;/span> &lt;span class="n">FOR&lt;/span> &lt;span class="n">THEM&lt;/span> &lt;span class="n">TO&lt;/span> &lt;span class="n">SAVE&lt;/span> &lt;span class="n">TIME&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">AS&lt;/span> &lt;span class="n">A&lt;/span> &lt;span class="n">RESULT&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">STMICROELECTRONICS&lt;/span> &lt;span class="n">SHALL&lt;/span> &lt;span class="n">NOT&lt;/span> &lt;span class="n">BE&lt;/span> &lt;span class="n">HELD&lt;/span> &lt;span class="n">LIABLE&lt;/span> &lt;span class="n">FOR&lt;/span> &lt;span class="n">ANY&lt;/span> &lt;span class="n">DIRECT&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">INDIRECT&lt;/span> &lt;span class="n">OR&lt;/span> &lt;span class="n">CONSEQUENTIAL&lt;/span> &lt;span class="n">DAMAGES&lt;/span> &lt;span class="n">WITH&lt;/span> &lt;span class="n">RESPECT&lt;/span> &lt;span class="n">TO&lt;/span> &lt;span class="n">ANY&lt;/span> &lt;span class="n">CLAIMS&lt;/span> &lt;span class="n">ARISING&lt;/span> &lt;span class="n">FROM&lt;/span> &lt;span class="n">THE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">CONTENT&lt;/span> &lt;span class="n">OF&lt;/span> &lt;span class="n">SUCH&lt;/span> &lt;span class="n">FIRMWARE&lt;/span> &lt;span class="n">AND&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">OR&lt;/span> &lt;span class="n">THE&lt;/span> &lt;span class="n">USE&lt;/span> &lt;span class="n">MADE&lt;/span> &lt;span class="n">BY&lt;/span> &lt;span class="n">CUSTOMERS&lt;/span> &lt;span class="n">OF&lt;/span> &lt;span class="n">THE&lt;/span> &lt;span class="n">CODING&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">INFORMATION&lt;/span> &lt;span class="n">CONTAINED&lt;/span> &lt;span class="n">HEREIN&lt;/span> &lt;span class="n">IN&lt;/span> &lt;span class="n">CONNECTION&lt;/span> &lt;span class="n">WITH&lt;/span> &lt;span class="n">THEIR&lt;/span> &lt;span class="n">PRODUCTS&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*******************************************************************************&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">Amount&lt;/span> &lt;span class="n">of&lt;/span> &lt;span class="n">memory&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">in&lt;/span> &lt;span class="n">bytes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">allocated&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">Stack&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">Tailor&lt;/span> &lt;span class="n">this&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">your&lt;/span> &lt;span class="n">application&lt;/span> &lt;span class="n">needs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Stack&lt;/span> &lt;span class="n">Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Stack&lt;/span> &lt;span class="n">Size&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">in&lt;/span> &lt;span class="n">Bytes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mh">0x0&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mh">0xFFFFFFFF&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Stack_Size&lt;/span> &lt;span class="n">EQU&lt;/span> &lt;span class="mh">0x00000400&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AREA&lt;/span> &lt;span class="n">STACK&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">NOINIT&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">READWRITE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ALIGN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Stack_Mem&lt;/span> &lt;span class="n">SPACE&lt;/span> &lt;span class="n">Stack_Size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__initial_sp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Heap&lt;/span> &lt;span class="n">Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">o&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">Heap&lt;/span> &lt;span class="n">Size&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">in&lt;/span> &lt;span class="n">Bytes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="mh">0x0&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mh">0xFFFFFFFF&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Heap_Size&lt;/span> &lt;span class="n">EQU&lt;/span> &lt;span class="mh">0x00000200&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AREA&lt;/span> &lt;span class="n">HEAP&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">NOINIT&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">READWRITE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ALIGN&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__heap_base&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Heap_Mem&lt;/span> &lt;span class="n">SPACE&lt;/span> &lt;span class="n">Heap_Size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__heap_limit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PRESERVE8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">THUMB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">Vector&lt;/span> &lt;span class="n">Table&lt;/span> &lt;span class="n">Mapped&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="n">Address&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="n">at&lt;/span> &lt;span class="n">Reset&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AREA&lt;/span> &lt;span class="n">RESET&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">DATA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">READONLY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__Vectors&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__Vectors_End&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__Vectors_Size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__Vectors&lt;/span> &lt;span class="n">DCD&lt;/span> &lt;span class="n">__initial_sp&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Top&lt;/span> &lt;span class="n">of&lt;/span> &lt;span class="n">Stack&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">Reset_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reset&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">NMI_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">NMI&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">HardFault_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Hard&lt;/span> &lt;span class="n">Fault&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">MemManage_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">MPU&lt;/span> &lt;span class="n">Fault&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">BusFault_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Bus&lt;/span> &lt;span class="n">Fault&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">UsageFault_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Usage&lt;/span> &lt;span class="n">Fault&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reserved&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reserved&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reserved&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reserved&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SVC_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SVCall&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DebugMon_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Debug&lt;/span> &lt;span class="n">Monitor&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Reserved&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">PendSV_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">PendSV&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SysTick_Handler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SysTick&lt;/span> &lt;span class="n">Handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">;&lt;/span> &lt;span class="n">External&lt;/span> &lt;span class="n">Interrupts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">WWDG_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Window&lt;/span> &lt;span class="n">Watchdog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">PVD_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">PVD&lt;/span> &lt;span class="n">through&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="n">detect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TAMPER_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Tamper&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">RTC_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">RTC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">FLASH_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">Flash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">RCC_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">RCC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI0_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI4_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mi">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel4_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel5_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel6_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA1_Channel7_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA1&lt;/span> &lt;span class="n">Channel&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">ADC1_2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">ADC1&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">ADC2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USB_HP_CAN1_TX_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USB&lt;/span> &lt;span class="n">High&lt;/span> &lt;span class="n">Priority&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">CAN1&lt;/span> &lt;span class="n">TX&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USB_LP_CAN1_RX0_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USB&lt;/span> &lt;span class="n">Low&lt;/span> &lt;span class="n">Priority&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">CAN1&lt;/span> &lt;span class="n">RX0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">CAN1_RX1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">CAN1&lt;/span> &lt;span class="n">RX1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">CAN1_SCE_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">CAN1&lt;/span> &lt;span class="n">SCE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI9_5_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mf">9.&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM1_BRK_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM1&lt;/span> &lt;span class="n">Break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM1_UP_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM1&lt;/span> &lt;span class="n">Update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM1_TRG_COM_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM1&lt;/span> &lt;span class="n">Trigger&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">Commutation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM1_CC_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM1&lt;/span> &lt;span class="n">Capture&lt;/span> &lt;span class="n">Compare&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM4_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">I2C1_EV_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">I2C1&lt;/span> &lt;span class="n">Event&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">I2C1_ER_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">I2C1&lt;/span> &lt;span class="n">Error&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">I2C2_EV_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">I2C2&lt;/span> &lt;span class="n">Event&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">I2C2_ER_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">I2C2&lt;/span> &lt;span class="n">Error&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SPI1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SPI1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SPI2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SPI2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USART1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USART1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USART2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USART2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USART3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USART3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">EXTI15_10_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span> &lt;span class="mf">15.&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="mi">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">RTCAlarm_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">RTC&lt;/span> &lt;span class="n">Alarm&lt;/span> &lt;span class="n">through&lt;/span> &lt;span class="n">EXTI&lt;/span> &lt;span class="n">Line&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">USBWakeUp_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">USB&lt;/span> &lt;span class="n">Wakeup&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="n">suspend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM8_BRK_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM8&lt;/span> &lt;span class="n">Break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM8_UP_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM8&lt;/span> &lt;span class="n">Update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM8_TRG_COM_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM8&lt;/span> &lt;span class="n">Trigger&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">Commutation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM8_CC_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM8&lt;/span> &lt;span class="n">Capture&lt;/span> &lt;span class="n">Compare&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">ADC3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">ADC3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">FSMC_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">FSMC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SDIO_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SDIO&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM5_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">SPI3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">SPI3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">UART4_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">UART4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">UART5_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">UART5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM6_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">TIM7_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">TIM7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA2_Channel1_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA2&lt;/span> &lt;span class="n">Channel1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA2_Channel2_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA2&lt;/span> &lt;span class="n">Channel2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA2_Channel3_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA2&lt;/span> &lt;span class="n">Channel3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DCD&lt;/span> &lt;span class="n">DMA2_Channel4_5_IRQHandler&lt;/span> &lt;span class="p">;&lt;/span> &lt;span class="n">DMA2&lt;/span> &lt;span class="n">Channel4&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">Channel5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__Vectors_End&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__Vectors_Size&lt;/span> &lt;span class="n">EQU&lt;/span> &lt;span class="n">__Vectors_End&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">__Vectors&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AREA&lt;/span> &lt;span class="o">|.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">CODE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">READONLY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">Reset&lt;/span> &lt;span class="n">handler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Reset_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">Reset_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMPORT&lt;/span> &lt;span class="n">__main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMPORT&lt;/span> &lt;span class="n">SystemInit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span>&lt;span class="n">SystemInit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BLX&lt;/span> &lt;span class="n">R0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span>&lt;span class="n">__main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BX&lt;/span> &lt;span class="n">R0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">Dummy&lt;/span> &lt;span class="n">Exception&lt;/span> &lt;span class="n">Handlers&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">infinite&lt;/span> &lt;span class="n">loops&lt;/span> &lt;span class="n">which&lt;/span> &lt;span class="n">can&lt;/span> &lt;span class="n">be&lt;/span> &lt;span class="n">modified&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">NMI_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">NMI_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">HardFault_Handler&lt;/span>\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">HardFault_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MemManage_Handler&lt;/span>\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">MemManage_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">BusFault_Handler&lt;/span>\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">BusFault_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UsageFault_Handler&lt;/span>\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">UsageFault_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SVC_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SVC_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DebugMon_Handler&lt;/span>\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DebugMon_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">PendSV_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">PendSV_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SysTick_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SysTick_Handler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Default_Handler&lt;/span> &lt;span class="n">PROC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">WWDG_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">PVD_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TAMPER_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">RTC_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">FLASH_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">RCC_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI0_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI4_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel4_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel5_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel6_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA1_Channel7_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">ADC1_2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USB_HP_CAN1_TX_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USB_LP_CAN1_RX0_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">CAN1_RX1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">CAN1_SCE_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI9_5_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM1_BRK_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM1_UP_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM1_TRG_COM_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM1_CC_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM4_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">I2C1_EV_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">I2C1_ER_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">I2C2_EV_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">I2C2_ER_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SPI1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SPI2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USART1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USART2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USART3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">EXTI15_10_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">RTCAlarm_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">USBWakeUp_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM8_BRK_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM8_UP_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM8_TRG_COM_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM8_CC_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">ADC3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">FSMC_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SDIO_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM5_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">SPI3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">UART4_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">UART5_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM6_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">TIM7_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA2_Channel1_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA2_Channel2_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA2_Channel3_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">DMA2_Channel4_5_IRQHandler&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">WEAK&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">WWDG_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">PVD_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TAMPER_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RTC_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">FLASH_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RCC_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI0_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI4_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel4_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel5_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel6_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA1_Channel7_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ADC1_2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USB_HP_CAN1_TX_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USB_LP_CAN1_RX0_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CAN1_RX1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CAN1_SCE_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI9_5_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM1_BRK_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM1_UP_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM1_TRG_COM_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM1_CC_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM4_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">I2C1_EV_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">I2C1_ER_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">I2C2_EV_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">I2C2_ER_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SPI1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SPI2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USART1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USART2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USART3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">EXTI15_10_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RTCAlarm_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">USBWakeUp_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM8_BRK_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM8_UP_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM8_TRG_COM_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM8_CC_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ADC3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">FSMC_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SDIO_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM5_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SPI3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UART4_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UART5_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM6_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIM7_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA2_Channel1_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA2_Channel2_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA2_Channel3_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DMA2_Channel4_5_IRQHandler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">B&lt;/span> &lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ALIGN&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*******************************************************************************&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span> &lt;span class="n">User&lt;/span> &lt;span class="n">Stack&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">Heap&lt;/span> &lt;span class="n">initialization&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*******************************************************************************&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IF&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="n">DEF&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">__MICROLIB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__initial_sp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__heap_base&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__heap_limit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ELSE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMPORT&lt;/span> &lt;span class="n">__use_two_region_memory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPORT&lt;/span> &lt;span class="n">__user_initial_stackheap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__user_initial_stackheap&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Heap_Mem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Stack_Mem&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Stack_Size&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Heap_Mem&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Heap_Size&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LDR&lt;/span> &lt;span class="n">R3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Stack_Mem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BX&lt;/span> &lt;span class="n">LR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ALIGN&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ENDIF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">END&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">;&lt;/span>&lt;span class="o">*******************&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">C&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">COPYRIGHT&lt;/span> &lt;span class="mi">2011&lt;/span> &lt;span class="n">STMicroelectronics&lt;/span> &lt;span class="o">*****&lt;/span>&lt;span class="n">END&lt;/span> &lt;span class="n">OF&lt;/span> &lt;span class="n">FILE&lt;/span>&lt;span class="o">*****&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>1. 代码解释&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;ol>
&lt;li>main.c - 主程序文件 这是一个简单的LED闪烁程序： 配置GPIOC的Pin2作为LED控制引脚 在主循环中通过GPIO_SetBits和GPIO_ResetBits来控制LED的亮灭 使用Delay函数实现延时&lt;/li>
&lt;li>startup_stm32f10x_hd.s - 启动文件 这是STM32的汇编启动文件，主要功能包括： 设置堆栈指针 配置中断向量表 初始化系统时钟 跳转到C语言main函数&lt;/li>
&lt;li>stm32f10x.h - 寄存器定义文件 定义了STM32的硬件寄存器映射： 定义了外设基地址（PERIPH_BASE等） 定义了GPIO和RCC等外设的寄存器结构体 提供了访问这些寄存器的指针定义&lt;/li>
&lt;li>stm32f10x_gpio.c/.h - GPIO驱动文件 提供GPIO操作的函数实现： GPIO_Init：初始化GPIO引脚的模式和速度 GPIO_SetBits：设置引脚高电平 GPIO_ResetBits：设置引脚低电平
关键的GPIO模式定义：
typedef enum
{
GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
}GPIOMode_TypeDef;
这是一个典型的STM32F10x系列单片机的基础程序，实现了最基本的GPIO控制功能，可以控制LED的亮灭。程序的结构清晰，包含了完整的底层驱动实现。&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;h2 id="10-初识stm32固件库">10 初识stm32固件库
&lt;/h2>&lt;p>&lt;strong>如何下载固件库&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-6.png"
width="1163"
height="7111"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-6_hu6713421380937874036.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-6_hu16578189358900785264.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="16"
data-flex-basis="39px"
>&lt;/p>
&lt;h2 id="11-新建项目固件库版本开始使用固件库编程">11 新建项目，固件库版本（开始使用固件库编程）
&lt;/h2>&lt;p>一般结构如下&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-7.png"
width="516"
height="189"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-7_hu14676375797874120851.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-7_hu1283430029036144859.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="273"
data-flex-basis="655px"
>&lt;/p>
&lt;p>可以在这里改名&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-8.png"
width="846"
height="604"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-8_hu13235363179316403925.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-8_hu17464396252472615979.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="336px"
>
&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-9.png"
width="274"
height="335"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-9_hu1072572233548950461.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-9_hu14475425586016813183.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="81"
data-flex-basis="196px"
>&lt;/p>
&lt;p>创建好文件夹还不行，还需要在keil中指定文件目录&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-10.png"
width="1403"
height="616"
srcset="https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-10_hu16152095954347615523.png 480w, https://www.zata.cc/p/%E9%87%8E%E7%81%ABf103-mini%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-10_hu18061822615813869429.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="227"
data-flex-basis="546px"
>&lt;/p></description></item><item><title>爬虫-实战-爬取arXiv AI论文对应的url和title等</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/</link><pubDate>Thu, 20 Mar 2025 10:59:07 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/images/index/index.png" alt="Featured image of post 爬虫-实战-爬取arXiv AI论文对应的url和title等" />&lt;h1 id="教程使用-python-爬取-arxiv-ai-论文--tutorial-crawling-arxiv-ai-papers-with-python">教程：使用 Python 爬取 arXiv AI 论文 / Tutorial: Crawling arXiv AI Papers with Python
&lt;/h1>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>代码文件和实例arXiv的html文件&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a class="link" href="images/index/deepcrawler.py" >爬虫代码&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a class="link" href="images/index/arxiv_papers.json" >json输出&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a class="link" href="https://www.zata.cc/files/arxiv-ai-papers-sample.html" >html示例&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>在本教程中，您将学习如何使用 Python 从 arXiv（一个流行的研究论文库）爬取最新的人工智能（AI）论文，并将结果保存为 JSON 文件。我们将逐步拆解代码，解释其功能，并告诉您如何根据需要进行修改。&lt;/p>
&lt;p>In this tutorial, you’ll learn how to use Python to scrape the latest Artificial Intelligence (AI) papers from arXiv (a popular repository of research papers) and save the results in a JSON file. We’ll break down the code step by step, explaining its functionality and how you can modify it for your needs.&lt;/p>
&lt;hr>
&lt;h2 id="前提条件--prerequisites">前提条件 / Prerequisites
&lt;/h2>&lt;p>开始之前，请确保您已安装以下内容：&lt;br>
Before you begin, ensure you have the following installed:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Python 3.x&lt;/strong>: 我们将使用的编程语言 / The programming language we’ll use.&lt;/li>
&lt;li>&lt;strong>库 / Libraries&lt;/strong>:
&lt;ul>
&lt;li>&lt;code>requests&lt;/code>: 用于发送 HTTP 请求获取网页 / For making HTTP requests to fetch web pages.&lt;/li>
&lt;li>&lt;code>beautifulsoup4&lt;/code>: 用于解析 HTML 内容 / For parsing HTML content.&lt;/li>
&lt;li>&lt;code>json&lt;/code>: Python 内置库，用于处理 JSON 数据 / Built-in Python library for working with JSON data.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>安装所需库（使用 pip）：&lt;br>
Install the required libraries using pip:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install requests beautifulsoup4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="代码功能--what-the-code-does">代码功能 / What the Code Does
&lt;/h2>&lt;p>这个脚本会：&lt;br>
The script:&lt;/p>
&lt;ol>
&lt;li>从 arXiv 的 AI 新论文页面 (&lt;code>https://arxiv.org/list/cs.AI/new&lt;/code>) 获取最新论文。&lt;br>
Fetches the latest AI papers from the arXiv page (&lt;code>https://arxiv.org/list/cs.AI/new&lt;/code>).&lt;/li>
&lt;li>提取每篇论文的详细信息，例如标题、摘要、作者、评论和学科分类。&lt;br>
Extracts details like title, abstract, authors, comments, and subjects for each paper.&lt;/li>
&lt;li>将数据保存到 JSON 文件 (&lt;code>arxiv_papers.json&lt;/code>)。&lt;br>
Saves the data in a JSON file (&lt;code>arxiv_papers.json&lt;/code>).&lt;/li>
&lt;/ol>
&lt;p>让我们深入代码！&lt;br>
Let’s dive into the code!&lt;/p>
&lt;hr>
&lt;h2 id="第一步导入库--step-1-importing-libraries">第一步：导入库 / Step 1: Importing Libraries
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>requests&lt;/code>: 发送 HTTP 请求以获取网页内容 / Sends HTTP requests to fetch the webpage.&lt;/li>
&lt;li>&lt;code>BeautifulSoup&lt;/code>: 解析网页的 HTML 内容 / Parses the HTML content of the webpage.&lt;/li>
&lt;li>&lt;code>json&lt;/code>: 处理 JSON 格式的数据保存 / Handles saving the scraped data in JSON format.&lt;/li>
&lt;li>&lt;code>time&lt;/code>: 本脚本未使用，但可用于将来添加延迟 / Not used in this script but imported for potential future use (e.g., adding delays).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第二步设置参数--step-2-setting-configuration-parameters">第二步：设置参数 / Step 2: Setting Configuration Parameters
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># arXiv AI 新论文页面 / arXiv AI new papers page&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;arxiv_papers.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名 / Output filename&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>START_URL&lt;/code>: 我们要爬取的网页（arXiv 的 AI 新论文页面）。&lt;br>
The webpage we want to scrape (new AI papers on arXiv).&lt;/li>
&lt;li>&lt;code>OUTPUT_FILE&lt;/code>: 保存爬取数据的文件名。&lt;br>
The name of the file where the scraped data will be saved.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>修改建议 / Tip&lt;/strong>: 您可以更改 &lt;code>START_URL&lt;/code> 来爬取其他 arXiv 类别，例如 &lt;code>cs.LG&lt;/code>（机器学习）。&lt;br>
You can modify &lt;code>START_URL&lt;/code> to scrape a different arXiv category (e.g., &lt;code>cs.LG&lt;/code> for Machine Learning).&lt;/p>
&lt;hr>
&lt;h2 id="第三步定义爬取函数--step-3-defining-the-crawling-function">第三步：定义爬取函数 / Step 3: Defining the Crawling Function
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl_arxiv_papers&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;开始爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送 HTTP 请求 / Send HTTP request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>crawl_arxiv_papers()&lt;/code>: 执行爬取的主要函数 / The main function that performs the scraping.&lt;/li>
&lt;li>&lt;code>headers&lt;/code>: 模拟浏览器请求，避免被服务器阻止 / Mimics a browser request to avoid being blocked by the server.&lt;/li>
&lt;li>&lt;code>requests.get()&lt;/code>: 获取网页内容，设置 20 秒超时 / Fetches the webpage content with a 20-second timeout.&lt;/li>
&lt;li>&lt;code>raise_for_status()&lt;/code>: 如果请求失败（例如 404 错误），抛出异常 / Raises an exception if the request fails (e.g., 404 error).&lt;/li>
&lt;/ul>
&lt;h3 id="解析-html--parsing-the-html">解析 HTML / Parsing the HTML
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dt_tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>BeautifulSoup&lt;/code>: 将 HTML 内容解析为可操作的结构 / Parses the HTML content into a navigable structure.&lt;/li>
&lt;li>&lt;code>papers&lt;/code>: 存储爬取结果的列表 / A list to store the scraped paper data.&lt;/li>
&lt;li>&lt;code>dt_tags&lt;/code>: 查找所有 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 标签，每篇论文的条目从这里开始 / Finds all &lt;code>&amp;lt;dt&amp;gt;&lt;/code> tags, which mark the start of each paper entry on the arXiv page.&lt;/li>
&lt;/ul>
&lt;h3 id="提取论文详情--extracting-paper-details">提取论文详情 / Extracting Paper Details
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">dt_tag&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">dt_tags&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dd_tag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dt_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_next_sibling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">dd_tag&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>遍历每个 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 标签，找到对应的 &lt;code>&amp;lt;dd&amp;gt;&lt;/code> 标签（包含元数据）。&lt;br>
Loops through each &lt;code>&amp;lt;dt&amp;gt;&lt;/code> tag and finds its sibling &lt;code>&amp;lt;dd&amp;gt;&lt;/code> tag (contains metadata).&lt;/li>
&lt;li>&lt;code>paper&lt;/code>: 存储单篇论文详情的字典 / A dictionary to store details of a single paper.&lt;/li>
&lt;/ul>
&lt;h4 id="提取论文链接和-id--extracting-paper-url-and-id">提取论文链接和 ID / Extracting Paper URL and ID
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper_link&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dt_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Abstract&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;arxiv_url&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;arxiv_id&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>找到 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 中的摘要链接，提取 URL 和 arXiv ID（例如 &lt;code>arXiv:XXXX.XXXX&lt;/code>）。&lt;br>
Finds the abstract link in &lt;code>&amp;lt;dt&amp;gt;&lt;/code> and extracts the URL and arXiv ID (e.g., &lt;code>arXiv:XXXX.XXXX&lt;/code>).&lt;/li>
&lt;/ul>
&lt;h4 id="提取元数据--extracting-metadata">提取元数据 / Extracting Metadata
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">meta_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dd_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;meta&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>在 &lt;code>&amp;lt;dd&amp;gt;&lt;/code> 中找到 &lt;code>&amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;/code>，它包含论文的详细信息。&lt;br>
Finds the &lt;code>&amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;/code> inside &lt;code>&amp;lt;dd&amp;gt;&lt;/code>, which holds the paper’s details.&lt;/li>
&lt;/ul>
&lt;h4 id="标题--title">标题 / Title
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-title mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">title_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Title:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">title_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Title:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取论文标题并移除 &amp;ldquo;Title:&amp;rdquo; 前缀。&lt;br>
Extracts the paper title and removes the &amp;ldquo;Title:&amp;rdquo; prefix.&lt;/li>
&lt;/ul>
&lt;h4 id="摘要--abstract">摘要 / Abstract
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">abstract&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">abstract&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;abstract&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">abstract&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取论文摘要。&lt;br>
Extracts the abstract text.&lt;/li>
&lt;/ul>
&lt;h4 id="评论可选--comments-optional">评论（可选） / Comments (Optional)
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-comments mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">comments_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Comments:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">comments_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Comments:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;comments&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果存在评论（例如 &amp;ldquo;10 pages, 3 figures&amp;rdquo;），则提取它。&lt;br>
Extracts comments if they exist (e.g., &amp;ldquo;10 pages, 3 figures&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4 id="作者--authors">作者 / Authors
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">authors_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-authors&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">authors_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">authors&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">authors_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">authors&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取作者列表。&lt;br>
Extracts a list of author names.&lt;/li>
&lt;/ul>
&lt;h4 id="学科分类--subjects">学科分类 / Subjects
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-subjects&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">subjects_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Subjects:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">subjects_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Subjects:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;subjects&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取学科分类（例如 &amp;ldquo;Artificial Intelligence (cs.AI)&amp;quot;）。&lt;br>
Extracts the subject categories (e.g., &amp;ldquo;Artificial Intelligence (cs.AI)&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4 id="添加到列表--adding-to-list">添加到列表 / Adding to List
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">paper&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">paper&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将论文字典添加到 &lt;code>papers&lt;/code> 列表中。&lt;br>
Adds the paper dictionary to the &lt;code>papers&lt;/code> list.&lt;/li>
&lt;/ul>
&lt;h3 id="错误处理--error-handling">错误处理 / Error Handling
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>捕获网络相关的错误，如果请求失败则返回空列表。&lt;br>
Catches network-related errors and returns an empty list if the request fails.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第四步保存数据到文件--step-4-saving-data-to-a-file">第四步：保存数据到文件 / Step 4: Saving Data to a File
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>save_to_file()&lt;/code>: 将爬取的数据写入 JSON 文件。&lt;br>
Writes the scraped data to a JSON file.&lt;/li>
&lt;li>&lt;code>ensure_ascii=False&lt;/code>: 保留非 ASCII 字符（例如中文或特殊符号）。&lt;br>
Preserves non-ASCII characters (e.g., Chinese or special symbols).&lt;/li>
&lt;li>&lt;code>indent=4&lt;/code>: 格式化 JSON 文件以便阅读。&lt;br>
Formats the JSON file for readability.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第五步主函数和执行--step-5-main-function-and-execution">第五步：主函数和执行 / Step 5: Main Function and Execution
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬虫程序...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">crawl_arxiv_papers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">papers&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">papers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共获取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">papers&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 篇论文信息&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;未获取到任何论文信息&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>main()&lt;/code>: 协调爬取和保存过程。&lt;br>
Orchestrates the crawling and saving process.&lt;/li>
&lt;li>&lt;code>if __name__ == &amp;quot;__main__&amp;quot;&lt;/code>: 确保脚本仅在直接运行时执行（而不是被导入时）。&lt;br>
Ensures the script runs only when executed directly (not when imported).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="运行代码--running-the-code">运行代码 / Running the Code
&lt;/h2>&lt;ol>
&lt;li>将代码保存到文件（例如 &lt;code>arxiv_crawler.py&lt;/code>）。&lt;br>
Save the code in a file (e.g., &lt;code>arxiv_crawler.py&lt;/code>).&lt;/li>
&lt;li>在同一目录下打开终端。&lt;br>
Open a terminal in the same directory.&lt;/li>
&lt;li>运行脚本：&lt;br>
Run the script:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python arxiv_crawler.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>检查输出文件 &lt;code>arxiv_papers.json&lt;/code> 查看结果。&lt;br>
Check the output file &lt;code>arxiv_papers.json&lt;/code> for the results.&lt;/li>
&lt;/ol>
&lt;h3 id="示例输出--sample-output">示例输出 / Sample Output
&lt;/h3>&lt;p>&lt;code>arxiv_papers.json&lt;/code> 文件可能如下所示：&lt;br>
The &lt;code>arxiv_papers.json&lt;/code> file might look like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arxiv_url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/abs/2503.12345&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arxiv_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;arXiv:2503.12345&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;A New AI Model&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;abstract&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;This paper introduces...&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;authors&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;John Doe&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Jane Smith&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;subjects&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Artificial Intelligence (cs.AI)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="自定义建议--tips-for-customization">自定义建议 / Tips for Customization
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>更改类别 / Change Category&lt;/strong>: 修改 &lt;code>START_URL&lt;/code> 来爬取其他 arXiv 类别（例如 &lt;code>https://arxiv.org/list/cs.LG/new&lt;/code> 用于机器学习）。&lt;br>
Modify &lt;code>START_URL&lt;/code> to scrape a different arXiv category (e.g., &lt;code>https://arxiv.org/list/cs.LG/new&lt;/code> for Machine Learning).&lt;/li>
&lt;li>&lt;strong>添加延迟 / Add Delays&lt;/strong>: 在循环中加入 &lt;code>time.sleep(2)&lt;/code> 以避免对服务器造成过大压力。&lt;br>
Use &lt;code>time.sleep(2)&lt;/code> in the loop to avoid overwhelming the server.&lt;/li>
&lt;li>&lt;strong>错误日志 / Error Logging&lt;/strong>: 使用日志记录代替 &lt;code>print&lt;/code> 语句，以便更好地调试。&lt;br>
Add logging instead of &lt;code>print&lt;/code> statements for better debugging.&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>爬虫-实战-多页面递归爬取</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/</link><pubDate>Thu, 20 Mar 2025 10:20:00 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/images/index/index.png" alt="Featured image of post 爬虫-实战-多页面递归爬取" />&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置爬虫参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># 替换为你想爬取的起始URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 最大爬取深度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;crawled_data.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用于存储已访问的URL，避免重复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用于存储爬取结果&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查深度限制和是否已访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">url&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">visited_urls&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;正在爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (深度: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">depth&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送HTTP请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 标记为已访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">visited_urls&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 解析HTML内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取当前页面的标题作为主要内容（可以根据需要修改）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">page_title&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;无标题&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取页面中的内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 存储当前页面的URL和内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawled_data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">page_title&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取页面中的所有链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s2">&amp;#34;无文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 将相对URL转换为绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 简单过滤，只爬取http或https链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">absolute_url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="s2">&amp;#34;http://&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https://&amp;#34;&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 递归爬取新链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 避免过于频繁请求，礼貌爬取&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬取...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 个页面&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="1-代码概述">1. 代码概述
&lt;/h3>&lt;p>这个爬虫使用 &lt;code>requests&lt;/code> 获取网页内容，&lt;code>BeautifulSoup&lt;/code> 解析 HTML，然后递归爬取页面中的链接，最终将结果保存为 JSON 文件。主要功能包括：&lt;/p>
&lt;ul>
&lt;li>从指定起始 URL 开始爬取。&lt;/li>
&lt;li>限制爬取深度，避免无限递归。&lt;/li>
&lt;li>提取页面标题和文本内容。&lt;/li>
&lt;li>保存爬取结果到本地文件。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-导入库">2. 导入库
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>requests&lt;/code>：用于发送 HTTP 请求获取网页内容。&lt;/li>
&lt;li>&lt;code>BeautifulSoup&lt;/code>（来自 &lt;code>bs4&lt;/code>）：解析 HTML 内容，提取所需数据。&lt;/li>
&lt;li>&lt;code>json&lt;/code>：将爬取结果保存为 JSON 格式。&lt;/li>
&lt;li>&lt;code>urljoin&lt;/code>（来自 &lt;code>urllib.parse&lt;/code>）：将相对 URL 转换为绝对 URL。&lt;/li>
&lt;li>&lt;code>time&lt;/code>：用于添加延迟，避免过于频繁请求服务器。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="3-配置爬虫参数">3. 配置爬虫参数
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># 替换为你想爬取的起始URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 最大爬取深度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;crawled_data.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>START_URL&lt;/code>：爬虫的起始页面，这里是 arXiv 的 AI 分类新论文页面。&lt;/li>
&lt;li>&lt;code>MAX_DEPTH&lt;/code>：限制递归爬取的深度，防止爬虫无限扩展（这里设为 1，只爬取起始页面和其直接链接）。&lt;/li>
&lt;li>&lt;code>OUTPUT_FILE&lt;/code>：结果保存的文件名。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="4-全局变量">4. 全局变量
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>visited_urls&lt;/code>：一个集合（&lt;code>set&lt;/code>），记录已访问的 URL，避免重复爬取。&lt;/li>
&lt;li>&lt;code>crawled_data&lt;/code>：一个列表，存储所有爬取到的页面数据。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="5-主爬取函数-crawl">5. 主爬取函数 &lt;code>crawl&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>url&lt;/code>：要爬取的网页地址。&lt;/li>
&lt;li>&lt;code>depth&lt;/code>：当前爬取的深度，默认从 0 开始。&lt;/li>
&lt;/ul>
&lt;h4 id="51-检查条件">5.1 检查条件
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">url&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">visited_urls&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果当前深度超过 &lt;code>MAX_DEPTH&lt;/code> 或 URL 已访问过，则停止爬取并返回。&lt;/li>
&lt;/ul>
&lt;h4 id="52-发送请求">5.2 发送请求
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;正在爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (深度: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">depth&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>打印当前爬取的 URL 和深度。&lt;/li>
&lt;li>使用 &lt;code>requests.get&lt;/code> 发送 HTTP GET 请求：
&lt;ul>
&lt;li>&lt;code>headers&lt;/code>：伪装成浏览器，避免被服务器拒绝。&lt;/li>
&lt;li>&lt;code>timeout=20&lt;/code>：设置 20 秒超时，防止请求挂起。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>raise_for_status()&lt;/code>：如果请求失败（比如 404 或 500），抛出异常。&lt;/li>
&lt;/ul>
&lt;h4 id="53-标记已访问">5.3 标记已访问
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将当前 URL 添加到 &lt;code>visited_urls&lt;/code> 集合，避免重复爬取。&lt;/li>
&lt;/ul>
&lt;h4 id="54-解析-html">5.4 解析 HTML
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>使用 &lt;code>BeautifulSoup&lt;/code> 将网页的 HTML 内容解析为可操作的对象。&lt;/li>
&lt;/ul>
&lt;h4 id="55-提取标题和内容">5.5 提取标题和内容
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">page_title&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;无标题&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>page_title&lt;/code>：提取页面的 &lt;code>&amp;lt;title&amp;gt;&lt;/code> 标签内容，如果没有则设为“无标题”。&lt;/li>
&lt;li>&lt;code>content&lt;/code>：提取页面所有文本内容（去掉 HTML 标签）。&lt;/li>
&lt;/ul>
&lt;h4 id="56-保存数据">5.6 保存数据
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">page_title&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将当前页面的信息（URL、标题、深度、内容）存入 &lt;code>crawled_data&lt;/code> 列表。&lt;/li>
&lt;/ul>
&lt;h4 id="57-提取并递归爬取链接">5.7 提取并递归爬取链接
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s2">&amp;#34;无文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">absolute_url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="s2">&amp;#34;http://&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https://&amp;#34;&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>soup.find_all(&amp;quot;a&amp;quot;, href=True)&lt;/code>：查找页面中所有带 &lt;code>href&lt;/code> 属性的 &lt;code>&amp;lt;a&amp;gt;&lt;/code> 标签（超链接）。&lt;/li>
&lt;li>&lt;code>href&lt;/code>：获取链接地址。&lt;/li>
&lt;li>&lt;code>link_text&lt;/code>：获取链接的文本内容，若为空则设为“无文本”。&lt;/li>
&lt;li>&lt;code>urljoin(url, href)&lt;/code>：将相对链接（如 &lt;code>/about&lt;/code>）转换为绝对链接（如 &lt;code>https://arxiv.org/about&lt;/code>）。&lt;/li>
&lt;li>如果链接以 &lt;code>http://&lt;/code> 或 &lt;code>https://&lt;/code> 开头，则递归调用 &lt;code>crawl&lt;/code>，深度加 1。&lt;/li>
&lt;/ul>
&lt;h4 id="58-延迟">5.8 延迟
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>每次请求后暂停 1 秒，避免对服务器造成过大压力（礼貌爬取）。&lt;/li>
&lt;/ul>
&lt;h4 id="59-错误处理">5.9 错误处理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果请求失败（如超时或 404），打印错误信息。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="6-保存数据函数-save_to_file">6. 保存数据函数 &lt;code>save_to_file&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>json.dump&lt;/code>：将数据以 JSON 格式写入文件。&lt;/li>
&lt;li>&lt;code>ensure_ascii=False&lt;/code>：支持非 ASCII 字符（如中文）。&lt;/li>
&lt;li>&lt;code>indent=4&lt;/code>：格式化 JSON，使其更易读。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="7-主函数-main">7. 主函数 &lt;code>main&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬取...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 个页面&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>调用 &lt;code>crawl&lt;/code> 开始爬取。&lt;/li>
&lt;li>保存结果到文件。&lt;/li>
&lt;li>打印爬取的总页面数。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="8-运行代码">8. 运行代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>确保代码只在直接运行脚本时执行（而不是被导入时）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="9-运行示例">9. 运行示例
&lt;/h3>&lt;ol>
&lt;li>安装依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install requests beautifulsoup4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>运行代码：
&lt;ul>
&lt;li>爬虫从 &lt;code>https://arxiv.org/list/cs.AI/new&lt;/code> 开始。&lt;/li>
&lt;li>爬取该页面及其直接链接（深度 ≤ 1）。&lt;/li>
&lt;li>结果保存到 &lt;code>crawled_data.json&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>输出文件示例：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;New submissions for cs.AI&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...页面文本内容...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/abs/1234.56789&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Paper Title&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...论文摘要等内容...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="10-注意事项">10. 注意事项
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>礼貌爬取&lt;/strong>：&lt;code>time.sleep(1)&lt;/code> 避免过于频繁请求，但可以根据网站政策调整。&lt;/li>
&lt;li>&lt;strong>robots.txt&lt;/strong>：检查目标网站的 &lt;code>robots.txt&lt;/code>（如 &lt;code>https://arxiv.org/robots.txt&lt;/code>），确保遵守规则。&lt;/li>
&lt;li>&lt;strong>异常处理&lt;/strong>：当前只处理了请求相关的异常，可根据需要扩展。&lt;/li>
&lt;li>&lt;strong>内容提取&lt;/strong>：当前提取所有文本（&lt;code>get_text()&lt;/code>），可改为提取特定元素（如论文标题、摘要）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="11-改进建议">11. 改进建议
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>过滤链接&lt;/strong>：添加域名限制（如只爬 &lt;code>arxiv.org&lt;/code> 的链接）。&lt;/li>
&lt;li>&lt;strong>多线程&lt;/strong>：使用 &lt;code>threading&lt;/code> 或 &lt;code>asyncio&lt;/code> 加速爬取。&lt;/li>
&lt;li>&lt;strong>数据清洗&lt;/strong>：去掉无关内容（如页脚、导航栏）。&lt;/li>
&lt;li>&lt;strong>代理支持&lt;/strong>：添加代理池以应对封禁。&lt;/li>
&lt;/ul></description></item><item><title>给hugo博客的页面增加一个自定义密码（防君子不防小人）</title><link>https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/</link><pubDate>Wed, 05 Mar 2025 17:14:05 +0800</pubDate><guid>https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index.png" alt="Featured image of post 给hugo博客的页面增加一个自定义密码（防君子不防小人）" />&lt;p>&lt;img src="https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index.png"
width="660"
height="219"
srcset="https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index_hu15667366514887267723.png 480w, https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index_hu16609420308474211687.png 1024w"
loading="lazy"
alt="演示需要输入密码查看文档"
class="gallery-image"
data-flex-grow="301"
data-flex-basis="723px"
>&lt;/p>
&lt;p>在 Hugo 的 Stack 模板中为特定文章添加自定义密码保护并不是 Hugo 内置的功能，但可以通过结合 Hugo 的前端功能和一些自定义逻辑来实现。以下是一个分步指南，帮助你在 Stack 模板中为某些文章添加密码保护：&lt;/p>
&lt;hr>
&lt;h2 id="在页面当中添加一个密码验证由于静态页面的特性仍有方法在没有密码的情况下解除锁定所以此方法不要当真防君子不防小人">在页面当中添加一个密码验证（由于静态页面的特性，仍有方法在没有密码的情况下解除锁定，所以此方法不要当真,防君子不防小人）
&lt;/h2>&lt;p>在 Hugo 的 Stack 模板中为特定文章添加自定义密码保护并不是 Hugo 内置的功能，但可以通过结合 Hugo 的前端功能和一些自定义逻辑来实现。以下是一个分步指南，帮助你在 Stack 模板中为某些文章添加密码保护：&lt;/p>
&lt;h3 id="1-前提条件">1. 前提条件
&lt;/h3>&lt;ul>
&lt;li>你需要对 Hugo 的模板文件（如 &lt;code>.html&lt;/code> 文件）有一定了解。&lt;/li>
&lt;li>你需要编辑 Stack 模板的代码（通常位于 &lt;code>themes/Stack&lt;/code> 目录下）。&lt;/li>
&lt;li>每篇文章的密码在Front Matter 中定义。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-为文章添加密码字段">2. 为文章添加密码字段
&lt;/h3>&lt;p>在需要密码保护的文章的 Front Matter 中添加一个自定义字段，例如 &lt;code>password&lt;/code>。例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;受保护的文章&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2025-03-05&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;mysecretpassword&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 自定义密码&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">这是一篇受保护的文章内容。&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果某篇文章没有 &lt;code>password&lt;/code> 字段，则默认不启用密码保护。&lt;/p>
&lt;hr>
&lt;h3 id="3-修改模板文件">3. 修改模板文件
&lt;/h3>&lt;p>Stack 模板通常使用 &lt;code>layouts&lt;/code> 文件夹中的模板来渲染文章页面。你需要修改渲染单篇文章的模板（通常是 &lt;code>themes/Stack/layouts/_default/single.html&lt;/code>）。&lt;/p>
&lt;h4 id="示例修改">示例修改：
&lt;/h4>&lt;p>在 &lt;code>single.html&lt;/code> 中添加逻辑，检查文章是否有密码，并要求用户输入密码。以下是一个基本的实现思路：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">define&lt;/span> &lt;span class="s2">&amp;#34;body-class&amp;#34;&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">article&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">page&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">/*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Enable&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">right&lt;/span> &lt;span class="n">sidebar&lt;/span> &lt;span class="k">if&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">Widget&lt;/span> &lt;span class="n">different&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="s1">&amp;#39;TOC&amp;#39;&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">enabled&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">TOC&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">enabled&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">empty&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*/&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">HasWidgetNotTOC&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="bp">false&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCWidgetEnabled&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="bp">false&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="nb">range&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Site&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">widgets&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">page&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">ne&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">type&lt;/span> &lt;span class="s2">&amp;#34;toc&amp;#34;&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">HasWidgetNotTOC&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">true&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCWidgetEnabled&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">true&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCManuallyDisabled&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="n">eq&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">toc&lt;/span> &lt;span class="bp">false&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCEnabled&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">not&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCManuallyDisabled&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCWidgetEnabled&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">hasTOC&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="n">ge&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">len&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">TableOfContents&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Scratch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Set&lt;/span> &lt;span class="s2">&amp;#34;TOCEnabled&amp;#34;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">and&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCEnabled&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">hasTOC&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span>&lt;span class="o">-&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Scratch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Set&lt;/span> &lt;span class="s2">&amp;#34;hasWidget&amp;#34;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">or&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">HasWidgetNotTOC&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="ow">and&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">TOCEnabled&lt;/span> &lt;span class="o">$&lt;/span>&lt;span class="n">hasTOC&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">define&lt;/span> &lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">password&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">div&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;password-prompt&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="err">请输入密码以查看内容：&lt;/span>&lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">input&lt;/span> &lt;span class="n">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;password&amp;#34;&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;password-input&amp;#34;&lt;/span> &lt;span class="o">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">button&lt;/span> &lt;span class="n">onclick&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;checkPassword()&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="err">提交&lt;/span>&lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">button&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">div&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">div&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span> &lt;span class="k">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span> &lt;span class="n">style&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;display: none;&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/article.html&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">links&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/components/links&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/components/related-content&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">eq&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">comments&lt;/span> &lt;span class="bp">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;comments/include&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partialCached&lt;/span> &lt;span class="s2">&amp;#34;footer/footer&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partialCached&lt;/span> &lt;span class="s2">&amp;#34;article/components/photoswipe&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">div&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">script&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">function&lt;/span> &lt;span class="n">checkPassword&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="n">input&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;password-input&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="n">correctPassword&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;{{ .Params.password }}&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">input&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="n">correctPassword&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;password-prompt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">style&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;none&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">document&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">style&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;block&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;密码错误！&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;/&lt;/span>&lt;span class="n">script&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/article.html&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">links&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/components/links&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;article/components/related-content&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">eq&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">comments&lt;/span> &lt;span class="bp">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;comments/include&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partialCached&lt;/span> &lt;span class="s2">&amp;#34;footer/footer&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">partialCached&lt;/span> &lt;span class="s2">&amp;#34;article/components/photoswipe&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">define&lt;/span> &lt;span class="s2">&amp;#34;right-sidebar&amp;#34;&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">password&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="o">.&lt;/span>&lt;span class="n">Scratch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Get&lt;/span> &lt;span class="s2">&amp;#34;hasWidget&amp;#34;&lt;/span> &lt;span class="p">}}{{&lt;/span> &lt;span class="n">partial&lt;/span> &lt;span class="s2">&amp;#34;sidebar/right.html&amp;#34;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">dict&lt;/span> &lt;span class="s2">&amp;#34;Context&amp;#34;&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s2">&amp;#34;Scope&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;page&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">}}{{&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&lt;/span> &lt;span class="n">end&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>&lt;img src="https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index-1.png"
width="1295"
height="784"
srcset="https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index-1_hu638043685328351914.png 480w, https://www.zata.cc/p/%E7%BB%99hugo%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%A1%B5%E9%9D%A2%E5%A2%9E%E5%8A%A0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%86%E7%A0%81%E9%98%B2%E5%90%9B%E5%AD%90%E4%B8%8D%E9%98%B2%E5%B0%8F%E4%BA%BA/images/index/index-1_hu8409764711839253425.png 1024w"
loading="lazy"
alt="修改对应文件内容"
class="gallery-image"
data-flex-grow="165"
data-flex-basis="396px"
>&lt;/p>
&lt;p>下面是single.html中原本的内容&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;!--
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ define &amp;#34;body-class&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> article-page
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Enable the right sidebar if
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Widget different from &amp;#39;TOC&amp;#39; is enabled
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - TOC is enabled and not empty
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> */}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- $HasWidgetNotTOC := false -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- $TOCWidgetEnabled := false -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- range .Site.Params.widgets.page -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- if ne .type &amp;#34;toc&amp;#34; -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ $HasWidgetNotTOC = true -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- else -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ $TOCWidgetEnabled = true -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- end -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- end -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- $TOCManuallyDisabled := eq .Params.toc false -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- $TOCEnabled := and (not $TOCManuallyDisabled) $TOCWidgetEnabled -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- $hasTOC := ge (len .TableOfContents) 100 -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- .Scratch.Set &amp;#34;TOCEnabled&amp;#34; (and $TOCEnabled $hasTOC) -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- .Scratch.Set &amp;#34;hasWidget&amp;#34; (or $HasWidgetNotTOC (and $TOCEnabled $hasTOC)) -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ define &amp;#34;main&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partial &amp;#34;article/article.html&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ if .Params.links }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partial &amp;#34;article/components/links&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partial &amp;#34;article/components/related-content&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ if not (eq .Params.comments false) }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partial &amp;#34;comments/include&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partialCached &amp;#34;footer/footer&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partialCached &amp;#34;article/components/photoswipe&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ define &amp;#34;right-sidebar&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ if .Scratch.Get &amp;#34;hasWidget&amp;#34; }}{{ partial &amp;#34;sidebar/right.html&amp;#34; (dict &amp;#34;Context&amp;#34; . &amp;#34;Scope&amp;#34; &amp;#34;page&amp;#34;) }}{{ end}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }} --&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="解释">解释：
&lt;/h4>&lt;ul>
&lt;li>&lt;code>{{ if .Params.password }}&lt;/code> 检查文章是否有 &lt;code>password&lt;/code> 参数。&lt;/li>
&lt;li>如果有，则显示一个密码输入框和提交按钮，内容默认隐藏。&lt;/li>
&lt;li>用户输入密码后，JavaScript 会验证输入是否与文章的密码匹配。如果匹配，则显示内容；否则提示错误。&lt;/li>
&lt;li>如果没有密码，则直接显示文章内容。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="注意事项">注意事项
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>静态网站限制&lt;/strong>：Hugo 生成的是静态网站，密码保护本质上是前端逻辑，安全性有限。如果需要真正的访问控制，建议使用 CMS 或动态后端。&lt;/li>
&lt;li>&lt;strong>Stack 模板兼容性&lt;/strong>：确保你的修改不会与 Stack 模板的现有样式或脚本冲突。如果有问题，可能需要调整 CSS 或 JavaScript。&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>hugo使用过程中遇到的问题</title><link>https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/</link><pubDate>Wed, 05 Mar 2025 16:22:44 +0800</pubDate><guid>https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/</guid><description>&lt;img src="https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/head.png" alt="Featured image of post hugo使用过程中遇到的问题" />&lt;h2 id="heading">
&lt;/h2>&lt;h3 id="github-action-遇到的问题">github action 遇到的问题
&lt;/h3>&lt;h4 id="github-action提示-you-can-try-to-increase-the-timeout-config-setting">github action提示 you can try to increase the &amp;rsquo;timeout&amp;rsquo; config setting.
&lt;/h4>&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index.png"
width="1521"
height="407"
srcset="https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index_hu12791443383063193090.png 480w, https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index_hu940097100402471275.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="373"
data-flex-basis="896px"
>&lt;/p>
&lt;p>解决方法就是在这里增加一个timeout参数，可以把时间设置大一些
&lt;img src="https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index-1.png"
width="968"
height="745"
srcset="https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index-1_hu11251976675478542362.png 480w, https://www.zata.cc/p/hugo%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/images/index/index-1_hu2192198264425451650.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="129"
data-flex-basis="311px"
>&lt;/p></description></item><item><title>5-引入 Giscus 评论系统</title><link>https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/</link><pubDate>Wed, 05 Mar 2025 14:46:18 +0800</pubDate><guid>https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/</guid><description>&lt;img src="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/head.png" alt="Featured image of post 5-引入 Giscus 评论系统" />&lt;p>参考：&lt;/p>
&lt;p>&lt;a class="link" href="https://www.lixueduan.com/posts/blog/02-add-giscus-comment/#1-%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F" target="_blank" rel="noopener"
>https://www.lixueduan.com/posts/blog/02-add-giscus-comment/#1-%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F&lt;/a>&lt;/p>
&lt;h2 id="stack-主题">Stack 主题
&lt;/h2>&lt;h3 id="1-登录绑定应用">1. 登录绑定应用
&lt;/h3>&lt;p>&lt;a class="link" href="https://github.com/apps/giscus" target="_blank" rel="noopener"
>https://github.com/apps/giscus&lt;/a>&lt;/p>
&lt;p>然后选择你需要绑定的仓库&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index.png"
width="1279"
height="841"
srcset="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index_hu7301991236287032117.png 480w, https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index_hu15685523468764669377.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="152"
data-flex-basis="364px"
>&lt;/p>
&lt;h3 id="2进入仓库开启discussions">2.进入仓库开启Discussions
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-1.png"
width="1828"
height="778"
srcset="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-1_hu9122074383968530154.png 480w, https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-1_hu5656848333615452332.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="234"
data-flex-basis="563px"
>&lt;/p>
&lt;h3 id="3获取配置信息">3.获取配置信息
&lt;/h3>&lt;p>进到下面的这个网站里面&lt;/p>
&lt;p>&lt;a class="link" href="https://giscus.app/zh-CN" target="_blank" rel="noopener"
>https://giscus.app/zh-CN&lt;/a>&lt;/p>
&lt;p>然后按照这样配置就可以得到最后的配置文件&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-3.png"
width="762"
height="2795"
srcset="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-3_hu15487024619736328917.png 480w, https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-3_hu9987533574049044194.png 1024w"
loading="lazy"
alt="配置步骤"
class="gallery-image"
data-flex-grow="27"
data-flex-basis="65px"
>&lt;/p>
&lt;h3 id="4回到hugoyaml把刚刚的配置填进去">4.回到hugo.yaml把刚刚的配置填进去
&lt;/h3>&lt;p>红框里面是要改的地方&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-4.png"
width="712"
height="1248"
srcset="https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-4_hu6166443668207969849.png 480w, https://www.zata.cc/p/5-%E5%BC%95%E5%85%A5-giscus-%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/images/index/index-4_hu15444406904299262961.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="57"
data-flex-basis="136px"
>&lt;/p>
&lt;h3 id="碰到的坑">碰到的坑
&lt;/h3>&lt;ol>
&lt;li>上面的参考文章里面写的页面&amp;ndash;discussion映射关系是使用pathname，但是我发现会乱码，就改成用title了&lt;/li>
&lt;/ol></description></item><item><title>4-自定义Python函数创建博客：告别繁琐的文件头输入</title><link>https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/</link><pubDate>Mon, 03 Mar 2025 16:32:39 +0800</pubDate><guid>https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/</guid><description>&lt;img src="https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index.png" alt="Featured image of post 4-自定义Python函数创建博客：告别繁琐的文件头输入" />&lt;p>&lt;img src="https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index.jpg"
width="1631"
height="929"
srcset="https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index_hu7069794274631558648.jpg 480w, https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index_hu15512260656921184801.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="175"
data-flex-basis="421px"
>&lt;/p>
&lt;p>以下是基于最新的需求重新撰写的博客文章，主题仍是“使用自定义Python函数创建博客，避免繁琐的文件头标准内容输入”。这次博客将反映新的功能：通过 &lt;code>categories&lt;/code>、&lt;code>tags&lt;/code> 和 &lt;code>title&lt;/code> 三个参数生成文件夹和文件，并将路径组合为 &lt;code>categories/tags/title&lt;/code>。&lt;/p>
&lt;hr>
&lt;h1 id="使用自定义python函数创建博客告别繁琐的文件头输入">使用自定义Python函数创建博客：告别繁琐的文件头输入
&lt;/h1>&lt;p>在维护技术博客时，每次创建新文章都需要手动设置文件夹结构和标准化的Markdown文件头，例如标题、分类、标签和日期等。这种重复劳动不仅耗时，还容易出错。想象一下，如果能通过一个简单的命令，比如 &lt;code>zata create -c Python -t github -b MyProject&lt;/code>，自动生成带有标准头部的博客文件，并按分类和标签组织目录结构，会不会让写作更高效？&lt;/p>
&lt;p>在这篇博客中，我将展示如何用Python实现这一自动化工具，并将其打包成一个命令行可执行文件。通过自定义函数，我们可以轻松创建博客文件，避免手动输入繁琐的文件头内容。&lt;/p>
&lt;hr>
&lt;h2 id="背景与目标">背景与目标
&lt;/h2>&lt;p>假设你正在用静态网站生成器（如Jekyll或Hugo）写博客，每次新建文章时需要：&lt;/p>
&lt;ol>
&lt;li>创建一个文件夹结构，比如 &lt;code>Python/github/MyProject&lt;/code>。&lt;/li>
&lt;li>在最内层文件夹中生成一个 &lt;code>index.md&lt;/code> 文件。&lt;/li>
&lt;li>为 &lt;code>index.md&lt;/code> 添加标准头部，例如：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">title: MyProject
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">description: &amp;#34;空&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">date: 2025-03-03T15:20:45+08:00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">image: images/index.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">categories:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Python
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tags:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - github
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>手动完成这些步骤虽然可行，但效率低下。我的目标是：&lt;/p>
&lt;ul>
&lt;li>编写一个Python脚本，接受 &lt;code>categories&lt;/code>、&lt;code>tags&lt;/code> 和 &lt;code>title&lt;/code> 三个参数。&lt;/li>
&lt;li>根据输入生成路径 &lt;code>categories/tags/title&lt;/code>，并创建对应的文件夹和 &lt;code>index.md&lt;/code> 文件。&lt;/li>
&lt;li>自动填充标准头部信息，日期使用当前时间。&lt;/li>
&lt;li>将脚本打包成命令行工具，支持 &lt;code>zata create -c [分类] -t [标签] -b [标题]&lt;/code> 的调用方式。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="20250303-初步实现可以使用命令行创建一个博客">2025.03.03 初步实现可以使用命令行创建一个博客
&lt;/h2>&lt;h3 id="步骤-1设计基本功能">步骤 1：设计基本功能
&lt;/h3>&lt;p>我们需要一个函数，根据输入的 &lt;code>categories&lt;/code>、&lt;code>tags&lt;/code> 和 &lt;code>title&lt;/code> 创建文件夹和文件。以下是最小化的实现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getcwd&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">T%H:%M:%S+08:00&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">md_file_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">header_content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">title: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">description: &amp;#34;空&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">date: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">current_time&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">image: images/index.png
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">categories:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">tags:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">md_file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">header_content&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;文件夹 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 和 &amp;#39;index.md&amp;#39; 创建成功！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Python&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;github&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;MyProject&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个脚本会在当前目录下创建 &lt;code>Python/github/MyProject&lt;/code> 文件夹，并在其中生成带有标准头部的 &lt;code>index.md&lt;/code>。&lt;/p>
&lt;h3 id="步骤-2添加命令行支持">步骤 2：添加命令行支持
&lt;/h3>&lt;p>为了让脚本更实用，我们引入 &lt;code>argparse&lt;/code> 模块，支持命令行参数输入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">argparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getcwd&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">T%H:%M:%S+08:00&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">md_file_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">header_content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">title: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">description: &amp;#34;空&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">date: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">current_time&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">image: images/index.png
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">categories:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">tags:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">md_file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">header_content&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;文件夹 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 和 &amp;#39;index.md&amp;#39; 创建成功！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">argparse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ArgumentParser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prog&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;根据categories、tags和title创建一个文件夹和index.md文件&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subparsers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_subparsers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dest&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;可用命令&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subparsers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_parser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;create&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建文件夹和index.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--categories&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客分类&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-t&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--tags&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客标签&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-b&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--title&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客标题&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse_args&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">command&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;create&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">print_help&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>保存为 &lt;code>zata.py&lt;/code>，运行以下命令测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python zata.py create -c Python -t github -b MyProject
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="步骤-3打包成可执行文件">步骤 3：打包成可执行文件
&lt;/h3>&lt;p>为了方便使用，我们用 &lt;code>PyInstaller&lt;/code> 将脚本打包成单一的 &lt;code>.exe&lt;/code> 文件：&lt;/p>
&lt;ol>
&lt;li>安装 PyInstaller：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install pyinstaller
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>打包脚本：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller --onefile zata.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>打包完成后，在 &lt;code>dist&lt;/code> 文件夹中找到 &lt;code>zata.exe&lt;/code>，运行：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">zata.exe create -c Python -t github -b MyProject
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="成果展示">成果展示
&lt;/h3>&lt;p>运行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">zata create -c Python -t github -b MyProject
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>结果：&lt;/p>
&lt;ul>
&lt;li>生成目录结构：&lt;code>Python/github/MyProject&lt;/code>。&lt;/li>
&lt;li>在 &lt;code>MyProject&lt;/code> 文件夹中创建 &lt;code>index.md&lt;/code>，内容如下：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">title: MyProject
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">description: &amp;#34;空&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">date: 2025-03-03T15:20:45+08:00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">image: images/index.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">categories:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Python
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tags:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - github
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>控制台输出：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">文件夹 &amp;#39;Python/github/MyProject&amp;#39; 和 &amp;#39;index.md&amp;#39; 创建成功！
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>整个过程只需一条命令，省去了手动创建文件夹和输入文件头的麻烦。&lt;/p>
&lt;hr>
&lt;h2 id="20250305-增加giu可以下拉选择来创建">2025.03.05 增加giu可以下拉选择来创建
&lt;/h2>&lt;p>&lt;img src="https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index.gif"
width="1113"
height="829"
srcset="https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index_hu16068264805347207270.gif 480w, https://www.zata.cc/p/4-%E8%87%AA%E5%AE%9A%E4%B9%89python%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%91%8A%E5%88%AB%E7%B9%81%E7%90%90%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B4%E8%BE%93%E5%85%A5/images/index/index_hu4974415188683123512.gif 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="134"
data-flex-basis="322px"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">argparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">tk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">messagebox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 原有函数保持不变，返回值改为元组以适应 GUI 使用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_category&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;创建category目录&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;post&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Category目录 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 创建成功！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;创建category时发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;创建tag目录，必须指定category&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;post&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;错误：Category目录 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 不存在！请先创建category&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Tag目录 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 创建成功！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;创建tag时发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;创建文章目录和index.md文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">T%H:%M:%S+08:00&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;post&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parent_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parent_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;错误：父目录 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">parent_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 不存在！请先创建相应的categories和tags目录&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">matched_paths&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">category&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_path&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">matched_paths&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matched_paths&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;错误：未在任何category下找到tags &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39;！请先创建相应的tags目录&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matched_paths&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">error_msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;错误：找到多个匹配的tags &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39;：&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">path&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">matched_paths&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">error_msg&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">error_msg&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="s2">&amp;#34;请指定具体的category以避免歧义&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">error_msg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parent_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">matched_paths&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parent_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">categories&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">basename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parent_path&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">md_file_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">header_content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">title: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">description: &amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">date: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">current_time&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">image: images/index/index.png
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">header_content&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;categories:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">header_content&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;tags:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> - &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">---
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">md_file_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">md_file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">header_content&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;文件夹 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 和 &amp;#39;index.md&amp;#39; 创建成功！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;文件夹 &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; 已存在，跳过创建 &amp;#39;index.md&amp;#39;。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 新增函数：获取现有 Category 和 Tag 列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_existing_categories&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;post&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">d&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">))]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_existing_tags&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;post&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tags&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">d&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">))])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">cat&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cat_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cat&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cat_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tags&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">d&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cat_path&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cat_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">))])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">sorted&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 修改后的 GUI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_gui&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Tk&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Zata - 博客管理工具&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;500x400&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notebook&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Notebook&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notebook&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;both&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">expand&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Category选项卡&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_frame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">notebook&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notebook&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建Category&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Category名称:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_entry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">create_category_btn&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">category_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">category&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;请输入Category名称&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_category&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showinfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 成功后刷新下拉框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">success&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_category_combobox&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建Category&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">command&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">create_category_btn&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Tag选项卡&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_frame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">notebook&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notebook&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建Tag&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;所属Category:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_category_entry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_category_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Tag名称:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_entry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">create_tag_btn&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tag_category_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tag_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">category&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;请输入Category和Tag名称&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showinfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 成功后刷新下拉框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">success&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_tag_combobox&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tag_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建Tag&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">command&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">create_tag_btn&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 文章选项卡&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">post_frame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">notebook&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notebook&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建文章&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Category 下拉框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;选择Category（可选）:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_combobox&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Combobox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;readonly&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Tag 下拉框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;选择Tag:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_combobox&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Combobox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;readonly&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;文章标题:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">post_title_entry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">40&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">post_title_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 更新下拉框内容的函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update_category_combobox&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">categories&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_existing_categories&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_combobox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;values&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">categories&lt;/span> &lt;span class="c1"># 空字符串表示可选&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">categories&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update_tag_combobox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">event&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">selected_category&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">category_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">selected_category&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_existing_tags&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">selected_category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_existing_tags&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_combobox&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;values&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tags&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">tags&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 绑定 Category 下拉框的选择事件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;lt;&amp;lt;ComboboxSelected&amp;gt;&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_tag_combobox&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 初始化下拉框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_category_combobox&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_tag_combobox&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">create_post_btn&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">category_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tag_combobox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">post_title_entry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">tag&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;请选择Tag并输入文章标题&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showinfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">post_frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建文章&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">command&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">create_post_btn&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mainloop&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">argparse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ArgumentParser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prog&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客目录和文件管理工具&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subparsers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_subparsers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dest&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;可用命令&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subparsers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_parser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;create&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建文章文件夹和index.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--categories&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客分类（可选）&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-t&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--tags&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客标签&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-b&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--title&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;博客标题&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subparsers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_parser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;create-category&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建category目录&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--category&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;要创建的category名称&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subparsers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_parser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;create-tag&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;创建tag目录&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-c&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--category&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;所属category&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tag_parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;-t&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;--tag&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;要创建的tag名称&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gui_parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subparsers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_parser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;gui&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;启动图形界面&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse_args&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">command&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;create&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_folder_and_md&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">categories&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tags&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">command&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;create-category&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_category&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">command&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;create-tag&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">success&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">msg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_tag&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">command&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;gui&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_gui&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">print_help&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>一个自动签到的py并且使用github action每日执行</title><link>https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/</link><pubDate>Mon, 03 Mar 2025 14:40:00 +0800</pubDate><guid>https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/</guid><description>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.png" alt="Featured image of post 一个自动签到的py并且使用github action每日执行" />&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.png"
width="693"
height="330"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu15539244554986542668.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu15411632889193254903.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="210"
data-flex-basis="504px"
>
效果就是每天8点去自动签到
&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.jpg"
width="1912"
height="954"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu1908156822460302415.jpg 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu14125157359231674070.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
>&lt;/p>
&lt;h2 id="使用cookie进行自动登录简单但是很容易因为cookie过期而需要重新获取cookie更新">使用Cookie进行自动登录（简单，但是很容易因为Cookie过期而需要重新获取Cookie更新）
&lt;/h2>&lt;h3 id="cookie的获取">Cookie的获取
&lt;/h3>&lt;p>参考：
&lt;a class="link" href="https://www.diuber.com/cookie/" target="_blank" rel="noopener"
>https://www.diuber.com/cookie/&lt;/a>&lt;/p>
&lt;p>首先需要获取Cookie，这个Cookie是登录之后的Cookie，登录之后的Cookie是在浏览器的开发者工具中获取的，具体方法如下：&lt;/p>
&lt;ol>
&lt;li>打开浏览器，登录mx的账号&lt;/li>
&lt;li>打开浏览器的开发者工具，在Network中找到请求的接口，点击请求的接口，在Headers中找到Cookie，复制Cookie&lt;/li>
&lt;/ol>
&lt;h3 id="签到的代码">签到的代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># mx_checkin.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">schedule&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_COOKIE&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 把Cookie放置在action的环境变量中,例如这里是MX_COOKIE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 签到函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">checkin&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 替换为实际的签到接口 URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">XXXXX&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 准备请求头（可能需要 Cookie 或 Token 来验证身份）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果需要登录凭证，可以在这里添加 Cookie 或 Authorization&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Cookie&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#34;Authorization&amp;#34;: &amp;#34;Bearer your_token_here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 准备请求数据（根据实际接口要求调整）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;userId&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;your-user-id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 替换为你的用户 ID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;timestamp&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 可选：发送当前时间戳&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送签到请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response_json&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查签到是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span> &lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到成功：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到请求失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 脚本主循环&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;自动签到脚本已启动...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 首次运行时立即签到（可选）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>代码写好之后可以先在本地测试，保证测试ok&lt;/p>
&lt;h3 id="github-action的工作流配置">github action的工作流配置
&lt;/h3>&lt;p>关于github action的内容，可以查看我的文章 &lt;a class="link" href="../2-github-action-%e4%bd%bf%e7%94%a8/" >&lt;code>github action使用&lt;/code>&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"># mx_checkin.yml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name: mx_checkin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">on:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> schedule:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> # 此处是UTC时间，对应北京时间早八点
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - cron : &amp;#39;00 00 * * *&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> workflow_dispatch:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">permissions:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> contents: read
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">jobs:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> build:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> runs-on: ubuntu-latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> steps:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - uses: actions/checkout@v3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Set up Python 3.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uses: actions/setup-python@v3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> with:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python-version: &amp;#34;3.12&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Install dependencies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> run: |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python -m pip install --upgrade pip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Run checkin script
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> run: |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python mx_checkin.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> env:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MX_COOKIE: ${{ secrets.MX_COOKIE }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="requirementstxt">requirements.txt
&lt;/h3>&lt;p>把需要的库写在这个文件中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">requests
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">schedule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">datetime
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置仓库密钥">设置仓库密钥
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1.jpg"
width="1912"
height="954"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1_hu9441030720341923765.jpg 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1_hu11884023262165687544.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
>&lt;/p>
&lt;p>把前面Cookie 填进去 &lt;strong>粘贴过来的时候可以把引号去掉，我记得是不用加引号的，如果发现自己电脑上面测试可以，Action不行的话可以再试试加引号&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>上面的方法很受限于网站对于cookie的验证，如果网站对cookie验证过于严格，可以尝试下面的方法。&lt;/p>
&lt;h2 id="使用账号密码进行自动登录复杂但是可以避免cookie过期的问题">使用账号密码进行自动登录（复杂，但是可以避免Cookie过期的问题）
&lt;/h2>&lt;p>这里我只是给了一个简单的配置，很多网站登录的时候可能会多重验证，那就麻烦了&amp;hellip;.&lt;/p>
&lt;h3 id="找到登录的接口">找到登录的接口
&lt;/h3>&lt;p>当然每个网站不一样，不能一概而论&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index.png"
width="704"
height="810"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index_hu12811556378852032637.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index_hu9188159357978234831.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="86"
data-flex-basis="208px"
>&lt;/p>
&lt;h3 id="代码">代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># checkin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">schedule&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">dotenv&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_dotenv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">load_dotenv&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">refresh_cookie&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;刷新 Cookie 的逻辑（需要根据实际网站实现）&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 替换为实际的登录 URL 和登录数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">login_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://mxwljsq.top/auth/login&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">login_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;email&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_EMAIL&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1"># 从环境变量获取邮箱&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;passwd&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_PASSWORD&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1"># 从环境变量获取密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">login_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># exit()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送登录请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">login_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">login_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 假设登录成功后 Cookie 在响应头中返回&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cookies&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_dict&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;; &amp;#34;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">new_cookie&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新成功&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新异常：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">checkin&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">refresh_cookie&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">Cookie&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Cookie 为空，请先刷新 Cookie&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://mxwljsq.top/user/checkin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Cookie&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response_json&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到成功：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果是登录失效，尝试刷新 Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到请求失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;自动签到脚本已启动...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 加载本地 Cookie，如果没有则使用环境变量中的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 首次运行立即签到&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 开始执行签到任务...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># mx_checkin.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mx_checkin&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">schedule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 此处是UTC时间，对应北京时间早八点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">cron &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;00 00 * * *&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Set up Python 3.12&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/setup-python@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">python-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;3.12&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install dependencies&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> python -m pip install --upgrade pip
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> if [ -f requirements.txt ]; then pip install -r requirements.txt; fi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Run checkin script&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> python mx_checkin.py&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MX_EMAIL&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.MX_EMAIL }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MX_PASSWORD&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.MX_PASSWORD }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置仓库密钥-1">设置仓库密钥
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1.png"
width="1240"
height="768"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1_hu16635990176998570639.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1_hu7013032388954241486.png 1024w"
loading="lazy"
alt="设置仓库密钥"
class="gallery-image"
data-flex-grow="161"
data-flex-basis="387px"
>&lt;/p>
&lt;p>这里是肯定不需要加引号的，因为邮箱和密码都是字符串，加引号的话会被认为是字符串。（我试过了）&lt;/p></description></item><item><title>3-hugo博客集成Netlify CMS</title><link>https://www.zata.cc/p/3-hugo%E5%8D%9A%E5%AE%A2%E9%9B%86%E6%88%90netlify-cms/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0800</pubDate><guid>https://www.zata.cc/p/3-hugo%E5%8D%9A%E5%AE%A2%E9%9B%86%E6%88%90netlify-cms/</guid><description>&lt;img src="https://www.zata.cc/p/3-hugo%E5%8D%9A%E5%AE%A2%E9%9B%86%E6%88%90netlify-cms/images/index/index.png" alt="Featured image of post 3-hugo博客集成Netlify CMS" />&lt;p>参考：&lt;/p>
&lt;p>&lt;a class="link" href="https://ttys3.dev/blog/setup-netlify-cms-for-hugo" target="_blank" rel="noopener"
>https://ttys3.dev/blog/setup-netlify-cms-for-hugo&lt;/a> [低质量]&lt;/p>
&lt;p>&lt;a class="link" href="https://guanqr.com/tech/website/deploy-blog-to-netlify/" target="_blank" rel="noopener"
>https://guanqr.com/tech/website/deploy-blog-to-netlify/&lt;/a>&lt;/p></description></item><item><title>爬虫-基础介绍</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/images/index/index.png" alt="Featured image of post 爬虫-基础介绍" />&lt;h2 id="介绍">介绍
&lt;/h2>&lt;h3 id="以下是一些常见的-http-状态码因为它们在网络开发和日常使用中很常见">以下是一些常见的 HTTP 状态码（因为它们在网络开发和日常使用中很常见）：
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>200 OK&lt;/strong>：请求成功，一切正常。&lt;/li>
&lt;li>&lt;strong>400 Bad Request&lt;/strong>：请求有问题，比如参数错误。&lt;/li>
&lt;li>&lt;strong>401 Unauthorized&lt;/strong>：未授权，需要登录或提供凭证。&lt;/li>
&lt;li>&lt;strong>403 Forbidden&lt;/strong>：服务器拒绝访问，权限不足。&lt;/li>
&lt;li>&lt;strong>404 Not Found&lt;/strong>：资源不存在，可能是URL错了。&lt;/li>
&lt;li>&lt;strong>500 Internal Server Error&lt;/strong>：服务器内部出错，程序或配置有问题。&lt;/li>
&lt;li>&lt;strong>503 Service Unavailable&lt;/strong>：服务暂时不可用，通常是服务器维护或过载。&lt;/li>
&lt;/ul>
&lt;h3 id="关键要点">关键要点
&lt;/h3>&lt;ul>
&lt;li>网络爬虫是一种自动浏览网页的程序，主要用于搜索引擎索引，但也用于数据挖掘和网页归档。&lt;/li>
&lt;li>它从初始URL开始，下载页面，提取链接，递归访问，形成索引。&lt;/li>
&lt;li>挑战包括资源消耗、重复内容和动态内容（如JavaScript页面）。&lt;/li>
&lt;li>需遵循选择、重访、礼貌和并行化政策，确保高效和合规。&lt;/li>
&lt;li>存在通用、聚焦和深网三种类型，法律和伦理问题需注意，如尊重robots.txt和数据隐私。&lt;/li>
&lt;/ul>
&lt;h3 id="定义与目的">定义与目的
&lt;/h3>&lt;p>网络爬虫，也称为蜘蛛或机器人，是一种系统地浏览万维网以进行网页索引的程序。&lt;br>
它的主要目的是为搜索引擎更新内容或索引，帮助用户更高效地搜索。意外的是，它还用于网页归档、验证超链接和数据挖掘。&lt;/p>
&lt;h3 id="工作原理">工作原理
&lt;/h3>&lt;p>爬虫从一组已知的URL（种子）开始，下载页面，提取其中的超链接，然后递归访问这些链接，依政策继续扩展。这种过程类似探索迷宫，但需管理大量数据。&lt;/p>
&lt;h3 id="示例python代码">示例Python代码
&lt;/h3>&lt;p>以下是一个简单的Python网络爬虫示例，使用&lt;code>requests&lt;/code>和&lt;code>BeautifulSoup&lt;/code>库，从给定URL开始，爬取页面上的所有链接并打印：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">urlparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送GET请求到URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;无法检索 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 解析HTML内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;html.parser&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 查找页面上的所有链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 获取href属性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果href为空，跳过此链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">href&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 将相对URL转换为绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 打印绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 在实际应用中，可以将此URL添加到队列中以供后续爬取&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 这里仅打印以简化&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例用法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">start_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://www.example.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此代码提供了一个基本框架，实际应用中需处理重复URL、遵守robots.txt等。&lt;/p>
&lt;hr>
&lt;h3 id="详细报告">详细报告
&lt;/h3>&lt;p>网络爬虫是互联网技术的重要组成部分，广泛用于搜索引擎优化（SEO）、数据收集和网站监控。本报告将详细探讨其定义、工作原理、类型、挑战及相关政策，力求全面覆盖用户可能关心的所有方面，并附上Python代码示例。&lt;/p>
&lt;h4 id="定义与基本概念">定义与基本概念
&lt;/h4>&lt;p>根据&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>的定义，网络爬虫（也称为蜘蛛、蜘蛛机器人、蚂蚁、自动索引器或Web scutter）是一种系统地浏览万维网以进行网页索引（web spidering）的互联网机器人。&lt;br>
它的核心功能是复制网页内容，供搜索引擎索引，从而提升搜索效率。研究表明，爬虫不仅是搜索引擎的工具，还用于网页归档、验证超链接和HTML代码，以及数据驱动的编程。&lt;/p>
&lt;h4 id="工作原理与过程">工作原理与过程
&lt;/h4>&lt;p>爬虫的工作流程通常从一组初始URL（称为种子）开始。它会：&lt;/p>
&lt;ul>
&lt;li>下载这些网页，提取其中的超链接。&lt;/li>
&lt;li>将新发现的链接添加到爬取前沿（crawl frontier），然后递归访问。&lt;/li>
&lt;li>根据预设政策（如选择政策、礼貌政策）决定下载哪些页面及访问频率。&lt;/li>
&lt;/ul>
&lt;p>例如，&lt;a class="link" href="https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/" target="_blank" rel="noopener"
>Cloudflare的解释&lt;/a>指出，爬虫通过跟随链接“爬行”，类似于人类在网上点击导航，但自动化且规模庞大。&lt;br>
归档方面，爬虫会保存网页快照，存储在类似数据库的仓库中，但功能较数据库简单，通常以HTML文件形式保存。&lt;/p>
&lt;h4 id="覆盖范围与局限">覆盖范围与局限
&lt;/h4>&lt;p>互联网的页面数量极其庞大，研究显示（2009年数据），即使是最大的爬虫也只能索引40-70%的可索引网页，而1999年的研究显示仅16%&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;br>
这一局限源于网页数量的爆炸性增长和高变化率，爬虫只能优先处理部分页面。&lt;/p>
&lt;h4 id="挑战与问题">挑战与问题
&lt;/h4>&lt;p>爬取过程中面临多重挑战：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>资源消耗&lt;/strong>：爬虫访问系统时会消耗网络和服务器资源，常未经提示访问，引发负载和礼貌性问题。&lt;/li>
&lt;li>&lt;strong>重复内容&lt;/strong>：由于HTTP GET参数的无限组合（如在线相册可能有48种不同URL，涉及排序、缩略图大小、格式和用户内容选项），难以避免重复下载&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>动态内容&lt;/strong>：AJAX页面等动态内容对爬虫构成挑战，Google提出可识别的AJAX调用格式以解决&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;/ul>
&lt;h4 id="爬取政策">爬取政策
&lt;/h4>&lt;p>爬取政策是爬虫高效运行的关键，分为以下几类：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>选择政策&lt;/strong>：决定下载哪些页面，常用指标包括广度优先、反向链接计数和部分PageRank。研究（如Cho等，180,000页从stanford.edu爬取）显示，部分PageRank更适合早期捕获高PageRank页面，随后是广度优先和反向链接计数&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>重访政策&lt;/strong>：目标是最大化新鲜度（本地副本是否准确）或最小化年龄（本地副本多旧）。Cho和Garcia-Molina的研究表明，统一政策（所有页面同频率）优于按变化率比例分配的策略&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>礼貌政策&lt;/strong>：避免超载服务器，成本包括网络资源、服务器超载和由编写不佳的爬虫导致的崩溃。标准做法是使用robots.txt文件，建议访问间隔从60秒到3-4分钟不等，具体如Cho使用10秒，WIRE爬虫15秒，Mercator用10t秒（t为下载时间），Dill等用1秒&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>并行化政策&lt;/strong>：运行多个进程以最大化下载率，减少开销，避免重复下载，需政策分配新发现的URL。&lt;/li>
&lt;/ul>
&lt;p>以下是各类政策的对比：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>政策类型&lt;/strong>&lt;/th>
&lt;th>&lt;strong>描述&lt;/strong>&lt;/th>
&lt;th>&lt;strong>示例/注意事项&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>选择政策&lt;/td>
&lt;td>决定优先爬取哪些页面&lt;/td>
&lt;td>广度优先、PageRank优先&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>重访政策&lt;/td>
&lt;td>确定页面重访频率以保持数据新鲜&lt;/td>
&lt;td>统一频率或按变化率调整&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>礼貌政策&lt;/td>
&lt;td>避免超载服务器，遵守robots.txt&lt;/td>
&lt;td>建议请求间隔1秒以上&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>并行化政策&lt;/td>
&lt;td>使用多进程提升效率，管理资源分配&lt;/td>
&lt;td>避免重复下载，优化爬取速度&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="类型的网络爬虫">类型的网络爬虫
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>通用爬虫&lt;/strong>：如Google和Bing的爬虫，目标是索引整个互联网。&lt;/li>
&lt;li>&lt;strong>聚焦爬虫&lt;/strong>：尝试下载相关页面，依赖通用搜索引擎作为起点。例如，学术爬虫如citeseerxbot（用于CiteSeer X）关注PDF、PostScript和Word文件，还有Google Scholar和Microsoft Academic Search&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>语义聚焦爬虫&lt;/strong>：使用领域本体进行更精准的爬取。&lt;/li>
&lt;/ul>
&lt;p>以下是各类爬虫的对比：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>类型&lt;/strong>&lt;/th>
&lt;th>&lt;strong>特点&lt;/strong>&lt;/th>
&lt;th>&lt;strong>示例&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>通用爬虫&lt;/td>
&lt;td>索引整个互联网，覆盖广&lt;/td>
&lt;td>Googlebot, Bingbot&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>聚焦爬虫&lt;/td>
&lt;td>针对特定主题或文件类型，效率高&lt;/td>
&lt;td>citeseerxbot, Google Scholar bot&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>语义聚焦爬虫&lt;/td>
&lt;td>使用本体，适合复杂领域&lt;/td>
&lt;td>学术研究领域爬虫&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>企业爬虫&lt;/td>
&lt;td>索引企业网站，供内部搜索使用&lt;/td>
&lt;td>内部网站搜索引擎&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="安全与伦理问题">安全与伦理问题
&lt;/h4>&lt;p>爬虫可能无意中索引非公共资源或暴露软件漏洞版本，缓解方法包括通过robots.txt限制搜索引擎仅索引公共部分，屏蔽交易部分&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;br>
此外，爬虫通过HTTP请求的User-agent字段标识，管理员可通过日志和工具追踪，偏好标识以便在陷入爬虫陷阱或超载服务器时联系。垃圾邮件机器人可能掩盖身份，增加识别难度。&lt;/p>
&lt;p>法律和伦理考虑包括：&lt;/p>
&lt;ul>
&lt;li>尊重网站的服务条款和robots.txt文件。&lt;/li>
&lt;li>避免以过多请求超载服务器（礼貌政策）。&lt;/li>
&lt;li>负责处理个人数据，遵守隐私法。&lt;/li>
&lt;li>透明地披露数据收集做法，尤其是涉及个人信息时。&lt;/li>
&lt;/ul>
&lt;h4 id="深网爬取">深网爬取
&lt;/h4>&lt;p>深网（deep web）或不可见网包含大量仅通过数据库查询可访问的页面，常规爬虫需链接才能访问。策略包括：&lt;/p>
&lt;ul>
&lt;li>Google的Sitemaps协议和mod oai。&lt;/li>
&lt;li>屏幕抓取（screen scraping）用于跨表单聚合数据。&lt;/li>
&lt;li>AJAX页面问题，Google提出可识别的AJAX调用格式&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;/ul>
&lt;h4 id="可视化与编程化">可视化与编程化
&lt;/h4>&lt;p>可视化爬虫/抓取工具降低了编程技能需求，通过高亮数据教学用户使用。例如，Needlebase（被Google作为ITA Labs的一部分收购，&lt;a class="link" href="http://www.needlebase.com" target="_blank" rel="noopener"
>Needlebase&lt;/a>）是典型代表，简化了数据提取过程&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/p>
&lt;h4 id="总结">总结
&lt;/h4>&lt;p>网络爬虫是互联网信息获取的核心工具，其效率和伦理问题持续受到关注。未来，随着动态内容和深网的增长，爬虫技术需进一步创新，以平衡覆盖率和资源消耗。&lt;/p>
&lt;h3 id="关键引文">关键引文
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia详细解释网络爬虫定义和工作原理&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/" target="_blank" rel="noopener"
>Cloudflare关于网络爬虫的工作原理和用途&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.techtarget.com/whatis/definition/crawler" target="_blank" rel="noopener"
>What is a Web Crawler? Everything you need to know from TechTarget.com&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.elastic.co/what-is/web-crawler" target="_blank" rel="noopener"
>What is a Web Crawler? | A Comprehensive Web Crawling Guide | Elastic&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://crawlbase.com/blog/what-is-a-web-crawler-use-cases-and-examples/" target="_blank" rel="noopener"
>What Is A Web Crawler? Use Cases And Examples Explained | Crawlbase&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.akamai.com/glossary/what-is-a-web-crawler" target="_blank" rel="noopener"
>What Is a Web Crawler? | How Do Crawlers Work? | Akamai&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://litslink.com/blog/what-is-a-web-crawler-and-how-does-it-work" target="_blank" rel="noopener"
>What Is a Web Crawler and How Does It Work | LITSLINK Blog&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://research.aimultiple.com/web-crawler/" target="_blank" rel="noopener"
>Web Crawler: What It Is, How It Works &amp;amp; Applications in 2025&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.sciencedirect.com/topics/computer-science/web-crawler" target="_blank" rel="noopener"
>web crawler - an overview | ScienceDirect Topics&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://dev.to/uiii/web-scraping-with-nodejs-and-typescript-the-crawler-part-23-2of2" target="_blank" rel="noopener"
>Web scraping with Node.js and Typescript - the crawler part (2/3) | DEV Community&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>2-Hugo主题和配置</title><link>https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/</link><pubDate>Sun, 02 Mar 2025 00:00:00 +0800</pubDate><guid>https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/</guid><description>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/2025-03-02-03-12-15.png" alt="Featured image of post 2-Hugo主题和配置" />&lt;span style="color:red">
参考&lt;br>
https://letere-gzj.github.io/hugo-stack/
&lt;/span>
&lt;h2 id="可能遇到的问题">可能遇到的问题
&lt;/h2>&lt;h3 id="如何插入嵌入式视频">如何插入嵌入式视频
&lt;/h3>&lt;h4 id="b站">B站
&lt;/h4>&lt;ol>
&lt;li>直接可以点击分享的嵌入代码然后粘贴到md文件中&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-5.png"
width="1092"
height="461"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-5_hu9116206819239244763.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-5_hu7331500311211880407.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="236"
data-flex-basis="568px"
>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">iframe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;//player.bilibili.com/player.html?isOutside=true&amp;amp;aid=113991737148695&amp;amp;bvid=BV1qQK7eXERw&amp;amp;cid=28358870196&amp;amp;p=1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">scrolling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;yes&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">border&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">frameborder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;no&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">framespacing&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">allowfullscreen&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">iframe&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-6.png"
width="1216"
height="346"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-6_hu10969684823629374122.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-6_hu11469701848580617392.png 1024w"
loading="lazy"
alt="粘贴代码到md"
class="gallery-image"
data-flex-grow="351"
data-flex-basis="843px"
>&lt;/p>
&lt;p>&lt;code>效果如下：&lt;/code>&lt;/p>
&lt;iframe
src="//player.bilibili.com/player.html?isOutside=true&amp;aid=113991737148695&amp;bvid=BV1qQK7eXERw&amp;cid=28358870196&amp;p=1"
scrolling="yes"
border="0"
frameborder="no"
framespacing="0"
allowfullscreen="true">
&lt;/iframe>
&lt;ol start="2">
&lt;li>使用shortcode方式&lt;/li>
&lt;/ol>
&lt;p>参考：https://zhuanlan.zhihu.com/p/622866669&lt;/p>
&lt;p>创建一个模板文件，内容可以为：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-7.png"
width="1700"
height="512"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-7_hu850349058267175087.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-7_hu10246328103374107097.png 1024w"
loading="lazy"
alt="bilibili的嵌入视频模板"
class="gallery-image"
data-flex-grow="332"
data-flex-basis="796px"
>&lt;/p>
&lt;p>代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">style&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;position:relative; padding-bottom:75%; width:100%; height:0&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">iframe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;//player.bilibili.com/player.html?bvid={{.Get 0 }}&amp;amp;page={{ if .Get 1 }}{{.Get 1}}{{ else }}1{{end}}&amp;amp;as_wide=1&amp;amp;high_quality=1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">scrolling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;no&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">border&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">frameborder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;no&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">framespacing&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">allowfullscreen&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">style&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;position:absolute; height: 100%; width: 100%;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">iframe&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后使用下面的语法使用这个模板
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-8.png"
width="587"
height="23"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-8_hu12031096918017416226.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-8_hu13637271954656825537.png 1024w"
loading="lazy"
alt="模板使用方法\{{}}"
class="gallery-image"
data-flex-grow="2552"
data-flex-basis="6125px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-9.png"
width="694"
height="198"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-9_hu4734358445426960514.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-9_hu9769016256501222468.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="350"
data-flex-basis="841px"
>&lt;/p>
&lt;p>&lt;code>效果如下：&lt;/code>&lt;/p>
&lt;p>&lt;code>&amp;lt; bilibili BV1tXRAYiEYR &amp;gt;&lt;/code>&lt;/p>
&lt;div style="position:relative; padding-bottom:75%; width:100%; height:0">
&lt;iframe
src="//player.bilibili.com/player.html?bvid=BV1qQK7eXERw&amp;page=1&amp;as_wide=1&amp;high_quality=1"
scrolling="no"
border="0"
frameborder="no"
framespacing="0"
allowfullscreen="true"
style="position:absolute; height: 100%; width: 100%;"
>
&lt;/iframe>
&lt;/div>
&lt;h3 id="hugo-文章日期设定上的小问题时区问题">Hugo 文章日期设定上的小问题（时区问题）
&lt;/h3>&lt;p>参考： &lt;a class="link" href="https://blog.hly0928.com/post/hugo-post-date-issue/" target="_blank" rel="noopener"
>https://blog.hly0928.com/post/hugo-post-date-issue/&lt;/a>&lt;/p>
&lt;p>Hugo 在生成静态页面的时候，不会生成超过当前时间的文章；而 Hugo 默认采用的是 格林尼治平时 (GMT)，比北京时间 (UTC+8) 晚了 8 个小时。也就是说，当北京时间在 08:00 之前，而你又将文章发布日期设在当天时，Hugo 就默认不会生成这个页面。&lt;/p>
&lt;p>解决方法：
最后我选择文章头增加时区信息&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2025&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">03&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="n">T00&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">00&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">00&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">08&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">00&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-4.png"
width="762"
height="1203"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-4_hu13132429697951786640.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-4_hu14916960223259750426.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="63"
data-flex-basis="152px"
>&lt;/p>
&lt;h2 id="stack-主题">Stack 主题
&lt;/h2>&lt;h3 id="hugo-stack-配置文件示例">hugo Stack 配置文件示例
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="n">baseurl&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">www&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cc&lt;/span> &lt;span class="c1"># 定义网站的基础 URL，所有相对链接基于此生成，通常是域名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">languageCode&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">en&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">us&lt;/span> &lt;span class="c1"># 指定默认语言代码（如 en-us 表示美国英语）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">theme&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">hugo&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">theme&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">stack&lt;/span> &lt;span class="c1"># 指定使用的 Hugo 主题名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">title&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Example&lt;/span> &lt;span class="n">Site&lt;/span> &lt;span class="c1"># 网站的默认标题，显示在浏览器标签页或页面中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">copyright&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Example&lt;/span> &lt;span class="n">Person&lt;/span> &lt;span class="c1"># 网站版权声明，通常显示在页脚&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Theme i18n support&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Available values: ar, bn, ca, de, el, en, es, fr, hu, id, it, ja, ko, nl, pt-br, th, uk, zh-cn, zh-hk, zh-tw&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DefaultContentLanguage&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">zh&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">cn&lt;/span> &lt;span class="c1"># 指定默认内容语言，这里是简体中文（zh-cn）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Set hasCJKLanguage to true if DefaultContentLanguage is in [zh-cn ja ko]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># This will make .Summary and .WordCount behave correctly for CJK languages.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">hasCJKLanguage&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 是否启用 CJK 语言（中文、日文、韩文）的优化，这里关闭&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">languages&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">en&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">languageName&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">English&lt;/span> &lt;span class="c1"># 语言名称为“英语”&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Example&lt;/span> &lt;span class="n">Site&lt;/span> &lt;span class="c1"># 英文版本的网站标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 语言优先级，数字越小优先级越高&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sidebar&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subtitle&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Example&lt;/span> &lt;span class="n">description&lt;/span> &lt;span class="c1"># 英文侧边栏描述&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">zh&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">cn&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">languageName&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">中文&lt;/span> &lt;span class="c1"># 语言名称为“中文”&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Zata&lt;/span>&lt;span class="s1">&amp;#39;s Blog # 中文版本的网站标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="c1"># 优先级低于英文&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sidebar&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subtitle&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 中文侧边栏描述（此处为空）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ar:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># languageName: عربي # 示例：阿拉伯语名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># languagedirection: rtl # 示例：从右到左布局&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># title: موقع تجريبي # 示例：阿拉伯语标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># weight: 3 # 示例：优先级&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># params:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># sidebar:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># subtitle: وصف تجريبي # 示例：阿拉伯语侧边栏描述&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">services&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Change it to your Disqus shortname before using&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">disqus&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortname&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;hugo-theme-stack&amp;#34;&lt;/span> &lt;span class="c1"># Disqus 评论系统的短名称，用于启用评论&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># GA Tracking ID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">googleAnalytics&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Google Analytics 的跟踪 ID（未填写）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pagination&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pagerSize&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># 每页显示的文章数量，这里为 10 篇&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">permalinks&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">post&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">slug&lt;/span>&lt;span class="o">/&lt;/span> &lt;span class="c1"># 文章链接格式，例如 /p/my-post/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">page&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">slug&lt;/span>&lt;span class="o">/&lt;/span> &lt;span class="c1"># 普通页面链接格式，例如 /about/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mainSections&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">post&lt;/span> &lt;span class="c1"># 指定主要内容类型为 post（通常是博客文章）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">featuredImageField&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">image&lt;/span> &lt;span class="c1"># 指定文章的特色图片字段为 image（文章头的key）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rssFullContent&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># RSS 订阅输出完整文章内容，而非摘要&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">favicon&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 网站图标路径（未设置，例如 /favicon.ico）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 网站图标路径#e.g.:favicon placed in static/favicon.ico of your site folder,then set thisfield to/favicon.ico(/is necessay)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">footer&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">since&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2020&lt;/span> &lt;span class="c1"># 显示网站起始年份（如“© 2020-2025”）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">customText&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 自定义页脚文本（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dateFormat&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">published&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Jan&lt;/span> &lt;span class="mi">02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2006&lt;/span> &lt;span class="c1"># 文章发布日期格式（例如“Jan 02, 2006”）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lastUpdated&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Jan&lt;/span> &lt;span class="mi">02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2006&lt;/span> &lt;span class="mi">15&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">04&lt;/span> &lt;span class="n">MST&lt;/span> &lt;span class="c1"># 最后更新时间的格式（包含时区）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sidebar&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">emoji&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">🍥&lt;/span> &lt;span class="c1"># 侧边栏显示的表情符号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subtitle&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Hello&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">I&lt;/span> &lt;span class="n">am&lt;/span> &lt;span class="n">Zata&lt;/span>&lt;span class="o">.&lt;/span> &lt;span class="c1"># 侧边栏副标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">avatar&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用头像&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">local&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 头像文件存储在本地&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">img&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">avatar&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">jpg&lt;/span> &lt;span class="c1"># 头像文件路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">article&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">math&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 是否启用数学公式支持（关闭）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">toc&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用文章目录（Table of Contents）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">readingTime&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 显示阅读时间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">license&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 是否显示许可声明（关闭）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">default&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Licensed&lt;/span> &lt;span class="n">under&lt;/span> &lt;span class="n">CC&lt;/span> &lt;span class="n">BY&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">NC&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">SA&lt;/span> &lt;span class="mf">4.0&lt;/span> &lt;span class="c1"># 默认许可文本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用评论&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">provider&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">disqus&lt;/span> &lt;span class="c1"># 使用 Disqus 作为评论提供者&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">disqusjs&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortname&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># DisqusJS 的短名称（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">apiUrl&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># DisqusJS 的 API 地址（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">apiKey&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># DisqusJS 的 API 密钥（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">admin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># DisqusJS 管理员（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">adminLabel&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># DisqusJS 管理员标签（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">utterances&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repo&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Utterances 的仓库（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">issueTerm&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">pathname&lt;/span> &lt;span class="c1"># Utterances 的问题标识方式（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">label&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Utterances 的标签（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">beaudar&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repo&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Beaudar 的仓库（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">issueTerm&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">pathname&lt;/span> &lt;span class="c1"># Beaudar 的问题标识方式（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">label&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Beaudar 的标签（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">theme&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Beaudar 的主题（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">remark42&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Remark42 的主机地址（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">site&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Remark42 的站点名称（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">locale&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Remark42 的语言（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">vssue&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">platform&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Vssue 的平台（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">owner&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Vssue 的拥有者（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repo&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Vssue 的仓库（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">clientId&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Vssue 的客户端 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">clientSecret&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Vssue 的客户端密钥（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">autoCreateIssue&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># Vssue 是否自动创建问题（关闭）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Waline client configuration see: https://waline.js.org/en/reference/component.html&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">waline&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">serverURL&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Waline 的服务器地址（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lang&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Waline 的语言（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pageview&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Waline 的页面浏览量（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">emoji&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">unpkg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nd">@waline&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">emojis&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="mf">1.0.1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">weibo&lt;/span> &lt;span class="c1"># Waline 的表情包地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">requiredMeta&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="c1"># Waline 的必填项：名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">email&lt;/span> &lt;span class="c1"># Waline 的必填项：邮箱&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">url&lt;/span> &lt;span class="c1"># Waline 的必填项：网址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">locale&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">admin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Admin&lt;/span> &lt;span class="c1"># Waline 的管理员名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">placeholder&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Waline 的占位符（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">twikoo&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">envId&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Twikoo 的环境 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">region&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Twikoo 的区域（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">path&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Twikoo 的路径（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lang&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Twikoo 的语言（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># See https://cactus.chat/docs/reference/web-client/#configuration for description of the various options&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cactus&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defaultHomeserverUrl&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://matrix.cactus.chat:8448&amp;#34;&lt;/span> &lt;span class="c1"># Cactus 的默认服务器地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">serverName&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;cactus.chat&amp;#34;&lt;/span> &lt;span class="c1"># Cactus 的服务器名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">siteName&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="c1"># Cactus 的站点名称（需唯一，未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">giscus&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repo&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的仓库（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repoID&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的仓库 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">category&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的分类（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">categoryID&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的分类 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mapping&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的映射方式（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lightTheme&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的亮色主题（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">darkTheme&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Giscus 的暗色主题（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">reactionsEnabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># Giscus 是否启用反应（启用）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">emitMetadata&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="c1"># Giscus 是否输出元数据（关闭）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gitalk&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">owner&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的拥有者（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">admin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的管理员（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">repo&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的仓库（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">clientID&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的客户端 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">clientSecret&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的客户端密钥（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxy&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Gitalk 的代理（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cusdis&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Cusdis 的主机地址（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Cusdis 的 ID（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">widgets&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">homepage&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">search&lt;/span> &lt;span class="c1"># 主页小部件：搜索框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">archives&lt;/span> &lt;span class="c1"># 主页小部件：归档列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">limit&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="c1"># 归档列表限制显示 5 个&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">categories&lt;/span> &lt;span class="c1"># 主页小部件：分类列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">limit&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># 分类列表限制显示 10 个&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">tag&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">cloud&lt;/span> &lt;span class="c1"># 主页小部件：标签云&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">limit&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># 标签云限制显示 10 个&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">page&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="nb">type&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">toc&lt;/span> &lt;span class="c1"># 单页小部件：目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">opengraph&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">twitter&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Your Twitter username&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">site&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># Twitter 用户名（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Available values: summary, summary_large_image&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">card&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">summary_large_image&lt;/span> &lt;span class="c1"># Twitter 卡片类型（大图模式）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">defaultImage&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">opengraph&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 是否启用默认 Open Graph 图片（关闭）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">local&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 是否使用本地图片（否）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 图片路径（未设置）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">colorScheme&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Display toggle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">toggle&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 显示主题切换按钮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Available values: auto, light, dark&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">default&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">auto&lt;/span> &lt;span class="c1"># 默认使用自动主题（根据浏览器偏好）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">imageProcessing&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cover&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用封面图处理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">content&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enabled&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用内容图片处理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">### Custom menu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">### See https://stack.jimmycai.com/config/menu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">### To remove about, archive and search page menu item, remove `menu` field from their FrontMatter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">menu&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[]&lt;/span> &lt;span class="c1"># 主菜单（为空）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">social&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">identifier&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">github&lt;/span> &lt;span class="c1"># 社交链接：GitHub&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">GitHub&lt;/span> &lt;span class="c1"># 显示名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="n">github&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">zata&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">zhangtao&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">ZataTree&lt;/span> &lt;span class="c1"># 链接地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">icon&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">brand&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">github&lt;/span> &lt;span class="c1"># 图标名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># - identifier: twitter # 示例：Twitter 社交链接（已注释）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># name: Twitter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># url: https://twitter.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># params:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># icon: brand-twitter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">related&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">includeNewer&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 相关文章推荐包括较新的文章&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">threshold&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="c1"># 相关性阈值（越高越严格）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">toLower&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 标签/分类是否忽略大小写&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">indices&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">tags&lt;/span> &lt;span class="c1"># 根据标签匹配相关文章&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span> &lt;span class="c1"># 标签权重&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">categories&lt;/span> &lt;span class="c1"># 根据分类匹配相关文章&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">200&lt;/span> &lt;span class="c1"># 分类权重&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">markup&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">goldmark&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">extensions&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">passthrough&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">enable&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用原始字符渲染（例如数学公式）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">delimiters&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">block&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="o">-&lt;/span> \&lt;span class="p">[&lt;/span> &lt;span class="c1"># 块级数学公式开始分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> \&lt;span class="p">]&lt;/span> &lt;span class="c1"># 块级数学公式结束分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="err">$$&lt;/span> &lt;span class="c1"># 块级数学公式开始分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="err">$$&lt;/span> &lt;span class="c1"># 块级数学公式结束分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inline&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="o">-&lt;/span> \&lt;span class="p">(&lt;/span> &lt;span class="c1"># 行内数学公式开始分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> \&lt;span class="p">)&lt;/span> &lt;span class="c1"># 行内数学公式结束分隔符&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">renderer&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">## Set to true if you have HTML content inside Markdown&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">unsafe&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 允许在 Markdown 中嵌入 HTML&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tableOfContents&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">endLevel&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="c1"># 目录包含到 4 级标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ordered&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 目录编号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">startLevel&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="c1"># 从 2 级标题开始&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">highlight&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noClasses&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">false&lt;/span> &lt;span class="c1"># 使用 CSS 类高亮代码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">codeFences&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 启用代码块&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guessSyntax&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 自动检测代码语言&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lineNoStart&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 行号从 1 开始&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lineNos&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 显示行号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lineNumbersInTable&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">true&lt;/span> &lt;span class="c1"># 行号显示在表格中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tabWidth&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="c1"># 制表符宽度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">frontmatter&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lastmod&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;:fileModTime&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;lastmod&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># 定义最后修改时间的来源（文件修改时间或 frontmatter 中的 lastmod）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="hugo-stack-主题添加最后修改于">Hugo Stack 主题添加[最后修改于]
&lt;/h3>&lt;p>参考：&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://shitao5.org/posts/hugo-stack/" target="_blank" rel="noopener"
>https://shitao5.org/posts/hugo-stack/&lt;/a>&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>
&lt;p>配置[最后修改于]&lt;/p>
&lt;p>在主题的.yaml文件中添加&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="n">frontmatter&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">lastmod&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;:fileModTime&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;lastmod&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-1.png"
width="878"
height="982"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-1_hu8889012725517830678.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-1_hu10408378799160670473.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="89"
data-flex-basis="214px"
>
&lt;strong>这样会显示最后更新于&lt;/strong>
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image.png"
width="1165"
height="668"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image_hu6179979274214935225.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image_hu16446997444669025875.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="174"
data-flex-basis="418px"
>&lt;/p>
&lt;p>&lt;strong>如果要显示最后修改于&lt;/strong>
修改 themes/hugo-theme-stack/i18n 文件夹中的 zh-cn.yaml 文件
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-3.png"
width="1518"
height="1215"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-3_hu10865147821651021898.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-3_hu10863578647763158585.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="124"
data-flex-basis="299px"
>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="在文章开头就显示修改时间">在文章开头就显示修改时间
&lt;/h3>&lt;p>参考：&lt;br>
&lt;a class="link" href="https://letere-gzj.github.io/hugo-stack/p/hugo/custom-stack-theme/#3-%E6%98%BE%E7%A4%BA%E6%96%87%E7%AB%A0%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4" target="_blank" rel="noopener"
>https://letere-gzj.github.io/hugo-stack/p/hugo/custom-stack-theme/#3-%E6%98%BE%E7%A4%BA%E6%96%87%E7%AB%A0%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4&lt;/a>&lt;/p>
&lt;ol>
&lt;li>在themes\hugo-theme-satck\layouts\partials\article\components\details.html，在指定位置引入以下代码&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl"> {{- if ne .Lastmod .Date -}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ partial &amp;#34;helper/icon&amp;#34; &amp;#34;clock&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">time&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;article-time--published&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{ T &amp;#34;article.lastUpdatedOn&amp;#34; }} {{ .Lastmod | time.Format ( or .Site.Params.dateFormat.lastUpdated &amp;#34;Jan 02, 2006 15:04 MST&amp;#34; ) }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">time&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {{- end -}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-2.png"
width="990"
height="661"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-2_hu12848048106209387350.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-2_hu14462126132099847529.png 1024w"
loading="lazy"
alt="在details.html中插入代码"
class="gallery-image"
data-flex-grow="149"
data-flex-basis="359px"
>&lt;/p>
&lt;ol start="2">
&lt;li>在主题的.yaml文件中添加&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 更新时间：优先读取git时间 -&amp;gt; git时间不存在，就读取本地文件修改时间&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">frontmatter&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">lastmod&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">:&lt;/span>&lt;span class="l">git&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">:&lt;/span>&lt;span class="l">fileModTime&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># 允许获取Git信息 &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">enableGitInfo&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index.png"
width="925"
height="271"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index_hu15220760328662926381.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index_hu12448746280374574208.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="341"
data-flex-basis="819px"
>&lt;/p>
&lt;p>这部分指定了Hugo获取lastmod值的优先级顺序：&lt;br>
:git：优先使用Git提交历史中的最后修改时间（更准确反映内容实际更新时间）。&lt;br>
:fileModTime：如果Git信息不可用，则使用本地文件的修改时间作为备选。&lt;br>
如果不设置这个，Hugo可能无法正确填充.Lastmod，导致你的代码 {{ if ne .Lastmod .Date }} 条件永远不生效。&lt;br>
enableGitInfo: true：&lt;br>
默认情况下，Hugo不会去查询Git信息（为了性能考虑）。&lt;br>
设置 enableGitInfo: true 后，Hugo会利用Git仓库的提交历史来填充页面变量（如 .Lastmod）。&lt;br>
如果你使用的是版本控制（比如GitHub），这个设置非常有用，因为它能确保修改时间反映的是内容的实际提交时间，而不是本地文件的时间（后者可能因环境不同而变化）。&lt;/p>
&lt;ol start="3">
&lt;li>修改github action文件.github/workflows/xxx.yaml，让可以读取git信息&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Git Configuration&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> git config --global core.quotePath false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> git config --global core.autocrlf false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> git config --global core.safecrlf true
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> git config --global core.ignorecase false &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-1.png"
width="1018"
height="671"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-1_hu16774370750001245115.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-1_hu8364093984618991152.png 1024w"
loading="lazy"
alt="代码修改位置"
class="gallery-image"
data-flex-grow="151"
data-flex-basis="364px"
>&lt;/p>
&lt;p>这些配置确保Git在构建过程中能够正确处理文件路径和换行符等问题，避免因环境差异导致的异常。&lt;br>
core.quotePath false：确保特殊字符的文件名不会被转义。&lt;br>
core.autocrlf false：避免换行符转换问题（不同系统可能处理不同）。&lt;br>
core.safecrlf true：确保换行符处理安全。&lt;br>
core.ignorecase false：保持文件名大小写敏感。&lt;br>
这些设置虽然不直接决定.Lastmod，但能确保Git仓库的行为一致，避免潜在问题。&lt;/p>
&lt;h3 id="代码块过长折叠展开">代码块过长折叠&amp;amp;展开
&lt;/h3>&lt;ol>
&lt;li>准备一张图片作为代码展开的按钮，放到assets/icons文件夹下，并命名为codeMore.png&lt;/li>
&lt;li>将下面代码复制粘贴到layouts/partials/footer/custom.html中(文件没有就新建)，有报错不要管&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">highlight&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">/* 你可以根据需要调整这个高度 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">max-height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">400&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-show&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">max-height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">none&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-box&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">padding-top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">78&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background-image&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="nf">gradient&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">linear&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">left&lt;/span> &lt;span class="kc">top&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">left&lt;/span> &lt;span class="kc">bottom&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">from&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="nf">to&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mh">#fff&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">absolute&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">left&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">right&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">bottom&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">z-index&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-btn&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">block&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">44&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#f0f0f5&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">border-top-left-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">border-top-right-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">padding-top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">cursor&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">pointer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-img&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">cursor&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">pointer&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">block&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">function&lt;/span> &lt;span class="nx">initCodeMoreBox&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">let&lt;/span> &lt;span class="nx">codeBlocks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.highlight&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">codeBlocks&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlocks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeBlock&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 校验是否overflow
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">scrollHeight&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">clientHeight&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 元素初始化
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// codeMoreBox
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">codeMoreBox&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;div&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-box&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// codeMoreBtn
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">codeMoreBtn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;span&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-btn&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">addEventListener&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;click&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-show&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 触发resize事件，重新计算目录位置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">dispatchEvent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="nx">Event&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;resize&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// img
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">img&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;img&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">img&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-img&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">img&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{{&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resources&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Get&lt;/span> &lt;span class="s2">&amp;#34;icons/codemore.png&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">Permalink&lt;/span> &lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 元素添加
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">img&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">initCodeMoreBox&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-7.png"
width="200"
height="200"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-7_hu1571281051582635187.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-7_hu8309077573045533805.png 1024w"
loading="lazy"
alt="挖掘机图片作为展开按钮"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
>
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-6.png"
width="1194"
height="905"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-6_hu5363306755399736069.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-6_hu5765167908079644630.png 1024w"
loading="lazy"
alt="文件绝对位置"
class="gallery-image"
data-flex-grow="131"
data-flex-basis="316px"
>&lt;/p>
&lt;h3 id="添加返回顶部按钮">添加’返回顶部’按钮
&lt;/h3>&lt;ol>
&lt;li>图片还是和代码块过长一样放在/assets/icons文件夹下，命名为backtop.png&lt;/li>
&lt;li>修改layouts/partials/footer/custom.html文件，下面的代码是直接在代码块折叠的基础上又加了返回最顶按钮.粘贴代码一样也是，vscode报错也别理&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">highlight&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">max-height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">400&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">relative&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-show&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">max-height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">none&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-box&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">padding-top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">78&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background-image&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">linear-gradient&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">to&lt;/span> &lt;span class="kc">bottom&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mh">#fff&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">absolute&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">left&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">bottom&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">z-index&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-btn&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">block&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="kc">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">44&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#f0f0f5&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">border-top-left-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">border-top-right-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">padding-top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">cursor&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">pointer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">code-more-img&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">block&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="kc">auto&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">#&lt;/span>&lt;span class="nn">backTopBtn&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">none&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">fixed&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">bottom&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">right&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">z-index&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">99&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">cursor&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">pointer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background-image&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">url&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sx">{{ (resources.Get &amp;#34;icons/backtop.png&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RelPermalink&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">}&lt;/span>&lt;span class="o">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">background-size&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nt">cover&lt;/span>&lt;span class="o">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">background-repeat&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nt">no-repeat&lt;/span>&lt;span class="o">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">style&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">function&lt;/span> &lt;span class="nx">initCodeMoreBox&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">codeBlocks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.highlight&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">codeBlocks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlocks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeBlock&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">scrollHeight&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">clientHeight&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">codeMoreBox&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;div&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-box&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">codeMoreBtn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;span&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-btn&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">img&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;img&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">img&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-more-img&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">img&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;{{ (resources.Get &amp;#34;&lt;/span>&lt;span class="nx">icons&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">codemore&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">png&lt;/span>&lt;span class="s2">&amp;#34;).RelPermalink }}&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">img&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">alt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;Show more&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">addEventListener&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;click&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">classList&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;code-show&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">dispatchEvent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="nx">Event&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;resize&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">img&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeMoreBtn&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">codeBlock&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">codeMoreBox&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Error in initCodeMoreBox:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">error&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">function&lt;/span> &lt;span class="nx">initScrollTop&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">rightSideBar&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.right-sidebar&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">rightSideBar&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">warn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Right sidebar not found&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">btn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">btn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;backTopBtn&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">btn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">onclick&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">backToTop&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">rightSideBar&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">btn&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">onscroll&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">body&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">scrollTop&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">documentElement&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">scrollTop&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">btn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;block&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">btn&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;none&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Error in initScrollTop:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">error&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">function&lt;/span> &lt;span class="nx">backToTop&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">scrollTo&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">top&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">behavior&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;smooth&amp;#34;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">addEventListener&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;DOMContentLoaded&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">initCodeMoreBox&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">initScrollTop&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-8.png"
width="200"
height="200"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-8_hu10187646418117058825.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-8_hu11643217485349635283.png 1024w"
loading="lazy"
alt="小火箭图标"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
>
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-5.png"
width="1065"
height="753"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-5_hu2824378096675725717.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/index-5_hu10185707607907486310.png 1024w"
loading="lazy"
alt="代码粘贴位置"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="339px"
>&lt;/p>
&lt;h3 id="如何修改导航栏">如何修改导航栏
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-14.png"
width="1130"
height="494"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-14_hu9894920497085083178.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-14_hu16678959993143435909.png 1024w"
loading="lazy"
alt="导航栏"
class="gallery-image"
data-flex-grow="228"
data-flex-basis="548px"
>&lt;/p>
&lt;p>修改content文件夹中的page文件夹下的文件夹，每一个文件夹代表一个导航栏&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-15.png"
width="373"
height="217"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-15_hu5722755495075117734.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-15_hu18388577968467041600.png 1024w"
loading="lazy"
alt="page下每一个文件夹代表一个导航栏"
class="gallery-image"
data-flex-grow="171"
data-flex-basis="412px"
>&lt;/p>
&lt;p>文件夹中的md文件就是&lt;code>页面&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-16.png"
width="1366"
height="472"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-16_hu9922154855368550930.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-16_hu13558857067107159546.png 1024w"
loading="lazy"
alt="md文件"
class="gallery-image"
data-flex-grow="289"
data-flex-basis="694px"
>&lt;/p>
&lt;p>这里有一个奇怪的页面archives&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-17.png"
width="1725"
height="946"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-17_hu12520433806162984328.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-17_hu10329728828398592193.png 1024w"
loading="lazy"
alt="archives"
class="gallery-image"
data-flex-grow="182"
data-flex-basis="437px"
>&lt;/p>
&lt;p>看到源码，实际上主要是layout这个属性&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-18.png"
width="544"
height="267"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-18_hu1045298879603298109.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-18_hu9495342891954455137.png 1024w"
loading="lazy"
alt="layout"
class="gallery-image"
data-flex-grow="203"
data-flex-basis="488px"
>&lt;/p>
&lt;p>这个layout属性对应的就是一个html页面，在主题中定义
&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-19.png"
width="537"
height="685"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-19_hu2758287370579651446.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-19_hu408243992053446535.png 1024w"
loading="lazy"
alt="定义位置"
class="gallery-image"
data-flex-grow="78"
data-flex-basis="188px"
>&lt;/p>
&lt;h3 id="archives页面中卡片对应的图片在哪里">archives页面中，卡片对应的图片在哪里
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-20.png"
width="1419"
height="885"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-20_hu4526935283047031264.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-20_hu6669957132286804951.png 1024w"
loading="lazy"
alt="archives页面卡片图片"
class="gallery-image"
data-flex-grow="160"
data-flex-basis="384px"
>&lt;/p>
&lt;p>这些图片对应的也是页面，在content根目录下面创建两个文件夹，分别是categories和tags就可以了&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-21.png"
width="988"
height="435"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-21_hu130895926152210267.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-21_hu13303519006153169300.png 1024w"
loading="lazy"
alt="categories和tags"
class="gallery-image"
data-flex-grow="227"
data-flex-basis="545px"
>&lt;/p>
&lt;h2 id="其他主题还没使用的">其他主题（还没使用的
&lt;/h2>&lt;h3 id="book">Book
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-10.png"
width="1401"
height="954"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-10_hu8311496147984711683.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-10_hu8674962086948646443.png 1024w"
loading="lazy"
alt="BOOK主题"
class="gallery-image"
data-flex-grow="146"
data-flex-basis="352px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-12.png"
width="1378"
height="804"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-12_hu18012281254532100943.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-12_hu11122258968500007807.png 1024w"
loading="lazy"
alt="关于tags"
class="gallery-image"
data-flex-grow="171"
data-flex-basis="411px"
>&lt;/p>
&lt;hr>
&lt;p>后续： 2025-05-08&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-13.png"
width="1241"
height="911"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-13_hu11110108557110793532.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-13_hu7000390127835302310.png 1024w"
loading="lazy"
alt="我的尝试"
class="gallery-image"
data-flex-grow="136"
data-flex-basis="326px"
>&lt;/p>
&lt;p>我去试了一些，直接修改主题并没有它示例上面的功能，但是想要改配置的话也没有教程可以参考，所以放弃&lt;/p>
&lt;h3 id="lovelt">Lovelt
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-11.png"
width="1875"
height="954"
srcset="https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-11_hu16687914566386816004.png 480w, https://www.zata.cc/p/2-hugo%E4%B8%BB%E9%A2%98%E5%92%8C%E9%85%8D%E7%BD%AE/images/index/image-11_hu12898208092670260077.png 1024w"
loading="lazy"
alt="Lovelt"
class="gallery-image"
data-flex-grow="196"
data-flex-basis="471px"
>&lt;/p></description></item><item><title>1-hugo安装使用</title><link>https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</guid><description>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/head.png" alt="Featured image of post 1-hugo安装使用" />&lt;h1 id="hugo">hugo
&lt;/h1>&lt;h2 id="常用命令">常用命令
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># start the hugo server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># build the hugo site&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="hugo使用注意事项">hugo使用注意事项
&lt;/h2>&lt;ol>
&lt;li>&lt;code>文件命名必须是index.xxxx.md&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>md文件+图片的组合，文件夹的名称是随意命名的，但文件夹里md文件的命名，必须为index.md或index.zh-cn.md否则图片资源可能在打包上传时会消失。&lt;/p>
&lt;ol start="2">
&lt;li>&lt;code>图片资源的放置位置有讲究&lt;/code>
看下面两张图，三张图片在md文件中本地查看都是可以的，但是在打包上传时，最后一个图片资源可能会消失。&lt;/li>
&lt;/ol>
&lt;p>&lt;code>图片资源必须和.md文件在同一个文件夹下，否则图片资源可能在打包上传时会消失。&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index.jpg"
width="1920"
height="1016"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index_hu16210632772650124683.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index_hu6449132482289204781.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="188"
data-flex-basis="453px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index-1.jpg"
width="1908"
height="891"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index-1_hu11921329357507897251.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/index/index-1_hu9180039650867633966.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="513px"
>&lt;/p>
&lt;h2 id="hugo在ubuntu系统下安装使用">hugo在ubuntu系统下安装使用
&lt;/h2>&lt;p>&lt;span style="color:red" > 2025年5月5日，本来想要在服务器上部署到，试了没成功，感觉挺难的，最后把服务器改成了windows系统 &lt;/span>
&lt;span style="color:red" > 2025年7月14日，我在mac到容器中执行apt install hugo 很容易就安装上了啊 &lt;/span>&lt;/p>
&lt;p>&lt;a class="link" href="https://gohugo.io/getting-started/quick-start/" target="_blank" rel="noopener"
>https://gohugo.io/getting-started/quick-start/&lt;/a>&lt;/p>
&lt;ol>
&lt;li>安装hugo&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install hugo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>安装git&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install git-all
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="hugo在windwos安装使用">hugo在windwos安装使用
&lt;/h2>&lt;ul>
&lt;li>download 下载&lt;/li>
&lt;/ul>
&lt;p>&lt;a class="link" href="https://github.com/gohugoio/hugo/releases" target="_blank" rel="noopener"
>https://github.com/gohugoio/hugo/releases&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8.jpg"
width="1912"
height="996"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8_hu17113566868376367491.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8_hu2480089921267885810.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="191"
data-flex-basis="460px"
>&lt;/p>
&lt;ul>
&lt;li>unzip to local 解压到本地 , example : here I created a folder&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-1.jpg"
width="1744"
height="972"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-1_hu6308411271341146571.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-1_hu10100391200030252032.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="179"
data-flex-basis="430px"
>&lt;/p>
&lt;ul>
&lt;li>run the cmd command under the directory 在目录下面运行cmd命令 ,example : here I created a folder named zata&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new site zata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-2.jpg"
width="1113"
height="626"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-2_hu6076851551550793527.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-2_hu860166904581307373.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>copy hugo.exe to zata folder 把hugo.exe复制到zata文件夹&lt;/p>
&lt;/li>
&lt;li>
&lt;p>run the cmd command under the directory 在目录下面运行cmd命令,example : here I created a folder named zata
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-3.jpg"
width="1787"
height="951"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-3_hu15713463188735219293.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-3_hu16324140096998634908.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="187"
data-flex-basis="450px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>then you can see the example site
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-4.jpg"
width="1908"
height="948"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-4_hu11639859572822230581.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-4_hu8196742127013815323.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="201"
data-flex-basis="483px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>next step, you need to install the theme
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-5.jpg"
width="1908"
height="891"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-5_hu11690653603472481323.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-5_hu12912525806492148694.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="513px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>choose the theme you want to install , example : here I choose the theme named Stack
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-6.jpg"
width="1908"
height="896"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-6_hu15725832044261330917.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-6_hu286637356239147652.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="212"
data-flex-basis="511px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-7.jpg"
width="1908"
height="891"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-7_hu3529339632070551541.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-7_hu15531316359361679505.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="513px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-8.jpg"
width="1908"
height="891"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-8_hu3627550054184280575.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-8_hu18287453062319878760.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="513px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-9.jpg"
width="1908"
height="891"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-9_hu13695251667230783657.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-9_hu12433595740479426673.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="214"
data-flex-basis="513px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>unzip the theme to the zata/themes folder, and delete the version number
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-10.jpg"
width="1744"
height="833"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-10_hu12910458764700619227.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-10_hu4508713524552970344.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="209"
data-flex-basis="502px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>copy [your-theme-name]/exampleSite/config.toml&amp;amp;content to zata/
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-11.jpg"
width="1744"
height="875"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-11_hu3261007449696839644.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-11_hu2282616671580614301.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="199"
data-flex-basis="478px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>delete the toml file, because the toml file is not used, the yaml file is used
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-12.jpg"
width="1744"
height="728"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-12_hu10040987687623478614.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-12_hu435537850710442610.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="239"
data-flex-basis="574px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-13.jpg"
width="1904"
height="709"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-13_hu11567434890688418696.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-13_hu3188427348478047399.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="268"
data-flex-basis="644px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>delete rich-content folder,because the rich-content folder is cite some website, and the website is not used
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-14.jpg"
width="1744"
height="717"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-14_hu7864802073797376886.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-14_hu7403729431339096405.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="243"
data-flex-basis="583px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>run the cmd command under the directory in zata folder, then you can see:
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-15.jpg"
width="1113"
height="626"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-15_hu1529786268679249648.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-15_hu7737275257581732366.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-16.jpg"
width="1908"
height="943"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-16_hu8923223115840126472.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-16_hu17962429128623728023.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="202"
data-flex-basis="485px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>then you can create a new post
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-17.jpg"
width="1113"
height="626"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-17_hu487498202997223794.jpg 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/image/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-17_hu2924432490108029008.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new content post/myFristBlog/index.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>myFtistBlog is the name of the page&lt;/strong>
In hugo, a folder is a page, then the default language of index.md that you can modify in the hugo.yaml, the default language of index.zh-cn.md is Chinese, and the images used in md will be placed in this folder.&lt;/p>
&lt;h2 id="使用github部署hugo的静态页面常规方式下面一节使用github-action">使用github部署hugo的静态页面常规方式（下面一节使用github action）
&lt;/h2>&lt;h3 id="将hugo的编译成静态页面">将hugo的编译成静态页面
&lt;/h3>&lt;ol>
&lt;li>修改配置文件中的baseurl,具体如何修改可以看下一节 :&lt;a class="link" href="#push-%e4%b8%8a%e4%b8%80%e6%ad%a5%e7%94%9f%e6%88%90%e7%9a%84pulic%e6%96%87%e4%bb%b6%e5%a4%b9%e5%88%b0github" >如何对应github静态页面的域名&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-4.png"
width="735"
height="324"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-4_hu7542179556551362073.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-4_hu15814733005732997075.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="226"
data-flex-basis="544px"
>&lt;/p>
&lt;ol start="2">
&lt;li>在根目录下面使用hugo -D 命令生成静态页面
using &amp;ldquo;hugo -D&amp;rdquo; command to generate static pages in the root directory
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>这将生成一个public文件夹
This will generate a public folder&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image.png"
width="1701"
height="626"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image_hu16241520916839569986.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image_hu1171907236490871539.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="271"
data-flex-basis="652px"
>&lt;/p>
&lt;h3 id="push-上一步生成的pulic文件夹到github">push 上一步生成的pulic文件夹到github
&lt;/h3>&lt;ol>
&lt;li>首先需要在github上创建一个仓库，这个仓库名如果是&amp;quot;[你的用户名].github.io&amp;quot; 那么后续生成的静态页面的地址就不会有后缀，不然就会有后缀，例如我的github名字是zata-zhangtao,我创建了一个仓库为zata-zhangtao.github.io，那么生成的静态页面的地址就是zata-zhangtao.github.io，而如果仓库名为zata-zhangtao, 那么生成的静态页面地址就会是zata-zhangtao.github.io/zata-zhangtao/&lt;/li>
&lt;/ol>
&lt;p>First, you need to create a repository on github, and if the repository name is &amp;ldquo;[your-username].github.io&amp;rdquo;, then the static pages will not have a suffix, otherwise there will be a suffix, for example, my github username is zata-zhangtao, I created a repository named zata-zhangtao.github.io, then the static pages address will be zata-zhangtao.github.io, but if the repository name iszata-zhangtao, then the static pages address will be z&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1.png"
width="2537"
height="1312"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1_hu16234192655568166130.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-1_hu1894947867173020098.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="464px"
>&lt;/p>
&lt;ol start="2">
&lt;li>把刚刚的public文件夹push到github上&lt;/li>
&lt;/ol>
&lt;p>push the public folder to github&lt;/p>
&lt;p>具体的push命令和方式不在具体说明&lt;/p>
&lt;p>the specific push command and way are not detailed&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-2.png"
width="2377"
height="1288"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-2_hu6437247496178885478.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-2_hu7927162917699179823.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="184"
data-flex-basis="442px"
>&lt;/p>
&lt;ol start="3">
&lt;li>设置github静态页面
setting up github pages&lt;/li>
&lt;/ol>
&lt;p>进入仓库的设置页面，然后点击pages,然后再选你那个分支作为你的静态页面，选择完成之后，稍等几分钟，看到页面产生就可以使用了
into the repository settings page, click pages, then choose your branch as your static page, select complete, wait a few minutes, and see if the page is generated, and you can use it&lt;/p>
&lt;p>&lt;code>如果你前面配置文件中的baseurl没有配置正确，可能会出现点击域名之后发现页面有问题，解决：&lt;/code>
重新修改baseurl，并重新编译和push，并且注意编译的时候有没有报错
if the baseurl in the hogo.yaml is not configured correctly, you will find that the page is not displayed correctly after clicking the domain, solve it by modifying the baseurl, recompiling and pushing, and pay attention to whether there are any errors when compiling&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-3.png"
width="2552"
height="1219"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-3_hu6281486776499999538.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-3_hu15839095071176640038.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="209"
data-flex-basis="502px"
>&lt;/p>
&lt;ol start="4">
&lt;li>然后你就可以看见你的静态页面了
then you can see your static page&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-5.png"
width="2505"
height="1333"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-5_hu15806227923097101262.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-5_hu10533883703515526931.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="187"
data-flex-basis="451px"
>&lt;/p>
&lt;h2 id="github-自动部署hugo的静态页面">github 自动部署hugo的静态页面
&lt;/h2>&lt;p>automatically deploy hugo&amp;rsquo;s static page by github action&lt;/p>
&lt;p>参考网址：&lt;/p>
&lt;pre>&lt;code>https://www.bilibili.com/video/BV1bovfeaEtQ?p=4
https://gohugo.io/hosting-and-deployment/hosting-on-github/#build-hugo-with-github-action
&lt;/code>&lt;/pre>
&lt;p>“GitHub 自动部署 Hugo 的静态页面”是指利用 GitHub Actions（GitHub 提供的工作流自动化工具）来实现以下过程：当你推送 Hugo 项目代码到 GitHub 仓库时，自动完成 Hugo 静态网站的构建并将其部署到某个目标位置（通常是 GitHub Pages），无需手动操作。&lt;/p>
&lt;ol>
&lt;li>在自己的根路径下面创建一个.github/workflows/hugo.yaml文件,并将如下代码复制粘贴进去
&lt;code>配置文件中有几点值得注意：&lt;/code>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>需要修改你的分支名，我这里是hugo,需要改成你自己的分支名&lt;/p>
&lt;/li>
&lt;li>
&lt;p>注意一下版本的问题，这里我默认版本是0.141.0，&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Sample workflow for building and deploying a Hugo site to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy Hugo site to Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># Runs on pushes targeting the default branch&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">hugo &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 注意要要修改你的分支名&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># Allows you to run this workflow manually from the Actions tab&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">concurrency&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">group&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cancel-in-progress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Default to bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">shell&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># Build job&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_VERSION&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.141.0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install Hugo CLI&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install Dart Sass&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sudo snap install dart-sass&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/configure-pages@v5&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install Node.js dependencies&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;[[ -f package-lock.json || -f npm-shrinkwrap.json ]] &amp;amp;&amp;amp; npm ci || true&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build with Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_CACHEDIR&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ runner.temp }}/hugo_cache&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_ENVIRONMENT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">production&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">TZ&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">America/Los_Angeles&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> hugo \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --gc \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --minify \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># Deployment job&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>
&lt;p>创建一个github仓库，然后进入setting，将build and development 改成Github Action ，并且修改环境变量
ctreate a github repository, then enter setting, change build and development to Github Action, and modify the environment variable&lt;/p>
&lt;p>&lt;strong>修改Github Action&lt;/strong>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-6.png"
width="2520"
height="1250"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-6_hu1009664941356908568.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-6_hu765690174291251485.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="201"
data-flex-basis="483px"
>&lt;/p>
&lt;p>&lt;strong>修改环境变量&lt;/strong>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-7.png"
width="1176"
height="704"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-7_hu18045451282021316823.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-7_hu5947992990023786840.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="167"
data-flex-basis="400px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-8.png"
width="1274"
height="1190"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-8_hu16781337876240894301.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-8_hu12382550358200024092.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="107"
data-flex-basis="256px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>需要将自己的根目录上传到github的一个仓库中，push之前可以把public文件夹和resources文件夹忽略掉,因为这两个文件夹是hugo编译生成的,自动部署可以自己生成，就不需要了。同时你许要修改根路径下面的yaml文件，主要是其中的baseurl，修改为&lt;code>https://&amp;lt;username&amp;gt;.github.io/&amp;lt;repository&amp;gt;&lt;/code> 当然如果你的仓库名是&lt;code>&amp;lt;username&amp;gt;.github.io&lt;/code>就可以修改为&lt;code>https://&amp;lt;username&amp;gt;.github.io&lt;/code>
you need to upload your root directory to a github repository, the repository name is not important, you can ignore the public folder and resources folder before pushing,because these two folders are generated by hugo, you don&amp;rsquo;t need them. Also you need to modify the yaml file in the root directory, mainly the baseurl, modify it to &lt;code>https://&amp;lt;username&amp;gt;.github.io/&amp;lt;repository&amp;gt;&lt;/code>, of course if your repository name is &lt;code>&amp;lt;username&amp;gt;.github.io&lt;/code> you can modify it to &lt;code>https://&amp;lt;username&amp;gt;.github.io&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-9.png"
width="2537"
height="1118"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-9_hu2013084756410934727.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-9_hu1292145593084476861.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="226"
data-flex-basis="544px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-10.png"
width="2552"
height="905"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-10_hu2957884498825007842.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-10_hu4156372245550788799.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="281"
data-flex-basis="676px"
>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>准备好之后就可以push了，注意别push错了，必须要是之前配置环境变量和workflows里面的分支,push之后可以到action里面查看进度，稍后就可访问静态页面了
You are ready to push, don&amp;rsquo;t push wrong, you must push to the branch you configured in the environment variable and workflows,push it, you can see the progress in the action, and you can access the static page later&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-11.png"
width="1573"
height="912"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-11_hu11516027236674178049.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-11_hu14411781741341770723.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="172"
data-flex-basis="413px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-12.png"
width="1987"
height="718"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-12_hu5487970392212061495.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-12_hu5422377005620018830.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="276"
data-flex-basis="664px"
>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="怎么使用自己的域名访问github-pages">怎么使用自己的域名访问github pages
&lt;/h2>&lt;ol>
&lt;li>配置DNS
登录你自己的域名服务商,我的域名服务商是阿里云，这里配置两条记录,无论你原本是不是访问需要加分支名或者什么，解析地址都是&lt;code>&amp;lt;username&amp;gt;.github.io&lt;/code>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-14.png"
width="850"
height="636"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-14_hu14414195123956723021.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-14_hu12161744166587141023.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-15.png"
width="850"
height="636"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-15_hu260045937749327974.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-15_hu6943772577854092524.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
>&lt;/li>
&lt;li>到github仓库当中，修改如下配置：setting-&amp;gt;Pages-&amp;gt;Custom domain-&amp;gt;输入你的域名-&amp;gt;保存
注意如果允许勾选enforce HTTPS，就一定勾选它，这会让你访问的时候浏览器显示安全
&lt;img src="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-16.png"
width="1786"
height="881"
srcset="https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-16_hu17235491872153744284.png 480w, https://www.zata.cc/p/hugo%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/images/index/image-16_hu3039270918547776473.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="202"
data-flex-basis="486px"
>&lt;/li>
&lt;/ol>
&lt;h2 id="配置相关">配置相关
&lt;/h2>&lt;ol>
&lt;li>
&lt;p>配置页面的样式
可以在项目的根目录下的config.yaml文件中进行配置。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>默认index.md文件头&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">title&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Chinese&lt;/span> &lt;span class="n">Test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">description&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">这是一个副标题&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2020&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">09&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">09&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">slug&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">test&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">chinese&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">image&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">helena&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">hertz&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">wWZzXlDpMog&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">unsplash&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">jpg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">categories&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">Test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">-&lt;/span> &lt;span class="n">测试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>内容解释&lt;/li>
&lt;/ol>
&lt;p>在 Hugo（一个流行的静态网站生成器）中，&lt;strong>&amp;ldquo;slug&amp;rdquo;&lt;/strong> 是一个用于控制页面 URL 的重要概念。它通常在文件的**前端事项（front matter）**中定义，用于自定义页面或文章的 URL 路径的最后一段。以下是关于 Hugo 中 &amp;ldquo;slug&amp;rdquo; 的详细解释：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>什么是 slug？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>定义&lt;/strong>：Slug 是一个简洁、URL 友好的字符串，通常由小写字母、数字和连字符（&lt;code>-&lt;/code>）组成，用于标识页面或内容的 URL。&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>：它替代了默认的文件名或标题生成的 URL 片段，让 URL 更简洁、可读，并且对搜索引擎优化（SEO）更友好。&lt;/li>
&lt;li>&lt;strong>默认行为&lt;/strong>：如果没有在前端事项中定义 slug，Hugo 会使用文件名（去掉扩展名）或标题（经过处理，如空格转为连字符）来生成 URL 的最后一段。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>在 Hugo 中使用 slug&lt;/strong>
你可以在 Markdown 文件的&lt;strong>前端事项&lt;/strong>中手动设置 slug。例如：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;我的第一篇文章&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;my-first-post&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>效果&lt;/strong>：假设文件位于 &lt;code>content/posts/&lt;/code> 目录下，默认情况下，URL 可能是 &lt;code>/posts/我的第一篇文章/&lt;/code>（或根据配置转为拼音/其他形式）。设置了 &lt;code>slug: &amp;quot;my-first-post&amp;quot;&lt;/code> 后，URL 会变成 &lt;code>/posts/my-first-post/&lt;/code>。&lt;/li>
&lt;li>&lt;strong>适用范围&lt;/strong>：Slug 只影响 URL 的最后一段（文件名部分），不会改变目录结构（即 &lt;code>posts&lt;/code> 部分仍由文件路径决定）。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>slug vs 文件名&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>如果不设置 slug，Hugo 默认使用文件名。例如，文件名为 &lt;code>my-first-post.md&lt;/code>，URL 会是 &lt;code>/posts/my-first-post/&lt;/code>。&lt;/li>
&lt;li>设置 slug 后，它会覆盖文件名。例如：
&lt;ul>
&lt;li>文件名：&lt;code>article-001.md&lt;/code>&lt;/li>
&lt;li>前端事项：&lt;code>slug: &amp;quot;new-article&amp;quot;&lt;/code>&lt;/li>
&lt;li>结果 URL：&lt;code>/posts/new-article/&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>&lt;strong>slug 的规则和注意事项&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>字符限制&lt;/strong>：建议使用小写字母、数字和连字符，避免空格、特殊字符或大写字母，以符合 URL 标准。&lt;/li>
&lt;li>&lt;strong>与 url 的区别&lt;/strong>：Hugo 中还有一个 &lt;code>url&lt;/code> 前端事项选项，它可以完全覆盖整个路径（包括目录部分），而 slug 只修改最后一段。例如：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;my-post&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/custom/path/to/my-post/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>slug&lt;/code> 只影响 &lt;code>/my-post&lt;/code> 部分。&lt;/li>
&lt;li>&lt;code>url&lt;/code> 会覆盖整个路径为 &lt;code>/custom/path/to/my-post/&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>多语言支持&lt;/strong>：在多语言网站中，可以为每种语言设置不同的 slug。例如：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># content/post/my-post.en.md&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;my-post&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># content/post/my-post.fr.md&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">slug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;mon-article&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul></description></item><item><title>Dify</title><link>https://www.zata.cc/p/dify/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/dify/</guid><description>&lt;img src="https://www.zata.cc/p/dify/Dify.png" alt="Featured image of post Dify" />&lt;h1 id="dify">Dify
&lt;/h1>&lt;h2 id="简介">简介
&lt;/h2>&lt;p>Dify 是一款开源的大语言模型（LLM）应用开发平台，融合了后端即服务（Backend as Service）和 LLMOps 的理念，使开发者可以快速搭建生产级的生成式 AI 应用 。它支持 GPT 系列模型以及其他大语言模型，专为用户提供便捷的人工智能应用程序开发体验 。&lt;/p>
&lt;h2 id="示例">示例
&lt;/h2>&lt;p>在 Dify 中，示例输出通常用于为 AI Agent 提供书写格式的参考，以确保其输出更接近预期。例如，在搭建个人在线旅游助手时，可以通过示例输出定义期望的回答格式和内容 。
&lt;img src="https://www.zata.cc/p/dify/images/Dify/image.png"
width="1684"
height="949"
srcset="https://www.zata.cc/p/dify/images/Dify/image_hu15204449759141511621.png 480w, https://www.zata.cc/p/dify/images/Dify/image_hu9450549378494447772.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="425px"
>&lt;/p>
&lt;h2 id="优缺点">优缺点
&lt;/h2>&lt;h3 id="优点">优点：
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>全面的 UI&lt;/strong>：Dify 提供了直观的用户界面，简化了开发过程 。&lt;/li>
&lt;li>&lt;strong>内置工具与 API 支持&lt;/strong>：将许多热门工具和第三方 API 接口内置在系统组件中，对初级用户非常友好 。&lt;/li>
&lt;li>&lt;strong>模块化设计&lt;/strong>：具有成熟的技术栈，易于扩展和二次开发 。&lt;/li>
&lt;/ul>
&lt;h3 id="缺点">缺点：
&lt;/h3>&lt;ul>
&lt;li>相较于 LangChain 等工具，Dify 在灵活性和深度定制性方面可能稍显不足 。&lt;/li>
&lt;/ul>
&lt;h2 id="应用场景">应用场景
&lt;/h2>&lt;p>Dify 可广泛应用于多种场景，包括但不限于：&lt;/p>
&lt;ul>
&lt;li>构建 AI 问答助手，快速响应用户问题。&lt;/li>
&lt;li>开发个人在线旅游助手，提供定制化的旅行建议。&lt;/li>
&lt;li>创建基于知识库的智能客服系统，提升企业服务效率。&lt;/li>
&lt;/ul>
&lt;h2 id="演示视频和参考">演示视频和参考
&lt;/h2>&lt;p>虽然目前没有直接提到 Dify 的具体演示视频链接，但可以通过以下资源进一步了解其功能和使用方法：&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://blog.csdn.net/FrenzyTechAI/article/details/140726584" target="_blank" rel="noopener"
>Dify 学习笔记系列&lt;/a> 提供了详细的入门教程和实际案例。&lt;/li>
&lt;li>&lt;a class="link" href="https://www.bilibili.com/video/BV1kwrBYnEK5" target="_blank" rel="noopener"
>bilibiliCoze与Dify知识库问答对比&lt;/a> 分享了关于工作流和节点使用的经验 。&lt;/li>
&lt;/ul></description></item><item><title>软件自动更新</title><link>https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/</guid><description>&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/index/index.png" alt="Featured image of post 软件自动更新" />&lt;h1 id="软件自动更新">软件自动更新
&lt;/h1>&lt;h2 id="todo">TODO
&lt;/h2>&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> 把服务器部署功能写成docker file的形式 【2025-02-26】&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 把客户端的封装成一个exe 【2025-02-26】&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 把上传更新文件写成用一个页面上传 【2025-02-26】&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 当前的更新和上传方式都是把全部的文件都上传和下载，文件一大太慢了，需要优化一下，只上传更新的文件 【2025-02-26】&lt;/li>
&lt;/ul>
&lt;h2 id="软件自动更新的重要性">软件自动更新的重要性
&lt;/h2>&lt;ol>
&lt;li>当软件开发过程中出现一些小bug，可以通过热补丁的方式快速修复（热补丁比较难，暂时没学）&lt;/li>
&lt;li>如果软件版本升级，不用总是去重新下载安装包。&lt;/li>
&lt;li>从用户体验角度来说，软件能自动更新也是更方便使用的。&lt;/li>
&lt;/ol>
&lt;h2 id="软件自动更新方面我找到的一些参考">软件自动更新方面我找到的一些参考
&lt;/h2>&lt;p>&lt;a class="link" href="https://blog.csdn.net/danxuezx/article/details/83784318" target="_blank" rel="noopener"
>https://blog.csdn.net/danxuezx/article/details/83784318&lt;/a>
&lt;a class="link" href="https://www.cnblogs.com/lindexi/p/18426258" target="_blank" rel="noopener"
>https://www.cnblogs.com/lindexi/p/18426258&lt;/a> 【五颗星，很值得看】
&lt;a class="link" href="https://www.chromium.org/developers/design-documents/software-updates-courgette/" target="_blank" rel="noopener"
>https://www.chromium.org/developers/design-documents/software-updates-courgette/&lt;/a> 【谷歌的压缩编译压缩方法】
&lt;a class="link" href="https://github.com/wayne-1024/auto-upgrade" target="_blank" rel="noopener"
>https://github.com/wayne-1024/auto-upgrade&lt;/a> 【一个自动更新的代码仓库，就是比较旧了】
&lt;a class="link" href="https://github.com/vslavik/winsparkle?tab=readme-ov-file" target="_blank" rel="noopener"
>https://github.com/vslavik/winsparkle?tab=readme-ov-file&lt;/a> 【winsparkle 一个用于自动更新的框架】
&lt;a class="link" href="https://zhuanlan.zhihu.com/p/425845057" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/425845057&lt;/a> 【动态更新的知识，大佬】
&lt;a class="link" href="https://fugary.com/?p=523" target="_blank" rel="noopener"
>https://fugary.com/?p=523&lt;/a> 【比较详细的教程】
&lt;a class="link" href="https://www.cnblogs.com/CSSZBB/p/12882068.html" target="_blank" rel="noopener"
>https://www.cnblogs.com/CSSZBB/p/12882068.html&lt;/a> 【这个人自己写了一个发布更新程序，部署在他自己服务器，可供别人使用】&lt;/p>
&lt;h2 id="我自己写了一个自动更新的代码基于python-的">我自己写了一个自动更新的代码，基于python 的
&lt;/h2>&lt;p>主要分为（ 用于提供更新服务的后端 ， 有更新就下载文件进行更新的前端 ）&lt;/p>
&lt;ol>
&lt;li>首先需要在服务器端部署一个服务，这个服务主要用于两个功能，第一个功能就是你把新的版本上传给他，第二个功能就是，你的客户端每次启动的时候来访问一下这个服务，看看有没有更新可以用，如果有更新那么就下载更新，提供下载的功能&lt;/li>
&lt;li>前端也就是客户端，每次启动的时候都去检查一下，如果有更新了就下载更新，然后根据配置文件去本地找文件进行更新&lt;/li>
&lt;/ol>
&lt;h3 id="服务器端">服务器端
&lt;/h3>&lt;p>首先需要在服务器上面安装python环境，然后运行下面的代码（建议新建一个文件夹）&lt;/p>
&lt;p>flask 需要建议在后台运行，可以使用tmux&lt;/p>
&lt;p>&lt;strong>安装tmux&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt-get install tmux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new -s &lt;span class="o">[&lt;/span>会话名&lt;span class="o">]&lt;/span> &lt;span class="c1"># 新建会话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux a -t &lt;span class="o">[&lt;/span>会话名&lt;span class="o">]&lt;/span> &lt;span class="c1"># 进入会话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ctrl + b + d &lt;span class="c1"># 退出会话&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux kill-session -t 【会话名或编号】 &lt;span class="c1"># 杀死会话&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装conda&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bash Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> .bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>创建虚拟环境&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">conda create -n myenv &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda activate myenv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装flask&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install flask
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>flask程序&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># app.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">flask&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Flask&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">send_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hashlib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">werkzeug.utils&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">secure_filename&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Flask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;MAX_CONTENT_LENGTH&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1600&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1024&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1024&lt;/span> &lt;span class="c1"># 配置最大可上传的文件大小为1600MB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置文件存储路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">UPLOAD_FOLDER&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;updates&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CONFIG_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;update_config.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;UPLOAD_FOLDER&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UPLOAD_FOLDER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">ensure_upload_folder&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;确保上传文件夹存在&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UPLOAD_FOLDER&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UPLOAD_FOLDER&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;计算文件MD5哈希值&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">md5&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;rb&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">iter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">lambda&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hexdigest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">update_config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">notes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;更新配置文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">version&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;publish_notes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">notes&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;download_url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;/download/&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;file_hash&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;UPLOAD_FOLDER&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;keep_old_files&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;data.txt&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># 可以根据需要修改&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">CONFIG_FILE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">hello&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;Hello, Flask with Nginx!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/update_config&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_update_config&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;获取更新配置&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">CONFIG_FILE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;r&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">FileNotFoundError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Configuration file not found&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="mi">404&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/download/&amp;lt;filename&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">download_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;下载更新文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">send_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;UPLOAD_FOLDER&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">secure_filename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">as_attachment&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">FileNotFoundError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;File not found&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="mi">404&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/upload&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">methods&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;POST&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">upload_file&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;上传新版本&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;file&amp;#39;&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;No file part&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="mi">400&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">files&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;file&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">form&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">notes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">form&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;notes&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">filename&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;No selected file&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="mi">400&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ensure_upload_folder&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">filename&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">secure_filename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;UPLOAD_FOLDER&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">notes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jsonify&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;message&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Upload successful&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="mi">200&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">host&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;0.0.0.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">Flask==3.0.0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">gunicorn==21.2.0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">Werkzeug==3.0.0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在tmux 里面，使用 python app.py 运行起来，然后分离会话&lt;/p>
&lt;p>如果这一步没有问题的话，使用浏览器访问【域名:5000】，如果能访问到，说明后端程序已经配置成功了&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-1.jpg"
width="1912"
height="990"
srcset="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-1_hu6481346888982623093.jpg 480w, https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-1_hu15848661900953701244.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="463px"
>&lt;/p>
&lt;p>&lt;strong>nginx 配置&lt;/strong>&lt;/p>
&lt;p>上面光配置了flask的后端程序是不行，这样直接访问域名/ip是找不到的，还需要配置nginx做一个代理，让nginx去访问flask的后端程序&lt;/p>
&lt;p>首先你需要安装nginx,可以按照下面的步骤进行安装,&lt;code>注意，安装就可以了，不要启动nginx！！！&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ubuntu官方列表的Nginx版本不一定是最新的。所以请添加Nginx安装列表：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 这一步不是必须的，但建议执行，不然安装的Nginx版本会挺旧的。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">software&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">properties&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">common&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">repository&lt;/span> &lt;span class="n">ppa&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">nginx&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">stable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 更新列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">get&lt;/span> &lt;span class="n">update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装 Nginx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">get&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">nginx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">v&lt;/span> &lt;span class="c1"># 查看Nginx版本号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">dpkg&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">L&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="c1"># 查看Nginx安装位置，输出/usr/share/doc/nginx。其他文件在/etc/nginx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">dpkg&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="nb">list&lt;/span> &lt;span class="c1"># 查看已安装的包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">get&lt;/span> &lt;span class="n">remove&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">nginx&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">common&lt;/span> &lt;span class="c1"># 删除Nginx（保留配置文件)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">get&lt;/span> &lt;span class="n">purge&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">nginx&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">common&lt;/span> &lt;span class="c1"># 删除Nginx（且不保留配置文件)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">sudo&lt;/span> &lt;span class="n">apt&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">get&lt;/span> &lt;span class="n">autoremove&lt;/span> &lt;span class="c1"># 删除依赖（dependencies）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">service&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">status&lt;/span> &lt;span class="c1"># 查看Nginx状态，默认在运行ing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 此时访问服务器的IP地址即可看到&amp;#34;Welcome to nginx!&amp;#34;的页面&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 每次更新 Nginx 配置后，都建议重启一下 Nginx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">service&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">start&lt;/span> &lt;span class="c1"># Nginx启动命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">service&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">stop&lt;/span> &lt;span class="c1"># Nginx停止命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">$&lt;/span> &lt;span class="n">service&lt;/span> &lt;span class="n">nginx&lt;/span> &lt;span class="n">restart&lt;/span> &lt;span class="c1"># Nginx重启命令&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>nginx配置&lt;/strong>&lt;/p>
&lt;p>进入到配置文件中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vim /etc/nginx/sites-available/update-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改以下代码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1"># 也就是其他地方访问需要的端口，nginx默认是80，也就是不需要额外加端口可以访问,记得把防火墙打开，还要就是没有被其他程序占用，&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">server_name&lt;/span> &lt;span class="n">zata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cc&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1"># 自己的域名或者ip地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">location&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxy_pass&lt;/span> &lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mf">127.0.0.1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">5000&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1"># 需要代理的地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxy_set_header&lt;/span> &lt;span class="n">Host&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="n">host&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxy_set_header&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Real&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">IP&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="n">remote_addr&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">proxy_set_header&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Forwarded&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">For&lt;/span> &lt;span class="err">$&lt;/span>&lt;span class="n">proxy_add_x_forwarded_for&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后创建符号链接让配置生效&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建符号链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ln -s /etc/nginx/sites-available/update-server /etc/nginx/sites-enabled/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查看符号链接是否创建成功&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ls -l /etc/nginx/sites-enabled/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查看配置是否有问题&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nginx -t
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>启动nginx&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /etc/nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">servce nginx start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>再检查一下是否有问题&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nginx -t
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后直接访问域名或者ip&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-2.jpg"
width="1912"
height="989"
srcset="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-2_hu12797993564654212328.jpg 480w, https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-2_hu13175447722801819768.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="463px"
>&lt;/p>
&lt;p>可以看到不加端口也可以访问了
到这一步说明flask和nginx都配成功了，不过如果遇到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;lt;html&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;413 Request Entity Too Large&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;body&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;413 Request Entity Too Large&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;hr&amp;gt;&amp;lt;center&amp;gt;nginx/1.18.0 &lt;span class="o">(&lt;/span>Ubuntu&lt;span class="o">)&lt;/span>&amp;lt;/center&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;/body&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;/html&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个是由于nginx也有上传文件大小的要求，可以修改nginx的配置文件&lt;/p>
&lt;hr>
&lt;hr>
&lt;p>上传前需要准备代码文件和用于更新的配置文件
首先是代码文件，这个需要打包成.zip文件，然后解压之后就相当于安装目录下面的所有文件&lt;/p>
&lt;p>就比如这个文件夹，remote.zip里面的文件就是所有其他文件打包的&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0.jpg"
width="1211"
height="309"
srcset="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0_hu17735251345565424042.jpg 480w, https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0_hu11854757531484144467.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="391"
data-flex-basis="940px"
>&lt;/p>
&lt;p>然后是配置文件，这个文件是用来记录当前版本的信息，以及更新的信息,这个本地和远程都需要放，本地版本的配置文件里面的版本只有小于远程版本才会更新的&lt;/p>
&lt;p>测试时候上传服务器可以把版本调大一点&lt;/p>
&lt;p>// conf.json&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;keep_files&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;data.txt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;updater.py&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;publish_notes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;初始版本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>keep_files 是需要保留的文件，这些文件或者是文件夹不会倍更新
version 是当前版本的信息&lt;/p>
&lt;p>publish_notes 是更新的信息&lt;/p>
&lt;p>然后把这两个文件都上传到服务器上，然后就可以使用了&lt;/p>
&lt;p>&lt;strong>上传文件&lt;/strong>&lt;/p>
&lt;p>这里就使用windows的命令行进行上传，当然也可以使用其他方式&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST -F &lt;span class="s2">&amp;#34;zip_file=@remote.zip&amp;#34;&lt;/span> -F &lt;span class="s2">&amp;#34;config=@conf.json&amp;#34;&lt;/span> &lt;span class="o">[&lt;/span>your IP or domain&lt;span class="o">]&lt;/span>/upload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里上传之后就看客户端了&lt;/p>
&lt;hr>
&lt;h3 id="客户端">客户端
&lt;/h3>&lt;p>首先把这个程序放在客户端的安装目录下面 （注意修改你的ip或者域名）&lt;/p>
&lt;p>python文件打包成exe （单文件，无控制台）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller -F -w updater.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>客户端的程序&lt;/strong>&lt;/p>
&lt;h4 id="客户端更新程序">客户端更新程序
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # updater.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # updater.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hashlib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">shutil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">argparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">argparse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ArgumentParser&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;--host&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;XXX.XXX.XXX.XXX&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;服务器IP地址或域名&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse_args&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">YOUR_HOST&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">host&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">AutoUpdater&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;http://&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">YOUR_HOST&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/update_config&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">config_path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;update.json&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;r&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_version&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">load_config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;加载更新配置文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 远程配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;加载配置文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">check_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;检查是否需要更新&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;计算文件的MD5哈希值&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">md5&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;rb&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">iter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">lambda&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hexdigest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">download_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;下载更新文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 下载更新文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/update.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">download_route&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;download_url&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;http://&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">YOUR_HOST&lt;/span>&lt;span class="si">}{&lt;/span>&lt;span class="n">download_route&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stream&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;wb&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iter_content&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 验证文件哈希&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;file_hash&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;文件验证失败！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">update_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;下载更新失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">backup_files&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">backup_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;备份当前文件&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 备份当前目录下的所有文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;temp_update&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;updater.exe&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;launcher.exe&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;备份文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;应用更新&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 解压更新文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">unpack_archive&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 保留指定的旧文件和文件夹&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">keep_files&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;keep_files&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">keep_files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果文件在子文件夹中,需要创建对应的临时文件夹&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_dir_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">temp_dir_path&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;备份: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果是文件夹则整个复制&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 修改删除文件的部分，添加重试和错误处理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;backup&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;temp_update&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;updater.exe&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;launcher.exe&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 文件 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 正在使用中，将在重启后更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 目录 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 中的某些文件正在使用中，将在重启后更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;删除 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 时出错: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果需要重启，创建标记文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">need_restart&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;need_restart&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;部分文件需要在重启后完成更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span> &lt;span class="c1"># 仍然返回True，因为这是预期的行为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 复制新文件时添加错误处理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 无法复制文件 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">，可能需要重启后完成更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dirs_exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 无法复制目录 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">，可能需要重启后完成更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;复制 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 时出错: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 恢复需要保留的旧文件和文件夹&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">keep_files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果是带路径的文件,先创建目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">file_dir&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果是文件夹则整个恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;应用更新失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, 错误位置: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">__traceback__&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tb_lineno&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">行&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">cleanup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">backup_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;清理临时文件和备份&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;update.zip&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;update.zip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;清理文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;执行更新流程&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load_config&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check_update&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;当前已是最新版本&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;发现新版本: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新说明:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;publish_notes&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 下载更新&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">download_update&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">update_file&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;下载更新文件: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 备份当前文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">backup_files&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;备份完成&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 应用更新&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新失败，正在恢复备份...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;恢复备份成功&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cleanup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;恢复备份失败，请手动恢复&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 清理临时文件和备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cleanup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新完成！当前版本: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">updater&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoUpdater&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;成功&amp;#34;&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">update_result&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;失败&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新过程中发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">finally&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;按任意键退出...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此外，本地需要一个update.json文件，这个文件是用来记录当前版本的信息,这个和远程的内容是一样的，本地版本的配置文件里面的版本只有小于远程版本才会更新的&lt;/p>
&lt;p>例如：
&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-3.jpg"
width="774"
height="293"
srcset="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-3_hu10049738672660823742.jpg 480w, https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-3_hu9935634132463982826.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="264"
data-flex-basis="633px"
>&lt;/p>
&lt;p>测试：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-4.jpg"
width="1663"
height="660"
srcset="https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-4_hu8325431658423460918.jpg 480w, https://www.zata.cc/p/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/image/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/%E8%BD%AF%E4%BB%B6%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0-4_hu17208630585937358031.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="251"
data-flex-basis="604px"
>&lt;/p>
&lt;p>可以把上面的代码打包exe，然后运行，实际上就可以进行更新了，不过我们平常的使用方法应该是检查更新，如果没有更新就打开正常的界面，于是可以使用下面的代码&lt;/p>
&lt;p>&lt;strong>启动器代码&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">subprocess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">shutil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查是否有更新程序在运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">updater_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;updater.exe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">updater_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 运行更新程序&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subprocess&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">updater_path&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">check&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果更新成功且需要重启&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;need_restart&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 删除重启标记&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;need_restart&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 等待原程序完全退出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 完成未完成的更新操作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dirs&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">files&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">walk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 清理临时文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 启动主程序&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main_program&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;main.exe&amp;#34;&lt;/span> &lt;span class="c1"># 替换为你的主程序名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">main_program&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subprocess&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">main_program&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="更完善的更新程序更新和启动在一个文件里面">更完善的更新程序（更新和启动在一个文件里面）
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># updater.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hashlib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">shutil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">argparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">subprocess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">tk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">messagebox&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ttk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">psutil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">threading&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">argparse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ArgumentParser&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_argument&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;--host&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;XXX.XXX.XXX.XXX&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">help&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;服务器IP地址或域名&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse_args&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">YOUR_HOST&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">host&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TARGET_APP&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;launcher.exe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">AutoUpdater&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;http://&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">YOUR_HOST&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/update_config&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">config_path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;update.json&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;r&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_version&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">load_config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;加载配置文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">check_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">current_version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">md5&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;rb&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">iter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">lambda&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">hash_md5&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hexdigest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">download_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/update.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">download_route&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;download_url&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;http://&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">YOUR_HOST&lt;/span>&lt;span class="si">}{&lt;/span>&lt;span class="n">download_route&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">stream&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;wb&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iter_content&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calculate_file_hash&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;file_hash&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;文件验证失败！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">update_file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;下载更新失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">backup_files&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">backup_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;temp_update&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;updater.exe&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;launcher.exe&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;备份文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">unpack_archive&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">keep_files&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;keep_files&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">keep_files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_dir_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">temp_dir_path&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;备份: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;backup&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;temp_update&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;updater.exe&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;launcher.exe&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 文件 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 正在使用中，将在重启后更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 目录 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 中的某些文件正在使用中，将在重启后更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">need_restart&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;删除 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 时出错: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">need_restart&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;need_restart&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;部分文件需要在重启后完成更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">item&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">listdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">src&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">item&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 无法复制文件 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dst&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dirs_exist_ok&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">PermissionError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;警告: 无法复制目录 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;复制 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">src&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">dst&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 时出错: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">file&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">keep_files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_dir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">file_dir&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">makedirs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isdir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copytree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;应用更新失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, 错误位置: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">__traceback__&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tb_lineno&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">行&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">cleanup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">temp_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;temp_update&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">backup_dir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">backup_dir&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;update.zip&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;update.zip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;清理文件失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load_config&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check_update&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;当前已是最新版本&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;发现新版本: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新说明:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;publish_notes&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">download_update&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">update_file&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;下载更新文件: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">backup_files&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;备份完成&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_file&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新失败，正在恢复备份...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;backup&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;恢复备份成功&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cleanup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;恢复备份失败，请手动恢复&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cleanup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新完成！当前版本: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">is_process_running&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">process_name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">proc&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">psutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">process_iter&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s1">&amp;#39;name&amp;#39;&lt;/span>&lt;span class="p">]):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">proc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">info&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;name&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lower&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">process_name&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lower&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">psutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">NoSuchProcess&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">psutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AccessDenied&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">psutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ZombieProcess&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">start_target_app&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subprocess&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Popen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;找不到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">，请确保文件存在！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;启动 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">show_updating_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">callback&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Toplevel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;300x100&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">resizable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Center the window&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update_idletasks&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">winfo_width&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">winfo_height&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">winfo_screenwidth&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">width&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">winfo_screenheight&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">height&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;+&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">+&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">label&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_window&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;正在更新，请稍候...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">label&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">progress&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Progressbar&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">update_window&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;indeterminate&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">progress&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pady&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">padx&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;x&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">progress&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Run update in a separate thread&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">run_update&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">after&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">lambda&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">finish_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_window&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">callback&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">thread&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">threading&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Thread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">run_update&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">thread&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">update_window&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">finish_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_window&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">callback&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">update_window&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">destroy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">callback&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Tk&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">withdraw&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">updater&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoUpdater&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load_config&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;无法加载更新配置，请检查网络或服务器状态&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check_update&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># messagebox.showinfo(&amp;#34;更新结果&amp;#34;, &amp;#34;当前已是最新版本&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_target_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">is_process_running&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">askyesno&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;提示&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">TARGET_APP&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 正在运行，请关闭它以继续更新。&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">是否重试？&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">destroy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update_callback&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showinfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新成功！当前版本: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">updater&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;version&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_target_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;更新结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;更新失败，请查看日志或联系管理员&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Show updating window and run update in thread&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">show_updating_window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">updater&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">update_callback&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mainloop&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># Keep the GUI running&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># Exit after mainloop ends&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;更新过程中发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">destroy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>