<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>笔记 on Air1</title><link>https://blog.air1.cn/categories/%E7%AC%94%E8%AE%B0/</link><description>Recent content in 笔记 on Air1</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Mon, 06 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.air1.cn/categories/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>Air1 TempFile 重构记录</title><link>https://blog.air1.cn/air1-tempfile-rewrite-notes/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/air1-tempfile-rewrite-notes/</guid><description>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>仓库&lt;/td>
&lt;td>&lt;a href="https://github.com/haenlau/TempFile">https://github.com/haenlau/TempFile&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>线上地址&lt;/td>
&lt;td>&lt;a href="https://tmp.air1.cn/">https://tmp.air1.cn/&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>当前部署&lt;/td>
&lt;td>Cloudflare Pages + Pages Functions / Advanced Worker，GitHub 自动构建&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>最新状态&lt;/td>
&lt;td>已回退到最大上传 99 MiB 的稳定版本&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>记录 Air1 TempFile 从&amp;quot;手动粘贴 Worker JS 部署&amp;quot;改造成&amp;quot;GitHub 推送 + Cloudflare Pages 自动构建&amp;quot;的过程，也记录了后来尝试 WebDAV 分片大文件上传、发现问题、最终回退到 99 MiB 稳定版本的完整经过。&lt;/p>
&lt;hr>
&lt;h2 id="1-项目背景">1. 项目背景&lt;/h2>
&lt;p>Air1 TempFile 是一个部署在 Cloudflare 上的临时文件上传工具，用于快速分享文件，7 天自动销毁。&lt;/p>
&lt;p>当前版本核心策略：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>最大上传限制&lt;/td>
&lt;td>99 MiB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>小文件存储&lt;/td>
&lt;td>Cloudflare KV（≤24 MiB）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>可选大文件后端&lt;/td>
&lt;td>R2、S3、WebDAV（24 MiB - 99 MiB）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>超过 99 MiB&lt;/td>
&lt;td>直接拒绝，不分片，不妥协&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>上传接口&lt;/td>
&lt;td>公开，无需口令&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部署方式&lt;/td>
&lt;td>GitHub 推送 → Cloudflare 自动构建&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>一句话：&lt;strong>当前目标不是做超大文件传输工具，而是做一个稳定、轻量、适合临时分享的文件中转站。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="2-改造前状态">2. 改造前状态&lt;/h2>
&lt;p>最初项目是一个直接部署在 Cloudflare Workers 上的单文件 JS，使用方式是：&lt;/p>
&lt;ol>
&lt;li>代码由千问网页生成&lt;/li>
&lt;li>手动粘贴到 Cloudflare Worker 编辑器&lt;/li>
&lt;li>在 Dashboard 绑定 KV 空间和变量&lt;/li>
&lt;li>绑定自定义域名&lt;/li>
&lt;/ol>
&lt;p>当时用到的变量：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>变量名&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>UPLOAD_TOKEN&lt;/code>&lt;/td>
&lt;td>上传令牌（实际并未被前端使用）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>WEBDAV_ACCOUNT&lt;/code>&lt;/td>
&lt;td>WebDAV 账号&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>WEBDAV_PASSWORD&lt;/code>&lt;/td>
&lt;td>WebDAV 密码&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>WECOM_WEBHOOK_URL&lt;/code>&lt;/td>
&lt;td>企业微信 Webhook&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>TEMP_STORE&lt;/code>&lt;/td>
&lt;td>KV 空间绑定&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="改造动机">改造动机&lt;/h3>
&lt;ul>
&lt;li>每次改代码都要手动粘贴，繁琐且容易出错&lt;/li>
&lt;li>没有版本管理，改坏了无法回退&lt;/li>
&lt;li>无法多人协作&lt;/li>
&lt;li>无法自动构建和部署&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-改造目标">3. 改造目标&lt;/h2>
&lt;ul>
&lt;li>✅ GitHub 仓库化管理&lt;/li>
&lt;li>✅ Cloudflare Pages 自动构建（GitHub 推送即部署）&lt;/li>
&lt;li>✅ 保持旧版 Air1 TempFile 前端样式不变&lt;/li>
&lt;li>✅ 去掉上传口令逻辑，保持公开上传&lt;/li>
&lt;li>✅ 不提交 &lt;code>wrangler.toml&lt;/code>，绑定通过 Dashboard 管理&lt;/li>
&lt;li>✅ 保留 KV、R2、S3、WebDAV 多种后端支持&lt;/li>
&lt;li>✅ 支持企业微信 / Telegram 通知&lt;/li>
&lt;/ul>
&lt;h3 id="为什么不提交-wranglertoml">为什么不提交 wrangler.toml&lt;/h3>
&lt;p>这是本项目的一个重要约定：&lt;/p>
&lt;ul>
&lt;li>维护者习惯通过 Cloudflare Dashboard 管理 KV、R2、环境变量和 Secrets&lt;/li>
&lt;li>如果绑定由 &lt;code>wrangler.toml&lt;/code> 管理，Dashboard 会提示&amp;quot;由配置文件管理&amp;quot;，不便 Web UI 修改&lt;/li>
&lt;li>当前项目的维护方式以 Dashboard 为主&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-cloudflare-pages-构建配置">4. Cloudflare Pages 构建配置&lt;/h2>
&lt;p>在 Cloudflare Dashboard 新建 Pages 项目并连接 GitHub 仓库 &lt;code>haenlau/TempFile&lt;/code>：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Framework preset&lt;/td>
&lt;td>None&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Install command&lt;/td>
&lt;td>&lt;code>npm ci&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Build command&lt;/td>
&lt;td>&lt;code>npm run build&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Build output directory&lt;/td>
&lt;td>&lt;code>dist&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node.js version&lt;/td>
&lt;td>20 或 22&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>进入 &lt;strong>Settings → Functions&lt;/strong> 设置：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compatibility date&lt;/strong>：&lt;code>2026-07-06&lt;/code> 或更新日期&lt;/li>
&lt;li>KV、R2、环境变量、Secrets 通过 Dashboard 添加&lt;/li>
&lt;/ul>
&lt;h3 id="域名绑定">域名绑定&lt;/h3>
&lt;p>绑定 &lt;code>tmp.air1.cn&lt;/code> 到 Pages 项目。&lt;/p>
&lt;blockquote>
&lt;p>⚠️ 如果旧 Worker route 仍然绑定这个域名，需要先移除旧 route，否则路由冲突。&lt;/p>&lt;/blockquote>
&lt;h3 id="github-仓库">GitHub 仓库&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub 仓库&lt;/td>
&lt;td>&lt;code>haenlau/TempFile&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>本地开发路径&lt;/td>
&lt;td>&lt;code>本地项目路径/TempFile&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="5-当前项目结构">5. 当前项目结构&lt;/h2>
&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">src/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── index.ts # Worker 入口、路由和上传流程
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── html.ts # 旧版上传页面
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── config.ts # 运行时固定配置和环境变量解析
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── storage.ts # KV / R2 / S3 / WebDAV 存储与下载逻辑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── r2.ts # Cloudflare R2 后端
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── s3.ts # S3 / S3-compatible 后端
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── webdav.ts # WebDAV 后端
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── notify.ts # 企业微信 / Telegram 通知
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── download-page.ts # 下载链接不存在或过期提示页
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── utils.ts # 通用工具函数
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有分片上传接口相关代码。&lt;/p>
&lt;hr>
&lt;h2 id="6-存储策略">6. 存储策略&lt;/h2>
&lt;h3 id="61-小文件24-mib">6.1 小文件（≤24 MiB）&lt;/h3>
&lt;ul>
&lt;li>直接写入 &lt;code>TEMP_STORE&lt;/code> KV&lt;/li>
&lt;li>文件内容和 metadata 都在 KV 中&lt;/li>
&lt;li>下载时直接从 KV 返回&lt;/li>
&lt;/ul>
&lt;h3 id="62-中等文件24-mib--大小--99-mib">6.2 中等文件（24 MiB &amp;lt; 大小 ≤ 99 MiB）&lt;/h3>
&lt;ul>
&lt;li>必须配置 &lt;code>LARGE_STORAGE_BACKEND&lt;/code>&lt;/li>
&lt;li>可选后端：&lt;code>r2&lt;/code>、&lt;code>s3&lt;/code>、&lt;code>webdav&lt;/code>&lt;/li>
&lt;li>文件本体写入后端，KV 只保存短链索引和 metadata&lt;/li>
&lt;/ul>
&lt;h3 id="63-超过-99-mib">6.3 超过 99 MiB&lt;/h3>
&lt;ul>
&lt;li>前端直接提示不能超过 99MB&lt;/li>
&lt;li>后端也会拒绝&lt;/li>
&lt;li>不会尝试分片上传&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="7-上传接口">7. 上传接口&lt;/h2>
&lt;h3 id="71-普通上传">7.1 普通上传&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-http" data-lang="http">&lt;span class="line">&lt;span class="cl">&lt;span class="err">POST /api/upload-public
&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-http" data-lang="http">&lt;span class="line">&lt;span class="cl">&lt;span class="err">POST /api/upload
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>要求&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>multipart/form-data&lt;/code>&lt;/li>
&lt;li>文件字段名：&lt;code>file&lt;/code>&lt;/li>
&lt;li>支持多文件&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>限制&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>单文件 ≤ 99 MiB&lt;/li>
&lt;li>单次上传总大小 ≤ 99 MiB&lt;/li>
&lt;li>多文件 ZIP 后也不能超过 99 MiB&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>成功返回示例&lt;/strong>：&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="nt">&amp;#34;downloadUrl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://tmp.air1.cn/abc123&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;fileId&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;abc123&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;filename&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;example.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="nt">&amp;#34;size&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">123456&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;storage&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;kv&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;expiresAt&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-07-13T06:39:58.220Z&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;h3 id="72-当前不存在的接口">7.2 当前不存在的接口&lt;/h3>
&lt;p>以下分片接口已经回退，不再存在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-http" data-lang="http">&lt;span class="line">&lt;span class="cl">&lt;span class="err">POST /api/upload/chunk/init
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">PUT /api/upload/chunk/{uploadId}/{index}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">POST /api/upload/chunk/complete
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="8-下载接口">8. 下载接口&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-http" data-lang="http">&lt;span class="line">&lt;span class="cl">&lt;span class="err">GET /{id}
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>短链规则&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>6 位，数字 + 小写字母&lt;/li>
&lt;li>字符集：&lt;code>0123456789abcdefghijklmnopqrstuvwxyz&lt;/code>&lt;/li>
&lt;li>示例：&lt;code>psf5i7&lt;/code>、&lt;code>2nofgm&lt;/code>&lt;/li>
&lt;li>兼容旧链接（旧的 10-32 位字母数字 ID 仍然可访问）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>下载响应设置&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>Content-Type&lt;/code>&lt;/li>
&lt;li>&lt;code>Content-Disposition&lt;/code>&lt;/li>
&lt;li>&lt;code>Cache-Control: no-store&lt;/code>&lt;/li>
&lt;li>&lt;code>X-Content-Type-Options: nosniff&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>过期提示&lt;/strong>：链接不存在或过期时返回中文提示页（&lt;code>src/download-page.ts&lt;/code>）&lt;/p>
&lt;hr>
&lt;h2 id="9-通知系统">9. 通知系统&lt;/h2>
&lt;p>支持两种通知渠道，可单独启用或同时启用。&lt;/p>
&lt;h3 id="企业微信">企业微信&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>变量&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>WECOM_WEBHOOK_URL&lt;/code>&lt;/td>
&lt;td>企业微信机器人 Webhook 地址&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="telegram">Telegram&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>变量&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>TELEGRAM_BOT_TOKEN&lt;/code>&lt;/td>
&lt;td>Bot Token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>TELEGRAM_CHAT_ID&lt;/code>&lt;/td>
&lt;td>接收通知的 Chat ID&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>⚠️ 两个变量必须成对配置，只填一个会导致通知失败。通知失败不会影响上传结果。&lt;/p>&lt;/blockquote>
&lt;h3 id="通知模板">通知模板&lt;/h3>
&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">Air1 TempFile：新文件上传
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">文件名：upload.zip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">大小：1.20 MB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">存储：KV
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">上传 IP：203.0.113.10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">时间：2026/7/6 14:02:45
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">过期：2026/7/13 14:02:44
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">下载地址：https://tmp.air1.cn/abc123
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通知通过 &lt;code>ctx.waitUntil(...)&lt;/code> 在后台发送，&lt;strong>成功或失败都不在前端提示&lt;/strong>，只在运行日志中记录。&lt;/p>
&lt;hr>
&lt;h2 id="10-webdav-分片上传--一次不成功的尝试">10. WebDAV 分片上传 — 一次不成功的尝试&lt;/h2>
&lt;blockquote>
&lt;p>这一段是历史记录，不是当前功能。&lt;/p>&lt;/blockquote>
&lt;h3 id="想法">想法&lt;/h3>
&lt;ul>
&lt;li>上传上限改为 2 GiB&lt;/li>
&lt;li>单文件超过 99MB 走 WebDAV 分片&lt;/li>
&lt;li>分片大小 48 MiB&lt;/li>
&lt;li>KV 保存分片上传会话&lt;/li>
&lt;li>每片上传成功后写 KV 收据&lt;/li>
&lt;li>完成后生成短链&lt;/li>
&lt;/ul>
&lt;h3 id="第一次方案下载时流式拼接">第一次方案：下载时流式拼接&lt;/h3>
&lt;p>下载时 Worker 按顺序读取 WebDAV 分片，用响应流拼接给浏览器。&lt;/p>
&lt;p>&lt;strong>问题&lt;/strong>：真实环境里下载时只拿到一个分片。同一个链接反复下载会得到不同分片，浏览器本地得到多个残缺文件。&lt;/p>
&lt;h3 id="第二次方案transformstream">第二次方案：TransformStream&lt;/h3>
&lt;p>改成 &lt;code>TransformStream + writer.write()&lt;/code>，希望通过背压顺序写出所有分片。&lt;/p>
&lt;p>&lt;strong>问题&lt;/strong>：本地测试通过，真实 Cloudflare 环境仍然不可靠。&lt;/p>
&lt;h3 id="第三次方案上传完成时合并">第三次方案：上传完成时合并&lt;/h3>
&lt;p>上传完成时把 WebDAV 分片合并成完整文件，下载只下载完整文件。&lt;/p>
&lt;p>&lt;strong>问题&lt;/strong>：合并过程发生在 &lt;code>complete&lt;/code> 请求里，WebDAV 较慢时容易导致前端 &lt;code>Network connection lost&lt;/code>，用户体验变差。&lt;/p>
&lt;h3 id="教训">教训&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>WebDAV 不是为浏览器大文件分片上传设计的协议&lt;/strong>&lt;/li>
&lt;li>Worker 中转分片并在边缘环境里合并大文件，容易遇到平台和网络边界&lt;/li>
&lt;li>为了一个临时文件工具把系统复杂度推到这个程度不值得&lt;/li>
&lt;/ul>
&lt;h3 id="回退">回退&lt;/h3>
&lt;p>最终回退到 99 MiB 稳定版本，三个回退提交：&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">3548f26 Revert &amp;#34;Merge WebDAV chunks before download&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">f988268 Revert &amp;#34;Fix chunked WebDAV downloads&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5b414ce Revert &amp;#34;Add WebDAV chunked uploads&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="11-当前推荐配置">11. 当前推荐配置&lt;/h2>
&lt;h3 id="111-最稳配置--仅-kv24-mib">11.1 最稳配置 — 仅 KV（≤24 MiB）&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>KV namespace binding&lt;/td>
&lt;td>&lt;code>TEMP_STORE&lt;/code>&lt;/td>
&lt;td>小文件内容与 metadata 均写入 KV&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="112-推荐中等文件配置--kv--r299-mib">11.2 推荐中等文件配置 — KV + R2（≤99 MiB）&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>KV namespace binding&lt;/td>
&lt;td>&lt;code>TEMP_STORE&lt;/code>&lt;/td>
&lt;td>保存短链索引和 metadata&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>R2 bucket binding&lt;/td>
&lt;td>&lt;code>R2_BUCKET&lt;/code>&lt;/td>
&lt;td>保存 24 MiB 以上文件本体&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Environment variable&lt;/td>
&lt;td>&lt;code>LARGE_STORAGE_BACKEND=r2&lt;/code>&lt;/td>
&lt;td>指定大文件后端为 R2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>可选变量&lt;/td>
&lt;td>&lt;code>PUBLIC_BASE_URL=https://tmp.air1.cn/&lt;/code>&lt;/td>
&lt;td>强制返回正式下载域名&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="113-webdav-配置24-mib---99-mib">11.3 WebDAV 配置（24 MiB - 99 MiB）&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>KV namespace binding&lt;/td>
&lt;td>&lt;code>TEMP_STORE&lt;/code>&lt;/td>
&lt;td>保存短链索引和 metadata&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Environment variable&lt;/td>
&lt;td>&lt;code>LARGE_STORAGE_BACKEND=webdav&lt;/code>&lt;/td>
&lt;td>指定大文件后端为 WebDAV&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Environment variable&lt;/td>
&lt;td>&lt;code>WEBDAV_URL=https://your-webdav-host/path/&lt;/code>&lt;/td>
&lt;td>WebDAV 根地址&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Secret&lt;/td>
&lt;td>&lt;code>WEBDAV_ACCOUNT=...&lt;/code>&lt;/td>
&lt;td>WebDAV 账号&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Secret&lt;/td>
&lt;td>&lt;code>WEBDAV_PASSWORD=***&lt;/code>&lt;/td>
&lt;td>WebDAV 密码&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>注意：当前 WebDAV 不是分片模式，超过 99 MiB 仍然会拒绝。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="12-上传-ip-获取">12. 上传 IP 获取&lt;/h2>
&lt;p>后端按以下顺序获取上传 IP：&lt;/p>
&lt;ol>
&lt;li>&lt;code>CF-Connecting-IP&lt;/code>&lt;/li>
&lt;li>&lt;code>True-Client-IP&lt;/code>&lt;/li>
&lt;li>&lt;code>X-Forwarded-For&lt;/code> 第一个 IP&lt;/li>
&lt;li>&lt;code>unknown&lt;/code>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="13-本地开发">13. 本地开发&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">npm install &lt;span class="c1"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run typecheck &lt;span class="c1"># TypeScript 类型检查&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build &lt;span class="c1"># esbuild 打包生成 dist/_worker.js&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev &lt;span class="c1"># 本地启动 Cloudflare Pages runtime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run deploy &lt;span class="c1"># 手动部署到 Cloudflare Pages&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="本地-devvars-示例">本地 .dev.vars 示例&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">LARGE_STORAGE_BACKEND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">webdav&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WEBDAV_URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">https://example.com/dav/tempfile/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WEBDAV_ACCOUNT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">your-webdav-account&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WEBDAV_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">your-webdav-password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">PUBLIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">http://localhost:8788/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="14-排障指南">14. 排障指南&lt;/h2>
&lt;h3 id="超过-24mib-上传失败">超过 24MiB 上传失败&lt;/h3>
&lt;p>检查 &lt;code>LARGE_STORAGE_BACKEND&lt;/code> 是否配置。未配置时超过 KV 阈值会失败。&lt;/p>
&lt;h3 id="超过-99mib-上传失败">超过 99MiB 上传失败&lt;/h3>
&lt;p>当前预期行为。当前版本最大只支持 99 MiB，不是 bug。&lt;/p>
&lt;h3 id="上传成功但通知没收到">上传成功但通知没收到&lt;/h3>
&lt;p>检查 &lt;code>WECOM_WEBHOOK_URL&lt;/code>、&lt;code>TELEGRAM_BOT_TOKEN&lt;/code>、&lt;code>TELEGRAM_CHAT_ID&lt;/code>。通知失败不会影响上传，看 Cloudflare Functions 日志排查。&lt;/p>
&lt;h3 id="下载链接显示过期页">下载链接显示过期页&lt;/h3>
&lt;p>可能原因：&lt;/p>
&lt;ul>
&lt;li>KV 记录过期&lt;/li>
&lt;li>KV namespace 绑定错误&lt;/li>
&lt;li>生产环境和预览环境绑定了不同 KV&lt;/li>
&lt;li>后端对象被清理&lt;/li>
&lt;li>短链 ID 不存在&lt;/li>
&lt;/ul>
&lt;h3 id="返回链接域名不是-tmpair1cn">返回链接域名不是 tmp.air1.cn&lt;/h3>
&lt;p>检查 &lt;code>PUBLIC_BASE_URL&lt;/code>。如果需要强制返回正式域名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">PUBLIC_BASE_URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">https://tmp.air1.cn/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="15-如果未来要支持大文件">15. 如果未来要支持大文件&lt;/h2>
&lt;p>不要再优先走 WebDAV 分片，更合理的方向是 &lt;strong>R2 Multipart Upload&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>R2 是 Cloudflare 原生对象存储，支持 multipart upload&lt;/li>
&lt;li>浏览器分片上传到 Worker，Worker 调用 R2 multipart API 上传 part&lt;/li>
&lt;li>R2 服务端完成合并，下载时是单个完整对象&lt;/li>
&lt;li>不需要 WebDAV 分片拼接，不需要 Worker 自己下载分片再合并&lt;/li>
&lt;/ul>
&lt;p>但注意：这应该作为独立大版本设计，不能在当前稳定分支里仓促加入。&lt;/p>
&lt;hr>
&lt;h2 id="16-重要提交记录">16. 重要提交记录&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>提交&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>5b414ce&lt;/code>&lt;/td>
&lt;td>&lt;strong>当前最新&lt;/strong> — Revert &amp;ldquo;Add WebDAV chunked uploads&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>c80d1ac&lt;/code>&lt;/td>
&lt;td>Shorten download ids&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>bc446ce&lt;/code>&lt;/td>
&lt;td>Add expired download page&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>d2d6473&lt;/code>&lt;/td>
&lt;td>Localize upload notifications&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;del>&lt;code>c5fec03&lt;/code>&lt;/del>&lt;/td>
&lt;td>&lt;del>已回退 — Add WebDAV chunked uploads&lt;/del>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;del>&lt;code>c90a8a7&lt;/code>&lt;/del>&lt;/td>
&lt;td>&lt;del>已回退 — Fix chunked WebDAV downloads&lt;/del>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;del>&lt;code>b5d1cba&lt;/code>&lt;/del>&lt;/td>
&lt;td>&lt;del>已回退 — Merge WebDAV chunks before download&lt;/del>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="17-总结">17. 总结&lt;/h2>
&lt;p>截至本文，Air1 TempFile 项目的关键状态：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th style="text-align: center">状态&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>GitHub 仓库化&lt;/td>
&lt;td style="text-align: center">✅ 已完成&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cloudflare Pages 自动构建&lt;/td>
&lt;td style="text-align: center">✅ 已完成&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>不使用 wrangler.toml&lt;/td>
&lt;td style="text-align: center">✅ Dashboard 管理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>前端保持旧版样式&lt;/td>
&lt;td style="text-align: center">✅ 已保留&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>上传接口公开&lt;/td>
&lt;td style="text-align: center">✅ 无口令&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>KV 小文件存储&lt;/td>
&lt;td style="text-align: center">✅ 正常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>R2/S3/WebDAV 中文件后端&lt;/td>
&lt;td style="text-align: center">✅ 可用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>通知（企业微信/Telegram）&lt;/td>
&lt;td style="text-align: center">✅ 已支持&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>下载短链（6 位字母数字）&lt;/td>
&lt;td style="text-align: center">✅ 已启用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>最大上传 99 MiB&lt;/td>
&lt;td style="text-align: center">✅ 已稳定&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WebDAV 分片上传&lt;/td>
&lt;td style="text-align: center">❌ 已回退&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2GB 大文件上传&lt;/td>
&lt;td style="text-align: center">❌ 不属于当前版本能力&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>核心维护原则：&lt;strong>稳定优先，最大上传 99 MiB，不再用 WebDAV 硬撑超大文件。&lt;/strong>&lt;/p></description></item><item><title>机房巡检系统架构说明</title><link>https://blog.air1.cn/inspection-system-architecture/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/inspection-system-architecture/</guid><description>&lt;h2 id="系统概述">系统概述&lt;/h2>
&lt;p>为生产机房值班监控开发的 B/S 架构巡检系统。核心流程：前端采集 20 个巡检点数据 → 图片压缩 → 生成 Word 报告 → 上传 SMB 共享目录归档。&lt;/p>
&lt;p>技术栈：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件&lt;/th>
&lt;th>技术&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>后端&lt;/td>
&lt;td>Python FastAPI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>前端&lt;/td>
&lt;td>Vue 3 + Element Plus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据库&lt;/td>
&lt;td>SQLite&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>图片处理&lt;/td>
&lt;td>Pillow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>文档生成&lt;/td>
&lt;td>python-docx&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>远程传输&lt;/td>
&lt;td>smbprotocol&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部署&lt;/td>
&lt;td>Nginx + Systemd&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="服务器配置">服务器配置&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>IP 地址&lt;/td>
&lt;td>&lt;code>YOUR_SERVER_IP&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作系统&lt;/td>
&lt;td>Ubuntu 26.04 LTS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Python&lt;/td>
&lt;td>3.14.4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node.js&lt;/td>
&lt;td>22.23.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内存&lt;/td>
&lt;td>7.2 GB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>磁盘&lt;/td>
&lt;td>62 GB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU&lt;/td>
&lt;td>4 核&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>访问入口：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>服务&lt;/th>
&lt;th>地址&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>前端页面&lt;/td>
&lt;td>&lt;code>http://YOUR_SERVER_IP&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>API 文档&lt;/td>
&lt;td>&lt;code>http://YOUR_SERVER_IP/api/docs&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>健康检查&lt;/td>
&lt;td>&lt;code>http://YOUR_SERVER_IP/api/health&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>SMB 共享配置：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>服务器&lt;/td>
&lt;td>&lt;code>YOUR_SMB_SERVER&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>共享名&lt;/td>
&lt;td>&lt;code>YOUR_SHARE_NAME&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>用户名&lt;/td>
&lt;td>&lt;code>YOUR_DOMAIN\YOUR_USER&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>密码&lt;/td>
&lt;td>&lt;code>YOUR_PASSWORD&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="目录结构">目录结构&lt;/h2>
&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">/opt/inspection/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── backend/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── app/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── main.py # FastAPI 入口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── config.py # 配置
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── database.py # 数据库连接
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── models.py # SQLAlchemy 模型
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── schemas.py # Pydantic 模型（20 个巡检点定义）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── api/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ├── shift.py # 班次信息接口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ ├── inspection.py # 提交/查询接口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │ └── upload.py # 图片上传接口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── services/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── image_processor.py # Pillow 图片压缩
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── report_generator.py # Word 报告生成
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── smb_writer.py # SMB 写入
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── cleanup.py # 临时文件清理
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── data/ # SQLite 数据库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── reports/ # 生成的报告
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── tmp/ # 临时文件（图片）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── frontend/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── src/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── App.vue # 主页面
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── main.js # 入口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── utils/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── api.js # API 调用
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── definitions.js # 巡检点定义
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── dist/ # 构建产物
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── package.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── vite.config.js
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── deploy.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="巡检点清单20-个">巡检点清单（20 个）&lt;/h2>
&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>1&lt;/td>
&lt;td>办公机房环境&lt;/td>
&lt;td>温度+湿度&lt;/td>
&lt;td>温度 18-27℃ / 湿度 35%-60%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>办公机房消防&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无故障灯告警&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Prometheus&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>运行正常 / 各设备在线&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Zabbix&lt;/td>
&lt;td>状态+流量&lt;/td>
&lt;td>运行正常 / 各设备流量正常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>主动威胁欺骗防御系统（谛听）&lt;/td>
&lt;td>状态+数值&lt;/td>
&lt;td>无新增事件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>云工作负载保护平台（牧云）&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无外部或明显恶意行为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>官网华为防火墙（6630E）&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>流量统计 10 Mbps-60 Mbps&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>长亭 WEB 应用防火墙（雷池）&lt;/td>
&lt;td>状态+数值&lt;/td>
&lt;td>无外部或明显恶意行为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>绿盟 WEB 应用防火墙（WAF）&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无外部或明显恶意行为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10&lt;/td>
&lt;td>北单外网 TLS 防火墙（6625F）&lt;/td>
&lt;td>数值&lt;/td>
&lt;td>CT 和 CNC 均 0.8 Mbps 左右&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>11&lt;/td>
&lt;td>北单 K8S 负载均衡连接数&lt;/td>
&lt;td>数值&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>12&lt;/td>
&lt;td>北单 TiDB 负载均衡连接数&lt;/td>
&lt;td>数值&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>13&lt;/td>
&lt;td>威胁监测与分析系统（天眼）&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无外部或外访恶意行为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>14&lt;/td>
&lt;td>综合监控大屏&lt;/td>
&lt;td>状态×3&lt;/td>
&lt;td>各模块运行正常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>15&lt;/td>
&lt;td>NTP 服务器&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>卫星数量正常，时间无偏移&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>16&lt;/td>
&lt;td>生产机房环境&lt;/td>
&lt;td>温度+湿度&lt;/td>
&lt;td>温度 18-27℃ / 湿度 35%-60%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>17&lt;/td>
&lt;td>计通监控平台&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无新增事件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>18&lt;/td>
&lt;td>电池室环境&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无渗漏无异常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>19&lt;/td>
&lt;td>柴油发电机&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>候命中，无漏油&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>20&lt;/td>
&lt;td>生产机房消防&lt;/td>
&lt;td>状态&lt;/td>
&lt;td>无故障灯告警&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>字段类型说明：&lt;/p>
&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;code>status&lt;/code>&lt;/td>
&lt;td>正常/异常单选&lt;/td>
&lt;td>Radio.Group&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>numeric&lt;/code>&lt;/td>
&lt;td>必填数值&lt;/td>
&lt;td>InputNumber&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>numeric_optional&lt;/code>&lt;/td>
&lt;td>选填数值&lt;/td>
&lt;td>InputNumber&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>条件高亮规则：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>条件&lt;/th>
&lt;th>效果&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>状态异常&lt;/td>
&lt;td>整行红底&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>温湿度异常（超出基线）&lt;/td>
&lt;td>整行黄底&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CNC 数量 &amp;gt; 0&lt;/td>
&lt;td>数值红字 + 二次确认弹窗&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="api-接口">API 接口&lt;/h2>
&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>GET&lt;/td>
&lt;td>&lt;code>/api/health&lt;/code>&lt;/td>
&lt;td>健康检查&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>&lt;code>/api/shift-info&lt;/code>&lt;/td>
&lt;td>获取班次信息&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>&lt;code>/api/smb-paths&lt;/code>&lt;/td>
&lt;td>获取 SMB 路径选项&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>&lt;code>/api/upload-image&lt;/code>&lt;/td>
&lt;td>上传图片&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>POST&lt;/td>
&lt;td>&lt;code>/api/inspection/submit&lt;/code>&lt;/td>
&lt;td>提交巡检记录&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>&lt;code>/api/report/{record_id}&lt;/code>&lt;/td>
&lt;td>下载报告&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GET&lt;/td>
&lt;td>&lt;code>/api/inspection/records&lt;/code>&lt;/td>
&lt;td>获取巡检记录列表&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="提交巡检请求体示例">提交巡检请求体示例&lt;/h3>
&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;record_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-06-23&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;shift&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;morning&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;inspector_name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;YOUR_NAME&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;points&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;p01_office_env&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nt">&amp;#34;temp_status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;normal&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;humidity_status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;normal&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;p02_office_fire&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nt">&amp;#34;status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;normal&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="nt">&amp;#34;remarks&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;p02_office_fire&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="nt">&amp;#34;image_temp_paths&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;p01_office_env&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;/tmp/xxx/yyy.jpg&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="nt">&amp;#34;smb_path&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;\\\\YOUR_SMB_SERVER\\YOUR_SHARE_NAME\\YOUR_NAME&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;skip_smb&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&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;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>smb_path&lt;/code>&lt;/td>
&lt;td>支持完整 UNC 路径或相对路径&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>skip_smb&lt;/code>&lt;/td>
&lt;td>为 &lt;code>true&lt;/code> 时只生成报告，不上传 SMB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="服务管理">服务管理&lt;/h2>
&lt;h3 id="状态检查">状态检查&lt;/h3>
&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">systemctl status inspection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl status nginx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl is-enabled inspection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="启停操作">启停操作&lt;/h3>
&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">systemctl restart inspection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl stop inspection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl start inspection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="日志查看">日志查看&lt;/h3>
&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">journalctl -u inspection -f
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">journalctl -u inspection -n &lt;span class="m">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tail -f /var/log/nginx/access.log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="systemd-服务配置">Systemd 服务配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">Inspection System Backend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">network.target&lt;/span>
&lt;/span>&lt;/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">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">User&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">root&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WorkingDirectory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/opt/inspection/backend&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/usr/bin/python3 -m uvicorn app.main:app --host 0.0.0.0 --port 8000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Restart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">always&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">RestartSec&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">5&lt;/span>
&lt;/span>&lt;/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">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WantedBy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="数据备份与恢复">数据备份与恢复&lt;/h2>
&lt;h3 id="备份数据库">备份数据库&lt;/h3>
&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">cp /opt/inspection/backend/data/inspection.db &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> /opt/inspection/backend/data/inspection_&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>.db
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="备份报告">备份报告&lt;/h3>
&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">tar -czf /tmp/reports_&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>.tar.gz /opt/inspection/backend/reports/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="恢复数据库">恢复数据库&lt;/h3>
&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">systemctl stop inspection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp /opt/inspection/backend/data/inspection.db.bak /opt/inspection/backend/data/inspection.db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl start inspection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="常见问题排查">常见问题排查&lt;/h2>
&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">journalctl -u inspection -n &lt;span class="m">50&lt;/span> &lt;span class="c1"># 查看详细错误&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsof -i :8000 &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="nb">cd&lt;/span> /opt/inspection/backend &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> python3 -m uvicorn app.main:app --host 0.0.0.0 --port &lt;span class="m">8000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>SMB 上传失败：&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">python3 -c &lt;span class="s2">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">import smbclient
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">smbclient.register_session(&amp;#39;YOUR_SMB_SERVER&amp;#39;, username=&amp;#39;YOUR_DOMAIN\\\\YOUR_USER&amp;#39;, password=&amp;#39;YOUR_PASSWORD&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">print(&amp;#39;SMB 连接成功&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">journalctl -u inspection &lt;span class="p">|&lt;/span> grep -i smb
&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">ls -la /opt/inspection/backend/tmp/ &lt;span class="c1"># 检查权限&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf /opt/inspection/backend/tmp/* &lt;span class="c1"># 清理临时文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">df -h / &lt;span class="c1"># 检查磁盘空间&lt;/span>
&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">nginx -t &lt;span class="c1"># 检查 Nginx 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls -la /opt/inspection/frontend/dist/ &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="nb">cd&lt;/span> /opt/inspection/frontend &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> npm run build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="部署流程">部署流程&lt;/h2>
&lt;h3 id="后端更新">后端更新&lt;/h3>
&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">scp -r ./backend/* root@YOUR_SERVER_IP:/opt/inspection/backend/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh root@YOUR_SERVER_IP &lt;span class="s2">&amp;#34;systemctl restart inspection&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="前端更新">前端更新&lt;/h3>
&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">scp -r ./frontend/* root@YOUR_SERVER_IP:/opt/inspection/frontend/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh root@YOUR_SERVER_IP &lt;span class="s2">&amp;#34;cd /opt/inspection/frontend &amp;amp;&amp;amp; npm run build&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="一键部署脚本">一键部署脚本&lt;/h3>
&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="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">SERVER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;YOUR_SERVER_IP&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;root&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="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 1. 上传后端代码 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp -r ./backend/* &lt;span class="nv">$USER&lt;/span>@&lt;span class="nv">$SERVER&lt;/span>:/opt/inspection/backend/
&lt;/span>&lt;/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">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 2. 上传前端代码 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp -r ./frontend/* &lt;span class="nv">$USER&lt;/span>@&lt;span class="nv">$SERVER&lt;/span>:/opt/inspection/frontend/
&lt;/span>&lt;/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">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 3. 构建前端 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh &lt;span class="nv">$USER&lt;/span>@&lt;span class="nv">$SERVER&lt;/span> &lt;span class="s2">&amp;#34;cd /opt/inspection/frontend &amp;amp;&amp;amp; npm run build&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="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 4. 重启服务 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh &lt;span class="nv">$USER&lt;/span>@&lt;span class="nv">$SERVER&lt;/span> &lt;span class="s2">&amp;#34;systemctl restart inspection&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="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 5. 检查状态 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ssh &lt;span class="nv">$USER&lt;/span>@&lt;span class="nv">$SERVER&lt;/span> &lt;span class="s2">&amp;#34;systemctl status inspection --no-pager | head -5&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="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 部署完成 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="巡检点配置修改">巡检点配置修改&lt;/h2>
&lt;p>添加新巡检点需要同步修改三个文件：&lt;/p>
&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>1&lt;/td>
&lt;td>&lt;code>backend/app/schemas.py&lt;/code>&lt;/td>
&lt;td>Pydantic 模型 + &lt;code>POINT_DEFINITIONS&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>&lt;code>backend/app/models.py&lt;/code>&lt;/td>
&lt;td>SQLAlchemy 数据库模型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>&lt;code>frontend/src/utils/definitions.js&lt;/code>&lt;/td>
&lt;td>前端定义&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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">rm /opt/inspection/backend/data/inspection.db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl restart inspection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改基线范围或字段名称：只需改 &lt;code>schemas.py&lt;/code> 和 &lt;code>definitions.js&lt;/code> 中对应字段的 &lt;code>standard&lt;/code> 或 &lt;code>label&lt;/code> 值。&lt;/p>
&lt;h2 id="python-依赖">Python 依赖&lt;/h2>
&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>fastapi&lt;/td>
&lt;td>0.118.0&lt;/td>
&lt;td>Web 框架&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>uvicorn&lt;/td>
&lt;td>latest&lt;/td>
&lt;td>ASGI 服务器&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>sqlalchemy&lt;/td>
&lt;td>2.0.45&lt;/td>
&lt;td>ORM 数据库操作&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>python-multipart&lt;/td>
&lt;td>latest&lt;/td>
&lt;td>文件上传解析&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>python-docx&lt;/td>
&lt;td>1.2.0&lt;/td>
&lt;td>Word 报告生成&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Pillow&lt;/td>
&lt;td>12.1.1&lt;/td>
&lt;td>图片压缩处理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>smbprotocol&lt;/td>
&lt;td>1.16.1&lt;/td>
&lt;td>SMB 共享上传&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>pydantic&lt;/td>
&lt;td>2.12.5&lt;/td>
&lt;td>数据校验&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>pydantic-settings&lt;/td>
&lt;td>latest&lt;/td>
&lt;td>配置管理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>apscheduler&lt;/td>
&lt;td>latest&lt;/td>
&lt;td>定时任务&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="前端依赖">前端依赖&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>依赖&lt;/th>
&lt;th>版本&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Vue&lt;/td>
&lt;td>3.5+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Element Plus&lt;/td>
&lt;td>2.8+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Axios&lt;/td>
&lt;td>1.7+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>vuedraggable&lt;/td>
&lt;td>4.1+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SortableJS&lt;/td>
&lt;td>1.15+&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>ESXi 虚拟机迁移到 Workstation</title><link>https://blog.air1.cn/esxi-vm-migration-to-workstation/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/esxi-vm-migration-to-workstation/</guid><description>&lt;h2 id="背景">背景&lt;/h2>
&lt;p>ESXi 8.0 上跑着一台 Windows 10 虚拟机，装了不少应用。需要把它迁移到本地 Windows 11 主机的 VMware Workstation 里，要求应用和数据完整保留。&lt;/p>
&lt;p>目标：在 Workstation 上能直接用，不重装系统、不丢软件。&lt;/p>
&lt;h2 id="方案选择">方案选择&lt;/h2>
&lt;p>几种主流方案：&lt;/p>
&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>VMware vCenter Converter Standalone&lt;/td>
&lt;td>官方免费工具，自动处理驱动兼容性和虚拟硬件版本&lt;/td>
&lt;td>最稳，推荐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OVF / OVA 导出导入&lt;/td>
&lt;td>ESXi 自带功能，但虚拟硬件版本可能与 Workstation 不兼容&lt;/td>
&lt;td>可用，但常需手动改 &lt;code>.ovf&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>直接拷贝 VMDK&lt;/td>
&lt;td>格式不完全一致，风险较高&lt;/td>
&lt;td>不推荐&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>最终选了 Converter。&lt;/p>
&lt;h2 id="迁移步骤">迁移步骤&lt;/h2>
&lt;h3 id="1-安装-vmware-vcenter-converter">1. 安装 VMware vCenter Converter&lt;/h3>
&lt;p>下载安装包后运行，安装类型选 &lt;strong>Local installation&lt;/strong>。&lt;/p>
&lt;p>Client-Server installation 是企业级大规模迁移用的，单台虚拟机迁移不需要。&lt;/p>
&lt;h3 id="2-配置-source">2. 配置 Source&lt;/h3>
&lt;p>打开 Converter，点 &lt;strong>Convert machine&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Source type&lt;/strong>：选 &lt;code>VMware Infrastructure virtual machine&lt;/code>&lt;/li>
&lt;li>填入 ESXi 的 IP、用户名、密码&lt;/li>
&lt;li>选中要迁移的虚拟机&lt;/li>
&lt;/ul>
&lt;h3 id="3-配置-destination">3. 配置 Destination&lt;/h3>
&lt;p>&lt;strong>Destination type 下拉菜单一定选对：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>❌ &lt;code>VMware Infrastructure virtual machine&lt;/code> — 这是往另一个 ESXi 迁移用的&lt;/li>
&lt;li>✅ &lt;code>VMware Workstation or other VMware virtual machine&lt;/code> — 生成 &lt;code>.vmx&lt;/code> + &lt;code>.vmdk&lt;/code>，Workstation 直接能打开&lt;/li>
&lt;/ul>
&lt;p>选对之后不需要填服务器地址，直接指定本地保存路径，比如 &lt;code>D:\VMs\your-vm-name&lt;/code>。&lt;/p>
&lt;h3 id="4-内存设置">4. 内存设置&lt;/h3>
&lt;p>进入 Options → Devices → Memory 界面。&lt;/p>
&lt;p>默认可能是 12GB 或更高，需要根据主机实际内存调整。主机总共 16GB，已用约 37%，给虚拟机分配 8GB（8192 MB）比较合理：&lt;/p>
&lt;ul>
&lt;li>宿主机留约 2GB + 系统缓存，不会卡&lt;/li>
&lt;li>Win10 + 多应用在 8GB 下够用&lt;/li>
&lt;li>后续需要可以在 Workstation 里关机后手动调&lt;/li>
&lt;/ul>
&lt;h3 id="5-磁盘类型">5. 磁盘类型&lt;/h3>
&lt;p>Options → Data to copy，下拉菜单选磁盘分配类型：&lt;/p>
&lt;ul>
&lt;li>❌ &lt;code>Not pre-allocated&lt;/code>（稀疏盘）：Workstation 支持较弱，可能启动慢、应用报错&lt;/li>
&lt;li>✅ &lt;code>Pre-allocated&lt;/code>：一次性分配全部空间，兼容性最好&lt;/li>
&lt;/ul>
&lt;p>选 Pre-allocated 会立刻占满磁盘空间，确保本地磁盘剩余空间足够。&lt;/p>
&lt;h3 id="6-高级选项">6. 高级选项&lt;/h3>
&lt;p>Options → Advanced options，四个选项全部勾选：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>选项&lt;/th>
&lt;th>作用&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Install VMware Tools on the destination virtual machine&lt;/td>
&lt;td>自动安装 Tools，确保显卡、网络、共享文件夹正常&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Customize guest preferences for the virtual machine&lt;/td>
&lt;td>重置 SID、适配 Workstation 硬件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Remove System Restore checkpoints on destination&lt;/td>
&lt;td>清理还原点，节省空间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Reconfigure destination virtual machine&lt;/td>
&lt;td>自动将 ESXi 硬件配置转换为 Workstation 兼容配置&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="7-开始转换">7. 开始转换&lt;/h3>
&lt;p>确认 Summary 页面信息无误后点 Finish。&lt;/p>
&lt;p>转换时间取决于磁盘大小和网络速度，300GB 磁盘在千兆网络下大约 25-40 分钟。&lt;/p>
&lt;h2 id="首次启动">首次启动&lt;/h2>
&lt;p>转换完成后，去保存路径找到 &lt;code>.vmx&lt;/code> 文件，用 VMware Workstation 打开。&lt;/p>
&lt;p>&lt;strong>首次启动时会弹出提示，选 &amp;ldquo;I moved it&amp;rdquo;&lt;/strong>，不要选 &amp;ldquo;I copied it&amp;rdquo;。选 &amp;ldquo;I moved it&amp;rdquo; 会保留原有的 UUID 和 MAC 地址，避免部分绑定硬件指纹的软件失效。&lt;/p>
&lt;p>启动后建议检查：&lt;/p>
&lt;ul>
&lt;li>VMware Tools 是否正常工作（显卡、网络、共享文件夹）&lt;/li>
&lt;li>网络是否通（ESXi 常用 vmxnet3，Workstation 也支持，但遇到问题可以改 e1000e）&lt;/li>
&lt;li>应用是否正常运行&lt;/li>
&lt;/ul>
&lt;h2 id="注意事项">注意事项&lt;/h2>
&lt;p>&lt;strong>转换前删除快照&lt;/strong>：在 ESXi 上删除或合并所有快照，带快照迁移容易导致数据不一致。&lt;/p>
&lt;p>&lt;strong>Workstation 版本&lt;/strong>：建议 17 Pro/Player 以上，与 ESXi 8.0 的虚拟硬件版本兼容性最好。旧版本（15/16）可能需要降级虚拟硬件版本才能启动。&lt;/p>
&lt;p>&lt;strong>激活问题&lt;/strong>：迁移后硬件 ID 可能变化，Windows 或第三方软件可能要求重新激活。选 &amp;ldquo;I moved it&amp;rdquo; 可以最大程度保留原 UUID。&lt;/p>
&lt;p>&lt;strong>VMware Tools&lt;/strong>：迁移后建议卸载 ESXi 版 Tools，重新安装 Workstation 版，否则显卡、共享文件夹等功能可能异常。&lt;/p></description></item><item><title>Sysmon 定位恶意域名访问进程</title><link>https://blog.air1.cn/sysmon-dns-query-logging/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/sysmon-dns-query-logging/</guid><description>&lt;h2 id="背景">背景&lt;/h2>
&lt;p>有电脑频繁外联恶意域名，需要定位是哪个进程发起的 DNS 查询。Sysmon 的 DNS 查询日志（事件 ID 22）可以记录每次 DNS 查询对应的进程，是解决此类问题的标准工具。&lt;/p>
&lt;h2 id="sysmon-安装">Sysmon 安装&lt;/h2>
&lt;p>Sysmon 是微软 Sysinternals 套件中的系统监控工具，下载地址：&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysmon">https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysmon&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>下载后解压，以管理员身份打开 PowerShell，进入解压目录执行安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">Sysmon64&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-i&lt;/span> &lt;span class="n">-n&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数说明：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-i&lt;/code>&lt;/td>
&lt;td>安装服务和驱动程序，可选择配置文件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-c&lt;/code>&lt;/td>
&lt;td>更新已安装的 Sysmon 驱动程序配置，或转储当前配置&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-m&lt;/code>&lt;/td>
&lt;td>安装事件清单（服务安装时自动安装）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-s&lt;/code>&lt;/td>
&lt;td>打印配置架构定义&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-u&lt;/code>&lt;/td>
&lt;td>卸载服务和驱动程序（&lt;code>-u force&lt;/code> 强制卸载）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>-n&lt;/code> 表示不安装事件清单（已通过 &lt;code>-i&lt;/code> 安装），可减少安装步骤。&lt;/p>
&lt;h2 id="配置-dns-查询监控">配置 DNS 查询监控&lt;/h2>
&lt;p>在 Sysmon 同目录下创建配置文件 &lt;code>sysmon_dns.xml&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Sysmon&lt;/span> &lt;span class="na">schemaversion=&lt;/span>&lt;span class="s">&amp;#34;4.90&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;HashAlgorithms&amp;gt;&lt;/span>md5,sha256,IMPHASH&lt;span class="nt">&amp;lt;/HashAlgorithms&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;CheckRevocation/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;EventFiltering&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;ProcessCreate&lt;/span> &lt;span class="na">onmatch=&lt;/span>&lt;span class="s">&amp;#34;exclude&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Image&lt;/span> &lt;span class="na">condition=&lt;/span>&lt;span class="s">&amp;#34;is&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>C:\Windows\System32\backgroundTaskHost.exe&lt;span class="nt">&amp;lt;/Image&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/ProcessCreate&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;NetworkConnect&lt;/span> &lt;span class="na">onmatch=&lt;/span>&lt;span class="s">&amp;#34;include&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Image&lt;/span> &lt;span class="na">condition=&lt;/span>&lt;span class="s">&amp;#34;end with&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>.exe&lt;span class="nt">&amp;lt;/Image&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/NetworkConnect&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 开启 DNS 查询日志，排除系统常见进程 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DnsQuery&lt;/span> &lt;span class="na">onmatch=&lt;/span>&lt;span class="s">&amp;#34;exclude&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Image&lt;/span> &lt;span class="na">condition=&lt;/span>&lt;span class="s">&amp;#34;is&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>C:\Windows\System32\svchost.exe&lt;span class="nt">&amp;lt;/Image&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Image&lt;/span> &lt;span class="na">condition=&lt;/span>&lt;span class="s">&amp;#34;is&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>C:\Windows\System32\SearchProtocolHost.exe&lt;span class="nt">&amp;lt;/Image&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/DnsQuery&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/EventFiltering&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/Sysmon&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置逻辑：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>NetworkConnect&lt;/strong>：只记录 &lt;code>.exe&lt;/code> 进程的网络连接，过滤掉非可执行文件的连接噪声&lt;/li>
&lt;li>&lt;strong>DnsQuery&lt;/strong>：排除 &lt;code>svchost.exe&lt;/code> 和 &lt;code>SearchProtocolHost.exe&lt;/code> 这两个系统进程的高频 DNS 查询，减少日志量&lt;/li>
&lt;li>&lt;strong>ProcessCreate&lt;/strong>：排除 &lt;code>backgroundTaskHost.exe&lt;/code>，避免后台任务进程的干扰&lt;/li>
&lt;/ul>
&lt;p>应用配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">Sysmon64&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-c&lt;/span> &lt;span class="n">sysmon_dns&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">xml&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="查看日志">查看日志&lt;/h2>
&lt;p>打开事件查看器（&lt;code>Win + R&lt;/code> → &lt;code>eventvwr.msc&lt;/code>），路径：&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">应用程序和服务日志 → Microsoft → Windows → Sysmon → Operational
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>过滤事件 ID 22（DNS 查询），可以看到每次 DNS 查询的：&lt;/p>
&lt;ul>
&lt;li>查询的域名&lt;/li>
&lt;li>发起查询的进程路径和 PID&lt;/li>
&lt;li>查询类型（A、AAAA、CNAME 等）&lt;/li>
&lt;li>查询结果&lt;/li>
&lt;/ul>
&lt;h2 id="sysmon-事件-id-速查">Sysmon 事件 ID 速查&lt;/h2>
&lt;p>以下是 Sysmon 所有事件类型的简要说明：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ID&lt;/th>
&lt;th>事件类型&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>ProcessCreate&lt;/td>
&lt;td>进程创建，含完整命令行、哈希、ProcessGUID&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>FileCreateTime&lt;/td>
&lt;td>进程修改文件创建时间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>NetworkConnect&lt;/td>
&lt;td>TCP/UDP 网络连接（默认禁用）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>ServiceStateChange&lt;/td>
&lt;td>Sysmon 服务状态变更（启动/停止）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>ProcessTerminate&lt;/td>
&lt;td>进程终止&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>DriverLoad&lt;/td>
&lt;td>驱动程序加载&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>ImageLoad&lt;/td>
&lt;td>模块加载（默认禁用，日志量大）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>CreateRemoteThread&lt;/td>
&lt;td>跨进程创建线程（代码注入检测）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>RawAccessRead&lt;/td>
&lt;td>原始驱动器读取（绕过文件审计）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10&lt;/td>
&lt;td>ProcessAccess&lt;/td>
&lt;td>进程访问其他进程（凭据窃取检测）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>11&lt;/td>
&lt;td>FileCreate&lt;/td>
&lt;td>文件创建或覆盖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>12&lt;/td>
&lt;td>RegistryEvent (Key/Value Create/Delete)&lt;/td>
&lt;td>注册表键/值的创建和删除&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>13&lt;/td>
&lt;td>RegistryEvent (Value Set)&lt;/td>
&lt;td>注册表值修改&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>14&lt;/td>
&lt;td>RegistryEvent (Key/Value Rename)&lt;/td>
&lt;td>注册表键/值重命名&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>15&lt;/td>
&lt;td>FileCreateStreamHash&lt;/td>
&lt;td>命名文件流创建（Zone.Identifier 检测）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>16&lt;/td>
&lt;td>ServiceConfigurationChange&lt;/td>
&lt;td>Sysmon 配置变更&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>17&lt;/td>
&lt;td>PipeEvent (Pipe Created)&lt;/td>
&lt;td>命名管道创建&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>18&lt;/td>
&lt;td>PipeEvent (Pipe Connected)&lt;/td>
&lt;td>命名管道连接&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>19&lt;/td>
&lt;td>WmiEvent (Filter)&lt;/td>
&lt;td>WMI 事件筛选器注册&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>20&lt;/td>
&lt;td>WmiEvent (Consumer)&lt;/td>
&lt;td>WMI 消费者注册&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>21&lt;/td>
&lt;td>WmiEvent (ConsumerToFilter)&lt;/td>
&lt;td>WMI 消费者绑定到筛选器&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>22&lt;/strong>&lt;/td>
&lt;td>&lt;strong>DNSEvent&lt;/strong>&lt;/td>
&lt;td>&lt;strong>DNS 查询（Windows 8.1+）&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>23&lt;/td>
&lt;td>FileDelete (Archived)&lt;/td>
&lt;td>文件删除并归档到 &lt;code>C:\Sysmon&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>24&lt;/td>
&lt;td>ClipboardChange&lt;/td>
&lt;td>剪贴板内容变化&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>25&lt;/td>
&lt;td>ProcessTampering&lt;/td>
&lt;td>进程篡改检测（hollow/herpaderp）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>26&lt;/td>
&lt;td>FileDeleteDetected&lt;/td>
&lt;td>文件删除检测（不保存文件）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>27&lt;/td>
&lt;td>FileBlockExecutable&lt;/td>
&lt;td>阻止创建可执行文件（PE 格式）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>28&lt;/td>
&lt;td>FileBlockShredding&lt;/td>
&lt;td>阻止文件粉碎操作&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>29&lt;/td>
&lt;td>FileExecutableDetected&lt;/td>
&lt;td>检测到新建可执行文件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>255&lt;/td>
&lt;td>Error&lt;/td>
&lt;td>Sysmon 错误&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="卸载">卸载&lt;/h2>
&lt;p>如需卸载 Sysmon：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.\&lt;/span>&lt;span class="n">Sysmon64&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-u&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Film Vault 部署与维护记录</title><link>https://blog.air1.cn/film-vault-deployment-and-maintenance-note/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/film-vault-deployment-and-maintenance-note/</guid><description>&lt;p>本文覆盖范围：&lt;/p>
&lt;ul>
&lt;li>拉取代码&lt;/li>
&lt;li>理解目录结构&lt;/li>
&lt;li>本地预览&lt;/li>
&lt;li>本地维护&lt;/li>
&lt;li>重新生成静态片库&lt;/li>
&lt;li>部署到 Cloudflare Pages&lt;/li>
&lt;li>配置 KV / Secrets&lt;/li>
&lt;li>理解管理员登录与线上写入逻辑&lt;/li>
&lt;li>排查搜索、分页、KV 覆盖、静态数据同步等问题&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="1-项目定位">1. 项目定位&lt;/h2>
&lt;p>Film Vault 是一个个人长期使用的&lt;strong>影视墙&lt;/strong>项目。&lt;/p>
&lt;p>核心目标：&lt;/p>
&lt;ul>
&lt;li>公开展示自己已经看过的影视作品&lt;/li>
&lt;li>允许访客搜索和浏览片库&lt;/li>
&lt;li>只有管理员登录后，才可以添加或删除影视&lt;/li>
&lt;li>本地双击可以预览&lt;/li>
&lt;li>Cloudflare Pages 上线后可以在线维护&lt;/li>
&lt;li>线上数据以 &lt;strong>Cloudflare KV&lt;/strong> 为主，但仓库里的 &lt;code>data/*&lt;/code> 仍然保留作为静态基线&lt;/li>
&lt;/ul>
&lt;p>项目已经支持：&lt;/p>
&lt;ul>
&lt;li>电影（movie）&lt;/li>
&lt;li>电视剧（tv）&lt;/li>
&lt;/ul>
&lt;p>管理员搜索支持分页，方便处理重名作品。&lt;/p>
&lt;hr>
&lt;h2 id="2-仓库目录">2. 仓库目录&lt;/h2>
&lt;p>仓库根目录：&lt;/p>
&lt;p>&lt;code>C:\Users\haenl\Documents\Codex\2026-04-23-d-1a-web-films-web-tmdb&lt;/code>&lt;/p>
&lt;h3 id="21-目录说明">2.1 目录说明&lt;/h3>
&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">.
&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">│ └─ workflows/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ rebuild-library.yml # GitHub Actions（可选，用于重建片库）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ data/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ library.json # 源片单（title / year / tmdbId / media_type）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ library.resolved.json # 前端完整静态片库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ library.source.js # 本地 file:// 预览用的数据脚本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ library.resolved.js # 本地 file:// 预览用的数据脚本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ scripts/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ add-movie.mjs # 本地命令行搜索并添加影视
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ rebuild-library.mjs # 根据源片单重建完整静态片库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ lib/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ movie-db.mjs # TMDB 请求封装
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ library-files.mjs # 片库文件读写
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ index.html # 页面结构
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ styles.css # 样式
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ app.js # 前端逻辑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ _worker.js # Cloudflare Pages / Workers 管理接口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ favicon.svg # 网站图标
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ wrangler.example.toml # Cloudflare 配置模板
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ admin.local.example.js # 本地管理员配置模板
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ package.json # npm scripts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ README.md # GitHub 首页说明
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─ FilmVault-博客版部署笔记.md # 这份详细笔记
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="3-为什么-data-文件不能删">3. 为什么 &lt;code>data/*&lt;/code> 文件不能删&lt;/h2>
&lt;p>这是项目里一个容易误判的点。&lt;/p>
&lt;p>线上虽然主要读写 Cloudflare KV，但仓库里的 &lt;code>data/*&lt;/code> 文件依然必须保留，因为它们承担了 4 个作用：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>初始种子数据&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>新环境第一次部署时，KV 可能是空的&lt;/li>
&lt;li>这时 Worker 需要仓库里的静态片库做初始数据源&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>KV 自动纠偏&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>如果 KV 里残留了旧数据，Worker 会比较静态文件的 &lt;code>generatedAt&lt;/code>&lt;/li>
&lt;li>当 GitHub 中的静态片库更新时，会自动覆盖旧 KV&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>本地 &lt;code>file://&lt;/code> 预览&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>双击 &lt;code>index.html&lt;/code> 时，页面优先读 &lt;code>library.source.js&lt;/code> / &lt;code>library.resolved.js&lt;/code>&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;p>结论：&lt;/p>
&lt;ul>
&lt;li>线上：以 KV 为主&lt;/li>
&lt;li>仓库：保留 &lt;code>data/*&lt;/code> 作为基线&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-获取项目">4. 获取项目&lt;/h2>
&lt;h3 id="41-克隆仓库">4.1 克隆仓库&lt;/h3>
&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">git clone https://github.com/haenlau/films.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> films
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="42-nodejs-版本">4.2 Node.js 版本&lt;/h3>
&lt;p>推荐：&lt;/p>
&lt;ul>
&lt;li>Node.js 18+&lt;/li>
&lt;/ul>
&lt;p>虽然本地纯预览不依赖 Node，但脚本维护和片库重建需要。&lt;/p>
&lt;hr>
&lt;h2 id="5-本地预览">5. 本地预览&lt;/h2>
&lt;h3 id="51-直接双击打开">5.1 直接双击打开&lt;/h3>
&lt;p>直接双击：&lt;/p>
&lt;p>&lt;code>index.html&lt;/code>&lt;/p>
&lt;p>项目已经兼容 &lt;code>file://&lt;/code> 打开方式。&lt;/p>
&lt;p>页面优先读取：&lt;/p>
&lt;ul>
&lt;li>&lt;code>data/library.source.js&lt;/code>&lt;/li>
&lt;li>&lt;code>data/library.resolved.js&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>所以即使没有本地 HTTP 服务，也能正常显示片库。&lt;/p>
&lt;h3 id="52-本地管理员模式">5.2 本地管理员模式&lt;/h3>
&lt;p>本地管理员模式用于：&lt;/p>
&lt;ul>
&lt;li>本地登录&lt;/li>
&lt;li>控制台添加影视&lt;/li>
&lt;li>导出片单&lt;/li>
&lt;li>导出完整数据&lt;/li>
&lt;/ul>
&lt;h4 id="步骤一创建本地配置文件">步骤一：创建本地配置文件&lt;/h4>
&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">copy admin.local.example.js admin.local.js
&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-js" data-lang="js">&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">FILM_VAULT_ADMIN&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">apiKey&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;YOUR_TMDB_API_KEY&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">password&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;YOUR_LOCAL_ADMIN_PASSWORD&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;p>注意：&lt;/p>
&lt;ul>
&lt;li>&lt;code>admin.local.js&lt;/code> &lt;strong>不要提交到 Git&lt;/strong>&lt;/li>
&lt;li>它已经在 &lt;code>.gitignore&lt;/code> 中&lt;/li>
&lt;/ul>
&lt;h4 id="步骤三本地使用流程">步骤三：本地使用流程&lt;/h4>
&lt;ol>
&lt;li>双击打开 &lt;code>index.html&lt;/code>&lt;/li>
&lt;li>右上角点击 &lt;code>登录管理&lt;/code>&lt;/li>
&lt;li>输入 &lt;code>admin.local.js&lt;/code> 中的本地密码&lt;/li>
&lt;li>登录成功后，出现 &lt;code>控制台&lt;/code>&lt;/li>
&lt;li>控制台中可用：
&lt;ul>
&lt;li>&lt;code>添加影视&lt;/code>&lt;/li>
&lt;li>&lt;code>导出片单&lt;/code>&lt;/li>
&lt;li>&lt;code>导出数据&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="6-源片单与完整片库">6. 源片单与完整片库&lt;/h2>
&lt;h3 id="61-datalibraryjson">6.1 &lt;code>data/library.json&lt;/code>&lt;/h3>
&lt;p>这是“源片单”，适合人工维护或脚本维护。&lt;/p>
&lt;p>推荐结构：&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="nt">&amp;#34;title&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;subtitle&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;generatedAt&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-05-11T14:30:48.507Z&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;entries&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="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;黑洞频率&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;year&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2000&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;tmdbId&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10559&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;media_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;movie&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;title&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;year&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2016&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;tmdbId&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">66732&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;media_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;tv&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;p>字段说明：&lt;/p>
&lt;ul>
&lt;li>&lt;code>title&lt;/code>：片名或剧名&lt;/li>
&lt;li>&lt;code>year&lt;/code>：年份，可选但强烈建议保留&lt;/li>
&lt;li>&lt;code>tmdbId&lt;/code>：TMDB 唯一 ID，可选但推荐保留&lt;/li>
&lt;li>&lt;code>media_type&lt;/code>：&lt;code>movie&lt;/code> 或 &lt;code>tv&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>建议：&lt;/p>
&lt;ul>
&lt;li>手工维护时，优先保留 &lt;code>tmdbId&lt;/code>&lt;/li>
&lt;li>如果没有 &lt;code>tmdbId&lt;/code>，脚本会搜索匹配，但重名作品有误匹配风险&lt;/li>
&lt;/ul>
&lt;h3 id="62-datalibraryresolvedjson">6.2 &lt;code>data/library.resolved.json&lt;/code>&lt;/h3>
&lt;p>这是前端直接使用的完整片库数据。&lt;/p>
&lt;p>包含：&lt;/p>
&lt;ul>
&lt;li>海报&lt;/li>
&lt;li>背景图&lt;/li>
&lt;li>评分&lt;/li>
&lt;li>上映/首播时间&lt;/li>
&lt;li>地区&lt;/li>
&lt;li>类型&lt;/li>
&lt;li>制作公司&lt;/li>
&lt;li>演员&lt;/li>
&lt;li>简介&lt;/li>
&lt;li>&lt;code>media_type&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这个文件不建议手工维护，推荐脚本生成。&lt;/p>
&lt;h3 id="63-本地预览用的-js-数据文件">6.3 本地预览用的 JS 数据文件&lt;/h3>
&lt;p>为了兼容 &lt;code>file://&lt;/code>，项目会额外生成：&lt;/p>
&lt;ul>
&lt;li>&lt;code>data/library.source.js&lt;/code>&lt;/li>
&lt;li>&lt;code>data/library.resolved.js&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>格式示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&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">__FILM_VAULT_SOURCE__&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;title&amp;#34;&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="s2">&amp;#34;subtitle&amp;#34;&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="s2">&amp;#34;entries&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>&lt;/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">__FILM_VAULT_RESOLVED__&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;title&amp;#34;&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="s2">&amp;#34;subtitle&amp;#34;&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="s2">&amp;#34;movies&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>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="7-命令行维护片库">7. 命令行维护片库&lt;/h2>
&lt;h3 id="71-配置-devvars">7.1 配置 &lt;code>.dev.vars&lt;/code>&lt;/h3>
&lt;p>在项目根目录创建：&lt;/p>
&lt;p>&lt;code>.dev.vars&lt;/code>&lt;/p>
&lt;p>内容示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-env" data-lang="env">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TMDB_API_KEY&lt;/span>&lt;span class="o">=&lt;/span>YOUR_TMDB_API_KEY
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="72-按名称搜索并添加影视">7.2 按名称搜索并添加影视&lt;/h3>
&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">npm run add:movie -- 怪奇物语
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="73-根据源片单重建完整片库">7.3 根据源片单重建完整片库&lt;/h3>
&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">npm run rebuild:library
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="74-packagejson-中的脚本">7.4 &lt;code>package.json&lt;/code> 中的脚本&lt;/h3>
&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;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;film-vault-wall&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;private&amp;#34;&lt;/span>&lt;span class="p">:&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="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;module&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;scripts&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;rebuild:library&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;node ./scripts/rebuild-library.mjs&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;add:movie&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;node ./scripts/add-movie.mjs&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;hr>
&lt;h2 id="8-tmdb-接口支持范围">8. TMDB 接口支持范围&lt;/h2>
&lt;p>这个项目最终不是“电影墙”，而是“影视墙”。&lt;/p>
&lt;p>所以当前搜索和详情逻辑支持：&lt;/p>
&lt;ul>
&lt;li>电影：&lt;code>movie&lt;/code>&lt;/li>
&lt;li>电视剧：&lt;code>tv&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="81-搜索逻辑">8.1 搜索逻辑&lt;/h3>
&lt;p>管理员控制台中的“添加影视”搜索支持：&lt;/p>
&lt;ul>
&lt;li>&lt;code>movie&lt;/code>&lt;/li>
&lt;li>&lt;code>tv&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>并且支持分页。&lt;/p>
&lt;p>当前实现策略：&lt;/p>
&lt;ul>
&lt;li>云端 Worker：&lt;code>/search/multi?page=...&lt;/code>&lt;/li>
&lt;li>本地浏览器：&lt;code>/search/multi?page=...&lt;/code>&lt;/li>
&lt;li>最终只保留 &lt;code>movie/tv&lt;/code> 类型结果&lt;/li>
&lt;/ul>
&lt;h3 id="82-详情逻辑">8.2 详情逻辑&lt;/h3>
&lt;p>添加时按 &lt;code>media_type&lt;/code> 分流：&lt;/p>
&lt;ul>
&lt;li>&lt;code>movie -&amp;gt; /movie/{id}&lt;/code>&lt;/li>
&lt;li>&lt;code>tv -&amp;gt; /tv/{id}&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这是为了保证：&lt;/p>
&lt;ul>
&lt;li>搜电影时拿电影详情&lt;/li>
&lt;li>搜电视剧时拿剧集详情&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="9-控制台中的搜索分页">9. 控制台中的搜索分页&lt;/h2>
&lt;p>这是当前版本的重要能力。&lt;/p>
&lt;h3 id="91-行为规则">9.1 行为规则&lt;/h3>
&lt;ul>
&lt;li>未搜索时：不显示分页控件&lt;/li>
&lt;li>搜索后只有 1 页：不显示分页控件&lt;/li>
&lt;li>搜索后有多页：显示分页控件&lt;/li>
&lt;/ul>
&lt;p>分页控件包括：&lt;/p>
&lt;ul>
&lt;li>&lt;code>上一页&lt;/code>&lt;/li>
&lt;li>&lt;code>第 X / Y 页&lt;/code>&lt;/li>
&lt;li>&lt;code>下一页&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="92-为什么需要分页">9.2 为什么需要分页&lt;/h3>
&lt;p>很多影视作品存在：&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;/p>
&lt;h3 id="93-关键实现思路">9.3 关键实现思路&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchQuery&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">query&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchPage&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 class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchPerformed&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="kr">const&lt;/span> &lt;span class="nx">payload&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">admin&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">mode&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s2">&amp;#34;remote&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">?&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">remoteSearchMovies&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchQuery&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchPage&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="kr">await&lt;/span> &lt;span class="nx">localSearchMovies&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchQuery&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchPage&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">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchResults&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">payload&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">results&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">state&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">searchTotalPages&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">Number&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">payload&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">total_pages&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 class="nx">renderSearchResults&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">renderSearchPagination&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-js" data-lang="js">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">page&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">Number&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">page&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="kr">const&lt;/span> &lt;span class="nx">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">fetch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">buildTmdbUrl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/search/multi&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">TMDB_API_KEY&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">language&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;zh-CN&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">query&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">include_adult&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;false&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">page&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nb">String&lt;/span>&lt;span class="p">(&lt;/span>&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="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="nx">json&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">results&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">total_pages&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nb">Number&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">payload&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">total_pages&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 class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="10-cloudflare-部署">10. Cloudflare 部署&lt;/h2>
&lt;p>推荐使用 &lt;strong>Cloudflare Pages&lt;/strong>。&lt;/p>
&lt;h3 id="101-为什么不是纯-workers">10.1 为什么不是纯 Workers&lt;/h3>
&lt;p>因为这个项目是：&lt;/p>
&lt;ul>
&lt;li>静态站点：&lt;code>index.html&lt;/code> / &lt;code>styles.css&lt;/code> / &lt;code>app.js&lt;/code>&lt;/li>
&lt;li>服务端接口：&lt;code>_worker.js&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>所以最适合：&lt;/p>
&lt;ul>
&lt;li>Pages 托管静态资源&lt;/li>
&lt;li>&lt;code>_worker.js&lt;/code> 提供管理员接口&lt;/li>
&lt;/ul>
&lt;h3 id="102-pages-构建配置">10.2 Pages 构建配置&lt;/h3>
&lt;p>连接 GitHub 仓库后：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Framework preset&lt;/td>
&lt;td>&lt;code>None&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Build command&lt;/td>
&lt;td>留空&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Build output directory&lt;/td>
&lt;td>&lt;code>.&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="103-wranglerexampletoml">10.3 &lt;code>wrangler.example.toml&lt;/code>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;films&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">compatibility_date&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;2026-04-23&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="nx">pages_build_output_dir&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 class="nx">kv_namespaces&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">binding&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;FILM_VAULT_KV&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">id&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;replace-with-your-kv-namespace-id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">preview_id&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;replace-with-your-preview-kv-namespace-id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="104-必要的-kv-配置">10.4 必要的 KV 配置&lt;/h3>
&lt;p>创建一个 KV namespace，并绑定：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>KV namespace binding&lt;/td>
&lt;td>&lt;code>FILM_VAULT_KV&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="105-必要的-secrets">10.5 必要的 Secrets&lt;/h3>
&lt;p>在 Cloudflare Pages 中配置：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Secret&lt;/th>
&lt;th>用途&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>TMDB_API_KEY&lt;/code>&lt;/td>
&lt;td>TMDB API 密钥&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ADMIN_PASSWORD&lt;/code>&lt;/td>
&lt;td>线上管理员登录密码&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>SESSION_SECRET&lt;/code>&lt;/td>
&lt;td>会话签名密钥&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="106-worker-的职责">10.6 Worker 的职责&lt;/h3>
&lt;p>&lt;code>_worker.js&lt;/code> 主要负责：&lt;/p>
&lt;ul>
&lt;li>公开读取片库：&lt;code>/api/library&lt;/code>&lt;/li>
&lt;li>管理员登录：&lt;code>/api/admin/session&lt;/code>&lt;/li>
&lt;li>管理员搜索影视：&lt;code>/api/admin/search&lt;/code>&lt;/li>
&lt;li>管理员添加影视：&lt;code>/api/admin/add&lt;/code>&lt;/li>
&lt;li>管理员删除影视：&lt;code>/api/admin/remove&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="107-线上数据读写逻辑">10.7 线上数据读写逻辑&lt;/h3>
&lt;p>线上优先读 Cloudflare KV。&lt;/p>
&lt;p>但为了避免 KV 停留在旧数据，Worker 还会：&lt;/p>
&lt;ul>
&lt;li>读取仓库静态文件 &lt;code>data/library.json&lt;/code>&lt;/li>
&lt;li>读取仓库静态文件 &lt;code>data/library.resolved.json&lt;/code>&lt;/li>
&lt;li>比较 &lt;code>generatedAt&lt;/code>&lt;/li>
&lt;li>如果仓库静态数据更“新”，就自动覆盖旧 KV&lt;/li>
&lt;/ul>
&lt;p>这个机制很重要，因为它保证：&lt;/p>
&lt;ul>
&lt;li>GitHub 中的片库更新后&lt;/li>
&lt;li>Cloudflare 重新构建&lt;/li>
&lt;li>线上不会永远停留在旧 KV&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="11-管理员使用逻辑">11. 管理员使用逻辑&lt;/h2>
&lt;h3 id="111-普通访客">11.1 普通访客&lt;/h3>
&lt;ul>
&lt;li>只能浏览片库&lt;/li>
&lt;li>只能搜索已添加的影视&lt;/li>
&lt;li>看不到管理功能&lt;/li>
&lt;/ul>
&lt;h3 id="112-管理员">11.2 管理员&lt;/h3>
&lt;ol>
&lt;li>点击 &lt;code>管理员登录&lt;/code>&lt;/li>
&lt;li>输入密码&lt;/li>
&lt;li>登录成功后出现 &lt;code>控制台&lt;/code>&lt;/li>
&lt;li>控制台中可执行：
&lt;ul>
&lt;li>&lt;code>添加影视&lt;/code>&lt;/li>
&lt;li>&lt;code>导出片单&lt;/code>&lt;/li>
&lt;li>&lt;code>导出数据&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>在线上环境中，添加/删除会直接写入 Cloudflare KV&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="12-默认排序与前端说明">12. 默认排序与前端说明&lt;/h2>
&lt;h3 id="121-默认排序">12.1 默认排序&lt;/h3>
&lt;p>站点默认按：&lt;/p>
&lt;p>&lt;code>上映时间&lt;/code>&lt;/p>
&lt;p>而不是评分优先。&lt;/p>
&lt;h3 id="122-当前文案说明">12.2 当前文案说明&lt;/h3>
&lt;p>当前项目已经统一到“影视”语义，而不是“电影”：&lt;/p>
&lt;ul>
&lt;li>我的影视墙&lt;/li>
&lt;li>影视库搜索&lt;/li>
&lt;li>添加影视&lt;/li>
&lt;li>已看影视&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="13-git-提交流程">13. Git 提交流程&lt;/h2>
&lt;h3 id="131-进入仓库目录">13.1 进入仓库目录&lt;/h3>
&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> C:&lt;span class="se">\U&lt;/span>sers&lt;span class="se">\h&lt;/span>aenl&lt;span class="se">\D&lt;/span>ocuments&lt;span class="se">\C&lt;/span>odex&lt;span class="se">\2&lt;/span>026-04-23-d-1a-web-films-web-tmdb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="132-查看状态">13.2 查看状态&lt;/h3>
&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">git status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="133-提交全部改动">13.3 提交全部改动&lt;/h3>
&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">git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;your commit message&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="134-只提交部分文件">13.4 只提交部分文件&lt;/h3>
&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">git add app.js _worker.js index.html styles.css README.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;your commit message&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="14-隐私与敏感信息">14. 隐私与敏感信息&lt;/h2>
&lt;h3 id="141-不应提交到-github-的文件">14.1 不应提交到 GitHub 的文件&lt;/h3>
&lt;ul>
&lt;li>&lt;code>admin.local.js&lt;/code>&lt;/li>
&lt;li>&lt;code>.dev.vars&lt;/code>&lt;/li>
&lt;li>&lt;code>.env&lt;/code>&lt;/li>
&lt;li>&lt;code>.env.local&lt;/code>&lt;/li>
&lt;li>任何真实 API Key、密码、会话密钥&lt;/li>
&lt;/ul>
&lt;h3 id="142-可以提交到仓库的内容">14.2 可以提交到仓库的内容&lt;/h3>
&lt;ul>
&lt;li>&lt;code>admin.local.example.js&lt;/code>&lt;/li>
&lt;li>&lt;code>.dev.vars.example&lt;/code>&lt;/li>
&lt;li>&lt;code>README.md&lt;/code> 中的变量名说明&lt;/li>
&lt;li>&lt;code>_worker.js&lt;/code> 中的环境变量读取代码&lt;/li>
&lt;/ul>
&lt;p>注意：&lt;/p>
&lt;ul>
&lt;li>变量名不是敏感信息&lt;/li>
&lt;li>真正敏感的是“实际值”&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="15-常见问题与排查">15. 常见问题与排查&lt;/h2>
&lt;h3 id="151-线上为什么还是旧片库">15.1 线上为什么还是旧片库&lt;/h3>
&lt;p>先检查：&lt;/p>
&lt;ul>
&lt;li>Cloudflare 当前部署对应的 commit 是否最新&lt;/li>
&lt;li>&lt;code>FILM_VAULT_KV&lt;/code> 是否绑定正确&lt;/li>
&lt;li>&lt;code>data/library.resolved.json&lt;/code> 是否带最新 &lt;code>generatedAt&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="152-为什么搜索不到目标作品">15.2 为什么搜索不到目标作品&lt;/h3>
&lt;p>常见原因：&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;/p>
&lt;ul>
&lt;li>继续翻页查找&lt;/li>
&lt;li>在源片单中明确 &lt;code>tmdbId&lt;/code>&lt;/li>
&lt;li>明确 &lt;code>media_type&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="153-为什么本地能搜线上添加失败">15.3 为什么本地能搜，线上添加失败&lt;/h3>
&lt;p>常见原因：&lt;/p>
&lt;ul>
&lt;li>Cloudflare 没部署到最新 commit&lt;/li>
&lt;li>Worker 仍在跑旧逻辑&lt;/li>
&lt;li>&lt;code>TMDB_API_KEY&lt;/code> 未配置&lt;/li>
&lt;li>&lt;code>ADMIN_PASSWORD&lt;/code> / &lt;code>SESSION_SECRET&lt;/code> 未配置&lt;/li>
&lt;li>KV 绑定不正确&lt;/li>
&lt;/ul>
&lt;h3 id="154-为什么-data-不能删">15.4 为什么 &lt;code>data/*&lt;/code> 不能删&lt;/h3>
&lt;p>因为它们负责：&lt;/p>
&lt;ul>
&lt;li>初始种子&lt;/li>
&lt;li>KV 纠偏&lt;/li>
&lt;li>本地预览&lt;/li>
&lt;li>可追踪版本基线&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="16-推荐维护方式">16. 推荐维护方式&lt;/h2>
&lt;h3 id="方案-a本地页面维护">方案 A：本地页面维护&lt;/h3>
&lt;p>适合直接在浏览器里操作：&lt;/p>
&lt;ol>
&lt;li>配置 &lt;code>admin.local.js&lt;/code>&lt;/li>
&lt;li>双击打开 &lt;code>index.html&lt;/code>&lt;/li>
&lt;li>登录管理&lt;/li>
&lt;li>添加影视&lt;/li>
&lt;li>导出片单 / 导出数据&lt;/li>
&lt;li>提交到 GitHub&lt;/li>
&lt;/ol>
&lt;h3 id="方案-b命令行批量维护">方案 B：命令行批量维护&lt;/h3>
&lt;p>适合大规模调整：&lt;/p>
&lt;ol>
&lt;li>修改 &lt;code>data/library.json&lt;/code>&lt;/li>
&lt;li>执行 &lt;code>npm run rebuild:library&lt;/code>&lt;/li>
&lt;li>提交到 GitHub&lt;/li>
&lt;/ol>
&lt;h3 id="方案-c线上-cloudflare-管理">方案 C：线上 Cloudflare 管理&lt;/h3>
&lt;p>适合日常在线维护：&lt;/p>
&lt;ol>
&lt;li>打开线上站点&lt;/li>
&lt;li>管理员登录&lt;/li>
&lt;li>在控制台里添加或删除影视&lt;/li>
&lt;li>数据直接写入 KV&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="17-推荐环境">17. 推荐环境&lt;/h2>
&lt;ul>
&lt;li>Node.js 18+&lt;/li>
&lt;li>Cloudflare Pages&lt;/li>
&lt;li>Chrome / Edge / Safari 最新版本&lt;/li>
&lt;li>Windows PowerShell 或任意可用终端&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="18-结论">18. 结论&lt;/h2>
&lt;p>这个项目最终是一个：&lt;/p>
&lt;ul>
&lt;li>本地可预览&lt;/li>
&lt;li>线上可部署&lt;/li>
&lt;li>管理员可登录&lt;/li>
&lt;li>支持电影和电视剧&lt;/li>
&lt;li>支持分页搜索&lt;/li>
&lt;li>线上数据由 Cloudflare KV 托管&lt;/li>
&lt;li>仓库静态数据用于基线和纠偏&lt;/li>
&lt;/ul>
&lt;p>的个人影视墙系统。&lt;/p>
&lt;p>只要保留好：&lt;/p>
&lt;ul>
&lt;li>仓库代码&lt;/li>
&lt;li>&lt;code>data/*&lt;/code>&lt;/li>
&lt;li>Cloudflare 的 KV 和 Secrets&lt;/li>
&lt;/ul>
&lt;p>几年后重新看到这份笔记，依然可以完整恢复。&lt;/p></description></item><item><title>Zabbix 企业微信告警推送服务</title><link>https://blog.air1.cn/zabbix-wechat-alert-daemon/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/zabbix-wechat-alert-daemon/</guid><description>&lt;h2 id="背景">背景&lt;/h2>
&lt;p>生产环境的 Zabbix 服务器处于内网隔离区，无法直接访问互联网，也就无法通过企业微信 API 推送告警。&lt;/p>
&lt;p>解决方案：利用网闸将 Zabbix 数据库单向同步到一台可联网的中转服务器，告警推送脚本部署在中转服务器上，只读同步库的 &lt;code>alerts&lt;/code> 表，通过企业微信 API 将告警推送到手机。&lt;/p>
&lt;h2 id="一服务概述">一、服务概述&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>项目&lt;/th>
&lt;th>内容&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>服务器&lt;/strong>&lt;/td>
&lt;td>&lt;code>192.168.23.22&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>操作系统&lt;/strong>&lt;/td>
&lt;td>Ubuntu Server，内核 6.8.0-85-generic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>服务名&lt;/strong>&lt;/td>
&lt;td>&lt;code>wechat-alert.service&lt;/code> (systemd 守护进程)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>脚本路径&lt;/strong>&lt;/td>
&lt;td>&lt;code>/opt/alert/wechat.py&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Python 环境&lt;/strong>&lt;/td>
&lt;td>&lt;code>/opt/alert/venv/&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>运行用户&lt;/strong>&lt;/td>
&lt;td>&lt;code>root&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>重启策略&lt;/strong>&lt;/td>
&lt;td>&lt;code>Restart=always&lt;/code>，失败后 10 秒自动拉起&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>已运行时间&lt;/strong>&lt;/td>
&lt;td>98 天+（自 2026 年 3 月 3 日起）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="工作流程">工作流程&lt;/h3>
&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">┌─────────────────────┐ ┌──────────────────────┐ 企业微信 API ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Zabbix 数据库 │ 网闸同步 │ wechat-alert 服务 │ ────────────► │ 企业微信 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 192.168.25.52:3306 │ ────────► │ 192.168.23.22 │ │ 手机通知 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ alerts 表 │ │ /opt/alert/wechat.py │ └──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────┘ └──────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="二架构与设计">二、架构与设计&lt;/h2>
&lt;h3 id="21-核心机制">2.1 核心机制&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>机制&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>纯只读模式&lt;/strong>&lt;/td>
&lt;td>只 &lt;code>SELECT&lt;/code> 不 &lt;code>UPDATE/INSERT&lt;/code>，不影响 Zabbix 数据库状态&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>增量去重&lt;/strong>&lt;/td>
&lt;td>基于 &lt;code>alertid&lt;/code> 递增标记，内存中记录已处理的最大 ID&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>定时轮询&lt;/strong>&lt;/td>
&lt;td>每 &lt;strong>10 秒&lt;/strong> 查询一次 &lt;code>alerts&lt;/code> 表&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>失败重试&lt;/strong>&lt;/td>
&lt;td>发送失败会保留 ID，下一轮自动重试&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>异常自检&lt;/strong>&lt;/td>
&lt;td>连续 3 次失败触发「自检告警」通知管理员（冷却 5 分钟）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>自动恢复&lt;/strong>&lt;/td>
&lt;td>systemd &lt;code>Restart=always&lt;/code>，进程崩溃自动拉起&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="22-去重策略">2.2 去重策略&lt;/h3>
&lt;p>基于 &lt;code>alertid&lt;/code> 的增量进度标记：内存中记录已处理的最大 ID，查询时只取 &lt;code>alertid &amp;gt; last_processed_id&lt;/code> 的新增数据。发送成功才推进标记，失败则保持不动，下一轮自动重试。&lt;/p>
&lt;h2 id="三部署配置">三、部署配置&lt;/h2>
&lt;h3 id="31-systemd-服务单元">3.1 systemd 服务单元&lt;/h3>
&lt;p>&lt;strong>路径&lt;/strong>: &lt;code>/etc/systemd/system/wechat-alert.service&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">WeChat Alert Daemon for Zabbix&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">network.target&lt;/span>
&lt;/span>&lt;/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">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">User&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">root&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WorkingDirectory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/opt/alert&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/opt/alert/venv/bin/python /opt/alert/wechat.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Restart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">always&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">RestartSec&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">StandardOutput&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">journal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">StandardError&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">journal&lt;/span>
&lt;/span>&lt;/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">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WantedBy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-服务管理命令">3.2 服务管理命令&lt;/h3>
&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">systemctl status wechat-alert.service
&lt;/span>&lt;/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">journalctl -u wechat-alert.service -f
&lt;/span>&lt;/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">systemctl restart wechat-alert.service
&lt;/span>&lt;/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">systemctl stop wechat-alert.service
&lt;/span>&lt;/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">systemctl &lt;span class="nb">enable&lt;/span> wechat-alert.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="四脚本代码">四、脚本代码&lt;/h2>
&lt;p>基于 &lt;code>alertid&lt;/code> 增量进度标记，不依赖 &lt;code>status&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="ch">#!/usr/bin/env python3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -*- coding: utf-8 -*-&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">微信告警守护进程（纯只读版 - 适配网闸同步场景）
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- 仅读取 Zabbix alerts 表
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- 不修改数据库任何状态 (No UPDATE/INSERT)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- 基于内存记录最大 alertid 实现去重
&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="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">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">urllib.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">urllib.error&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">pymysql&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">os&lt;/span>
&lt;/span>&lt;/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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CORPID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;YOUR_CORPID&amp;#39;&lt;/span> &lt;span class="c1"># 企业微信 CorpID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">CORPSECRET&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;YOUR_CORPSECRET&amp;#39;&lt;/span> &lt;span class="c1"># 企业微信应用 Secret&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">AGENTID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;8&amp;#39;&lt;/span> &lt;span class="c1"># 企业微信应用 AgentID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TOUSER&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;YOUR_PHONE&amp;#34;&lt;/span> &lt;span class="c1"># 接收人 UserID（手机号）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TOPARTY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;6&amp;#34;&lt;/span> &lt;span class="c1"># 接收部门 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">DB_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="s1">&amp;#39;host&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;YOUR_DB_HOST&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># Zabbix 数据库地址（网闸同步后的中转库）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;port&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3306&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;user&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;zabbix&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="s1">&amp;#39;password&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;YOUR_DB_PASSWORD&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="s1">&amp;#39;database&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;zabbix&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="s1">&amp;#39;charset&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;utf8mb4&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="s1">&amp;#39;connect_timeout&amp;#39;&lt;/span>&lt;span class="p">:&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="s1">&amp;#39;read_timeout&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&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="n">CHECK_INTERVAL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># 轮询间隔（秒）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SELF_ALERT_THRESHOLD&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="c1"># 连续失败 N 次后发自检告警&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SELF_ALERT_COOLDOWN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">300&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">db_fail_count&lt;/span> &lt;span class="o">=&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">token_fail_count&lt;/span> &lt;span class="o">=&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">last_self_alert_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">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="c1"># 内存中记录已处理的最大 alertid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 初始为 0，程序启动后会立即同步为数据库当前的最大值&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">last_processed_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">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="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="k">def&lt;/span> &lt;span class="nf">log&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="n">timestamp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1"> %H:%M:%S&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="sa">f&lt;/span>&lt;span class="s2">&amp;#34;[&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">timestamp&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">] &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">msg&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">flush&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="k">def&lt;/span> &lt;span class="nf">send_wechat_message_raw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">subject&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&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">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">payload&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;touser&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">TOUSER&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;toparty&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">TOPARTY&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;msgtype&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;text&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;agentid&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">AGENTID&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;text&amp;#34;&lt;/span>&lt;span class="p">:&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="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">subject&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">message&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;safe&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&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">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">data&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">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">payload&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="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&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">req&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&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">Request&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">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">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="p">{&lt;/span>&lt;span class="s1">&amp;#39;Content-Type&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;application/json&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">with&lt;/span> &lt;span class="n">urllib&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">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">req&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">10&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">resp&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">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loads&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">read&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&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">result&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;errcode&amp;#39;&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">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="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;⚠️ 微信 API 返回错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&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;errmsg&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">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="n">log&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="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">get_token_for_self_alert&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;专用于自检告警的 token 获取（独立重试）&amp;#34;&amp;#34;&amp;#34;&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="sa">f&lt;/span>&lt;span class="s1">&amp;#39;https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">CORPID&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;amp;corpsecret=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">CORPSECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&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="n">urllib&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">urlopen&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">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">resp&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">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loads&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">read&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&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">data&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;errcode&amp;#39;&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="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;access_token&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">except&lt;/span> &lt;span class="ne">Exception&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">pass&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">None&lt;/span>
&lt;/span>&lt;/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">send_self_alert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reason&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">global&lt;/span> &lt;span class="n">last_self_alert_time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">now&lt;/span> &lt;span class="o">=&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>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">now&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">last_self_alert_time&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">SELF_ALERT_COOLDOWN&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="n">log&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">reason&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">token&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_token_for_self_alert&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">token&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;❌ 自检告警：无法获取 token，放弃发送&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="n">subject&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="n">message&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="sa">f&lt;/span>&lt;span class="s2">&amp;#34;主机：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">uname&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&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="sa">f&lt;/span>&lt;span class="s2">&amp;#34;时间：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1"> %H:%M:%S&amp;#39;&lt;/span>&lt;span class="p">)&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="sa">f&lt;/span>&lt;span class="s2">&amp;#34;原因：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">reason&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="sa">f&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>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">send_wechat_message_raw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">subject&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&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">last_self_alert_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">now&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">log&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_wechat_token&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">token_fail_count&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="sa">f&lt;/span>&lt;span class="s1">&amp;#39;https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">CORPID&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;amp;corpsecret=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">CORPSECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&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="n">urllib&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">urlopen&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">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">resp&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">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loads&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">read&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;utf-8&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">data&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;errcode&amp;#39;&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="n">token_fail_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&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">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;access_token&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">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">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;❌ 获取 token 失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">data&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;errmsg&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="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;💥 获取 token 异常：&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="n">token_fail_count&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&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">token_fail_count&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">SELF_ALERT_THRESHOLD&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send_self_alert&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">token_fail_count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 次无法获取企业微信 token&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">None&lt;/span>
&lt;/span>&lt;/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">process_alerts&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">db_fail_count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">last_processed_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">conn&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="n">cursor&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">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">log&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">conn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pymysql&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">connect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">DB_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">cursor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">conn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cursor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pymysql&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cursors&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DictCursor&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&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">db_fail_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">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="c1"># 初始化：首次运行时同步到数据库当前最大 alertid&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">last_processed_id&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="n">cursor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;SELECT MAX(alertid) as max_id FROM alerts&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">row&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cursor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fetchone&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_max&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;max_id&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">row&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;max_id&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="mi">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="k">if&lt;/span> &lt;span class="n">current_max&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>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">last_processed_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">current_max&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;🚀 初始化完成：当前数据库最大 alertid 为 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">last_processed_id&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">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34; 将仅监控 ID &amp;gt; &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">last_processed_id&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 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">log&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>&lt;/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"># 查询新增告警（只查 alertid &amp;gt; last_processed_id 的数据）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cursor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">(&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"> SELECT alertid, subject, message
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> FROM alerts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> WHERE alertid &amp;gt; &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ORDER BY alertid ASC
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> LIMIT 50
&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 class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">last_processed_id&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">alerts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cursor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fetchall&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">alerts&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="n">log&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">alerts&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 条新告警 (ID 范围：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">alerts&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;alertid&amp;#39;&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">alerts&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;alertid&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>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">token&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_wechat_token&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">token&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;⚠️ 无法获取 Token，跳过本次发送&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="n">success_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&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">alert&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">alerts&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_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">alert&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;alertid&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">subject&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">alert&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;subject&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s1">&amp;#39;[无标题]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">alert&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;message&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s1">&amp;#39;[无内容]&amp;#39;&lt;/span>
&lt;/span>&lt;/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">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;📤 发送告警 ID=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">alert_id&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">subject&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">30&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="n">send_wechat_message_raw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">subject&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">last_processed_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">alert_id&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;✅ 告警 ID=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">alert_id&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">success_count&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&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">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;❌ 告警 ID=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">alert_id&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">break&lt;/span>
&lt;/span>&lt;/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">log&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">success_count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/&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">alerts&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, 内存标记 ID: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">last_processed_id&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">except&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">pymysql&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Error&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="ne">OSError&lt;/span>&lt;span class="p">)&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">log&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="n">db_fail_count&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&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">db_fail_count&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">SELF_ALERT_THRESHOLD&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send_self_alert&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">db_fail_count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 次无法连接数据库 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">DB_CONFIG&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="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">log&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="n">send_self_alert&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="mi">100&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="k">if&lt;/span> &lt;span class="n">cursor&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cursor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">close&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">conn&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">conn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">close&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="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">log&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">log&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">DB_CONFIG&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="si">}&lt;/span>&lt;span class="s2">:&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">DB_CONFIG&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;port&amp;#39;&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">DB_CONFIG&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;database&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">log&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">CHECK_INTERVAL&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">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;🛡️ 模式：只读不写 (基于 alertid 增量去重)&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">while&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">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">process_alerts&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">KeyboardInterrupt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">log&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">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exit&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">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">log&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="n">send_self_alert&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="mi">100&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">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="n">CHECK_INTERVAL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="五运维参考">五、运维参考&lt;/h2>
&lt;h3 id="51-文件清单">5.1 文件清单&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>路径&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>/opt/alert/wechat.py&lt;/code>&lt;/td>
&lt;td>当前运行的主脚本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/opt/alert/wechat.py.bak&lt;/code>&lt;/td>
&lt;td>备份（2026-02-28）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/opt/alert/venv/&lt;/code>&lt;/td>
&lt;td>Python 虚拟环境（含 pymysql）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/etc/systemd/system/wechat-alert.service&lt;/code>&lt;/td>
&lt;td>systemd 服务单元&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="52-依赖">5.2 依赖&lt;/h3>
&lt;p>依赖说明：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件&lt;/th>
&lt;th>用途&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Python 3.x&lt;/td>
&lt;td>运行时环境&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pymysql&lt;/code>&lt;/td>
&lt;td>连接 MySQL / Zabbix 数据库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>urllib&lt;/code>&lt;/td>
&lt;td>Python 标准库，用于调用企业微信 API&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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 pymysql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="53-企业微信-api">5.3 企业微信 API&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>接口&lt;/th>
&lt;th>用途&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>GET /cgi-bin/gettoken&lt;/code>&lt;/td>
&lt;td>获取 access_token&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>POST /cgi-bin/message/send&lt;/code>&lt;/td>
&lt;td>发送应用消息&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Ocserv 跨系统安装配置指南</title><link>https://blog.air1.cn/ocserv-install-config/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/ocserv-install-config/</guid><description>&lt;h2 id="一centos-7-安装配置">一、CentOS 7 安装配置&lt;/h2>
&lt;h3 id="1-安装-epel-源和-ocserv">1. 安装 EPEL 源和 Ocserv&lt;/h3>
&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"># 安装 EPEL 源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum -y install epel-release
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># YUM 安装 Ocserv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yum -y install ocserv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-生成-ssl-证书">2. 生成 SSL 证书&lt;/h3>
&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">mkdir ssl &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> ssl
&lt;/span>&lt;/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"># 创建 CA 证书模板&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &amp;gt; ca.tmpl &lt;span class="s">&amp;lt;&amp;lt; EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cn = &amp;#34;Innatus&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">organization = &amp;#34;Innatus.CN&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">serial = 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">expiration_days = 9999
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">ca
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cert_signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">crl_signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/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"># 生成 CA 私钥和证书&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-privkey --outfile ca-key.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
&lt;/span>&lt;/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"># 创建服务器证书模板（替换为你的服务器公网IP）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &amp;gt; server.tmpl &lt;span class="s">&amp;lt;&amp;lt; EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cn = &amp;#34;你的服务器IP&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">organization = &amp;#34;Innatus.CN&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">expiration_days = 9999
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">encryption_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">tls_www_server
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/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">certtool --generate-privkey --outfile server-key.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
&lt;/span>&lt;/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"># 移动证书到 Ocserv 默认目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp server-cert.pem /etc/pki/ocserv/public/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp server-key.pem /etc/pki/ocserv/private/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp ca-cert.pem /etc/pki/ocserv/cacerts/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置-ocserv-主配置文件">3. 配置 Ocserv 主配置文件&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">vi /etc/ocserv/ocserv.conf
&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-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 验证方式改为密码验证&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">auth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;plain[passwd=/etc/ocserv/ocpasswd]&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"># 2. 监听端口（默认443，如有占用可修改）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">tcp-port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">443&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">udp-port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">443&lt;/span>
&lt;/span>&lt;/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"># 3. 连接欢迎信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">banner&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Welcome Innatus.CN&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"># 4. 最大连接数限制&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">max-clients&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">max-same-clients&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">2&lt;/span>
&lt;/span>&lt;/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"># 5. 服务器证书和私钥路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">server-cert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/pki/ocserv/public/server-cert.pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">server-key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/pki/ocserv/private/server-key.pem&lt;/span>
&lt;/span>&lt;/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"># 6. CA 证书路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ca-cert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/pki/ocserv/cacerts/ca-cert.pem&lt;/span>
&lt;/span>&lt;/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"># 7. 取消 IPv4 网段注释（启用内网分配）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ipv4-network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">192.168.10.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ipv4-netmask&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">255.255.255.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="c1"># 8. 启用 DNS 并设置公共 DNS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">tunnel-all-dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">8.8.8.8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">8.8.4.4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-创建管理-vpn-用户">4. 创建/管理 VPN 用户&lt;/h3>
&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"># 创建用户（替换 Innatus 为自定义用户名）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ocpasswd -c /etc/ocserv/ocpasswd Innatus
&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">ocpasswd -c /etc/ocserv/ocpasswd -d Innatus
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-系统网络配置">5. 系统网络配置&lt;/h3>
&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"># 启用 IPv4 转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="m">1&lt;/span> &amp;gt; /proc/sys/net/ipv4/ip_forward
&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">echo&lt;/span> &lt;span class="s2">&amp;#34;net.ipv4.ip_forward = 1&amp;#34;&lt;/span> &amp;gt;&amp;gt; /etc/sysctl.conf &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sysctl -p
&lt;/span>&lt;/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">systemctl start firewalld.service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 放行端口（如果修改了端口，替换 443 为自定义端口）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>443/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>443/udp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启用伪装转发（NAT）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --add-masquerade
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -o eth0 -j MASQUERADE
&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">firewall-cmd --reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-启动并设置开机自启">6. 启动并设置开机自启&lt;/h3>
&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">ocserv -f -d &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/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">systemctl &lt;span class="nb">enable&lt;/span> ocserv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl start ocserv
&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">systemctl restart ocserv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="二ubuntu-安装配置">二、Ubuntu 安装配置&lt;/h2>
&lt;h3 id="1-安装-ocserv">1. 安装 Ocserv&lt;/h3>
&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">apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装 Ocserv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install -y ocserv gnutls-bin
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-生成-ssl-证书与-centos-步骤一致">2. 生成 SSL 证书（与 CentOS 步骤一致）&lt;/h3>
&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">mkdir ssl &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> ssl
&lt;/span>&lt;/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"># 创建 CA 模板&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &amp;gt; ca.tmpl &lt;span class="s">&amp;lt;&amp;lt; EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cn = &amp;#34;Innatus&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">organization = &amp;#34;Innatus.CN&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">serial = 1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">expiration_days = 9999
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">ca
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cert_signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">crl_signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/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"># 生成 CA 证书&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-privkey --outfile ca-key.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
&lt;/span>&lt;/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"># 创建服务器证书模板（替换为服务器IP）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &amp;gt; server.tmpl &lt;span class="s">&amp;lt;&amp;lt; EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">cn = &amp;#34;你的服务器IP&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">organization = &amp;#34;Innatus.CN&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">expiration_days = 9999
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">signing_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">encryption_key
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">tls_www_server
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/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">certtool --generate-privkey --outfile server-key.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
&lt;/span>&lt;/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"># 移动证书到 Ubuntu 下的 Ocserv 目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p /etc/ocserv/certs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp server-cert.pem /etc/ocserv/certs/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp server-key.pem /etc/ocserv/certs/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp ca-cert.pem /etc/ocserv/certs/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置-ocserv-主配置文件-1">3. 配置 Ocserv 主配置文件&lt;/h3>
&lt;p>Ubuntu 下配置文件路径为 &lt;code>/etc/ocserv/ocserv.conf&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">vi /etc/ocserv/ocserv.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心配置项调整（与 CentOS 一致，仅证书路径需适配）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&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="na">auth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;plain[passwd=/etc/ocserv/ocpasswd]&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="na">tcp-port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">443&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">udp-port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">443&lt;/span>
&lt;/span>&lt;/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"># 证书路径（Ubuntu 路径适配）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">server-cert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/ocserv/certs/server-cert.pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">server-key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/ocserv/certs/server-key.pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ca-cert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/etc/ocserv/certs/ca-cert.pem&lt;/span>
&lt;/span>&lt;/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"># 其他配置（同 CentOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">banner&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Welcome Innatus.CN&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">max-clients&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">max-same-clients&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ipv4-network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">192.168.10.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ipv4-netmask&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">255.255.255.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">tunnel-all-dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">8.8.8.8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">8.8.4.4&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-创建-vpn-用户同-centos">4. 创建 VPN 用户（同 CentOS）&lt;/h3>
&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">ocpasswd -c /etc/ocserv/ocpasswd Innatus
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-系统网络配置-1">5. 系统网络配置&lt;/h3>
&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"># 启用 IPv4 转发&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="m">1&lt;/span> &amp;gt; /proc/sys/net/ipv4/ip_forward
&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">echo&lt;/span> &lt;span class="s2">&amp;#34;net.ipv4.ip_forward = 1&amp;#34;&lt;/span> &amp;gt;&amp;gt; /etc/sysctl.conf &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sysctl -p
&lt;/span>&lt;/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"># Ubuntu 防火墙配置（UFW）&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">ufw allow 443/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ufw allow 443/udp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启用 NAT 转发（需先安装 iptables）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install -y iptables
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 保存 iptables 规则（永久生效）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iptables-save &amp;gt; /etc/iptables/rules.v4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-启动并设置开机自启-1">6. 启动并设置开机自启&lt;/h3>
&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">ocserv -f -d &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/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">systemctl &lt;span class="nb">enable&lt;/span> ocserv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl start ocserv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl restart ocserv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="三常见问题">三、常见问题&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>问题&lt;/th>
&lt;th>处理建议&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>端口占用&lt;/td>
&lt;td>若 443 端口被 Nginx / Apache 占用，可将 &lt;code>tcp-port&lt;/code> / &lt;code>udp-port&lt;/code> 改为其他端口（如 4433），并同步更新防火墙规则。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网卡名称不一致&lt;/td>
&lt;td>Ubuntu / CentOS 的网卡名称可能为 &lt;code>ens33&lt;/code>、&lt;code>eth0&lt;/code> 等，先用 &lt;code>ip addr&lt;/code> 确认实际网卡名。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>证书生成失败&lt;/td>
&lt;td>确保已安装 &lt;code>gnutls-bin&lt;/code>（Ubuntu）或 &lt;code>gnutls-utils&lt;/code>（CentOS）。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="总结">总结&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>CentOS&lt;/strong> 依赖 EPEL 源安装 Ocserv，证书默认存放路径为 &lt;code>/etc/pki/ocserv/&lt;/code>，防火墙使用 firewalld；&lt;/li>
&lt;li>&lt;strong>Ubuntu&lt;/strong> 直接通过 apt 安装，证书需手动创建目录 &lt;code>/etc/ocserv/certs/&lt;/code>，防火墙默认使用 UFW，需配置 iptables 实现 NAT 转发；&lt;/li>
&lt;li>核心配置项（认证方式、端口、DNS、证书路径）在两个系统中基本一致，仅需适配证书存放路径和防火墙命令。&lt;/li>
&lt;/ol></description></item><item><title>云厂商常用公网 IP 段</title><link>https://blog.air1.cn/cloud-ip-ranges/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/cloud-ip-ranges/</guid><description>&lt;p>整理了主流云服务商的部分常用公网 IPv4 地址段。&lt;strong>实际 IP 段可能动态变化，仅供参考&lt;/strong>。&lt;/p>
&lt;details>
&lt;summary>点击展开/阿里云&lt;/summary>
&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">8.129.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.129.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.129.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.130.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.131.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.130.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.132.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.133.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.132.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.134.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.134.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.134.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.135.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.135.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.135.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.136.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.136.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.136.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.137.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.140.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.141.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.140.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.141.200.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.142.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.144.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.146.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.144.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.148.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.149.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.120.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.96.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.100.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.104.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.105.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.104.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.106.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.108.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.108.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.108.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">39.96.0.0/13
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.227.188.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.120.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.120.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.121.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.121.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.121.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.156.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.156.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.156.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">42.96.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.113.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.113.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.113.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.100.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.94.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.92.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.92.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.96.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.97.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.96.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.96.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.98.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.110.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.102.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.100.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.104.0.0/13
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.105.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.104.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.104.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.106.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.107.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.106.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.108.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.108.108.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.108.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.109.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.110.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.111.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.110.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.112.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.113.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.112.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.114.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.114.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.114.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.114.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.115.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.114.16.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.115.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.115.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.116.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.116.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.116.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.116.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.117.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.117.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.117.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.117.248.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.118.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.118.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.118.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.118.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.118.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.119.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.119.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.119.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.120.0.0/13
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.121.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.120.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.120.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.122.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.122.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.122.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">47.92.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.12.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.0.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.40.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.8.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.16.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.4.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.32.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.48.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.52.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.48.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.56.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.60.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.56.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.8.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">60.205.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.110.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.110.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">59.82.0.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">60.205.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">60.205.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">60.205.133.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8.128.0.0/11
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.37.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.37.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.15.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.133.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.132.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.133.201.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.200.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.201.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.200.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.37.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.47.4.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.52.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.52.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.52.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.36.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.40.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.48.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.56.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.14.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.176.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.184.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.198.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.199.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.200.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.201.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.208.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.216.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.11.32.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.15.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.14.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.173.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.227.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.228.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.230.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.233.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.235.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.236.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.3.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.2.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.30.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.4.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.56.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.60.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.8.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.124.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.13.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.12.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.15.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.5.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.6.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.76.7.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">101.132.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.173.196.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.173.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.173.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.75.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.74.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.74.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.215.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.124.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.124.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.124.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.125.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.125.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.125.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.126.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.126.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.126.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.127.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.127.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.127.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">112.74.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.55.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.55.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.124.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.55.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.29.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.28.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.29.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.29.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.251.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.124.20.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.124.16.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.124.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.28.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.62.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.62.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.178.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.62.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.31.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.31.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.23.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.178.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.178.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.190.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.190.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.190.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.31.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.23.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.23.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.38.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.38.216.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.38.208.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.38.219.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.224.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.229.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.228.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.231.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.230.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.232.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.234.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.241.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.240.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.243.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.42.242.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.24.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.25.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.24.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.24.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.26.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.26.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.79.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.55.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.27.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.55.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.55.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.76.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.76.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.76.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.76.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.76.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.77.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.77.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.77.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.77.193.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.78.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.79.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.78.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.0.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.0.24.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.0.16.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.0.28.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.196.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.40.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.89.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.17.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.42.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.89.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.89.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.56.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.197.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.196.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.198.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.199.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.40.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.57.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.56.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.57.45.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.57.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.129.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.129.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.129.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.196.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.196.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.196.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.224.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.224.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.224.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.76.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.92.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.205.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.92.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.92.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.13.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.60.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.20.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.21.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.22.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.23.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.32.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.36.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.32.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.44.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.46.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.44.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.52.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.54.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.52.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.56.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.58.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.56.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.6.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.62.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.60.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.72.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.73.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.74.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.75.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.76.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.77.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.107.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.144.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.128.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.152.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.156.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.152.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.160.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.168.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">218.244.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.119.168.0/22
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/details>
&lt;details>
&lt;summary>点击展开/腾讯云&lt;/summary>
&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">1.12.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1.13.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1.13.16.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1.14.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.136.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.52.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106.55.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">111.229.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">111.230.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.117.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.132.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.126.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.195.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.195.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.24.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">118.25.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.88.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.90.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.92.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.94.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.28.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.0.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.100.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.102.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.104.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.106.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.110.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.112.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.114.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.116.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.118.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.120.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.122.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.124.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.126.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.14.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.16.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.18.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.20.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.22.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.24.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.26.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.28.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.29.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.30.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.32.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.34.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.36.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.38.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.44.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.46.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.48.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.50.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.52.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.54.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.56.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.58.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.6.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.60.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.62.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.64.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.66.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.68.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.70.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.72.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.74.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.76.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.78.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.86.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.88.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.90.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.92.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.94.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.29.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.45.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.208.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.212.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.152.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.51.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.100.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.102.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.104.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.106.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.110.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.112.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.114.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.116.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.118.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.120.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.122.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.124.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.126.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.175.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.246.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.97.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.206.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.0.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.100.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.102.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.104.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.106.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.110.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.112.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.114.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.116.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.118.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.120.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.122.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.124.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.126.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.136.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.14.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.16.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.18.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.20.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.22.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.24.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.26.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.28.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.30.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.32.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.34.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.36.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.38.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.44.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.46.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.48.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.50.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.52.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.54.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.56.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.58.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.6.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.60.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.62.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.64.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.66.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.68.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.70.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.72.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.74.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.76.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.78.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.86.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.88.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.90.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.92.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.94.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.207.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.220.0.0/14
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">128.108.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">129.204.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">129.211.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">129.226.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">129.28.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.112.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">132.232.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.112.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.208.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.232.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">134.175.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.155.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.186.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.0.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.112.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.128.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.136.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.14.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.140.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.140.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.16.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.18.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.20.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.236.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.237.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.252.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.32.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.44.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.44.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.46.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.48.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.50.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.52.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.53.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.54.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.56.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.58.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.6.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.60.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.62.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.64.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.66.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.68.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.70.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.72.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.74.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.76.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.78.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.86.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.88.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.90.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.92.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.94.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.199.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.100.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.102.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.104.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.110.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.114.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.116.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.120.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.124.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.128.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.132.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.136.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.140.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.144.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.148.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.152.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.156.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.16.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.160.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.164.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.168.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.172.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.176.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.180.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.184.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.188.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.208.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.212.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.220.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.224.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.228.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.232.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.236.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.240.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.244.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.248.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.84.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.88.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.92.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.143.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">146.56.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">148.70.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.0.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.132.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.133.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.16.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.160.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.164.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.168.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.172.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.176.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.180.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.184.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.188.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.192.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.20.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.24.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.28.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.32.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.36.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.4.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.44.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.48.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.52.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.56.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.60.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.64.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.8.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.86.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.88.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.89.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.109.90.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">150.158.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">152.136.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.192.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.240.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">154.8.248.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.75.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.14.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.0.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.128.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.14.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.16.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.18.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.20.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.22.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.24.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.26.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.28.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.6.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">162.62.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">170.106.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">170.106.128.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">170.106.129.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">170.106.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">170.106.130.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.192.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">172.81.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175.178.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175.24.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.159.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.226.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.248.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.249.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.254.250.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.144.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.144.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.144.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.144.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.144.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">193.112.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.192.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.194.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.212.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.214.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.216.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.218.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.226.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.227.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.195.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">210.73.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">210.73.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">210.73.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.178.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.180.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.184.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.186.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.196.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.198.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.200.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.202.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.204.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.206.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.210.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.212.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.220.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.224.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.240.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">211.159.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.136.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.137.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.138.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.142.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.242.252.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.220.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.240.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.244.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.248.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.40.252.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.232.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.234.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.0.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.10.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.100.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.104.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.12.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.128.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.132.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.134.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.136.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.137.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.14.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.144.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.146.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.148.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.150.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.152.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.154.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.156.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.158.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.16.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.160.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.162.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.166.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.168.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.168.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.169.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.172.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.174.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.176.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.18.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.180.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.184.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.188.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.2.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.20.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.204.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.22.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.224.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.228.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.230.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.232.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.234.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.236.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.237.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.238.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.238.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.24.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.244.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.246.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.248.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.252.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.26.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.28.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.30.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.32.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.32.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.34.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.36.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.36.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.37.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.38.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.4.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.40.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.42.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.44.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.46.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.48.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.50.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.52.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.54.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.6.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.62.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.62.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.64.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.66.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.68.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.70.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.72.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.74.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.76.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.78.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.8.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.80.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.82.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.84.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.86.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.88.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.92.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.51.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.100.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.104.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.106.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.108.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.120.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.64.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.68.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.72.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.76.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.80.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.84.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.88.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.92.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">58.87.96.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">62.234.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">81.70.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">82.156.0.0/15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">94.191.0.0/17
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/details>
&lt;details>
&lt;summary>点击展开/华为云&lt;/summary>
&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">1.94.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1.95.0.0/16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.128.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.132.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.136.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.140.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.144.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.148.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.152.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.153.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.156.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.157.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.161.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.165.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.169.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.170.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.172.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.176.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.180.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.184.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14.137.188.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.254.0.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.254.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.254.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.254.2.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">43.254.3.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.155.208.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.155.211.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.249.212.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.249.212.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.249.213.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.249.214.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">45.249.215.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.0.192.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.0.200.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.16.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.64.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.72.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.76.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.96.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.104.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.108.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.110.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.112.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.120.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.124.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">49.4.126.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">78.101.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">78.101.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">78.101.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">85.97.220.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">85.97.221.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">85.97.222.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.31.200.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.31.202.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.31.203.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.69.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.69.140.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.69.141.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.152.54.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.161.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.218.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.218.216.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.218.217.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.218.218.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">103.218.219.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.40.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.208.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.209.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.211.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.212.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.216.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.41.255.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.64.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.72.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.96.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.98.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.99.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.100.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.104.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">110.238.120.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.44.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">113.45.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.115.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.115.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.115.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.116.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">114.119.172.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.130.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.136.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.138.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.140.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.142.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">115.120.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.120.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.63.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.128.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.129.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.130.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.131.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.132.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.133.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.134.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.135.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.136.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.137.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.138.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.139.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.141.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.142.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.243.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.71.244.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.196.200.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.196.202.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.204.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.204.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.2.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.3.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.4.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.5.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.6.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.7.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.20.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.22.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.28.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.29.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.32.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.48.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.56.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.192.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.193.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.194.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.215.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.219.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.220.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.221.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.222.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.223.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">116.205.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.16.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.24.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.25.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.29.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.30.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.31.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.32.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.44.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.48.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.56.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">117.78.60.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.114.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.118.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.120.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.144.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.152.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.3.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.0.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.8.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.16.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.17.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.18.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.19.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.20.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.23.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.64.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.68.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.69.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.70.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.71.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.72.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.128.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.129.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.130.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.224.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.225.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.227.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.228.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.240.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.242.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.244.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.245.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.246.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.248.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.249.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.250.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.252.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.253.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.8.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.64.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.65.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.66.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.68.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.72.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.80.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.88.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.92.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">119.13.112.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.46.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">120.46.128.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.36.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.36.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.36.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.48.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.56.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.62.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121.37.192.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.96.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.225.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.236.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.240.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.244.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.250.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.9.252.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.128.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.132.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.136.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.160.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.192.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.196.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.200.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">122.112.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.60.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.60.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.60.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123.60.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.70.0.0/17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.70.128.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.70.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.70.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.70.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.64.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.248.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.249.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.251.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">124.71.254.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.0.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.14.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.32.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.96.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.98.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.99.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.100.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.104.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.120.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.240.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.9.248.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.132.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.136.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.160.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.164.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.168.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.172.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.176.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.208.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">139.159.224.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.210.128.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.210.192.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">140.210.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.16.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.20.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.32.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.48.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.64.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.67.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.79.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.80.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.112.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.120.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.124.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.128.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.144.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.152.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.160.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.176.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.178.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.179.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.180.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.181.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.182.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.184.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.185.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.186.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.187.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.188.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.190.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.192.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.208.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.216.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.220.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.223.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.224.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">159.138.240.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">168.195.92.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">168.195.92.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">168.195.93.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.0.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.16.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.17.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.24.0/21
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.32.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.36.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.40.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.44.0/22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">182.160.49.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">185.176.76.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">185.176.76.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">185.176.78.0/23
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.199.0.0/18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.199.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.199.96.0/20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.210.163.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.2.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.4.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.5.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.6.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.7.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.8.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.9.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.10.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.11.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.12.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.13.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.14.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">197.252.15.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200.10.96.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200.32.52.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200.32.54.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200.32.57.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.0.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.1.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.2.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.3.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.4.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.5.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.8.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.9.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.19.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.20.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.21.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.22.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.23.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.24.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.25.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.26.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.29.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.32.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.33.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.38.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.39.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.40.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.42.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.43.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.44.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.45.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.46.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.47.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.48.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">203.135.50.0/24
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">218.245.64.0/19
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">218.245.96.0/19
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/details></description></item><item><title>网站架构与部署说明</title><link>https://blog.air1.cn/site-architecture-and-deployment/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.air1.cn/site-architecture-and-deployment/</guid><description>&lt;p>这篇文章专门用来说明当前这个站点是怎样组织、怎样构建、又怎样发布到线上去的。它不是泛泛而谈的 Hugo 教程，而是针对这个仓库本身的一份工程说明。&lt;/p>
&lt;h2 id="一项目定位">一、项目定位&lt;/h2>
&lt;p>这个项目是一个非常轻量的静态博客站点，核心技术栈只有三层：&lt;/p>
&lt;ol>
&lt;li>内容层：使用 Markdown 维护页面和文章。&lt;/li>
&lt;li>构建层：使用 Hugo 把内容、模板和样式编译成静态文件。&lt;/li>
&lt;li>部署层：使用 Cloudflare Pages 连接 GitHub 仓库，在每次推送后自动构建并发布。&lt;/li>
&lt;/ol>
&lt;p>这意味着整个站点没有传统意义上的后端服务，也没有数据库依赖。页面访问时，用户拿到的是已经提前生成好的 HTML、CSS 和其他静态资源，所以结构简单、上线稳定、访问速度也比较容易保证。&lt;/p>
&lt;h2 id="二仓库结构">二、仓库结构&lt;/h2>
&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">config.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">content/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> _index.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> about/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> index.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> posts/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">themes/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> air1/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> assets/css/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> layouts/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以把它理解成三块：&lt;/p>
&lt;h3 id="1-configtoml">1. &lt;code>config.toml&lt;/code>&lt;/h3>
&lt;p>这是全站配置入口，负责定义站点级参数，例如：&lt;/p>
&lt;ul>
&lt;li>&lt;code>baseURL&lt;/code>：站点主地址。&lt;/li>
&lt;li>&lt;code>title&lt;/code>：站点标题。&lt;/li>
&lt;li>&lt;code>theme&lt;/code>：当前使用的主题名称，这里是 &lt;code>air1&lt;/code>。&lt;/li>
&lt;li>&lt;code>languageCode&lt;/code> 和 &lt;code>defaultContentLanguage&lt;/code>：语言设置。&lt;/li>
&lt;li>&lt;code>relativeURLs = true&lt;/code>：尽量使用相对链接，方便站点在不同域名或预览域下工作。&lt;/li>
&lt;li>&lt;code>enableRobotsTXT = true&lt;/code>：自动生成 &lt;code>robots.txt&lt;/code>。&lt;/li>
&lt;li>&lt;code>pagination.pagerSize = 10&lt;/code>：文章列表每页展示数量。&lt;/li>
&lt;li>&lt;code>[menu]&lt;/code>：顶部导航，目前主要是 &lt;code>post&lt;/code> 和 &lt;code>about&lt;/code>。&lt;/li>
&lt;li>&lt;code>[params]&lt;/code>：自定义参数，比如站点描述、页脚文案、作者名和 favicon 地址。&lt;/li>
&lt;/ul>
&lt;p>站点很多“可改但不需要改模板”的信息，都会放在这里。&lt;/p>
&lt;h3 id="2-content">2. &lt;code>content/&lt;/code>&lt;/h3>
&lt;p>这里是站点内容本体。&lt;/p>
&lt;ul>
&lt;li>&lt;code>content/_index.md&lt;/code>：首页内容。&lt;/li>
&lt;li>&lt;code>content/about/index.md&lt;/code>：关于页内容。&lt;/li>
&lt;li>&lt;code>content/posts/*.md&lt;/code>：博客文章。&lt;/li>
&lt;/ul>
&lt;p>Hugo 会把这些 Markdown 文件读取进来，再根据模板渲染成最终页面。换句话说，写文章、改页面，本质上都是在维护这个目录。&lt;/p>
&lt;h3 id="3-themesair1">3. &lt;code>themes/air1/&lt;/code>&lt;/h3>
&lt;p>这里放的是站点主题，也就是页面结构和视觉表现层。&lt;/p>
&lt;p>这个项目没有把主题单独当成远程依赖，而是直接把主题代码放在仓库里一起维护。这样做有两个好处：&lt;/p>
&lt;ol>
&lt;li>主题改动和站点改动可以一起提交，版本一致。&lt;/li>
&lt;li>Cloudflare Pages 在构建时不需要额外拉子模块，流程更直接。&lt;/li>
&lt;/ol>
&lt;h2 id="三页面渲染架构">三、页面渲染架构&lt;/h2>
&lt;p>这个站点虽然简单，但结构是清晰分层的。&lt;/p>
&lt;h3 id="1-页面骨架layouts_defaultbaseofhtml">1. 页面骨架：&lt;code>layouts/_default/baseof.html&lt;/code>&lt;/h3>
&lt;p>这是全站最外层的 HTML 骨架，负责把页面拆成几个固定区域：&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;head&amp;gt;&lt;/code>：由 &lt;code>partials/head.html&lt;/code> 输出。&lt;/li>
&lt;li>&lt;code>&amp;lt;header&amp;gt;&lt;/code>：由 &lt;code>partials/header.html&lt;/code> 输出。&lt;/li>
&lt;li>&lt;code>&amp;lt;main id=&amp;quot;content&amp;quot;&amp;gt;&lt;/code>：由不同页面模板填充主体内容。&lt;/li>
&lt;li>&lt;code>&amp;lt;footer&amp;gt;&lt;/code>：由 &lt;code>partials/footer.html&lt;/code> 输出。&lt;/li>
&lt;/ul>
&lt;p>可以把它理解成站点的总框架，所有页面最终都会套在这个壳子里。&lt;/p>
&lt;h3 id="2-头部与元信息layoutspartialsheadhtml">2. 头部与元信息：&lt;code>layouts/partials/head.html&lt;/code>&lt;/h3>
&lt;p>这个文件负责页面 SEO 和资源装配，主要包括：&lt;/p>
&lt;ul>
&lt;li>页面标题计算。&lt;/li>
&lt;li>页面描述提取。&lt;/li>
&lt;li>作者信息。&lt;/li>
&lt;li>&lt;code>robots&lt;/code> 元信息。&lt;/li>
&lt;li>favicon 输出。&lt;/li>
&lt;li>RSS 链接。&lt;/li>
&lt;li>Open Graph 和 Twitter Card 元信息。&lt;/li>
&lt;li>样式表拼接与压缩。&lt;/li>
&lt;/ul>
&lt;p>这里还有一个很实用的设计：主题会把 &lt;code>assets/css/main.css&lt;/code>、&lt;code>min770px.css&lt;/code>、&lt;code>dark.css&lt;/code>、&lt;code>syntax.css&lt;/code> 通过 Hugo 的资源管线拼接后再输出。这样线上拿到的是合并和压缩后的 CSS，而不是零散文件。&lt;/p>
&lt;h3 id="3-顶部导航layoutspartialsheaderhtml">3. 顶部导航：&lt;code>layouts/partials/header.html&lt;/code>&lt;/h3>
&lt;p>顶部区域会读取 &lt;code>config.toml&lt;/code> 里的菜单配置，按权重输出导航链接。现在导航本身非常简洁，只有站点标题和少量菜单项，符合这个项目“轻量、低干扰”的风格。&lt;/p>
&lt;h3 id="4-文章列表layoutspartialspostshtml">4. 文章列表：&lt;code>layouts/partials/posts.html&lt;/code>&lt;/h3>
&lt;p>这个文件负责首页或列表页上的文章集合展示。它做了几件事：&lt;/p>
&lt;ol>
&lt;li>从 &lt;code>site.RegularPages&lt;/code> 中筛出 &lt;code>Section = &amp;quot;posts&amp;quot;&lt;/code> 的页面。&lt;/li>
&lt;li>调用 &lt;code>.Paginate&lt;/code> 做分页。&lt;/li>
&lt;li>使用 &lt;code>li.html&lt;/code> 渲染每一篇文章的列表项。&lt;/li>
&lt;li>在文章数量超过一页时输出 &lt;code>prev&lt;/code>、页码和 &lt;code>next&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>因此，新增文章后，只要文件位于 &lt;code>content/posts/&lt;/code>，它就会自动进入列表，不需要再手动改首页。&lt;/p>
&lt;h3 id="5-文章详情layouts_defaultsinglehtml">5. 文章详情：&lt;code>layouts/_default/single.html&lt;/code>&lt;/h3>
&lt;p>单篇文章页负责输出：&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;/p>
&lt;h3 id="6-样式层themesair1assetscss">6. 样式层：&lt;code>themes/air1/assets/css/&lt;/code>&lt;/h3>
&lt;p>当前样式主要分成四份：&lt;/p>
&lt;ul>
&lt;li>&lt;code>main.css&lt;/code>：基础布局与常规样式。&lt;/li>
&lt;li>&lt;code>min770px.css&lt;/code>：较宽屏幕下的样式调整。&lt;/li>
&lt;li>&lt;code>dark.css&lt;/code>：深色模式相关样式。&lt;/li>
&lt;li>&lt;code>syntax.css&lt;/code>：代码高亮样式。&lt;/li>
&lt;/ul>
&lt;p>这种拆分方式能让样式职责更明确，也方便后续逐块维护。&lt;/p>
&lt;h2 id="四内容到页面的生成流程">四、内容到页面的生成流程&lt;/h2>
&lt;p>当仓库里新增或修改一篇文章时，生成过程大致是这样的：&lt;/p>
&lt;ol>
&lt;li>在 &lt;code>content/posts/&lt;/code> 下新增一个 Markdown 文件。&lt;/li>
&lt;li>在 front matter 中写入标题、日期、描述、URL 等元信息。&lt;/li>
&lt;li>Hugo 读取 &lt;code>config.toml&lt;/code>、内容文件和主题模板。&lt;/li>
&lt;li>Hugo 使用 Goldmark 把 Markdown 转成 HTML。&lt;/li>
&lt;li>Hugo 把内容套进主题模板里，生成最终静态页面。&lt;/li>
&lt;li>构建结果输出到 &lt;code>public/&lt;/code> 目录。&lt;/li>
&lt;/ol>
&lt;p>也就是说，内容、模板、配置三者在构建时会汇合，最终变成浏览器看到的站点。&lt;/p>
&lt;h2 id="五部署架构">五、部署架构&lt;/h2>
&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">本地修改
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; git commit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; git push 到 GitHub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; Cloudflare Pages 拉取仓库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; Hugo 构建静态文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; 发布到 Pages
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-&amp;gt; 通过 pages.dev 或自定义域名访问
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这条链路的好处是：&lt;/p>
&lt;ul>
&lt;li>变更来源单一，所有发布都可追踪到 Git 提交。&lt;/li>
&lt;li>不需要手动上传文件。&lt;/li>
&lt;li>回滚方便，只要回退到历史提交重新推送即可。&lt;/li>
&lt;li>Cloudflare 会自动处理静态托管、缓存和全球分发。&lt;/li>
&lt;/ul>
&lt;h2 id="六cloudflare-pages-的构建配置">六、Cloudflare Pages 的构建配置&lt;/h2>
&lt;p>根据当前项目的设计，这个站点在 Cloudflare Pages 上的关键配置应当是：&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">Framework preset: Hugo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Build command: hugo --gc --minify
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Build output directory: public
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Root directory: /
&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-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HUGO_VERSION = 0.147.7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里每一项都有明确作用：&lt;/p>
&lt;ul>
&lt;li>&lt;code>Framework preset: Hugo&lt;/code>：让 Pages 按 Hugo 项目处理。&lt;/li>
&lt;li>&lt;code>hugo --gc --minify&lt;/code>：构建时清理未使用资源，并压缩输出。&lt;/li>
&lt;li>&lt;code>public&lt;/code>：这是 Hugo 默认的静态输出目录。&lt;/li>
&lt;li>&lt;code>Root directory: /&lt;/code>：说明仓库根目录就是 Hugo 项目根目录。&lt;/li>
&lt;li>&lt;code>HUGO_VERSION&lt;/code>：固定 Hugo 版本，减少本地与线上构建差异。&lt;/li>
&lt;/ul>
&lt;h2 id="七为什么这个部署方式适合当前项目">七、为什么这个部署方式适合当前项目&lt;/h2>
&lt;p>对这个站点来说，GitHub + Cloudflare Pages 的组合非常合适，原因主要有四个：&lt;/p>
&lt;h3 id="1-内容型站点不需要复杂运行环境">1. 内容型站点不需要复杂运行环境&lt;/h3>
&lt;p>博客本质上是“写完就展示”的场景，静态站点生成非常匹配，不需要数据库、容器编排或常驻服务。&lt;/p>
&lt;h3 id="2-发布动作天然适合-git-工作流">2. 发布动作天然适合 Git 工作流&lt;/h3>
&lt;p>文章、配置、主题都在同一个仓库里，提交一次就是一个完整变更单元。以后不管是追踪问题、回溯版本，还是协作维护，都很清晰。&lt;/p>
&lt;h3 id="3-cloudflare-pages-几乎不增加运维负担">3. Cloudflare Pages 几乎不增加运维负担&lt;/h3>
&lt;p>Pages 已经把构建触发、静态托管、CDN 分发、HTTPS 等能力打包好了。对于个人博客，这种托管方式性价比很高。&lt;/p>
&lt;h3 id="4-当前主题本来就偏向少即是多">4. 当前主题本来就偏向“少即是多”&lt;/h3>
&lt;p>这个项目的主题结构简单、资源少、前端逻辑轻，因此非常适合静态分发，不需要为了部署去引入额外复杂度。&lt;/p>
&lt;h2 id="八一次完整发布通常怎么做">八、一次完整发布通常怎么做&lt;/h2>
&lt;p>如果按日常维护的角度看，这个站点的发布流程通常是下面这样：&lt;/p>
&lt;ol>
&lt;li>在本地修改 &lt;code>content/&lt;/code>、&lt;code>config.toml&lt;/code> 或主题文件。&lt;/li>
&lt;li>本地预览：&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">hugo server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>确认内容和样式无误后提交：&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">git add -A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Describe the change&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>Cloudflare Pages 检测到 &lt;code>main&lt;/code> 分支更新后自动开始构建。&lt;/li>
&lt;li>构建成功后，新版本自动上线。&lt;/li>
&lt;/ol>
&lt;p>如果只是写文章，绝大多数情况下不需要碰部署平台本身；只要把文章正确提交到仓库里，剩下的工作交给 Pages 就可以了。&lt;/p>
&lt;h2 id="九当前项目里值得注意的细节">九、当前项目里值得注意的细节&lt;/h2>
&lt;p>结合这个仓库本身，还有几个细节值得记录下来：&lt;/p>
&lt;h3 id="1-站点使用相对链接">1. 站点使用相对链接&lt;/h3>
&lt;p>&lt;code>relativeURLs = true&lt;/code> 让站点在 &lt;code>*.pages.dev&lt;/code> 预览域名和正式域名之间切换时更从容，减少因为绝对路径写死导致的问题。&lt;/p>
&lt;h3 id="2-favicon-使用外部图床地址">2. favicon 使用外部图床地址&lt;/h3>
&lt;p>当前 favicon 不是放在仓库本地，而是通过配置项引用外部 SVG 地址。这样改图标很方便，但也意味着图标展示会依赖图床域名的可用性。&lt;/p>
&lt;h3 id="3-主题与站点同仓维护">3. 主题与站点同仓维护&lt;/h3>
&lt;p>这让“改内容”和“改主题”可以在同一次提交里完成，特别适合个人站点快速迭代。&lt;/p>
&lt;h3 id="4-当前文章系统是纯文件驱动">4. 当前文章系统是纯文件驱动&lt;/h3>
&lt;p>没有后台，没有 CMS，没有数据库。要新增文章，只需要新增一个 Markdown 文件；要删除文章，直接删除对应文件即可。&lt;/p>
&lt;h2 id="十总结">十、总结&lt;/h2>
&lt;p>这个站点的核心思路其实很简单：&lt;/p>
&lt;ul>
&lt;li>用 &lt;code>content/&lt;/code> 管内容。&lt;/li>
&lt;li>用 &lt;code>themes/air1/&lt;/code> 管展示。&lt;/li>
&lt;li>用 &lt;code>config.toml&lt;/code> 管站点级行为。&lt;/li>
&lt;li>用 Hugo 负责构建。&lt;/li>
&lt;li>用 GitHub 和 Cloudflare Pages 负责发布。&lt;/li>
&lt;/ul>
&lt;p>这种架构的优势不在于“功能多”，而在于“路径短”。从写下文章，到提交仓库，到自动上线，整条链路清晰、稳定，而且非常适合长期维护。&lt;/p>
&lt;p>后续如果这个站点要继续扩展，最自然的方向通常会是：&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;/p></description></item></channel></rss>