图片格式与反爬虫
WebP 格式选型与 /web-res/ 混淆图片机制
图片格式
所有漫画图片统一使用 WebP 格式存储和分发:
- 体积比 JPEG 小 25-35%,节省存储和带宽成本
- 支持有损和无损压缩
- Android 和所有现代浏览器原生支持
- 上传工具在上架时自动转换为 WebP
文件命名为零填充三位数页码:001.webp、002.webp、012.webp。
反爬虫:混淆图片
/web-res/ 路径下的图片经过网格切片重排处理,是反爬虫的关键机制。
混淆原理
原始图片 混淆后图片
┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐
│ 1 │ 2 │ 3 │ 4 │ │ 9 │ 3 │16 │ 7 │
├───┼───┼───┼───┤ ├───┼───┼───┼───┤
│ 5 │ 6 │ 7 │ 8 │ ───→ │ 2 │14 │ 5 │11 │
├───┼───┼───┼───┤ ├───┼───┼───┼───┤
│ 9 │10 │11 │12 │ │12 │ 6 │ 1 │15 │
├───┼───┼───┼───┤ ├───┼───┼───┼───┤
│13 │14 │15 │16 │ │ 4 │10 │13 │ 8 │
└───┴───┴───┴───┘ └───┴───┴───┴───┘图片被按 4×4 网格切分为 16 块,然后根据混淆种子(seed)确定性地重排。
还原方式
Edge Function 在签名验证失败时返回 scrambleInfo:
{
"seed": "a1b2c3d4e5f6g7h8",
"gridX": 4,
"gridY": 4
}Web 前端使用 Canvas API 根据 seed 计算每个切片的原始位置,将 16 块重新拼回原图。爬虫因为没有 seed 和还原逻辑,只能得到乱序图片。
同一章节的 seed 是稳定的(基于 chapter_folder + 密钥的哈希),前端可以缓存还原映射表。不同章节的 seed 不同。
混淆资源的生成
混淆版本的图片由上传工具在上架时预生成,与原始图片一起存储在源站上:
{bucket}/
├── res/ ← 原始图片
│ └── one-piece/ch01/001.webp
└── web-res/ ← 混淆图片(预生成)
└── one-piece/ch01/001.webpGoEdge 按路径前缀路由到对应目录,不做任何运行时图片处理。