从微信读书 API 抓取高清书籍封面:失效后改用 Open Library

·Ronin.XI··

原文章通过微信读书未公开搜索接口取得封面,再修改图片 URL 参数获得大图。这个接口没有面向第三方开发者的稳定契约,字段、频率限制和图片授权都无法从公开文档确认,因此不应继续作为批量抓取方案。

如果目标是按 ISBN 获取书籍封面,可以改用有公开文档的 Open Library Covers API。它支持按 ISBN 请求不同尺寸,并能在缺图时返回明确的 404。原 URL 保留,是为了让已经从“微信读书 API 抓取封面”搜索进入的读者能看到安全替代方案。

用 ISBN 生成封面地址

Open Library 支持 S、M、L 三种尺寸。把 ISBN 中的连字符删除后组成地址:

https://covers.openlibrary.org/b/isbn/9780140328721-L.jpg?default=false

加入 default=false 后,找不到封面时会返回 404,而不是返回一张难以区分的默认占位图。

Node.js 下载示例

以下命令和脚本在自己的项目目录中运行,不需要额外安装请求库:

import { writeFile } from "node:fs/promises";

async function downloadCover(isbn) {
  const clean = isbn.replaceAll("-", "");
  const url = `https://covers.openlibrary.org/b/isbn/${clean}-L.jpg?default=false`;
  const response = await fetch(url);

  if (response.status === 404) return false;
  if (!response.ok) throw new Error(`HTTP ${response.status}`);

  const bytes = Buffer.from(await response.arrayBuffer());
  await writeFile(`${clean}.jpg`, bytes);
  return true;
}

await downloadCover("978-0-14-032872-1");

预期结果是当前目录出现以 ISBN 命名的 JPG。返回 false 表示 Open Library 没有对应封面;HTTP 错误则应记录状态并有限重试,不要持续高频请求。

Python 下载示例

from pathlib import Path
from urllib.error import HTTPError
from urllib.request import urlopen

isbn = "9780140328721"
url = f"https://covers.openlibrary.org/b/isbn/{isbn}-L.jpg?default=false"

try:
    Path(f"{isbn}.jpg").write_bytes(urlopen(url, timeout=15).read())
except HTTPError as error:
    if error.code != 404:
        raise

脚本没有找到封面时会跳过 404;网络故障和其他 HTTP 状态仍会抛出,便于调用方决定是否稍后重试。

批量获取前的边界

  • 先去除 ISBN 中的连字符,并校验 ISBN-10 或 ISBN-13;
  • 以 ISBN 而不是书名选择版本,避免同名书和不同版次混淆;
  • 设置超时、低并发、缓存和有限重试,不要扫描未知 ISBN 段;
  • 保留缺图状态,不要自动把其他版本封面冒充成目标版本;
  • 记录图片来源和获取日期,方便以后替换或移除;
  • 封面本身仍可能受版权保护,公开展示、再分发和商业使用前要确认授权。

如果必须获得完整元数据、稳定 SLA 或明确商业授权,应选择符合用途的图书数据服务,而不是继续猜测微信读书或其他 App 的内部接口。

下载后的封面和书目数据也需要纳入备份;目录与恢复方法可继续看大学生学习资料备份指南。