跳到主内容
最新版本 · 发布于 2026-08-23

v2.11.085

🕷️ 蜘蛛池 · v2.11.084 的域名写门控是 **fail-closed**(无有效签名租约即拒写)。一台合法永久授权机

$curl -fsSL https://dl.wztseo.com/spider-pool.sh | bash
50
累计版本
50
2026 年发布
0
下载总次数
100%
自托管 CDN

版本历史

点击卡片展开/收起

v2.11.085

最新
2026-08-23·48 MB(压缩,自动解压)

# v2.11.085 · 防破解重构:默认放行 + 定向冻结(fail-open)

背景

v2.11.084 的域名写门控是 fail-closed(无有效签名租约即拒写)。一台合法永久授权机

(103,NTP 未开、时钟快 117s)升级后,续租的 r1_ts 超服务端仅 5s 未来容差 → 空挑战 →

拿不到租约 → 域名写被静默锁死。合法用户被防破解误伤,不可接受,故 084 已撤回、本版重构。

产品定调(硬约束):合法授权用户永不因防破解被自动锁;只锁破解者(后台手动封 /

自动检测);我方官网服务器崩溃 72 小时内不影响已授权用户的域名写。

变更(设计反转)

  • 域名写默认放行(fail-open):domainWriteAllowed() 默认允许;仅当客户端本地持有

一份有效签名的 frozen 策略(hasActiveSignedFreeze())时才拒写(403)。

无租约 / 租约过期 / 官网不可达 / 签名密钥缺失 —— 一律放行,不再锁合法用户。

  • 定向冻结(sticky):后台「封设备」或自动检测破解 → 服务端签发 frozen 策略;客户端

一旦 ACK 该 frozen,即粘滞保留,即使服务器不可达 / 令牌过期也保持锁定,直到收到

严格更高 (epoch,seq)normal 策略才解冻(单调,防降级绕过)。

  • 72h 宽限:官网崩溃期间,合法客户端凭已有 normal 状态继续放行,不受影响。
  • 时钟自愈:续租响应带 server_now,客户端据此校正时钟偏移,消除 084 那类

"时钟快 → 续租被拒" 的连锁;装机脚本/系统修复同步启用 NTP(systemd-timesyncd)。

  • 商业门与防破解门分离:
  • 门 A CanAddDomain:授权到期禁新增域名(402,商业);
  • 门 A′ IsDomainWritable:到期后非主域只读(402,既有商业机制);
  • 门 B hasActiveSignedFreeze:防破解冻结门,拦所有域名写(403)。三门互不越界。
  • max_domains 暂不执法:忽略 policy token 里的自定义 max_domains,只认免费版 3 / unlimited

商业判断,避免远程误限合法用户。

  • 后台监控五态:freeze_pending / freeze_active_sticky / unfreeze_pending /

normal_confirmed / offline(+ supported_uninitialized 未初始化),基于客户端 last_ack

单调记账判定,手动冻结附 SLA 提示;控制面只翻标志 + 推进代际,签令在续租时发生。

兼容/升级建议

  • 非 critical:客户端可择机「系统管理 → 🔍 立即检查 → ⚡ 一键升级」。双进程重启,大库冷启勿急杀。
  • 老客户端(082/无设备协议)升级后按默认放行工作,不会被防破解锁;仅破解/被封设备才会被定向冻结。
  • 服务端(wztseo.com)已就绪:POLICY_SIGN_SEED/LIC_SIGN_SEED 已配置;缺 seed 时不锁合法用户

(仅无法签发/更新策略,含 frozen)。

v2.11.082

2026-08-11·48 MB(压缩,自动解压)

# v2.11.082 · 后台侧栏滚动与分组展开修复

问题

  • 升到 v2.11.080/081 后侧栏菜单变多,鼠标滚轮滚不动;滚到下方时体感像在「收缩侧栏」。
  • 分组手风琴一次只开一组,一切换菜单其它组就收起,像不断换「标签页」、无法固定展开。

修复

  • 侧栏滚动区补 min-height:0 / flex-basis:0,在整页 overflow:hidden 下可正常上下滚。
  • 多分组可同时展开,并 sessionStorage 记住本次会话状态;路由只保证当前组展开,不再关掉其它组。
  • 子菜单展开动画 max-height 400→2000,避免核心/域名长列表被裁切。
  • 底部「收起侧栏」改为明确 button,减少误触感。

升级说明

  • 非 critical,纯前端。
  • 升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀)。

v2.11.084

2026-08-11·48 MB(压缩,自动解压)

# v2.11.084 · 授权防破解 期一+期二(设备绑定 + 签名域名租约 + 后台封设备)

背景

针对客户端被破解绕过授权的问题,引入设备身份 + 短期签名域名租约机制:

只有持有服务端签发的有效租约,客户端才允许「新增/修改域名」写操作;破解/盗用可在后台一键封禁。

本版为纯增量:蜘蛛出站建站/正常访问流量不受影响,仅「域名管理写操作」受租约门控。

新增

  • 设备身份:客户端首次运行生成 install_id + Ed25519 设备密钥(本地设置库持久化)。
  • 设备绑定(挑战-应答):两回合握手,R1 用设备私钥签 install_id+nonce 证明持钥,绑定到授权账号。
  • 签名域名租约:服务端用 Ed25519 子密钥签发 domain-policy 租约(含 epoch/seq 单调基线、

install_id/公钥哈希绑定、nbf/exp、domain_write=normal/frozen、max_domains)。客户端严格验签 +

单调接受 + trusted_time 防回拨,domainWriteAllowed() 为域名写唯一入口,fail-closed

  • 续租:verify / 心跳后两回合续租(R1 持钥证明 + 新鲜 nonce 防重放),拿更高 tuple 租约。
  • 后台封设备:授权监控页「封设备」——冻结设备(拒续租)+ install 黑名单(拒重绑),

被封机旧租约到期(≤TTL)后写操作 fail-closed 锁死;支持解封恢复。

  • 用户级封禁增强:被封用户返回签名 active=false 令牌并裁剪敏感信息,禁止再绑设备。

兼容/升级建议

  • 非 critical:客户端可择机「系统管理 → 🔍 立即检查 → ⚡ 一键升级」。双进程重启,大库冷启勿急杀。
  • 升级后客户端启动时会自动 verify→绑定设备→拿 normal 租约(秒级),域名写不受影响;

仅在拿到租约前的极短窗口、或异常拿不到租约时才会临时锁写。

  • 服务端(wztseo.com)已就绪:签名密钥 POLICY_SIGN_SEED/LIC_SIGN_SEED 已配置。

v2.11.081

2026-08-10·48 MB(压缩,自动解压)

# v2.11.081 · 仅允许名单 IP 防误开 UI + AI SEO 清除失败记录

一、仅允许名单 IP(原「IP放行」)防误开

  • 侧栏改名「仅允许名单IP」;设置页顶部危险说明,明确 开启 = 名单外全部 403
  • 开启需二次确认;空名单禁止开启。
  • 安全中心顶栏露出独占状态;开启时红条 + 一键关闭。
  • 「IP/UA 名单」页注明:本页白名单只跳过云 IP/限流,与独占模式不是同一功能。
  • 起因:客户误开后全站 403,误以为关「屏蔽终端」即可恢复。

二、AI SEO 清除失败记录

  • POST /api/admin/articles/ai-seo-clear-failed:按 all_failedidsfailed 重置为未增强,不删文章
  • 状态 API 增加 recent_failures;文章页失败区可一键清除后重试。

升级说明

  • 非 critical
  • 升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • 若前台曾 403:到安全中心确认「仅允许名单IP」为关;或侧栏打开该页关掉独占开关。

v2.11.080

2026-08-10·47 MB(压缩,自动解压)

# v2.11.080 · Bing IndexNow 中心 + Bing 全家桶对齐 + 强引/防火墙蜘蛛选择 UI

一、Bing IndexNow 中心(独立页)

  • 菜单:推送中心 → Bing IndexNow 中心/push/indexnow)。
  • 记 Key / 自动写站根 {key}.txt / 验文件 / 手动推送 / 简单自动推(worker + 历史)。
  • API:/api/admin/indexnow/*;提交走 api.indexnow.org,带 keyLocation
  • 百度推送页增加跳转提示,避免和 IndexNow 混淆。

二、微软 Bing 全家桶对齐 Google 标准

  • Detect 认 msnbot / adidxbot / BingPreview / MicrosoftPreview,展示名统一「微软Bing」。
  • 防火墙白名单勾「微软Bing」即可覆盖全家桶;CF 假蜘蛛 UA、护栏 CIDR、蜘蛛族 salt 同步。
  • AS8075 预设注释警示:可能误伤 Bingbot,须保证 verified-bot-skip 在前。

三、强引「指定蜘蛛」与防火墙列表同源

  • 强引弹窗不再硬编码短列表,改为 GET /spider/all-namesdetector.AllDisplayNames()(与防火墙一致)。
  • 蜘蛛配置页 IP 识别卡片列表同步动态拉取。

四、蜘蛛选择 UI 重排

  • 强引:三列紧凑 chip;未选 --text-faint、已选主题色;显示已选数量。
  • 防火墙编辑弹窗:去掉旧表格左右栏;顶部上下文条 + 白/黑名单双卡 + 4 列等宽预设 + chip 列表。

升级说明

  • 非 critical
  • 升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • IndexNow:升后可在新页管理 Key;已有 indexnow_key / 站根 txt 会自动识别。
  • 防火墙:若白名单原先只勾 Google,需自行加「微软Bing」才放行 Bing(代码不改写生产配置)。

v2.11.079

2026-08-10·48 MB(压缩,自动解压)

# v2.11.079 · 关键词文件库 + 外推取词修正 + 强引来源可读名

一、关键词管理「📄 文件库」(对齐外链 v4.3)

  • 多选 txt 导入、归属轴(全局 / 模型公共库 / 网站分组库)、预览 / 下载 / 改名 / 改归属 / 删整组。
  • keyword_file_groups;热路径 GetKeywordsByGroup 合并手动词 + _common + 归属落在该组的文件词。
  • file_ 为系统保留前缀;通用整组清空/改组对文件组返回 422,须走文件库 API。

二、外推 / 强引取词修正

  • mix 错组:只要能从选中外链反查到 group_name 就优先用,不再要求 Type==linklib|mix(mix 开启时 Type 仍可能是 custom)。
  • {随机关键词}:改为保留空格 / 大小写 / 【品牌】,只剥离会拆坏 URL 的 ?#&= 与控制字符(不再空格改 -、砍 50 字)。

三、强引记录「按具体来源」下拉

  • linklib:file_* 显示注册表 display_name(或从 file_<slug>_<hash> 还原文件名),不再露出整串 hash。
  • /spider-redirect-logs/sources 附带 label;前端优先使用。

升级说明

  • 非 critical
  • 升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • 含关键词文件库迁移;首次启动会建表/索引。
  • 103:已有取词热修;本版为正式 garble 通吃包,可择机一键升替换。

v2.11.078

2026-08-10·48 MB(压缩,自动解压)

# v2.11.078 · 修复站点互链共享池无界拷贝导致蜘蛛 OOM

一、生产事故:互链一开蜘蛛内存冲到 ~120GB 被反复 OOM

生产 103 在站点互链(site_interlink)开启且文章落在共享池(domain_id=0)时,

GetArticlesByDomainAndGroup(domain, "", n, seed) 的 fallback 写成:

```go

shared = append(shared, ga...) // 先把整组几十万篇全拷进临时 slice

if len(shared) >= n*4 { break }

```

互链锚文本路径每次请求都会触发 → 单次分配数 GB → RSS 冲到约 120GB →

内核 OOM kill → 8080 accept 队列打满 → Cloudflare 回源失败 → Google 抓取量塌到一万级。

heap profile 实证:GetArticlesByDomainAndGroupalloc_space >97%

二、修复

  • 共享池 fallback:只 pickArticlesByHash 取需要的 N 篇,禁止 append(整组)
  • 指定 article_group:改走内存索引(与 GetArticlesByHash 同口径),禁止每请求

SELECT ... body 把整组正文拖进堆(互链只要标题)。

  • 单测:TestGetArticlesByDomainAndGroup_SharedFallback_NoFullGroupCopy(20 万篇组不炸)。

升级说明

  • 非 critical,但 103 / 开了站点互链 + 大共享文章池的节点强烈建议尽快升
  • 升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(双进程重启;大库冷启勿急杀进程)。
  • 103 今日已用热修包止血;本版为正式 garble 通吃包,升上来与热修同修复、可替换热修二进制。

v2.11.077

2026-08-05·47 MB(压缩,自动解压)

# v2.11.077 · 域名健康巡检页主题修复(跟随主题切换)

一、域名健康巡检页不跟随主题(修一堆写死的黑色底色)

域名健康巡检(DomainHealth.vue)页面的 hero / KPI 卡片 / 标签容器三处底色写死为

var(--panel-bg, #1a1d24),而 --panel-bg 这个变量主题系统从未定义,导致永远回退到

写死的深黑 #1a1d24 —— 即便切到「明亮白」等主题,该页仍是黑底,与系统主题切换不匹配。

  • 三处底色 var(--panel-bg,#1a1d24)var(--card-bg),边框 → var(--card-border),

并加 backdrop-filter: blur(8px) 与其他现代化页面玻璃质感统一。

  • hero 标题、KPI 数字补 var(--text-primary);.dh-mutedvar(--text-faint)
  • 以上变量在全部 8 套主题(含「明亮白」)均有定义,现在正确跟随主题切换。

升级说明

  • 非 critical。纯前端样式修复。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级

(重启 spider+admin,大库冷启勿急杀)。

v2.11.076

2026-08-04·47 MB(压缩,自动解压)

# v2.11.076 · 外链文件库 v4.3(归属轴)+ 外链入库统一强制 http/https

一、外链文件库 v4.3:归属轴 + 文件列表(双轴布局)

在保持 v4.2「DB 为真源 + 文件名确定性 group_name」不变的前提下,新增归属轴

(全局 / 模型公共库 / 网站分组库)做第二维筛选,并把 📄 文件分组做成文件列表

(文件名 / 行数 / 大小 / 时间 + 预览 / 下载 / 改名 / 改归属 / 删除)。

  • link_file_groupsscope_type(common|model|site)/scope_key(dirname);老库自动补列。
  • 多文件导入需选归属;import-multi / stats / move-file-group-scope 后端贯通。
  • 同名文件跨归属导入拒绝(group_name 由文件名派生、不可变)。
  • 前端双轴筛选栏显示该归属外链总条数(悬浮看文件数);深链 ?view=files&scope=&key=
  • file_ 前缀系统保留:模型 / 网站分组 / link_group alias 均禁用该前缀。

二、外链入库统一强制 http:// / https://(修强引空转)

裸域名会让强引 http.Redirect 跳到「本站相对路径」→ 蜘蛛到不了外部域名 → 强引空转。

所有入库路径统一:去 UTF-8 BOM + 校验绝对 scheme,非法行跳过(不再整份拒绝)。

  • 单条新增:缺 scheme → 400。
  • 批量文本 / 文件库多文件导入:逐行入库,表头「URL」/ 裸域名 / 空行跳过;全非法才 400;

成功提示分列 新增 / 去重 / 跳过

  • 租赁三入口(客户自助下单 / 建单批量 / 追加外链)、sitemap 导入、种子 txt 导入:同口径校验。

三、蜘蛛强引配置补「文件库」多分组

强引「混合(池内 + 外链管理库)」的多分组菜单补上 📄 文件库(按文件名分组)分组来源。

升级说明

  • 非 critical。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级(重启 spider+admin,大库冷启勿急杀)。

v2.11.074

2026-08-01·46 MB(压缩,自动解压)

# v2.11.074 · 日志清理中心 + 系统管理标签化 + 强引清空修复

一、系统管理四标签

系统管理拆为:运行概览 / 运行控制 / 存储清理 / 系统更新

深链用 ?tab=(禁止改 location.hash,避免与 Vue hash 路由冲突黑屏)。

顶栏有新版本时「手动/详情」直达系统更新页。

二、日志与存储清理中心

统一清理 ClickHouse 三表(logs / redirect_logs / external_link_stats)+ 可选文本日志:

  • 缩 TTL / 删旧分区 / 整表清空(超管 + 打字确认表名)
  • 副作用说明:清明细 ≠ 清首页 KPI;CH 空间可能异步下降
  • 强引无筛选全清改为 400,引导走清理中心

三、重置首页蜘蛛访问计数(独立危险操作)

存储清理页单独卡片。超管输入 RESET_STATS 后,打蜘蛛进程清零内存计数并落盘。

首页「今日 / 昨日 / 累计」归零;不碰 CH 明细。蜘蛛不可达则失败(防假成功)。

四、强引记录分池清空修复 + 中文

  • 清空按图表同一套 pool 键匹配(含 source 空、靠 group_name 归池的旧行)
  • mutations_sync=1 等删完再返回,并失效 list/count 缓存
  • 按钮 / 图例 / 租赁 tab 中文化(不再显示 linklib:pool:breed 等英文)

五、CF 权限提示小修

识别 code=0 + request is not authorized;补 Bot Management 权限点名提示。

升级说明

  • 非 critical。升级路径:系统管理 → 🔍 立即检查 → ⚡ 一键升级。
  • 一键升级会重启 spider+admin;大库冷启可能数分钟,073 起已有 watchdog 宽限,勿急杀进程。

v2.11.073

2026-07-31·46 MB(压缩,自动解压)

# v2.11.073 · 蜘蛛防护 BFM dual-API + admin 冷启防误杀(接替已撤版的 072)

> 072 已从更新通道撤下(大库机器一键升级后后台起不来)。本版保留 072 的 BFM 修法,

> 并修掉真正导致「升级后后台打不开」的 watchdog 误杀。

一、蜘蛛防护 BFM(承接 072)

Cloudflare 已全网废弃老 /settings/bot_fight_mode(返 code=1003)。蜘蛛防护应用/状态改走 dual-API:

getBotFightModeDual、写 setBotFightModeWithFallback,自动回退 /zones/{id}/bot_management

进程级 legacyBFMDead:见一次 1003 后直走新端点,避免数百 zone 双倍调用加剧 971 限流。

二、admin 冷启宽限(072 事故根因)

一键升级会重启 spider+admin。大库(10G+) + 大 WAL 时 admin 进程已在跑、但绑端口要数分钟

旧 watchdog「查不到端口就回落探 8081 → 连续 3 次失败 → restart」≈每 3 分钟掐一次,后台永远起不来。

  • 有 PID 且无监听端口:宽限内(ADMIN_START_GRACE 默认 600 秒)只记 note、NOT restarting
  • 超过宽限仍无端口才当卡住去 restart。
  • 两处副本同步:scripts/spider-pool.sh + admin/system_repair.go;同步测试钉死。

升级说明

  • 非 critical。用蜘蛛防护、或库较大的机器建议升级。
  • 升级路径仍是:系统管理 → 🔍 立即检查 → ⚡ 一键升级(不会静默换包)。
  • 升完若后台稍慢出来属大库冷启正常;有宽限后不会再被 watchdog 误杀循环。

质量

  • watchdog_script_sync_test.go 加冷启宽限断言;cf_bot_fight_mode_test.go 仍覆盖 BFM 回退。
  • go test ./admin/ -run 'Watchdog|BotFightMode|SpiderProtect' 通过。

v2.11.071

2026-07-31·46 MB(压缩,自动解压)

# v2.11.071 · CF 控制中心批三收口 + 域名体检结果稳定化

> 两块:①Cloudflare 控制中心批三修复收口(假绿/吞错/快照增强/冲突语义/死代码清理 + 两条破坏性防护);

> ②「域名体检」结果稳定化——修同一域名两次体检评分/等级会变的老毛病。

一、Cloudflare 控制中心 · 批三收口

破坏性防护(架构师直接实现)
  • Origin 端口批量默认 merge:只按本工具指纹增改,不再默认 replace 覆盖整个 phase;replace 必须显式 confirm,防误删用户其它 Origin Rules。remove 只删本工具规则,不误删同端口的用户规则。
  • 清空规则:phase 白名单 + dry-run 预览(区分本工具规则 vs 用户自建条数)+ 二次确认;预览失败即中止。通用 rules/batchrules/copy 对 Origin phase 做 replace 也强制 confirm,闭环防绕过。
收口修复
  • 健康总览不再假绿:未取到的指标标 unknown,不当成健康。
  • 批量删 Page Rules 计错误数;蜘蛛防护拆成 BFM / verified-bot / spider-rule 子项,BFM 失败不缓存成 false
  • 同 description 多条即冲突:ASN 黑名单 / 国家封禁 / 蜘蛛防护发现重复规则时返回 conflict,不删不写
  • WAF 托管规则禁用保留 execute 规则并置 enabled:false,复启时保留原 action_parameters
  • 快照回滚:真实回滚前先建 pre_restore 快照;24h 过期快照挂 drift cron 自动清理。
  • 死代码清理:删 verified-bot-stats / cf-audit-logs / certificates / migrate-preview 等无效路由与前端未用封装。
复检发现并修的两条
  • P1:蜘蛛防护把冲突检测提到改 BFM 之前 —— 冲突时任何写(含 BFM)都不做,兑现「冲突即不写」。
  • P2:新增 cfConflictError 哨兵,批处理器保留 conflict 状态,不再压成笼统 error,前端可区分「需人工处理的重复规则」与「CF API 失败」。

二、域名体检 · 结果稳定化

用户反馈:同一域名连做两次体检,评分/等级都不一样。根因是体检聚合十多个免费外部源(RDAP/Wayback/Tranco/Bing/crt.sh/情报源…),超时/限流即被静默当「无数据/0」,而评分用 earned/maxp 动态分母会因此整体重算。

  • 结果缓存 6h:同域名 6 小时内重复体检直接复用上次结果(用已有 domain_vet_results 表当缓存),既消抖动又降低对公共源的重复压力;前端加「强制刷新(忽略 6h 缓存)」开关,命中缓存的行带「缓存」徽标。
  • DR 信号兜底真正计入评分:原来 Tranco/OPR 一超时,DR 的 16 分整块从分母消失导致评分乱跳;改为按信号(域龄/Wayback/反链/子域)推算值(封顶 58)计入,分母稳定,抖动大幅收敛。
  • 置信度门槛:关键四维(域龄/收录/Wayback/DR)取到不足 2 项 → 判 low_confidence,最高按 C 呈现并提示重试,堵住「只有 DNS 通就 100 分 A」的假高分;历史黄赌毒风险词一票否决 F 仍优先。前端展示 data_completeness 与「数据不足」徽标。

升级建议

  • 本版为非 critical 增强/修复,按需升级。
  • 用了 Cloudflare 控制中心批量操作(尤其 Origin 端口、清空规则)的强烈建议升级——含防误删的破坏性防护与越权/冲突语义收口。

质量

  • 双人复检(架构师 + GPT-5.6)3 轮通过。
  • cf_batch3_remaining_test.go(冲突/BFM 顺序/conflict 状态保留)、cf_batch3b_test.go(Origin merge/replace、清空 dry-run)、domain_check_stability_test.go(置信度门槛/DR 兜底/风险词 F)。
  • build / vet / go test ./admin/ / npm build 全绿。

v2.11.070

2026-07-30·46 MB(压缩,自动解压)

# v2.11.070 — 069 复检缺陷收口(522 防护补强 + 句子池加固)

> 纯修复补丁,不含新功能。针对 v2.11.069 双人复检(架构 + GPT-5.6)检出的真缺陷逐条收口。

> 非 critical。

修复

P0:522 防护缺口
  • 跳转站 human 流量纳入统一保险丝:v2.11.069 只挡了渲染路径,redirect_mode=all 的蜘蛛池站

其 human 302/js 跳转绕过Connection: close 与全局 inflight/RPS —— 302/js-200 在

keep-alive 下被 IdleTimeout 拖住,照样打满 accept 队列。070 抽出 guardHuman,渲染与跳转

两条 human 出口统一走它。

P0:watchdog 存活探针名副其实
  • 服务端放行 unix 来源:/internal/status/internal/waf-stats 原先只认 127.0.0.1/::1,

走 unix socket 时 host 为空 → 返 403。watchdog 的 unix 探针因此只拿到 403、退化成「socket

上有人应答」。现放行空 host(unix 连接),真实远端 IP 仍拒。

  • watchdog 探针判据收紧为 code==200:配合上一条,unix 探针拿到真 200 才算健康,并能白拿

/internal/status 的 goroutines。对「非 200 但有应答」(如未升级的旧二进制 unix 侧 403)仍判

存活、绝不重启、只告警版本错配 —— 避免「070 脚本 + 069 旧二进制」在手工升级窗口触发死循环。

P1:watchdog socket 不再写死
  • systemd unit 通过 Environment=SPIDER_UNIX_SOCK= 传入真实 socket:装机脚本从既有

config.yamlserver.unix_socket 解析(缺省 /tmp/spider-pool.sock);后台「⚡ 恢复生产

服务器标准」注入运行时 cfg.Server.UnixSocket。自定义 socket 部署不再退化成 TCP 探针。

P1:句子池 admin 内存加固
  • preview 只读前 2MB(原 os.ReadFile 整文件再切片,预览 200MB+ 文件会 OOM);总行数改走

mtime+size 缓存,不再每次预览全量重扫。

  • countLinesStreaming 改真有界:只维护「本行是否有非空白字符」的布尔状态,不缓存整行 ——

一个无换行的 512MB 单行 txt 不再吃等量内存。

P2:上传健壮性 + 文案同步
  • 大文件上传改用 os.CreateTemp 唯一临时名(并发上传同名文件不再互相截断),并 chmod 0644

与小文件分支对齐(修 CreateTemp 默认 0600 导致他用户蜘蛛进程读不到)。

  • 「一键修复」成功文案、帮助中心看门狗说明同步为「存活探针:蜘蛛优先 unix socket / TCP 兜底、

过载不误杀」。

守卫

  • admin/watchdog_script_sync_test.go 新增「unix 探针必须以 code==200 判据」断言;两处 watchdog

脚本仍逐字一致校验。

  • 新增单测:guardHuman(渲染/跳转/拒绝三态)、internalRequestAllowed(unix 放行 / 远端拒)、

countLinesStreaming 无换行有界、writeSentencePoolFile 大文件 0644。

复检

架构 + GPT-5.6 双人复检:核心逻辑(guardHuman defer 时序、Connection: close 不被跳转覆盖、

internalRequestAllowed 边界、watchdog 版本错配容忍、计数等价性、临时文件并发)确认无误;

检出的两处中等问题(临时文件 0600、装机脚本 socket 写死)已修复并回归。

门禁

go build ./... / go vet / go test ./config ./handler ./admin + 根包全绿;新增代码 gofmt 干净;

bash -n scripts/spider-pool.sh 通过。

v2.11.069

2026-07-30·45 MB(压缩,自动解压)

# v2.11.069 · 源站打满/522 防护 + 句子池管理页

> 两块:①修「accept 队列满 → watchdog 误杀 → 全站 522」死循环,并给蜘蛛池加源站 human 保险丝;

> ②后台「内容管理 → 句子池」管理片段拼装用的 content/title 语料(与「随机句子」分离)。

> 治本仍是 CF「仅放行已验证蜘蛛」;本版让源站在漏拦时也能撑住,且不再自己把自己重启死。

1. Watchdog 优先探 unix socket

health-watchdog.sh(装机脚本 + 一键修复两处副本同步):

  • 蜘蛛存活探针优先 curl --unix-socket /tmp/spider-pool.sock …/internal/status
  • unix 通则绝不 restart(即使 TCP :8080 已超时)
  • TCP 不通仅记日志:accept backlog full, NOT restarting

背景:2026-07-30 生产 Recv-Q 顶满时本机 curl 127.0.0.1:8080 超时,unix sock 仍 200;旧 watchdog 连续 3 次失败就 systemctl restart,冷启动再被灌满 → 522 死循环。

2. 蜘蛛池 human 全局准入 + Connection: close

operation_mode=spider_pool(站群/单站默认不动):

| 设置 | 默认 | 含义 |

|---|---|---|

| spider_pool_human_guard | 开(空/1) | 总开关,0 关闭 |

| human_global_inflight | 3000 | 同时处理的 human 上限,0=不限 |

| human_global_rps | 8000 | 每秒 human 上限,0=不限 |

超限 → 429 + 立刻拆连接。human 响应强制 Connection: close,避免假浏览器把 keep-alive 占满。

说明:历史 Google 高峰(~95 万/时、~1000 IP 复用)从不顶满;打满的是「~15 万独立 IP × 1.2 次/IP」的散弹连接形态 —— per-IP 限流对此无效。

3. rejectClosed:有 body 后主动关连接

拦截路径(403/429):能 Hijack 时手写完整 HTTP 响应再 Close,既避免 068 以前的空关 520,又减少 CLOSE-WAIT 堆积。

4. 拒连告警文案

ListenOverflows 告警引导优先开 CF「仅放行已验证蜘蛛」,并明确勿在 TCP 过载时反复重启。

5. 句子池管理页

  • 后台「内容管理 → 句子池」:上传/预览/下载/删除 data/content|title/(含 _common 与分组目录)。
  • 供蜘蛛池片段拼装(spider_pool_fragment_body)使用;不是设置页里的「随机句子」指纹库。
  • 大文件建议用 scripts/deploy-sentence-pool.sh 直传,避免浏览器上传超时。

升级建议

  • 蜘蛛池强烈建议升级;升完后可用「系统修复 → 恢复生产服务器标准」刷新 watchdog 脚本,或重装 watchdog。
  • 已在 CF 开 only-bots 的机器:本版是双保险 + 可安全重开 watchdog timer。
  • 未开 only-bots:请到 Cloudflare 页一键开启(免费版规则满 5 条时需先删一条非关键规则)。

质量

  • watchdog_script_sync_test 钉死两处副本 + unix socket / NOT restarting
  • human_admit_test / reject_closed_test(含 Hijack 路径)
  • sentence_pool_test

v2.11.068

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.068 · Sitemap URL 统一开关 + 修 CF 520 误伤(critical)

> 两件事:①给蜘蛛池一个「URL 统一」开关(默认关=063 抓量优先);②修掉源站空关连接 / 自动封电信联通导致的 Cloudflare Error 520

1. Sitemap URL 与页面统一(设置项)

  • 新键 sitemap_url_unify:默认关(空/0)。
  • :sitemap / 发现图用蜘蛛家族盐(与 063 相同)——蜘蛛池推荐,抓量优先。
  • :sitemap 与页面 canonical 同盐(064 风格)——利于收录,但会改发现图路径。
  • 设置页露出开关;分组可覆盖。改完 reload,sitemap 缓存键带 |u=1 避免串缓存。
  • 页面 <link rel=canonical> 始终按文章 ID,不受此开关影响。

2. 修 CF 520 误伤(生产事故)

根因链:源站对真人 Hijack 后空关 TCP(或自动封整个电信/联通 ASN)→ Cloudflare 看成「源站未知错误」→ Error 520,用户以为全站挂了,蜘蛛日志却是空的。

2.1 拦截改为正规响应 + Connection: close

auto_ban / 规则 block·deny / IP·UA 黑名单 / 云 IP / 人类限流:不再 Hijack 空关,统一 403/429 + 短 body + Connection: close

拦归拦,CF 不再报 520。

2.2 自动封 ASN 永不碰国内宽带

anomaly 跳过并自动禁用已存在的:

  • 电信 AS4134 / AS4809 / AS4812
  • 联通 AS4837 / AS9929
  • 移动 AS9808 及常见移动 ASN

垃圾流量请用单 IP / bot_score / CF only-bots;整 ASN 封住宅网 = 全国用户 520。

2.3 自动规则动作用 deny

新建 auto-ip / auto-ua / auto-asn 规则改为 deny(有 body),与上面 2.1 一致。

升级建议

建议所有在用 Cloudflare 回源的部署立即升级(critical)。

已在 067 的蜘蛛池也要升——067 修了 TTL/URL 发现图,但不含本版 520 误伤修复。

升级后 anomaly 下一轮会自动关掉误伤的 auto-asn-AS4134 等;若后台仍开着 l5_bot_score_high/mid 的 enforce,可按需改回 shadow(模板默认本就是 shadow)。

v2.11.067

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.067 · 紧急:蜘蛛池 sitemap 默认缓存改回 3600 秒(critical)

> 容量事故热修。064 把蜘蛛池 sitemap 默认 max-age 从历史的 ~1 小时打成 60 秒,

> CF/Google 回源频率暴涨,accept 队列被灌满 → ListenOverflows → 域名打不开 / CF 521。

> 多位用户反馈 063 正常、一升 064+ 就炸。本版默认改回 3600 秒

改动

  • [handler/sitemap_cache.go](handler/sitemap_cache.go):蜘蛛池 sitemapCachePolicyFor 未配置时默认 3600(原 60)。
  • 仍可按分组/全局设 sitemap_cache_ttl_seconds 调短(要配合 sitemap_fresh_signals 勤刷时再用 300/60)。
  • 命中与未命中仍用同一 Cache-Control(064 修好的那部分保留)。
  • 站群 / 单站 / 泛目录行为不变。

与 066 的关系

  • 066:回退 URL 发现图(familySalt)。
  • 067:回退 sitemap 缓存默认 TTL。
  • 两条都是 064 引入的对外行为变化;都要退。

升级建议

已升 064/065/066 的蜘蛛池部署请立即升级(critical)。

等不及可先在后台设 sitemap_cache_ttl_seconds=3600/internal/reload,或退 063 二进制。

v2.11.066

紧急
2026-07-29·46 MB(压缩,自动解压)

# v2.11.066 · 紧急回退 064 URL 统一 —— 恢复抓取发现图

> 事故热修(critical)。064 把 sitemap / 内链 / 链尾 URL 全部改成与页面 canonical 同盐后,

> Google 已认识的路径与泛子域主机名一夜断裂,已升级用户抓量全线下跌。

> 本版把发现图侧算法退回 063;065 的片段拼装与合成 URL 保留。

修了什么

  • sitemap 真文章 URL:恢复蜘蛛家族盐(google=17 等)生成路径;主机名恢复 art.ID*13+familySalt
  • 站内互链 / 404 推荐 / crawl 链尾:恢复 seed 盐,参与发现图的链接不再跟 064 一起换盐。
  • 页面 <link rel=canonical>:仍用文章 ID(与 063 一致)。短期接受「抓了不收录」,优先救抓量。
  • 合成 URL / 片段拼装(065):保留;合成路径继续自指 canonical(新 ID 无旧图可断)。
  • 观测告警(064):保留。若后台出现 ListenOverflows 拒连告警,那是容量/垃圾流量问题,

与本次 URL 回退无关——退 063 或升 066 都治不好拒连,需按 somaxconn / 异常 UA / 迁域名排查。

没动什么

  • B1 模式隔离、B3 sitemap 缓存策略、B4 日志 status+route_kind、设置审计、四条告警 —— 全部保留。

升级建议

所有已升到 v2.11.064 / v2.11.065 的部署请立即升级本版(critical)。

等不及编译推送的,可先手工退 063(只换二进制):

```bash

cd /tmp && curl -fsSL -o sp063.gz https://dl.wztseo.com/spider-pool/v2.11.063/spider-pool-linux-amd64.gz && gunzip -c sp063.gz > sp063 && echo '0ca29838f6ef7bea230603170bfaaabc3f606976a8031916fa76b291a762d51e sp063' | sha256sum -c && systemctl stop spider-pool spider-admin && cp -a /opt/spider-pool/spider-pool /opt/spider-pool/spider-pool.bak.from064 && install -m 755 sp063 /opt/spider-pool/spider-pool && systemctl start spider-pool spider-admin && /opt/spider-pool/spider-pool --version

```

ListenOverflows 告警的机器:先按拒连排障,不要指望换版本 alone 恢复。

v2.11.065

2026-07-29·46 MB(压缩,自动解压)

# v2.11.065 · 蜘蛛池片段拼装 + sitemap 合成 URL

> 把秒速排那套「句子池现拼 + 无限 URL」搬到我们引擎上,只动蜘蛛池模式

> 站群 / 单站 / 泛目录对外行为零变更。

🧩 片段拼装:任意 URL 都能产出实质正文

文章库找不到 ID 时,蜘蛛池模式从句子池现抽约 15 句拼成正文。

页面集合不再被文章库大小(约 40 万篇)封顶。

  • 按 URL 稳定(不是每请求都变)—— 抓取空间是 URL 集合不是响应集合;

同一 URL 每次变对空间零增益,只会废掉缓存和 304。

  • 三道闸:必须 spider_pool + 开关未关 + 句子池已导入。没导入池子时行为与改之前一致。
  • 顺带修掉一处陈年死代码:content 句子池类别此前从未被加载,中间级兜底一直是空的。

设置:spider_pool_fragment_body(默认开)、spider_pool_fragment_paras(默认 15)。

📡 sitemap 合成 URL:把空间兑现成流量

蜘蛛池 sitemap 在真文章之外再发 N 倍未知 ID(默认 10×,基数 1 亿):

  • 路径走 ArticleURLPathCanonical(..., id, 0, ""),与伪文章 canonical 自指
  • extractID 往返校验失败的不发(挡 {id}_{日期}.html 这类模板)
  • 小时桶轮换;缓存键带桶,桶内仍可缓存
  • 修复:文章写入计入 urlsWritten,防止边界页超 pageSize

设置:sitemap_synthetic(默认开)、sitemap_synthetic_ratio(默认 10)。

📦 句子池

试跑组 ennews(清洗后约 144 万句 / 14.7 万标题)需放到

data/content/*.txtdata/title/*.txt(根级文件 → _common)。

清洗脚本:scripts/clean-sentence-pool.py

升级建议

  • 蜘蛛池部署建议升级;站群/单站不受影响。
  • ⚠️ 首日建议把 sitemap_synthetic_ratio 设为 1,观察 sitemap 抓取与内存后再调回 10。
  • 秒关:sitemap_synthetic=0spider_pool_fragment_body=0,然后 /internal/reload
  • 未导入句子池时,合成 URL 仍会发放,正文回退到关键词兜底(偏薄)。

v2.11.064

2026-07-29·46 MB(压缩,自动解压)

# v2.11.064 · 文章 URL 规范化 + 抓取观测盲区清零

> 这一版围绕「蜘蛛来了,但抓了不收录 / 收录不了也看不出为什么」

> 主角是一个隐藏很久的 URL 规范化缺陷 —— 实测每域名 18.99 万条 URL 里 92% 中招

> 其余五项都在补观测:让「抓取量到底花在哪」「谁改了配置」「源站是不是在拒连」变得可查。

🎯 92% 的 sitemap URL 被 Google 判为「非规范副本」

同一篇文章,系统里原先有 7 个地方各自生成 URL,而且各传各的随机盐:

| 生产者 | 用的盐 |

|---|---|

| sitemap | 蜘蛛家族盐 17 / 101 / 43 / 71 |

| 页面 canonical 标签 | 文章 ID |

| GSC 推送 | 17 |

| 百度推送 | 101 |

| 站内互链 | 渲染上下文 seed |

| 404 推荐 | 0 |

结果是同一篇文章有好几个不同的 URL,而只有 canonical 那一个是自指的

sitemap 挂出去的全是非规范副本 —— Google 抓到后判定「替代网页(含适当的规范标记)」,

抓了但不索引。这正是「蜘蛛量不低、收录却上不去」的直接原因。

修复:新增唯一入口 ArticleURLPathCanonical / ArticleURLCanonical,

URL 只由文章自身决定(文章 ID + 它自己的栏目),不再受渲染上下文影响,七个生产者全部改走这里。

顺带修掉三个同源问题:

  • 合并两份重复的 URL 渲染实现。 两份的日期种子不同,{cid} 一个填真实栏目 ID、一个填空;

{cid}+{aid} 规则的站点,两边算出来是完全不同的路径,不只差一个月份。

  • 同一篇文章出现在不同栏目的列表页里,原先会拿到不同 URL。 现在一律用文章自己的栏目。
  • GSC / 百度推送原先完全绕过域名 URL 规则,推出去的 URL 跟站点实际 URL 对不上,

白烧 Indexing API 配额。

📊 蜘蛛日志补上状态码与路由类型

spider.logs 此前只记「谁来了、访问了什么路径」,不记响应结果

于是「1000 万次抓取」这个数字里,有多少是真实内容页、多少是跳转空转、多少是 5xx 报错,

在任何统计里都分不出来

本版新增两列:

  • status —— HTTP 状态码。302 灌水、503 降级、5xx 故障从此可分。
  • route_kind —— 路由类型(内容页 / robots / sitemap / 跳转 / 缓存命中)。

> 实测意义:高抓取量时段里 robots.txt 稳定占全部请求的 41%~58%

> 这在泛域名场景下是正常的(每发现一个新子域就要取一次 robots),

> 但在补上这两列之前,它和真实内容抓取混在同一个数字里,无法区分。

表结构变更为幂等加列,升级时自动执行,不影响历史数据。

🔀 修模式隔离:蜘蛛池的全局设置会串到站群

同一台机器上混跑多种模式时,有三处代码在读全局运营模式,而不是域名所在分组的模式。

后果是:给蜘蛛池调的设置,会影响到站群/单站域名的 sitemap 顶层信号和渲染策略。

三处已全部改为按分组解析。另加了一条源码审计测试——

今后谁再在这个包里直接读全局 operation_mode,测试会直接失败。

⏱ sitemap 缓存策略:摘掉一个压抓取频率的响应头

原先三处各说各话:内部缓存 10 分钟 / 5 分钟(写死),命中时回 max-age=300,

未命中时回 max-age=3600。同一个 URL 的缓存指令,取决于我们的缓存碰巧热不热 ——

从 Google 角度看是随机的。

更要紧的是那个 3600:它和历史上从页面摘掉后换来 2.9 倍抓取量的是同一个值,

在 sitemap 这条路径上一直留着。它在对 Google 说「一小时内别再来取 sitemap」,

而「每天刷新 lastmod」想要的恰恰是它勤来取 —— 两件事互相抵消

现在:蜘蛛池模式下 TTL 可配(默认 60 秒),命中与未命中用同一个缓存指令,

对外 max-age 严格等于内部 TTL。

> 站群 / 单站 / 泛目录模式逐字节不变,包括上面那个命中/未命中不一致的历史行为 ——

> 改动它会影响这些模式的对外表现,应当单独评估,不在本版范围内。

🔔 四条新告警

此前所有告警盯的都是「机器和服务有没有事」。但有几类故障发生时机器一切正常:

  • 强引开着却没在生效 —— 配置显示开启,实际一条跳转都没产生。
  • 抓取量断崖式下跌 —— 与自身基线对比,跌幅超阈值即报。
  • 源站在 TCP 层拒连 —— 读内核 ListenOverflows 计数。这类失败根本到不了应用层,

应用日志里干干净净,而 Cloudflare 那边已经在报 521。

  • 域名集体转黑 —— 昨天还有抓取、今天归零的域名批量出现。

阈值均可配置,填 0 即关闭该条。

📝 设置变更审计

后台保存系统设置从来没有写过操作日志

曾经发生过关键开关被改动、事后无法追溯是谁改的、什么时候改的。现在补上了。

两个细节:

  • 设置页每次保存都提交整张表单(几百个键),因此只记录真正发生变化的键。
  • 敏感字段(密码 / 密钥 / Token)不回显明文,但附一段短指纹 ——

否则「密钥被换过」和「密钥没动过」在日志里长得一模一样,审计就失去意义。

🧪 验证

  • 新增约 45 个单元测试。
  • 关键模块全部通过变异测试自证(逐条把生产代码改坏,确认测试确实会失败):

sitemap 缓存策略 7/7、设置审计 11/11、告警与日志字段全部捕获。

  • 另有两个源码审计测试,用于阻止同类问题复发:

一个盯「文章 URL 是否都走规范入口」,一个盯「是否有人直接读全局运营模式」。

  • 门禁全绿:build / vet / 全量测试 / race 竞态检测 / 格式检查。

升级建议

建议所有部署升级,尤其是「蜘蛛量正常但收录上不去」的站点。

> ⚠️ 部分站点的文章 URL 会发生变化。 本版把七个生产者统一到同一套规则,

> 因此原先由 sitemap / 推送 / 互链产生的那批非规范 URL 会改为与页面 canonical 一致。

> 使用含日期或 {cid} 占位符的 URL 规则的站点,变化范围更大。

>

> 这正是修复的目的 —— 让挂出去的 URL 和自指的 canonical 对齐。

> 旧 URL 在默认配置(block_invalid_url = off)下仍可正常打开;

> 若把该项设为 404,建议升级后重新提交一次 sitemap。

升级后可关注两处:Search Console 里「替代网页(含适当的规范标记)」的数量应逐步下降;

蜘蛛统计中 robots.txt 与真实内容页的比例首次变得可查。

v2.11.063

2026-07-28·46 MB(压缩,自动解压)

# v2.11.063 · 授权降级 503 可见性 + sitemap 抓取信号开关

> 这一版围绕同一个问题:「后台显示没蜘蛛,但说不出为什么」

> 两条改动分别堵住了两个「系统自己在挡蜘蛛、却在任何统计里都看不见」的盲区。

> 对外行为默认零变更——新开关默认关闭,不主动改变任何站点当前的表现。

🔍 授权降级正在回 503,现在能看见了

授权异常时,系统会对搜索引擎返回 503(签名失效 / 部分降速 / 完全停服)。

问题在于这三处 503 都发生在写日志之前——ClickHouse 里查不到、蜘蛛统计里不计数。

于是会出现这样的场景:一个有 2000 个域名的站点,1999 个非主域名正在对 Google 说

「24 小时内别来」,而后台只显示「没蜘蛛」,查不出任何线索。

现在:

  • 进程内按原因(签名失效 / 部分降速 / 完全停服)和域名分别计数。
  • 后台新增接口 /api/admin/license/degrade,把「静态授权状态」和「实际已经回了多少次 503」

一并给出,并附上人话解释。

  • 新增告警规则:降级正在发生时主动报。此前所有告警盯的都是「机器/服务有没有事」,

而这件事发生时机器一切正常,蜘蛛却被系统自己挡在门外。

  • 相关日志按 5 分钟节流写入 journalctl,不刷屏;节流不影响计数准确性。

> 说明:这一版只做可见性,不改变降级逻辑本身。授权正常的站点不受任何影响。

🕷 sitemap 抓取信号开关(默认关闭)

新增分组级配置项 sitemap_fresh_signals。开启后,该分组的 sitemap 会把

lastmod 报为当天、changefreq 报为 alwayspriority 报为 1.0

背景:当前默认策略出于稳妥考虑,会把 lastmod 锁定为本周一(每周才变一次),

并按文章发布年龄把 priority 逐级衰减到 0.4、changefreq 降到 monthly

文章库越老,被标成「一个月才变一次」的比例越高,Google 的回访频率也就越低。

新开关允许按域名分组解除这一限制,便于先在部分分组上验证效果再决定是否推广。

  • 默认关闭,不开启则与上一版逐字节一致。
  • 分组级生效:可以只对一部分域名开启,其余作为对照。
  • 修改后需要重载配置,叠加 sitemap 缓存约 10 分钟内全量生效。

> ⚠️ 三个信号里,只有 lastmod 是 Google 明确会用于安排抓取计划的;

> 官方已声明忽略 changefreqpriority。三者一并给出,是为了让对比实验的

> 变量收敛成单一开关,不代表后两者本身有效果。

>

> ⚠️ 该开关目前没有后台界面,在分组配置里维护。请注意:通过后台保存分组时

> 会整体覆盖分组配置,可能导致该项被清除。

🧪 验证

  • 新增 24 个单元测试(授权降级 17 个 + sitemap 信号 7 个)。
  • 两组测试均通过变异测试自证(逐条把生产代码改坏,确认测试确实会失败):

授权降级 6/6、sitemap 信号 7/7 全部捕获。

  • 门禁全绿:build / vet / 全量测试 / race 竞态检测 / 格式检查。

升级建议

  • 建议所有部署升级。默认行为无变化,升级风险低。
  • 若曾遇到「后台显示没蜘蛛但查不出原因」,升级后可先看

「授权降级」接口的返回,通常能直接给出答案。

v2.11.062

2026-07-27·45 MB(压缩,自动解压)

# v2.11.062 · 文章库增量加载 + 文章 ID 不再复用(环形文章库 阶段 A0)

> 这一版是基础设施改造,对外行为零变更:后台看到的文章、蜘蛛端渲染的内容、

> 所有页面输出都和上一版完全一致。改的是"文章数据怎么进内存"和"文章 ID 怎么分配",

> 为后续的环形文章库(固定容量、自动汰换)打地基。

>

> 直接可感知的收益是大库的 CPU/GC 压力显著下降,以及批量导入快一个数量级

🚀 增量加载:文章变更不再触发全量 reload

以前每次新增/修改文章,蜘蛛端都要把整个文章库重新读进内存。库越大越吃力,

高频采集时能到每分钟三次全量 reload。

现在文章的增删改会通过数据库触发器记进一份变更日志,蜘蛛端只消费增量:

  • 后台批量更新 3000 篇 → 增量应用约 1 秒(42 万篇规模实测)。
  • 一次性导入 12 万篇产生的 12 万条变更 → 分批追赶共约 10.7 秒,一条不丢。
  • 全量 reload 现在只服务配置类变更(设置/域名/模板),去抖仍是 20 秒,不变。

🔒 文章 ID 不再复用

以前文章被删除后,它的 ID 可能被新文章重新占用。而翻译、AI 生成记录、推送历史、

搜索引擎已收录的 URL 里可能还挂着旧的那个 ID —— 于是新文章会莫名其妙继承旧文章的关联数据。

现在 ID 由单调序列分配,发放过的号永不回收,从根上消除这类串数据的问题。

📦 导入更快、更可靠

  • 批量导入分批事务:1 万篇导入从 20.85 秒降到 1.03 秒
  • 不再静默丢文章:导入过程中分配失败、写入失败、文件读取失败,以前会跳过继续、

最后照样报"导入完成";现在一律明确报错。

  • 不再"报错又报成功":批量导入出错时以前可能先返回错误、再返回成功,客户端无所适从。
  • 读取中断不再留半截数据:导入文件读到一半出错时,已读部分不再被提交,重试不会重复导入。
  • 跨服务器迁移修正:完整导出/导入会重新分配 ID,但以前仍把 similar_to_id(指向另一篇文章的 ID)

原样搬到目标库,导致相似度关联指向毫不相关的文章。现在该字段与相似度评分一并清空,由目标库重算。

🧪 验证

  • 五轮"修复 → 双人独立复检"收敛;单元/集成测试新增约 42 个用例,含 20 万轮随机差分测试。
  • 真机演练(测试机灌到生产量级):30 万篇迁移 + 载入共 9.7 秒;

再灌 12 万篇域私有后共 42 万篇,3 路并发随机泛二级域流量持续压测,

累计数千次请求零失败,内存稳定在 ~925MB 不增长。

  • Schema 改动全为加法(只加列/表/触发器/索引),回滚安全:装了本版再退回旧版仍可正常读写。

升级建议

  • 建议所有部署升级,文章库越大收益越明显。
  • 首次启动会执行一次数据迁移(加列 + 建触发器):30 万篇实测约 10 秒,期间服务不可用,属正常重启窗口。
  • 环形文章库(固定容量汰换)本版尚未启用,article_ring_capacity 默认为 0。

v2.11.061

2026-07-25·45 MB(压缩,自动解压)

# v2.11.061 · AI 生成文章自动带表格(提升 SEO 评分 + SERP 表格富摘要)

> 针对内容管理批量 SEO 评分里「缺 markdown 表格(失 SERP 表格预览)」的扣分项:

> AI 采集与新闻采集生成的新文章现在会稳定带上表格,拿满评分的表格维度,

> 并争取 Google 搜索结果的表格富摘要展示。

✨ 双保险机制

  • 提示词补强:给通用中文提示词(SEO 博客/百科/测评/产品)补上「必须含至少 1 个表格」的硬要求,

让 AI 优先生成与内容相关的真表格(对比/参数/要点归纳)。

  • 自动兜底:AI 未按要求生成表格时,系统在写入前自动补插一个「关键信息速览」表(插在首个 H2 之后),

保证成品文章正文一定含表格。AI/新闻两条采集链路均已接入。

📈 效果

  • 新生成文章的 SEO 评分表格维度(10 分)稳定得分;有机会获得 Google SERP 表格富摘要,提升点击率。
  • 已含表格的文章不受影响;仅作用于新生成文章,不改动存量已发布文章。

升级建议

  • 做 AI 采集/新闻采集的部署建议升级。改动仅影响新文章生成链路,不改数据结构与核心抓取/渲染/授权逻辑。

v2.11.060

2026-07-25·45 MB(压缩,自动解压)

# v2.11.060 · 蜘蛛访问日志页体验优化:IP/城市分列 + 筛选重排 + 无感刷新

> 「蜘蛛访问日志」页继续打磨:访问明细 IP 与城市拆为独立列、域名统计筛选区重新布局、

> 下拉面板跟随主题、两页数据定时自动刷新改为无感更新。纯前端展示层,零数据/逻辑变更。

📋 访问明细

  • 「IP/城市」拆成 IP城市 两个独立列,各自对齐,信息一目了然。

🌐 域名统计

  • 筛选区重排:范围 / 口径 / 排序 分组整齐、搜索区右对齐,蜘蛛选择器独立成行,布局更规整。
  • 下拉面板主题修复:口径、排序由原生 select 换成 Element Plus 下拉,

面板配色现在完美跟随后台主题切换器(深色/浅色一致),不再是突兀的白色。

⚡ 无感更新

  • 域名统计(45s)、访问明细(60s)的定时自动刷新改为无感更新:后台静默拉取最新数据,

不再出现"加载中"闪烁、列表清空重排;刷新失败时保留当前数据、不闪报错,下个周期自愈。

  • 用户主动操作(切换筛选/翻页/重试)仍正常显示加载与错误反馈。

升级建议

  • 建议升级以获得更顺滑的后台观测体验。纯 UI/交互调整,零数据/逻辑变更,升级无风险。

v2.11.059

2026-07-24·45 MB(压缩,自动解压)

# v2.11.059 · 蜘蛛访问日志页 UI 精修:访问明细瘦身 + 域名统计配色分层

> 「蜘蛛访问日志」页两个标签的界面细节优化,让信息更聚焦、分类更清晰。

> 纯前端展示层调整,不改任何数据口径、抓取/渲染/授权与统计逻辑。

📋 访问明细

  • 精简表格:去掉独立的「域名」列(8 列 → 7 列),把横向空间让给「访问地址」等更需要宽度的列。
  • IP/城市保持单行显示,更紧凑清爽。
  • 筛选区重排为三段式:日期行 / 蜘蛛行 / 域名行,各行内部高度一致、间距拉开,

快捷按钮右对齐,不再挤成一团。

🌐 域名统计

  • 指标卡改版:带左侧语义色条,数字加大加粗;总到访=主色、泛域=青、未分类告警=橙、

最佳站点=紫,一眼区分指标类别。

  • 表格分类信息配色分层:站点类型(单域/泛域站/混合/推断)、域名类型(主域/泛域/未分类)

按语义上色并加描边;统计对象/域名高亮、归属主域弱化,文字层次分明,不再"一片白"。

  • 占比条改为蓝→青渐变、表头与输入框聚焦态增强等细节打磨。

升级建议

  • 建议升级以获得更清晰的后台观测体验。纯 UI 调整,零数据/逻辑变更,升级无风险。

v2.11.058

2026-07-24·45 MB(压缩,自动解压)

# v2.11.058 · 蜘蛛访问日志改版:三标签视图 + 域名分类统计

> 「蜘蛛访问日志」页整体改版:拆为「数据概览 / 域名统计 / 访问明细」三个标签,

> 域名统计从「单纯排行」升级为「按分类聚合」,一眼看清各类站点的蜘蛛到访分布。

> 纯后台观测功能,不改抓取/渲染/授权与核心计数逻辑。

📊 三标签视图

  • 数据概览:总到访、活跃域名、按搜索引擎分布等汇总指标集中展示。
  • 域名统计:域名 × 搜索引擎到访次数,支持按分类聚合查看各类站点吸引蜘蛛的情况;

支持时间范围(今天/昨天/近7天/近30天)、升降序、域名关键字搜索、分页与占比。

  • 访问明细:保留原始逐条访问记录查询,来源明细抽屉宽度自适应窗口。

⚙️ 实现要点

  • 数据源:沿用 ClickHouse spider.stats_domain_daily(日×蜘蛛×域名预聚合)+ 物化视图

增量维护,查询走聚合表,秒级响应;无 ClickHouse 的单站/小节点自动走按天文本日志聚合,口径一致。

  • 迁移解耦:建表(DDL)、历史回填、失败重试全部移到独立后台迁移服务,与 API 热路径彻底分离;

迁移状态机(idle/running/completed/backoff)带指数退避重试,不会因反复调用而重启已完成的迁移。

  • 数据一致性:单日回填采用不可变分类快照 + 前后校验和(checksum)双重校验,配置中途变更也不会

混入不一致口径;REPLACE PARTITION 后二次校验,校验不过不写完成标记。

  • 稳健性:ClickHouse 计数严格解析(区分空响应/协议异常与真实 0 值,异常明确报错而非误当 0);

聚合全程 int64 溢出保护;崩溃遗留的临时 stage 表可安全清理,不误伤活跃 worker 与目标表。

升级建议

  • 建议所有部署升级。纯后台观测功能,不改数据结构与核心抓取/渲染/授权逻辑;

有 ClickHouse 的服务器升级后由后台迁移服务自动完成建表与近 30 天历史回填。

v2.11.057

2026-07-24·45 MB(压缩,自动解压)

# v2.11.057 · 后台新增「域名 × 搜索引擎 蜘蛛到访排行」

> 蜘蛛访问日志页新增「域名到访排行」:按搜索引擎给各域名的蜘蛛到访次数排序,

> 一眼看出哪些域名吸引蜘蛛、哪些不引蜘蛛。纯后台观测功能,不改抓取/渲染/授权。

🏆 功能

  • 在「蜘蛛访问日志」页新增域名排行面板:选中某搜索引擎(如 Google),即列出各域名被该蜘蛛

访问的次数,降序排列;选「全部」则按所有已识别蜘蛛合计。

  • 时间范围:今天 / 昨天 / 近7天 / 近30天。
  • 支持:按次数升/降序、域名关键字搜索、分页;显示每个域名的到访次数与占比。

⚙️ 实现要点

  • 数据源:新增 ClickHouse spider.stats_domain_daily(按 日×蜘蛛×域名 预聚合)+ 物化视图

增量维护,查询走聚合表而非直扫每天数千万行的原始日志,秒级响应。无 ClickHouse 的单站/小节点

自动走按天文本日志聚合,口径一致。

  • 升级自愈:有 CH 的服务器升级后自动建表 + 建 MV,并逐日回填近 30 天历史(缺哪天补哪天,

幂等,不会重复累加也不会丢历史);建表未完成时不回填、失败自动重试。

  • 稳健性:统计口径一致、翻页稳定不重不漏、关键字按字面量匹配;CH 查询异常时明确报错而非

返回空数据误导;时区统一在后端换算并在启动校验 CH 与服务器时区。

升级建议

  • 建议所有部署升级。纯后台观测功能,不改数据结构与核心抓取/渲染/授权逻辑;

有 ClickHouse 的服务器升级后自动完成建表与近 30 天历史回填。

v2.11.056

2026-07-23·44 MB(压缩,自动解压)

# v2.11.056 · 统一安装包 + legacy 版加固(打包/发布改进,产品逻辑不变)

> 本版不改产品代码,只优化发布打包:合并为单一安装包、并让老系统包也获得同等混淆。

> 无需担心兼容性,授权/抓取/渲染逻辑与 v2.11.055 完全一致。

📦 统一为一个安装包(新老系统通吃)

以前按系统 glibc 分两个变体下载:标准版(GLIBC_2.34,仅新系统)+ legacy 版(GLIBC_2.28,老系统)。

两者源码完全相同,只是编译环境不同。因 GLIBC_2.28 向后兼容(新老系统都能跑),现统一为一个包:

  • 所有系统统一下载 spider-pool-linux-amd64(GLIBC_2.28 编译,Debian11+/Ubuntu20.04+/RHEL8+ 通吃);
  • install 脚本去掉 glibc 分流逻辑,只做最低门槛校验(≥2.28 放行);
  • 发布链路减半,不再需要分别构建两个变体。
  • 过渡兼容:仍保留一份 -legacy 同内容别名,旧版 install 脚本升级前不会 404。

🔒 legacy/老系统包同等混淆加固

老系统包以前是普通 build(字符串明文、易逆向),现改为与标准版同等的 garble -literals

混淆 + 字符串加密:授权判断逻辑符号、包结构、内部字符串全部混淆,逆向可读性大幅降低。

(说明:白嫖满速本就需要伪造官网私钥签名或 patch 二进制,混淆进一步抬高 patch 定位难度。)

🧰 发布工具链

  • Dockerfile.bullseye:固化 garble 进构建镜像(走 goproxy.cn)。
  • build-on-vm.sh:统一走 VM 上 bullseye-Docker garble 编译产出通吃包;修复历史「编译失败被吞、误报已发布」与「go 版本过低不生成二进制」两个发布链路隐患。
  • publish.sh:上传主包三件套 + 向后兼容 -legacy 别名。

升级建议

  • 建议所有部署升级。产品逻辑与 v2.11.055 一致,仅打包与老系统安全性改进。

v2.11.055

2026-07-23·44 MB(压缩,自动解压)

# v2.11.055 · 安全加固:客户端补授权过期校验,堵已签名过期缓存白嫖

> 本版核心为一处授权安全修复(经 GPT-5.6 复检),另附新增模板预设与电商多语言。

> 不改数据结构、不影响抓取渲染,建议所有部署升级。

🔒 授权:客户端校验 license 过期(堵长期白嫖)

原客户端速度因子只看「厂商签名有效 + active=true」,漏了到期校验:

一份历史正版缓存(active=true)在过期后仍被当满速使用,可长期白嫖,且无需 patch 二进制。

  • 新增 isExpired() 过期判定:
  • ExpiresAt 为空 = 永久授权,豁免不过期;
  • 非空但无法解析(非 RFC3339)= 保守当已过期(fail-closed),堵住「malformed 已签名日期被当永久满速」的 fail-open 口子;
  • 24h 宽限,防时钟/时区抖动把刚过期几分钟的正版立刻掐断。
  • verifiedActive = 签名有效 && active && !isExpired();过期后不再算满速,落到「按过期天数梯度降速」的正版宽限逻辑。
  • 新增测试覆盖:过期 / 永久 / 未过期 / malformed 已签名日期 四类场景,回归全绿。

> 兼容性:正版授权都是合法 RFC3339 或空(永久),不受影响;仅历史过期缓存被正确降速。

🎨 新增模板预设

  • 新增 preset-company / preset-ecommerce / preset-news 三类行业预设模板集;
  • 新增 preset-universal/darksuite 通用深色套系。

🌐 电商多语言(i18n)

  • 新增 engine/i18n_ecommerce 电商场景多语言词库与测试,配合电商模板本地化渲染。

🧪 其它

  • 同步 engine 包两处陈旧测试断言:unicode 过滤器自 v2.11.021 改用 HTML 数字实体 &#xXXXX;(标题进 <title>/<h1> 才能被浏览器/Google 正确解码);postdatenaturalPubTime 去指纹扰动后不再等于原始日期。测试全绿。

升级建议

  • 建议所有部署升级。核心为授权过期校验修复,不改数据结构、不影响抓取渲染。

v2.11.054

2026-07-23·45 MB(压缩,自动解压)

# v2.11.054 · 安全加固:SSRF 防护 / 首装抢注 / 模板并发数据竞争

> 本版为纯安全加固,修复三处经 GPT-5.6 多轮独立审查确认的问题,均不改数据结构、不影响抓取渲染。

> 建议所有部署尽快升级。

🔒 S2 · 图片代理(/img-proxy)匿名 SSRF 加固

/img-proxy 是供蜘蛛匿名访问的公网接口,旧实现仅校验 URL 前缀就去拉取任意地址,

可被利用请求内网服务 / 回环 / 云元数据(169.254.169.254)造成 SSRF 数据外泄。

  • 新增拨号层(DialContext)IP 拦截:拒绝环回、私网(10/172.16/192.168)、link-local、

CGNAT(100.64/10)、198.18/15、未指定、多播等高危网段;用已校验 IP 直连防 DNS rebinding,

每跳重定向重新校验防重定向绕过。

  • URL 只允许 http/https scheme(挡 file://、gopher:// 等)。
  • 响应内容以字节魔数为准判定是否图片,不信任上游 Content-Type:伪造 CT=image/* 的

HTML/JSON/SVG 一律拒绝;对外输出 Content-Type 按魔数权威推导(不回传上游 CT),

配合 X-Content-Type-Options: nosniff,彻底挡住 SVG / polyglot 造成的存储型 XSS。

  • 失败响应头不再回显内部错误明文(防泄露被拦内网 IP / DNS 细节)。
  • 缓存命中同样复验,清理历史版本可能缓存过的非图片内容。

🔒 S1 · 首次安装接口抢注防护

首装接口(创建首个管理员)是无鉴权公网接口,旧实现仅靠「admins 表为空」判断,

一旦删库 / 部署空窗期,可能被扫描器抢注管理员接管后台。

  • 首装成功写持久 install_completed 标记;标记存在后,即使 admins 表被清空也拒绝公网首装

(此时用命令行 --reset-admin 恢复)。

  • 创建管理员 + 写标记放入同一事务(BEGIN IMMEDIATE),任一步失败回滚,消除中间态被利用的窗口;

事务内二次校验管理员数,兼顾多实例竞态。

  • 旧部署升级时自动回填标记,防历史部署删库后被抢注。

🔧 B1 · 模板集并发读写数据竞争

模板热更新(/internal/reload)整体替换 map 时,与请求路径高并发读存在 data race。

  • 模板快照改为 atomic.Pointer 原子读写,消除竞争(go test -race 通过,无竞争)。

🧪 其它

  • 修正 admin 包一处陈旧测试断言(模板集数量由 3 扩到 12 后一直误报),回归全绿。

升级建议

  • 建议所有部署升级。纯安全加固,不改数据结构、不影响抓取渲染与授权逻辑。

v2.11.053

2026-07-22·45 MB(压缩,自动解压)

# v2.11.053 · 修复模板商城「换了缩略图后台仍显示旧图」

> 官网商城的缩略图已更新,但蜘蛛池后台里部分模板(🌐 通用/深色 dark 系列等)仍显示旧缩略图。

> 这一版修掉后台预览图的缓存机制,让换图后能自动跟上。

🐛 问题:后台部分模板缩略图换了不更新

模板缩略图有两种来源:

  • 内嵌 SVG(如 TechWire / NoirPress 等精品套):图直接写在目录里,换图立即生效 —— 一直正常;
  • COS 图片(dark1–9、pgslot 系列、cryptonova 等):后台走 /api/admin/market/preview/{id} 代理取图。

旧的代理实现有三个问题,导致 COS 换了 preview.jpg 后后台仍吐旧图:

1. 内存缓存按模板 id 存、几乎不过期;

2. Cache-Control: max-age=86400,浏览器也缓存一整天;

3. 预览 URL 不带版本号,换图后地址不变,一直命中旧缓存。

🔧 修复

对齐官网做法,给后台预览代理加版本感知:

  • 预览 URL 改为 /api/admin/market/preview/{id}?v={version} —— 版本变了 URL 就变,自动绕开旧缓存;
  • 内存缓存键改为 id::version + 5 分钟 TTL,Cache-Control 降到 300 秒;
  • 点商城「刷新」时清空预览内存缓存,立刻和 COS 新图对齐。

💡 之后维护模板的提示

  • 更新商城模板(dark/pgslot/crypto 等走 COS 的):传新 preview.jpg / zip 到 COS 后,

务必把目录里该模板的 version 一并 +1 —— 这样后台/浏览器才会自动取新图,不会命中旧缓存。

  • 内嵌 SVG 缩略图的官方预设、以及指纹/引擎逻辑,仍需发版才能更新(不属在线更新范围)。

升级建议

  • 用模板商城、遇到过「换了缩略图后台不更新」的建议升级。纯后台预览缓存修复,不改数据结构、不影响抓取渲染。

v2.11.052

2026-07-22·43 MB(压缩,自动解压)

# v2.11.052 · 修复模板商城「卸载后绑定残留」+ 卸载确认弹窗改为系统内置

> 解决两个模板商城的体验问题:卸载弹窗还是浏览器原生灰框、以及**卸载模板后绑定关系没清干净,

> 导致「模板已删、绑定还在、想给域名换装新模板却绑不上」。**

🐛 核心修复:卸载模板后绑定残留,新模板无法绑定

模板↔域名的真正绑定存在 template_domains(渲染引擎实际认的机制)。旧版商城卸载有两个漏洞:

  • 绑定检查查错地方:只查了 domains.template 字段,没查真正生效的 template_domains ——

于是某域名明明绑在该模板上,卸载检查却看不到,结果「模板目录删了、绑定却残留」。

  • 卸载后不清理绑定:删完模板目录就返回,template_domains 里的残留(ghost)条目没删 →

再给该域名装新模板时,系统认为它还绑在已删的旧模板上,绑不上

现在:

  • 卸载前的绑定检查合并 template_domains 来源,拦截提示会列出正在使用的具体域名,指引先换绑;
  • 卸载成功后自动清掉该模板在 template_domains 里的绑定,杜绝 ghost 残留;
  • 若历史上已有残留(旧版卸载留下的),给对应域名重新装模板即可正常绑定。

🎨 卸载确认弹窗改为系统内置弹窗

模板商城「卸载」的确认框以前是浏览器原生 confirm()(灰白系统框、无法跟随主题)。现改为系统内置弹窗:

  • 玻璃磨砂样式、跟随主题切换器(亮/暗色、主题色一致);
  • 模板名加粗、多行说明清晰,按钮为「确定卸载 / 取消」。

升级建议

  • 用模板商城装卸模板、遇到过「卸载后换不了模板 / 绑不上」的建议升级。
  • 纯后台模板管理修复,不改数据结构、不影响抓取与渲染,可随需升级。

v2.11.051

2026-07-22·43 MB(压缩,自动解压)

# v2.11.051 · 修复「普通用户流量分析」明明选中网段却显示「封禁 0」

> 解决一个反复出现、之前几版都没根治的困惑:**在「安全中心 → 普通用户流量分析」里,

> 一个明显被识别为工具/脚本的网段,点封禁却提示「封禁 0」,让人以为没生效。**

> 这一版把封禁结果讲成人话、并修掉底层的两个隐患。

🐛 核心修复:封禁结果不再含糊,分「新封 / 已在名单 / 被拒」三类

以前后台只回一个「封禁 X 个」,当网段本来就在名单里时这个数是 0 —— 于是显示

「封禁 0」,让人误以为失败。实际上它一直在生效。现在封禁后会明确告诉你:

  • 新封 N 个 —— 本次新增、已写入「威胁情报名单」;
  • ℹ️ M 个本就在名单里(正在生效) —— 不是失败,是已经封着,无需重复封;
  • K 个被安全护栏拒绝 —— 逐条给出原因(搜索引擎/CDN 段、段内有蜘蛛流量、非法 CIDR)。

🔧 修复:封禁时的「聚合窗口漂移」隐患

页面展示的网段是某一刻聚合出来的,而封禁是在你点击的几秒后再判断。由于聚合用的是

滑动时间窗口,那几秒里窗口会漂移,可能让刚才还在列表里的网段「掉出」结果 →

老逻辑据此误判「不在最近聚合里,拒绝封禁」,造成「明明选中了却封不了」。

新版封禁时改用独立护栏校验,只守三条安全红线,不再依赖那次会漂移的聚合:

1. CIDR 必须合法(纯本地判断);

2. 不能落在搜索引擎 / CDN 回源段(纯本地 protectedCIDRs,永远可靠);

3. 段内不能有蜘蛛流量(实时精确查这一个段,不受窗口/排序波动影响)。

🧹 顺带:名单写入格式更稳

写入「威胁情报名单」时,注释与网段各自单独成行,杜绝历史上「行内注释导致

ParseCIDR 解析失败、整条被静默丢弃」的坑;读取端也兼容老的行内注释格式。

升级建议

  • 用过「安全中心 → 普通用户流量分析」封网段、遇到过「封禁 0」困惑的,建议升级。
  • 纯后台安全功能修复,不改数据结构、不影响抓取与渲染,可随需升级。

v2.11.050

2026-07-22·43 MB(压缩,自动解压)

# v2.11.050 · 文章配图新增「📚 图片库」来源 + 一键恢复动态兜底

> 解决一个很常见的困惑:「文章配图全是 AI 生成的 SVG 色块,想用自己的图片库,却没有入口。」

> 这一版把图片库接进批量配图,并让「用固定图」和「跟随图片库动态取图」两种模式可逆切换。

📚 新增:批量配图来源「图片库」

「文章管理 → 批量配图」的图源里新增 📚 图片库:直接用你在

「内容管理 → 图片库」里导入的图片链接(或上传的本地图)给文章配图。

  • 即时完成,无需下载、无需外部 API key、图存本地永不死链。
  • 按所选分组匹配图片库(留空 = 各文章用自己所属分组的图片库);

同分组多篇会均匀分到不同图片、同一篇结果稳定,不会整站撞同一张。

  • 对应分组图片库为空的文章会跳过,并提示去图片库导入(模型公共库 / 网站分组库均可)。

🧹 新增:「清空缩略图(恢复动态兜底)」

批量配图会把图片写死进文章缩略图,之后不再随图片库变化。新增一个按钮把这一步变可逆:

  • 点「🧹 清空缩略图」→ 文章封面恢复动态兜底:渲染时图片库对应分组有图就用图片库

(改图片库随改随生效、不撞图),没有则用 SVG 占位(永不 404)。

  • 支持按分组清空或全站清空;全站清空需二次强化确认 + 后端 confirm_all 保护,防误清整库。

说明:两种模式怎么选

| 想要 | 操作 |

|---|---|

| 每篇内容相关的独特图 | 批量配图选 AI 图源(Pollinations / Unsplash / 自定义) |

| 用自己管理的固定图库 | 批量配图选「📚 图片库」 |

| 改图片库随改随生效、不撞图 | 点「🧹 清空缩略图」回到动态兜底 |

对话框顶部有醒目提示讲清「写死 vs 动态跟随」的差异,点错了随时可用「清空缩略图」还原。

升级建议

  • 想用自有图片库给文章配图、或觉得配图老是 SVG 色块的,建议升级。
  • 纯显示层 / 后台功能增强,不影响已有文章数据,可随需升级。

v2.11.049

2026-07-22·43 MB(压缩,自动解压)

# v2.11.049 · 修复大流量机器上「普通用户流量」分析/封禁/AI 研判超时失败

🔴 现象

在请求量大的机器上,点「👤 普通用户流量」页的「🤖 让 AI 研判」或「封禁选中」,报错:

```

AI 研判失败:聚合失败: Post "http://127.0.0.1:8123/..." context deadline exceeded

```

而且封禁也会连带失败 —— 封完「🎯 威胁情报名单」里空空如也。

根因

「普通用户流量」分析要在 spider.logs 上做多次按 /24 网段的重聚合(count/uniqExact/

countIf/正则匹配)。这类查询本身没问题,但 ClickHouse 客户端写死了 30 秒超时 ——

在日志量大的机器(数百 GB / 每天数千万行)上,聚合跑不完 30 秒就被客户端掐断,

context deadline exceeded

更隐蔽的连带问题:封禁网段时,服务端会重新聚合一次做安全校验(不信任前端)。

聚合一超时,封禁就整体失败 —— 于是「确认封禁成功」但威胁情报名单里什么都没有。

这也是之前反馈「封了但名单空白」的一个真实来源。

修复

  • ClickHouse 客户端新增 QueryTimeout,重聚合类查询超时从 30s 放宽到 90s
  • 同时在 ClickHouse 服务端附加 max_execution_time,让服务端在同样时限内主动优雅中止

慢查询(返回明确错误而不是静默挂起),避免极端慢查询拖垮 ClickHouse。

  • 「普通用户流量」的 5 处聚合查询(主聚合 / 蜘蛛流量校验 / 昼夜节律 / 分钟峰值 / 总量)

全部走新的 90s 超时。

实测(测试机造 2.3 亿行放大数据复现)

| | 结果 |

|---|---|

| 旧行为(30s) | 30 秒被掐断 → context deadline exceeded(复现用户报错) |

| 新行为(90s) | 37 秒顺利完成 ✅ |

升级建议

  • 请求量大、点 AI 研判/封禁报「聚合失败/超时」的机器,建议升级。
  • 请求量小的机器本来就不会超时,可随下一版一起升。

v2.11.048

2026-07-21·42 MB(压缩,自动解压)

# v2.11.048 · 修复封禁网段后「威胁情报名单」仍显示空白

> 承接 v2.11.046。上一版让封禁的网段写得进、能生效、有地方看,

> 但这一版修的是最后一步:封完之后那个「威胁情报名单」框当场不刷新,

> 让人误以为封禁没写进去。

🔴 封禁成功了,但「🎯 威胁情报名单」框还是空的

在「安全 → 👤 普通用户流量」页封禁网段并确认后,切到「安全 → 🚫 IP/UA 名单」页,

底部的「🎯 威胁情报名单(自动写入)」框仍然是空的 —— 让人以为封禁根本没写进去。

(有用户反馈:确认封禁了 16 个网段,名单框却一片空白。)

原因:封禁结果确实写进了 settings.threat_intel_ips(数据没丢、也真的生效了),

但前端封禁成功后只刷新了「普通用户流量」的聚合列表,没有重新拉取配置

而「威胁情报名单」框绑定的配置只在进入安全页时加载一次,不重新拉取就一直显示

打开页面时的旧值(空)。必须手动刷新整个页面(F5)才会显示 —— 这就是「封了却看不见」的真正原因。

修复:封禁成功后自动重新拉取配置,「威胁情报名单」框立即显示新封的网段,

无需手动刷新。封禁成功提示也明确写清:已写入威胁情报名单、本页已自动刷新、

到「IP/UA 名单」页底部查看/撤销。

> 说明:这是纯显示层问题。之前用 v2.11.046/047 封禁的网段其实早就写进去并生效了,

> 只是需要刷新页面才看得到;升级本版后不用手动刷新,封完当场可见。

升级建议

  • 用过「普通用户流量」封禁功能、且觉得「封了但名单空白」的,建议升级。
  • 没用过这个功能的不受影响,可随下一版一起升。

v2.11.047

2026-07-21·41 MB(压缩,自动解压)

# v2.11.047 · 修复「AI 文章存进网站分组库后前台不显示」

> ⚠️ **如果你在「AI 内容生成 → 文章存入分组」里选的是「🏷 网站分组库」,

> 生成的文章在网站上一直不显示 —— 这就是这个 bug。** 升级本版即修复,

> 不需要重新生成文章,原来存进去的会立刻显示出来。

🔴 现象:选「网站分组库」存文章,网站空白;换「模型公共库」就有

在「AI 内容生成」把文章存入网站分组库(网站管理里的分组),网站前台

列表/首页一篇都不显示;把同样的内容改存到模型公共库(模型管理),

立刻就有了。很多人因此以为「网站分组库」是坏的,只能都往模型公共库塞。

原因:文章「存进哪个库」和「从哪个库读」对不上

  • :选「网站分组库」→ 文章按分组目录名(group_dirname)归档
  • :网站渲染文章时只认模型目录名(model_dirname)

两个名字不是一回事(分组有自己的目录名,同时又挂在某个模型下),于是

存进分组库的文章,前台按模型库的名字去找 → 永远找不到 → 空白。

而「模型公共库」恰好存和读都用模型名,所以看起来只有它「能用」。

修复:前台读文章时,分组库优先、模型库兜底

网站渲染文章(列表、首页、正文推荐内容、随机标题、相关文章、爬虫锚文本等)

统一改为:该分组自己的「网站分组库」有内容就优先用它,没有再退回「模型公共库」

—— 与模板选择「分组模板优先、模型模板兜底」的优先级一致。

  • 存进「网站分组库」的文章,现在正常显示
  • 只用「模型公共库」的用户完全不受影响(分组库为空时行为和以前一模一样)

说明

  • 两个库仍是分开的:「网站分组库」= 该分组专属内容(同分组的站点共享);

「模型公共库」= 同一模型下所有分组共享。按需选择即可。

  • 已加回归测试锁死该行为,并在测试机用真实数据复现→修复→复验通过。

v2.11.046

2026-07-20·40 MB(压缩,自动解压)

# v2.11.046 · 修复「普通用户流量」封禁的网段既看不见也没生效

> ⚠️ **如果你在 v2.11.044 / v2.11.045 用过「普通用户流量」页的封禁功能,那些封禁实际上

> 从未生效。 升级本版后会自动恢复**,不需要重新操作。详见下方第 2 条。

🔴 1. 封禁的网段在后台找不到

在「安全 → 👤 普通用户流量」页封禁网段后,到「安全 → 🚫 IP/UA 名单」页看不到任何记录,

也无法撤销。

原因:封禁结果写入的是「威胁情报名单」,而 IP/UA 名单页只显示手工维护的四个名单

(IP 黑/白名单、UA 黑/白名单),威胁情报名单在后台没有任何展示界面

封禁成功的提示语还写着「可在 IP/UA 名单页查看和撤销」—— 这是错的,把人指向了错误的位置。

修复:IP/UA 名单页新增「🎯 威胁情报名单」框,可查看、可编辑、带条数统计。

撤销封禁 = 删掉对应行再点保存。 提示语也改成指向正确位置。

> 这个名单和你手工维护的四个名单是分开存放的(便于整体回滚),但同样生效。

> 「普通用户流量」页的封禁、以及威胁情报源自动拉取的 IP,都写在这里。

🔴 2. 更严重:封禁其实根本没生效

上面那条只是「看不见」。查下去发现封禁压根没起作用 ——

封禁写入的格式是 1.2.3.0/24 # 说明文字(注释跟在网段后面),而黑名单解析只跳过

整行# 开头的注释;这种行内注释会让网段解析失败,整条被静默丢弃

也就是说:界面提示封禁成功,实际一条都没进黑名单。 属于最容易误事的一类问题 ——

看起来生效了,其实没有,而且没有任何报错。

修复:

  • 写入时注释单独成行,不再跟在网段后面
  • 解析时容忍行内注释 —— 因此升级后,之前按旧格式写坏的封禁会自动恢复生效,

你不需要重新封一遍

升级建议

  • 在 v2.11.044 / v2.11.045 用过封禁功能的,建议升级。 升级后先到

「安全 → IP/UA 名单 → 🎯 威胁情报名单」确认一下里面的内容是不是你想封的;

如果有不想要的,删行保存即可。

  • 没用过这个功能的不受影响,可随下一版一起升。

v2.11.045

2026-07-20·40 MB(压缩,自动解压)

# v2.11.045 · 修复 AI 接口预设里三个调不通的 Claude 模型

🔴 修复:OpenRouter 的 Claude 模型选了就报错(三条全坏)

「采集管理 → AI 配置」里选 OpenRouter 供应商时,三个 Claude 选项全部无法使用,

选中后调用直接失败:

| 预设里写的(错) | 正确的 |

|---|---|

| anthropic/claude-haiku-4-5 | anthropic/claude-haiku-4.5 |

| anthropic/claude-sonnet-4-5 | anthropic/claude-sonnet-4.5 |

| anthropic/claude-opus-4-5 | anthropic/claude-opus-4.5 |

OpenRouter 的模型名用点号,而预设写成了连字符(那是 Anthropic 官方直连的写法)。

一字之差,三个选项一个都用不了,而且已经这样很久了。

已修正并更新到当前一代,全部按 OpenRouter 官方模型列表逐条核对过:

  • Claude Haiku 4.5(快/便宜)
  • Claude Sonnet 5(速度与智能平衡)
  • Claude Opus 4.8(旗舰,最强 Opus)
  • Claude Fable 5(最强,贵,难题专用)
  • 另保留上一代 Sonnet 4.6 / Opus 4.7 备选

> 如果你之前在 OpenRouter 下选过 Claude 且一直调用失败,升级后重新选一次即可。

> 已经手工填对模型名的不受影响。

修复:Gemini 预设的错误提示 + 补两个稳定版

预设里有一条注释写着「Google API 没有 gemini-2.5-flash」—— 这是错的,该模型存在且可用。

已删除该错误提示,并补上遗漏的两个稳定版:

  • gemini-2.5-pro(稳定)
  • gemini-2.5-flash(稳定)

Gemini 其余 10 个选项已用真实 key 拉官方模型列表逐条核对,全部有效,无需改动。

说明

  • 本版只动 AI 接口的模型选项列表,不改任何调用逻辑,升级无风险。
  • 已有的 AI 端点配置不受影响 —— 预设只在「新建端点」时提供下拉选项。
  • ⏰ 仍在用 DeepSeek 的机器请注意:deepseek-chat / deepseek-reasoner 将于

2026-07-24 15:59 UTC 被官方停用。升级到 v2.11.043 或更高版本会开机自动

把旧模型名换成 deepseek-v4-flash,不用手工改配置。

v2.11.044

2026-07-20·40 MB(压缩,自动解压)

# v2.11.044 · 「普通用户流量」分析面板 + 一键导出诊断包

新增:安全页「👤 普通用户流量」标签

用来回答一个很常见的问题:「后台显示普通用户几十万上百万,是不是被攻击了?」

以前只能看到一个吓人的数字,看不出这些流量到底是什么。现在按 IP 的 C 段(/24)聚合,

把每个网段的行为形状摆出来,并对每一条给出能看懂的判断依据:

  • 时间维度:昼夜节律(真人有作息、机器 24 小时平坦)、活跃小时数、分钟级突发度
  • UA 维度:伪造搜索引擎 UA、脚本工具指纹(python/curl/scrapy/无 UA 等)
  • 行为维度:是否加载 CSS/JS/图片(真浏览器必然加载,脚本只要 HTML)、有无探测

wp-login/.env/.git 这类敏感路径

  • IP 结构:C 段内地址占用密度、同一 /16 下是否有多个相邻段协同活动

⚠️ 只分析非蜘蛛流量。 蜘蛛侧有独立的蜘蛛防火墙,这个面板一行都不碰。

关键设计:先分清「未收录的爬虫」,再谈可疑

实测发现,很多被算进「普通用户」的其实是自报家门的爬虫(在 UA 里写明了自己的名字、

版本,有的还留了说明网址和联系邮箱),只是本系统的蜘蛛识别库还没收录它们。

它们的行为和攻击极其相似 —— 少量 IP、超高频、路径单一、不加载静态资源。

只看行为一定会把它们判成攻击并建议封禁。

所以现在会先给网段定性:

  • 🤖 已声明爬虫 → 直接告诉你它叫什么,建议「按 UA 屏蔽」或「加进识别库」,

不建议按 IP 段封禁(它们 IP 很少且固定,按段封既没必要又容易误伤)

  • 🔧 工具/脚本 / 🌐 类浏览器 → 才进入可疑度打分

AI 研判:只出建议,人工确认才封

点「🤖 让 AI 研判」,AI 会对每个网段给出「攻击 / 采集器 / 正常 / 不确定」+ 置信度 + 理由,

显示在判断依据下方。AI 不能封禁任何东西,必须你勾选后点「封禁选中」。

三重护栏(都在服务端强制,不依赖 AI 是否听话):

1. 段内只要有蜘蛛流量,一律禁止封禁 —— 蜘蛛请用蜘蛛防火墙处理

2. 属于搜索引擎或 CDN 回源范围的网段一律拒绝(Google/百度/Bing/Yandex/Cloudflare),

只要有重叠就拒,不要求完全落在里面

3. 封禁时服务端重新聚合校验,只允许封本次分析里真实出现过的网段;AI 编造出来的

网段会被整条丢弃

封禁结果写入「威胁情报名单」,和你手工维护的黑名单分开存放,可在「IP/UA 名单」页查看和撤销。

新增:📦 一键导出诊断包

遇到看不明白的流量问题,可以导出诊断包发给技术支持,不用开放服务器权限。

包含:流量构成(各类蜘蛛/普通用户的请求数与 IP 数)、C 段行为指纹、UA 分布 Top 30、

小时分布、防护开关状态、机器负载。只有几十 KB。

隐私:

  • 不含单个访客 IP(只到 /24 网段)、不含原始访问日志不含任何密钥或密码
  • 黑白名单只报条数,不导出内容
  • 不会自动上传 —— 文件下载到你本地,由你决定要不要发给我们

说明

  • 本功能依赖 ClickHouse 做流量聚合。未启用 ClickHouse 的机器(单站模式常见)打开这个

标签会提示「本机无法进行流量聚合分析」,其余功能不受影响。

  • 昼夜节律类信号只在观察窗口 ≥12 小时时参与判断 —— 1 小时的窗口谈作息没有意义。

v2.11.043

2026-07-20·39 MB(压缩,自动解压)

# v2.11.043 · DeepSeek 旧模型名自动升级 + 模板归属大修 + AI 功能补齐

> 本版包含 v2.11.042 的全部内容(042 未单独发布)。

⏰ 紧急:DeepSeek 2026-07-24 弃用旧模型名(建议尽快升级)

DeepSeek 官方于 2026-07-24 15:59 UTC 硬弃用 deepseek-chat / deepseek-reasoner,

之后请求直接失败。用 DeepSeek 的机器届时采集/洗稿/翻译/AI SEO/栏目生成会同时停摆

  • 升级本版后开机自动把旧模型名换成 deepseek-v4-flash,不用手工改配置。

(模型名存在数据库里,只更新软件预设是救不了已装机器的。)

  • base_url / api_key / 请求格式都不变,只有模型名变。
  • 只动 api.deepseek.com 官方直连端点;OpenRouter 等聚合商用自己的命名空间,不受影响。
  • ⚠️ 原来用 deepseek-reasoner(推理模式)的,迁移后会落到非思考模式。

需要推理能力的请到「采集管理 → AI 配置」手动改成 deepseek-v4-pro

  • 新建端点时可选 deepseek-v4-flash(快/便宜)和 deepseek-v4-pro(旗舰),都是 1M 上下文。

修复:商城模板装完「没名字·没缩略图·和别的模板重复」

  • 没有中文名 —— 商城包里其实带着名字(如 CryptoNova · 加密新闻杂志),但列表接口

从不返回它,卡片只能显示裸目录名。现在显示中文名,底下小字标注 模型 / 目录id

  • 没有缩略图 —— 缩略图只存在于商城目录里,不在模板包内,装完本地读不到。

现在安装时自动落地;商城包内也补了预览图(老版本重装一次也能出图)。

  • 同名模板互相串台 —— 同一个模板装到多个模型/分组下时,后台用目录名当唯一标识,

导致卡片看着重复;更严重的是缩略图/编辑/保存/删除都会作用到错误的那一份

修复:同一模板装到多个分组时「改了模板不生效」(渲染层根因)

这是上一条的根子,影响的是实际渲染:

  • 引擎的模板表也按目录名建立,三份同名模板互相覆盖、按字母序最后一个赢,另外两份

被静默丢弃。结果三个环节各指一个目录:后台编辑器改的是首个匹配的,引擎渲染的是最后

一个,用户以为在改域名所属分组的那一份。内容相同时看不出来,一改模板就是「不生效」

  • 域名绑定也只用目录名做 key:三张卡片读同一条记录;在 A 卡保存完再在 B 卡保存,

B 会直接盖掉 A 的绑定

  • 现在全链路改用「模型/模板名」唯一标识。老的绑定不需要重新绑 —— 启动时自动归一

(按绑定域名实际所属的分组定位到正确的那一份),判不出来的由引擎兜底,兜底也优先选

域名所属分组的那一份。

新增:模板配置体检 + 绑定冲突提示 + 「无模板返回 404」开关

排查「域名为什么调不到我装的模板」以前全靠猜,现在后台直接说清楚。

  • 模板管理页新增「配置体检」标签(带红色数字角标),自动列出有问题的域名和修法:
  • 分组没有模板:域名没绑模板,所在分组/模型下也没有任何模板 → 只能发兜底页。
  • 绑定指向了别的分组:域名身上挂着绑到其它分组模板的旧记录。绑定优先级最高,

所以本分组新装的模板永远不生效 —— 最容易被误判成「模板装了没用」。

  • 绑定冲突提示:一个域名只能绑一个模板。现在保存前就在域名框下方标红提示已绑在

哪个模板、去哪解绑。

  • 新开关「分组没有模板时直接返回 404」(默认关闭):关闭时发一个简陋兜底页(HTTP 200),

页面「看着正常」但内容很差,配置漏了不容易发现;开启后问题立刻暴露。

⚠️ 默认不开是有意的 —— 任何分组临时没模板(换模板中、刚建分组还没装)都会让整站 404。

建议先看体检面板确认没有误报再开。

新增:AI SEO 增强可选 AI 接口 + 失败自动换端点

  • 界面原本写死「GLM-4 worker」,实际用的是 AI 配置里第一个启用的端点(多数人配的是

DeepSeek),文案骗人。现在显示实际使用的端点名和模型

  • 新增 AI 接口选择器,可为这个功能单独指定供应商;不选则沿用原行为。
  • 失败自动切备用端点 —— 以前端点偶发限流/超时/内容审核拒绝,文章直接标记失败,

一键加入几千篇时端点抖一下就是一大批失败。

  • 尊重端点上配置的超时时间(以前写死 60 秒)。

新增:AI 生成栏目支持「写入网站分组」

  • 「目标」原本只有 写入模型库 / 写入特定域名 / 仅预览,想给某个分组生成栏目只能挑一个

属于它的域名让系统反查 —— 域名没分组就直接报错。现在多了「写入网站分组」选项。

  • 顺带修:传入不存在的分组以前会被静默写成脏数据,现在会校验并提示。

其它

  • 商城安装日志和返回值记的是商城标注的模型,不是你实际选的安装目标(装到 A 日志写 B),

排查时对不上。现在记真实目标。

  • 商城「已安装」检测和卸载原本只查商城标注的模型,装到自选目标后检测不到、也卸载不掉。

v2.11.041

2026-07-19·39 MB(压缩,自动解压)

# v2.11.041 · 单站/站群可自由添加 www./二级域名

修复:添加 www.123.com / 二级域名「加不进去」

  • 之前后台添加域名会强制砍掉 www. 前缀,导致 www.123.com 被归一化成 123.com,

和已有的 123.com 撞成「重复域名」被静默跳过 —— 看起来就是「加不进去」。

  • 现在不再砍 www:客户可自由把 www.123.comblog.123.comm.123.com

任意子域名作为独立站点添加(单站/站群/泛目录任意模式)。

  • 服务端用精确 host 匹配,存什么就服务什么;用哪个域名访问就在后台填哪个。

说明

  • 想强制跳 www 的,继续用分组里的「301 重定向到 www」;想让 www 和裸域各自独立服务的,现在直接加两条即可。
  • 后台「根域名列表」提示文案同步更正(旧文案误写「不带 www」)。

v2.11.040

2026-07-18·39 MB(压缩,自动解压)

# v2.11.040 · 精准访客分流·国家维度(geo_country)+ 命名/入口优化

新增:「🌍 精准分流·国家维度」(geo_country)—— 英文站/跨国站的正解

  • 原「精准 cloak(geo_lang)」按语言分流,只适合泰/印尼/越等小语种站(审计员用中文/英文=非目标语言→看正常站)。
  • 英文站/跨国大语种站语言分不开审计员和真客户,新增按 IP 国家分流:
  • 🤖 蜘蛛 → 渲染收录 💰 目标国家 IP + 搜索来路 → 跳广告 🛡 目标国家直访 → 404 🎭 非目标国家(美国等审计区)→ 渲染正常站(防降权)
  • 基本设置选「🌍 精准分流·国家维度」→ 填目标国家码(PH,IN,NG…)。⚠ 需已导入 GeoIP 国家库。

优化

  • 「精准 cloak」统一改名「精准访客分流」(语言维度 / 国家维度两种)。
  • 基本设置「游客访问跳转」加醒目推荐卡片 + 一键启用。

建议

做英文/跨国站群的用户更新;小语种站继续用语言维度即可。

v2.11.039

2026-07-18·40 MB(压缩,自动解压)

# v2.11.039 · 新闻翻译跨模型 fallback + 文章库健壮性 + 未分组筛选

修复:某些模型对小语种弱(如 DeepSeek 泰语)导致翻译不彻底

  • 翻译后语言校验失败时,自动换 fallback 链里的其它端点(不同模型)重译,而不是死磕同一个模型。
  • 给弱语种源(泰语等)配一个更强的 fallback 端点(GLM/GPT/Gemini),泰语这类问题自愈。

修复:文章库某分组「计数有数字但点开列表空 / 单篇打不开」

  • 根因:articles 表 title/summary/hits 允许 NULL,一篇脏数据(NULL)会让整个列表 / 单篇查询 Scan 报错 → 500 → 前端静默空。
  • 全字段 COALESCE 兜底,一篇脏数据不再搞垮整个分组;前端加载失败不再静默吞错。

新增:文章库「未分组」一键筛选

  • 「全部文章库」旁加「🗂 未分组(N)」按钮,点击直接列出所有没分组 / 坏分组的文章。
  • 配合「全选跨页 → 批量移动」一键归类,不用再翻页找孤儿。

建议

用新闻采集(尤其小语种)/ 文章库的用户建议更新。

v2.11.038

2026-07-18·40 MB(压缩,自动解压)

# v2.11.038 · 授权页退款文案 24 小时

变更

  • 授权管理页「7 天无理由退款」→「24 小时无理由退款」,与官网退款政策一致(24 小时内、未深度使用可申请全额退款)。

建议

文案一致性更新,可随手升级。

v2.11.037

2026-07-18·40 MB(压缩,自动解压)

# v2.11.037 · AI 关键词扩展三项优化

修复:扩展慢 + 核心词残留 + 长尾质量

有用户反馈:加了核心词做 AI 扩展要 90 分钟,且原来不能用的核心词还留在库里,只想保留可用的长尾词。本版针对性优化。

1. 删核心词 / 留长尾(新)
  • AI 采集页「关键词扩展」加「扩展后删核心词」开关:任务成功完成时,自动把这批核心词从关键词库删除(只留生成的长尾词)。仅在任务「完成」才删,超时/取消不删,避免误删。
  • 关键词管理页加「🎯 选中疑似核心词」按钮:按「短词 / 词数≤2」启发式选出疑似核心词,审核后走批量删除,长尾词不会被选中。
2. 提速 + 护蜘蛛
  • 原本每生成一个长尾词就 SELECT COUNT + INSERT 一次,疯狂敲共享的 spider-pool.db、和蜘蛛抢写锁(会拖慢抓量)。
  • 改为:任务启动时一次性把库里已有关键词 load 进内存去重集,workers 并发插入靠加锁去重(跨 worker 也不重),每个核心词的长尾一次事务批量写。既快又不再抢蜘蛛写锁。
3. 质量过滤
  • 自动丢弃垃圾长尾:太短(<2 字符)、纯符号/数字(无任何字母)、与核心词完全相同的行。长尾更干净可用。

建议

用 AI 关键词扩展的用户建议更新。

v2.11.036

2026-07-17·39 MB(压缩,自动解压)

# v2.11.036 · 模板渲染修复(栏目名 + dark 系列 CSS)

修复:{menu} 栏目名 {$vo.name} 渲染成空

模板里 {menu}...{$vo.name}...{/menu} 想显示栏目名,但引擎循环变量没有 name 字段(栏目名在 title)→ 渲染空、导航链接没文字。

  • 引擎加 {$vo.name} = {$vo.title} 别名(栏目名/文章名都取 title),手写模板不再踩坑。
  • 商城 CryptoNova / TokenForge 两套已同步改用 {$vo.title} 并重新上架,栏目管理现在能正常调用。

修复:dark 系列商城模板 CSS 从不加载

「深色通用模板」把整套 80KB 设计放在 static/css/style.css,只用 /*%MODERN_CSS_PATCH_v1%*/ 标记引用(没有 <link>)。但该标记原本只是内置预设的「已打补丁」旗标,对商城模板从不注入 → dark 的 style.css 从没加载过,渲染残缺。

  • 模板加载时在该标记处注入 static/css/style.css(仅当存在 → 无 css 的系统预设完全不受影响)。
  • dark1-9 现在能渲染出完整设计。

商城

模板商城全部缩略图已换成真实渲染截图(dark/crypto/pgslot 一线设计质感)。

建议

使用商城 dark 系列 / 多语言模板 / 栏目导航的用户建议更新。

v2.11.034

2026-07-17·39 MB(压缩,自动解压)

# v2.11.034 · 新增 2 套高质量加密货币模板(单站+站群双用途)

商城上新:CryptoNova + TokenForge

模板商城「加密/金融」新增两套精品加密货币模板,单站和站群都能用:

  • CryptoNova · 加密新闻杂志 —— CoinDesk/CoinTelegraph 风格。深空蓝黑 + 霓虹青紫渐变、玻璃拟态、实时行情条、Hero 特稿、资讯网格。适合加密新闻/资讯站。
  • TokenForge · 加密评测攻略 —— CoinGecko/Messari 风格。炭黑 + 祖母绿/金、市场快照组件、币种评测卡(评分星条)、入门攻略、涨跌榜。适合评测/攻略/数据站。

两套都:

  • 多语言可切换(泰/英/中 + 缺失兜底英文)
  • 单站锁死精美配色 + 站群自动按域名改类名去指纹(一套双用途,不用分开)
  • 文章日期自然分散(v033)、外链 CSS 自动内联(v030)、响应式、完整 SEO(TKD + JSON-LD)

用法

后台「模板商城 → 加密/金融」一键装到任意域名/模型 → 绑定域名 → 切语言即时生效。装前请先更新到本版(模板的多语言键 + 去指纹前缀在本版内置)。

v2.11.033

2026-07-17·39 MB(压缩,自动解压)

# v2.11.033 · 文章/卡片日期自然化(所有模板)

修复:批量生成的文章日期全扎堆在同一天

之前文章卡片、列表、详情页的发布日期直接取文章入库时间 —— 批量 AI 生成时全是同一天,一眼假,是明显的站群指纹。

本版引擎级自然化(所有模板自动生效,无需改模板):

  • 每篇文章按其稳定 ID 哈希,发布日期在真实入库日往前分散 2~400 天;
  • 不日漂移:锚定真实入库日,不是「今天往前推」,所以日期一旦定下就不变(Google 不会看到日期穿越);
  • 全站一致:同一篇文章在卡片、列表、详情页、JSON-LD Article schema(datePublished / dateModified)显示的日期完全一致;
  • 修改时间自动落在发布时间之后 0~20 天、且不超过今天。

效果:首页/列表卡片日期自然错落(如 2025-10、2026-01、2026-03…),像真实运营了很久的站。

对所有模板(含商城 9 套 PG 模板 + 系统内置)统一生效。

v2.11.032

2026-07-17·39 MB(压缩,自动解压)

# v2.11.032 · AI 生成任务:区分「真生成」和「跳过」

修复:显示「完成」实际却是全部跳过

有用户反馈:AI 文章生成任务,关键词已有文章会被自动跳过,但任务列表「成功」列显示的其实是 完成数(=成功+跳过),状态只写「✔ 完成」—— 看着像生成完毕了,实际是跳过完毕(一篇没新生成)。

本版:

  • 任务列表「成功」列改为显示真实生成篇数(完成 − 跳过)。
  • 新增「跳过」列(橙色 + 悬浮说明「该关键词在本分组已有文章,自动跳过」)。
  • 当一个任务全部跳过、0 新生成时,状态显示「⚠ 全部跳过」,并提示:想重新生成请换关键词 / 换分组 / 调高「每词最多篇数」上限。

一眼就能看出这次到底生成了几篇、跳过了几篇,不再误判。

说明:为什么会跳过

同一分组内、同一个关键词已经成功生成过文章(且文章还在)就会自动跳过,避免重复内容。这是正常去重,不是 bug —— 之前只是前台没讲清楚。

历史版本均通过 wztseo.com 自托管 CDN 提供下载,长期可用。