对 https://one.dsrupt.ai/ 的完整拆解:整站前端已归档(2 个文件 / 3.62 MB),207 个后端接口已枚举出路径和 HTTP 方法,69 条前端路由、5 组硬编码密钥、53 篇帮助文档全文全部拿到。
- 报告页:打开
- 归档清单 + 公开接口探测:
/api/summary - 完整接口地图:
/api/endpoints - 前端路由表:
/api/routes - 泄露配置 + 第三方 host:
/api/config - 公开内容全文:
/api/content - 读归档的原始前端文件:
/api/file?path=/assets/index-DPXPu-4s.js
Dsrupt One 是 Dsrupt.ai 的多品牌 AI 创作工作台,面向代理商和创意团队。
核心卖点不是「又一个 AI 生图站」,而是品牌一致性:你把客户品牌的 CI、logo、网站地址喂进去,平台自动生成品牌指南(颜色、语气、规则、字体),之后每一次生成都自动套用这套规范。配合 MCP,它把能力接进 ChatGPT / Claude / Manus / Cursor —— 你在聊天框里说一句话,出来的图就是你的品牌。
产品线有两条:
| 产品 | 说明 |
|---|---|
| Dsrupt One | 多品牌 AI 工作台(本站,one.dsrupt.ai),自助注册、已上线 |
| AI Activations | 线下活动/战役的品牌化 AI 体验,把参会者变成一方数据 |
| 维度 | 情况 |
|---|---|
| 前端 | Vite + React 18 SPA,单包 3.57 MB(无懒加载分包),TanStack Query + zustand,Tailwind/Radix |
| 后端 | Rails —— user[email] 参数风格、/ui_api/ 命名空间、{status, error} 错误体 |
| 鉴权 | JWT(Authorization: Bearer)+ 游客 token(/ui_api/guest)+ Google 登录 + Cloudflare Turnstile |
| 支付 | Stripe(前端硬编码 publishable key、js.stripe.com) |
| 可观测 | PostHog(埋点)+ Sentry |
| CDN | CloudFront(d2s57ng2ndjfn.cloudfront.net,存指南视频和素材) |
| 多租户 | organisations(组织)+ brands(品牌)+ campaigns(战役)+ workspaces(工作区) |
| 项目 | 数量 | 说明 |
|---|---|---|
| 前端文件 | 2 | HTML 壳 + 1 个 JS 单包 + 1 个 CSS,共 3.62 MB,存进本 val 的 blob(键前缀 mirror/) |
| 后端接口 | 207 | 全部 /ui_api/*,带 HTTP 方法:POST 127 / GET 55 / DELETE 37 / PATCH 28 / PUT 3 |
| 前端路由 | 69 | 从 React Router 的 path:"…" 提取 |
| 硬编码密钥 | 5 组 | 见下 |
| 帮助文档 | 53 篇 | /ui_api/help 全文,含标题、分类、标签、正文 |
| 指南模块 | 9 个 | /ui_api/guides,含视频地址与章节正文 |
那 207 条不是猜路径试出来的:先定位到前端唯一的请求包装函数
he(path, opts)→fetch(\${API_BASE_URL}${path}`),再从单包里正则提取所有/ui_api/出现点,并往后扫 400 字符抓method:"…"`。所以每条都带真实 HTTP 方法和出处分包。
单包里有这么一行:
zs = window.location.hostname === "one.dsrupt.ai"
? "https://backend.dsrupt.ai"
: "https://dsrupt-backend-staging-5c326933ece6.herokuapp.com"
含义:在 one.dsrupt.ai 上打开时打生产后端;在任何其他域名(含本地开发)打开时,前端会把请求直接打到 staging 后端。
也就是说那个 Heroku staging 地址是公开可发现的,而且前端还专门写了迁移逻辑把 localStorage 里旧的 herokuapp.com 地址改回生产地址:
migrate: e => { if (e?.API_BASE_URL?.includes("herokuapp.com")) e.API_BASE_URL = zs; return e }
全部来自前端单包,任何人都能在浏览器里看到:
| 项目 | 值 |
|---|---|
| PostHog 项目 key | phc_mv3vnxXt5BF6iUmoSXKDSMz45JVjv9g5qdBYs3DgG3hu |
| Cloudflare Turnstile sitekey | 0x4AAAAAAE1m9aEjG1lSegJx |
| CloudFront CDN | https://d2s57ng2ndjfn.cloudfront.net |
| Google OAuth client id | 83826095488-vcpkjj8ovmj13n70bkbgkld1079ofe0l.apps.googleusercontent.com |
| staging 后端 | https://dsrupt-backend-staging-5c326933ece6.herokuapp.com |
publishable key / sitekey / 项目 key 本身设计为公开(必须发给浏览器),不算漏洞。但它们是可被滥用的入口:PostHog key 能往你的项目里灌假事件,Turnstile sitekey 能被拿去刷你的验证配额,Google client id 能用来伪造 OAuth 流程的起点。staging 后端地址则是攻击面本身。
| 接口 | 返回 |
|---|---|
/.well-known/oauth-authorization-server | 完整 OAuth 2.1 元数据(MCP 接入用,含 register/revoke 端点) |
/ui_api/help | 53 篇帮助文档的索引(key / 标题 / 分类 / 标签) |
/ui_api/help/:key | 单篇帮助文档全文 |
/ui_api/guides | 9 个指南模块 + 章节正文 + 视频地址 |
/ui_api/demo/view/:id | 存在(返回 400,参数不对) |
/mcp | 存在(返回 401,需 OAuth) |
其余 200 条一律 401 Unauthorized。
| 模块 | 前缀 | 内容 |
|---|---|---|
| 管理后台 | /ui_api/admin/* | 用户、组织、邀请、定价(plans/packages/scenarios/workflows)、声音、语音同意审核、发布战役 |
| 品牌 | /ui_api/brands/* | 品牌 CRUD、核心(core)、指南生成/改写、资产、战役 |
| 素材 | /ui_api/assets/* | 素材 CRUD、自动分类建议 |
| 生成 | /ui_api/predictions/*、/ui_api/video_predictions/*、/ui_api/audio_predictions/* | 图像/视频/音频生成、分类、公开、下载、放大、品牌绑定 |
| 活动 | /ui_api/events/* | 活动 CRUD、统计、二维码、定制、群发、配额分配、激活报价、Stripe PaymentIntent |
| 工具 | /ui_api/tools/* | 工具运行、HTML、升级、公开工具开关 |
| 主题 | /ui_api/themes/* | 主题 CRUD、参考图、生成预览 |
| 直通访问 | /ui_api/direct_access/*、/ui_api/direct_access_v2/* | 活动码换内容、生成、HTML |
| 积分 | /ui_api/credits/* | 交易流水、用量分析 |
| 声音 | /ui_api/voices/*、/ui_api/toolbar/voices/* | 声音库、同意书 |
| 组织 | /ui_api/organisations/*、/ui_api/organisation_invitations/* | 组织、邀请(含 claim link / 邮件投递) |
| 账号 | /ui_api/guest、/ui_api/login、/ui_api/signup、/users/password | 游客、登录、注册、找回密码 |
| 其他 | /ui_api/help、/ui_api/guides、/ui_api/voice_consent/* | 帮助、指南、语音同意 |
完整 207 条见报告页「接口地图」标签页,支持按方法筛选和路径搜索。
/ /account /activation /activation-info /ad-multiplier /admin /admin/invitations
/audio_gallery /blockout /branded-demos /branded_demos /brands /brands/:id
/cast /cast/e/:elementId /chat /create /create/examples /create/m/:mediaId
/direct-access-v2/:codes /direct-access/:codes /director /events /events/:eventId/stats
/events/:id /flow /guides /guides/:key /help /help/:key /invite/:token /login
/mcp-access /mcp/ad-multiplier /mcp/blockout /mcp/director /mcp/music-video /music-video
/oauth/authorize /org-admin /org-admin/quote /organisations/:id /reset-password
/reset-password/:token /signup /simple_video_gallery /stats /studio /studio/m/:mediaId
/templates /themes/:id /tools /tools/:id /tools/build /tools/enhance /tools/filter
/tools/instagram_splitter /tools/public /tools/remove-background /tools/theme-builder
/tools/upscale /tools/vectorize /tools/video-upscale /users/password/edit
/voice-consent/:token /voice-consent/revoke/:token /voices /whats-new /workspace
/mcp/* 那几条很有意思:ad-multiplier、blockout、director、music-video —— 说明 MCP 侧暴露的是具体创作工作流,不是通用接口。
Rendering mermaid diagram...
index.ts ← Hono 后端:报告页 + 6 个数据接口
harvest.ts ← 抓取脚本(可重跑,会覆盖)
frontend/
root.tsx ← HTML 壳
index.tsx ← React 入口
components/
App.tsx ← 报告 UI(概览 / 接口地图 / 前端路由 / 公开内容 / 泄露配置 / 归档文件)
blob 存储(本 val 私有):
manifest.json ← 归档清单:文件、接口数、路由数、泄露项、host 统计
api-map.json ← 207 条接口:路径 + 方法 + 出处分包
routes.json ← 69 条前端路由
hosts.json ← 单包里出现的所有第三方 host
config.json ← 硬编码配置 + 后端 base 判定逻辑原文
public-data.json ← 公开接口探测结果
public-content.json ← 53 篇帮助文档 + 指南 + OAuth 元数据全文
mirror/index.html ← 原站 HTML 壳
mirror/assets/* ← 单包 JS + CSS
直接 Run harvest.ts。它会重新拉一遍原站、覆盖归档和接口地图。原站前端文件名带哈希(当前 index-DPXPu-4s.js),发版后哈希会变,重跑就能跟上。
除上面 6 个公开接口外,其余 200 条全部返回 401。也就是说:品牌数据、生成记录、活动数据、积分流水、用户与组织、定价方案 —— 这些都在登录墙后面,没有账号拿不到。
想继续往下扒,两条路:
- 给我一个已登录的 token。 在浏览器登录后打开 DevTools → Application → Local Storage →
auth-storage,把user.token的值发我。有它我就能把/ui_api/brands、/ui_api/predictions、/ui_api/admin/*这些全量拉下来归档。 - 自己跑。
harvest.ts里get()加一个Authorization头,把probePaths换成想拉的路径,重跑即可。
⚠️ token 等同于账号密码,只在你自己信任的环境里用;我不会把它写进代码或存进 val。
这份归档是公开可访问的前端静态资源(任何人打开浏览器都能拿到)、接口路径清单和无需登录即可访问的公开文档,不含任何用户数据、私有内容或密钥。
但要注意:
- 整站复制他人前端代码用于公开发布,涉及对方著作权。
- 接口地图用于对自己账号下的数据做备份没问题;用来批量抓取他人数据则可能违反对方服务条款(见 https://dsrupt.ai/terms-of-service)。
- 泄露的 key 虽设计为公开,但不要拿去刷别人的配额。
自己评估用途。