如何本地运行 OpenSEO 站点审计引擎并验证 badseo 测试站的全部问题? 📅 发布时间:2026/9/14 8:46:05 👁 浏览次数: 如何本地运行 OpenSEO 站点审计引擎并验证 badseo 测试站的全部问题【免费下载链接】open-seoOpen source alternative to Semrush and Ahrefs项目地址: https://gitcode.com/GitHub_Trending/op/open-seo如果你改动了 OpenSEO开源的 Semrush / Ahrefs 替代品的站点审计代码或者想确认审计引擎能否抓出常见的技术 SEO 错误可以用仓库自带的 badseo 测试站做端到端验证badseo 是一个刻意充满 SEO 错误的本地站点每个页面只破坏一条规则缺失title、重定向死循环、无内链页面、薄内容等而仓库里的审计 harness 会驱动真实的OpenSEO 爬取 问题检测函数去爬它逐页断言每个 fixture 触发且仅触发其声明的问题。跑通这一条路径你就得到了对审计引擎可核对的回归验证结果。前提条件来自 docs/LOCAL_DEVELOPMENT.md 的本地开发前置要求Node.js 20CorepackNode.js 24 及以前随 Node 自带Node.js 25 需单独安装仓库使用 pnpmpackage.json中声明packageManager: pnpm10.30.1用corepack enable激活该精确版本pnpm --version应与声明一致过老的全局 pnpm 可能拒绝仓库的 lockfile注意 badseo 和主应用是两个独立的 pnpm 项目各有自己的 lockfile根目录安装不会装 badseo 的依赖。反过来审计 harness 运行在仓库根目录上下文它从../src导入审计代码所以根目录依赖也必须装好。启动 badseo 本地站点在仓库根目录执行# 激活 package.json 声明的 pnpm 版本 corepack enable # 1. 安装根目录依赖审计 harness 需要 pnpm install --frozen-lockfile # 2. 安装 badseo 子项目依赖 pnpm --dir badseo install --frozen-lockfile # 3. 启动 badseo 开发服务器 pnpm --dir badseo run devVite 配置见 badseo/vite.config.ts将开发服务器固定在127.0.0.1:8787所以站点在http://localhost:8787上可用。文档明确要求本地跑审计时用这个 Vite dev server并传入与它一致的 originhttp://localhost:8787——因为 badseo 的 sitemap 和 robots.txt 里的 URL 是按请求的 origin 动态生成的见 badseo/src/server/badseo.ts传给 harness 的 origin 必须和站点实际暴露的 origin 匹配否则爬到的 URL 会对不上。浏览器打开http://localhost:8787/#issues可以看到全部 fixture 页面的目录用于人工抽查。运行端到端审计并解读输出在另一个终端badseo dev server 保持运行从仓库根目录执行pnpm --dir badseo run audit http://localhost:8787该命令实际执行cd .. tsx badseo/scripts/run-audit.ts入口脚本是 badseo/scripts/run-audit.ts。它的做法是从../../src直接导入生产 Worker 使用的真实函数crawlPage、discoverUrls、parseRobotsTxt、runPageReporters、findDuplicates、findRedirectChainsAndLoops等只自行重写了爬取 frontier 的 BFS 循环目的是能爬 localhost——生产环境的 frontier 有 SSRF 策略会屏蔽私有主机爬取上限 200 页、并发 10正式检测前先对全部页面做一轮预热请求避免 dev server 冷启动让健康页被误判为慢响应。harness 会输出三部分结果爬取摘要行爬了多少页、多少内链、检出多少问题以及crawl completed还是crawl TRUNCATED被节流或超限截断时显示 TRUNCATED此时孤儿页检查会被跳过逐页 pass/fail 矩阵首页/和隐私页/privacy必须完全干净每个 fixture 页面必须触发恰好等于其expectedIssues声明的问题集合——缺的标missing多出的标extra页面没被爬到标NOT CRAWLED。另有一条专门的回归项trailing-slash 重定向环必须落到 200 且无 loop对应 every-app/open-seo#61 的历史缺陷issue-type 覆盖行issue-type coverage: X/YY 是 src/shared/audit-issues.ts 中AUDIT_ISSUE_TYPES注册表的问题类型总数28 种X 是被至少一个 fixture 覆盖到的数量有遗漏时会列出missing: ...清单。退出码即验证结论全部通过时打印ALL N CHECKS PASSED并以 0 退出任何一项不符打印N/M CHECKS FAILED并以非零退出因此它可以直接用作审计引擎的 CI 门禁。一个可选的调试开关设置环境变量DEBUG_DEPTH后脚本会额外打印/structure/deep/路径页面的爬取深度用于排查深页问题。新增 fixture给审计引擎补一个回归测试badseo 的 README 明确说明“一个 fixture 就是一个回归测试”。如果你要验证审计引擎新增的某个问题检测流程是在 badseo/src/fixtures/ 对应分类文件中新增一个 fixture 对象核心字段const myFixture: Fixture { path: /category/my-mistake, category: Content quality, name: My SEO mistake, summary: One-line description shown in the on-page test panel., lesson: Why it matters / how to fix it., expectedIssues: [thin-content], // the audit issue ids this page must trigger handler: () htmlResponse( renderPage({ fixture: myFixture, title: …, metaDescription: …, bodyHtml: …, }), ), };其中title/metaDescription/bodyHtml需要按你要构造的缺陷页面自行填写上例即文档给出的原始示例。expectedIssues中的 id 必须与AUDIT_ISSUE_TYPES注册表的 key 对应且会做类型检查。把 fixture 加入所属分类的导出数组各分类在 badseo/src/fixtures/registry.ts 中汇总为allFixtures。重新跑pnpm --dir badseo run audit http://localhost:8787harness 会强制新 fixture 触发其声明的全部问题并在覆盖行中反映。README 给出三条构造约束违反会让验证结果失真每页只隔离一个问题除演示的缺陷外页面其余方面必须健康kitchen-sink 页是刻意的例外它一页破六种规则title 和 meta description 全站唯一否则会意外产生 duplicate-title / duplicate-meta 组有意的重复对除外文案保持平实只说明页面做什么、这个错误为什么重要。改完 badseo 代码后的校验命令是pnpm --dir badseo run buildVite build 类型检查格式化用仓库根目录的 Prettierpnpm exec prettier --write badseo/**/*.{ts,tsx,json,jsonc,md}限制与边界harness 能爬 localhost 是因为它自行实现了 frontier 循环生产审计的 SSRF 策略仍会屏蔽私有主机两者不冲突但也不应混为一谈。爬取若显示TRUNCATED说明 200 页上限或节流提前触发了孤儿页检查只在爬取完整时执行此时该行的结论不完整。本文只覆盖本地运行与验证路径badseo 部署到 Cloudflare Workernpm run build npm run deploy见 badseo/README.md属于独立任务此处不展开。审计 harness 本身不依赖主应用的数据库或 DataForSEO 凭据docs/LOCAL_DEVELOPMENT.md中的.env.local、DATAFORSEO_API_KEY、AUTH_MODE等配置是运行主应用pnpm run dev时才需要的。【免费下载链接】open-seoOpen source alternative to Semrush and Ahrefs项目地址: https://gitcode.com/GitHub_Trending/op/open-seo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考