图书ISBN查询实战:ISBN 格式识别与 978/10 位校验指南
图书ISBN查询ISBN校验ISBN-10ISBN-13 # 图书ISBN查询实战:ISBN 格式识别与 978/10 位校验指南
> 接口/接入点:图书ISBN查询(1626-1) · 是否免费:免费 · 请求方式:POST / GET · 返回格式:JSON · 适用人群:开发者、数据录入人员 · 阅读时间:约 6 分钟
## TL;DR
- 接口支持 **978 开头**的 ISBN-13 及**部分 10 位** ISBN;以 `isbn` 参数传入即可。
- ISBN-10 与 ISBN-13 是两种编号体系,后者以 978/979 前缀;查不到时先做格式与校验位自检。
- 调用前用正则 + 校验位算法过滤明显错误的号,减少无效调用。
## Why
用户手输或扫码得到的 ISBN 常常带空格、连字符,或是旧版 10 位号。直接扔给接口,可能浪费免费额度还返回"查不到"。先识别格式、算校验位、做归一化,能显著提升命中率与调用效率。
## What
| 概念 | 说明 |
|------|------|
| ISBN-13 | 13 位,通常以 `978` 或 `979` 开头(本接口重点支持 978 开头) |
| ISBN-10 | 10 位旧标准,部分仍可被本接口识别 |
| 连字符 | 书写时常带 `-`(如 `978-7-208-06164-4`),传参建议去掉 |
| 校验位 | 末位用于检错,可本地计算验证号是否合法 |
## How
### 步骤 1:归一化与格式识别
```python
import re
def normalize_isbn(raw: str) -> str:
s = re.sub(r"[\s-]", "", raw) # 去空格与连字符
if re.fullmatch(r"\d{13}", s):
return s # 13 位
if re.fullmatch(r"\d{9}[\dXx]", s):
return s # 10 位(末位可能是 X)
return s # 其余原样返回,交由接口判断
```
### 步骤 2:本地校验位校验(快速筛错)
```python
def isbn13_valid(s: str) -> bool:
if not re.fullmatch(r"\d{13}", s):
return False
total = sum((1 if i % 2 == 0 else 3) * int(c) for i, c in enumerate(s))
return total % 10 == 0
def isbn10_valid(s: str) -> bool:
if not re.fullmatch(r"\d{9}[\dXx]", s):
return False
total = sum((10 - i) * (int(c) if c != "X" and c != "x" else 10)
for i, c in enumerate(s))
return total % 11 == 0
```
### 步骤 3:校验通过再调用
```python
isbn = normalize_isbn("978-7-208-06164-4")
if isbn13_valid(isbn) or isbn10_valid(isbn):
# 调用图书ISBN查询(见快速接入篇)
...
else:
print("ISBN 格式/校验位不正确,请核对")
```
## 返回示例与解析
传参格式正确且书已收录时,`data` 正常返回;若返回 `ret_code` 非 0,多为该书未收录或号已停用(见错误码排查篇)。
## 进阶 / 边界
- **去连字符**:接口示例参数为纯数字 `9787208061644`,传参前建议统一去 `-` 与空格。
- **部分 10 位可用**:文档明确"支持 978 开头及部分 10 位 ISBN",个别 10 位号可能不被收录,属正常。
- **979 前缀**:当前接口重点支持 978 开头;979 号是否被识别以实际返回为准。
- **校验位通过仍查不到**:说明书未入库或 ISBN 已废弃,按错误处理流程兜底。
## FAQ
**Q1:必须转成 978 开头的 13 位才能查吗?**
不必。接口支持 978 开头及部分 10 位;但统一归一化、做校验位自检能减少无效调用。
**Q2:带连字符的 ISBN 能直接传吗?**
可以传,但建议先去连字符和空格,与官方示例(`9787208061644`)保持一致更稳妥。
**Q3:本地校验位通过了,接口却查不到?**
本地校验只证明"号码格式合法",不代表书已收录。查不到按"未找到"处理。
**Q4:ISBN-10 末位是 X 怎么处理?**
校验位算法中 X 视为 10;传参保留 X(大写或小写均可,建议大写)。
## 相关能力 / 下一步阅读
- [图书ISBN查询:5 分钟接入,从注册到第一条图书信息](https://www.showapi.com/guides/isbn-book-quickstart-1626)
- [图书ISBN查询错误码排查:ret_code 非 0 与"查不到"怎么办](https://www.showapi.com/guides/isbn-book-error-handling-1626)
- [图书管理系统如何集成图书ISBN查询:从扫码录入到藏书档案](https://www.showapi.com/guides/isbn-book-library-system-1626)
- **本系列共 12 篇**:查看[图书ISBN查询(apiCode=1626)官方指南总目录](https://www.showapi.com/guides/isbn-book-guides-1626)