在数字阅读时代,Amazon Kindle Web 版本引入了复杂的文本混淆机制,以防止用户轻松提取和备份已购电子书。这种机制将文本转换为随机 glyph ID 和 SVG 路径渲染的图像形式,每批页面还会重新随机化映射,导致传统文本提取失效。针对这一问题,我们可以采用像素模式分析结合 JavaScript 注入的技术方案,来逆转混淆过程,重建可选择的纯文本内容,实现真正的离线阅读自由。
像素模式分析的核心在于将 obfuscated glyphs 转换为可识别的图像,然后通过图像相似度匹配还原原始字符。这种方法避免了直接解析 SVG 路径的复杂性,尤其适用于 Amazon 故意添加的微小扰动(如假字体提示)。首先,从 Kindle Web 的渲染 API(如 /renderer/render)下载 TAR 包,解压得到 glyphs.json 和 page_data_*.json 文件。glyphs.json 包含每个 glyph ID 对应的 SVG 路径,例如一个 glyph 的路径可能是 "M 450 1480 L 820 1480 ...",这些路径定义了字母的笔画。
为了分析像素模式,我们使用 CairoSVG 等库将每个 SVG 渲染为高分辨率 PNG 图像,推荐尺寸为 512x512 像素,以捕捉精细细节。渲染时需注意处理 Amazon 的反爬取技巧:SVG 中可能包含微小的 MoveTo 命令(如 m3,1),这些在浏览器中无害,但在服务器端渲染时可能产生伪连接线。为此,在渲染前对路径进行规范化处理,例如填充完整路径或忽略阈值小于 1 像素的移动命令。渲染完成后,生成每个 glyph 的感知哈希(perceptual hash),如使用 imagehash 库的 phash 函数。这允许跨批次比较相同形状的 glyph,即使 ID 不同。
接下来,进行字符匹配:下载 Bookerly 字体家族(normal、italic、bold、bolditalic)的 TTF 文件,这些是 Kindle 默认字体。从 Unicode 范围(A-Z, a-z, 0-9, 标点,连字如 ff, fi)渲染标准字符图像,使用 SSIM(Structural Similarity Index Measure)算法计算与 obfuscated glyph 的相似度。SSIM 分数范围 0-1,推荐阈值 0.95 以上视为匹配;低于 0.9 的 glyph 需手动检查或 fallback 到 OCR。证据显示,这种像素级匹配在实际书籍中可达 100% 成功率,因为 glyph 形状保持不变,仅 ID 随机化。处理连字时,需扩展匹配库,包括 ffi 等特殊组合。
JavaScript 注入是实现自动化提取的关键,尤其在浏览器环境中运行 Kindle Web 时。Amazon 的 Cloud Reader 使用 Canvas 或 SVG 动态渲染页面,文本作为图像显示,无法直接选中。为逆转此过程,我们注入自定义 JS 脚本,拦截网络请求或 hook 渲染函数。使用浏览器扩展(如 Tampermonkey)或开发者工具注入脚本,首先 spoof 用户代理为 Kindle 兼容浏览器(e.g., "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"),并维护 session cookies 和 rendering token。
注入脚本的核心逻辑:监听 fetch 或 XMLHttpRequest,捕获 /startReading API 的响应以获取 token,然后模拟分页请求下载 TAR 文件。解压后,在内存中解析 JSON,使用 Canvas API 渲染 glyphs 到 offscreen canvas,生成 ImageData 对象进行像素分析。JS 中实现简单 SSIM 可通过 getImageData() 提取像素数组,计算均值和方差后应用公式:SSIM(x,y) = (2μxμy + C1)(2σxy + C2) / ((μx² + μy² + C1)(σx² + σy² + C2)),其中 C1= (0.01255)^2, C2=(0.03*255)^2 为稳定常数。阈值设置为 0.92 以平衡准确性和速度。对于整个页面重建,脚本可创建虚拟页面 DOM,根据 page_data 中的 xPosition、fontSize(典型 19.8px)和 transform 放置文本 span,应用 CSS 样式恢复 bold/italic。
整合像素分析与 JS 注入后,我们能重建完整页面。观点是,这种混合方法优于纯 OCR,因为像素匹配提供精确字符,而 JS 确保实时提取。证据来自实际实现:对于 920 页书籍,处理 184 批次只需数分钟,匹配 361 个唯一 glyph 无一失败。相比单个 glyph OCR(准确率 ~51%),页面级重建后结合 Tesseract OCR 可进一步校正上下文错误,如上标数字或粘连词。
可落地参数与清单如下,确保工程化实现:
-
环境准备:
- Node.js 或 Python 后端:安装 cairosvg, pillow, scikit-image (for SSIM), tesseract-ocr。
- 浏览器端:Chrome 扩展,权限包括 storage, tabs, webRequest。
- 字体库:从 Google Fonts 下载 Bookerly TTF,扩展 Unicode 至 U+2000-U+2FFF 覆盖标点。
-
像素分析参数:
- 渲染分辨率:512x512,抗锯齿开启(scale=2)。
- 哈希类型:phash,哈希大小 8x8。
- SSIM 阈值:0.95 (strict), 0.90 (fallback to OCR)。
- 批次大小:5 页/请求,间隔 2s 避免 rate limit。
-
JS 注入清单:
- 脚本入口:@match https://read.amazon.com/*,立即执行。
- Token 获取:override fetch,POST /startReading,解析 JSON response.asin 和 token。
- Glyph 渲染:new OffscreenCanvas(512,512),ctx.drawSvg(svgPath),然后 toBlob() 生成图像。
- 匹配循环:for each glyph, compute SSIM vs font library,cache 结果至 localStorage。
- 页面重建:createElement('div'),set style.position='absolute', left/top from page_data,innerText=matchedChar。
- 导出:使用 html2canvas 截取重建页面,或直接 serialize DOM 为 HTML。
-
监控与回滚:
- 日志:记录 SSIM 平均分(目标 >0.95),失败 glyph 数(<1%)。
- 错误处理:如果匹配失败率 >5%,切换到页面级 OCR,使用 tesseract --oem 3 --psm 6(单块文本)。
- 性能:内存限制 <500MB/批次,超时 30s/页面。
- 回滚策略:若 Amazon 更新 obfuscation,fallback 到手动 OCR 整个截屏图像。
这种实现不仅恢复了 selectable text,还保留了格式如段落缩进和链接(通过 positionId)。对于离线阅读,导出为 EPUB:使用 ebooklib 库,将重建 HTML 章节打包,嵌入 Bookerly 字体。潜在风险包括 API 变更导致 token 失效,建议监控 Amazon 开发者文档;法律上,仅限个人使用已购内容,避免分发。总体而言,通过像素模式分析和 JS 注入,我们将 Kindle Web 从图像牢笼中解放,赋予用户真正的所有权。
(字数约 1250)