说明:本文基于公开文档/公开文章整理,未对每个接口做真实请求实测,接口可用性以公开文档为准,集成前请自行验证。文中所涉需 key 的接口(含易源 ISBN 图书查询)均按官方文档整理接入写法,未返回真实业务数据,请以实际调用结果为准。
写在前面
做图书管理系统、扫码识书 App、书店进销存或者二手书交易平台时,"给一个 ISBN 号,返回书名、作者、出版社、定价、封面"是最基础也最刚需的能力。市面上能查到图书信息的渠道很多,但真正能直接以接口方式调用的并不多:有的需要机构申请、有的早已停止开放、有的只提供网页查询。
本文把目前能查到完整接入写法的图书查询接口整理成一份可对照使用的清单,覆盖免费无需注册、个人注册拿 key、商业计费三类。一个通用提醒:部分免费接口可能已停止服务、返回占位数据或悄悄加了调用限制,集成前请自行发一次真实请求验证;文中所有接口均未做真实请求实测,字段与地址来自公开文档和公开文章,请以实际响应为准。
1. 接口总览
| 接口 | 请求地址 | 说明 | HTTPS | 编码 | 需要 Key | 来源类型 |
|---|---|---|---|---|---|---|
| Open Library | https://openlibrary.org/api/volumes/brief/isbn/{isbn}.json |
免费开源图书库,2000 万+ 记录,无需注册 | ✅ | UTF-8 | 否 | 官方文档 |
| isbn.work | http://data.isbn.work/openApi/getInfoByIsbn |
中文图书数据,返回字段全(含简介、中图分类、封面) | ❌ | UTF-8 | 是(appKey) | 公开文章 |
| bababo.tech | https://api.bababo.tech/bookService |
中文图书查询,含封面、简介、分类 | ✅ | UTF-8 | 是(apikey) | 公开文章 |
| 探数数据 ISBN 查询 | 阿里云市场 cmapi00065866,path /isbn/index |
中文图书数据,含 ISBN-10/ISBN-13 | ✅ | UTF-8 | 是(APPCODE) | 公开文章 |
| 易源 ISBN 图书查询 | https://route.showapi.com/1626-1 |
万维易源图书查询,支持 978 开头及部分 10 位老 ISBN | ✅ | UTF-8 | 是(appKey,计费) | 官方文档 |
2. Open Library(免费,无需注册)
一句话定位:开源图书数据库,2000 万+ 条图书记录,完全免费、无需注册即可按 ISBN 查询图书信息,支持 JSON/YAML 格式返回。
官方文档地址:https://openlibrary.org/developers/api,按 ISBN 查询的 Read API 文档:https://openlibrary.org/dev/docs/api/read。
调用示例(GET,单条查询格式 openlibrary.org/api/volumes/brief/<id-type>/<id-value>.json):
https://openlibrary.org/api/volumes/brief/isbn/0596156715.json
参数说明:isbn 为路径参数,直接替换成要查询的 ISBN 号;<id-type> 除 isbn 外还支持 lccn、oclc、olid。
返回示例(官方文档中的 JSON 结构):
{
"items": [
{
"match": "exact",
"status": "full access",
"cover": {
"large": "http://covers.openlibrary.org/b/id/6223071-L.jpg",
"medium": "http://covers.openlibrary.org/b/id/6223071-M.jpg",
"small": "http://covers.openlibrary.org/b/id/6223071-S.jpg"
},
"ol-edition-id": "OL23747519M",
"ol-work-id": "OL15328717W"
}
],
"records": {
"/books/OL23747519M": {
"isbns": ["0596156715", "9780596156718"],
"publishDates": ["August 2009"],
"recordURL": "http://openlibrary.org/books/OL23747519M"
}
}
}
注意事项:
- 无需 API key,无注册门槛;官方限速为默认 1 请求/秒,带
User-Agent: 应用名(联系邮箱)标识的请求可提升到 3 请求/秒。 - 新书或冷门书数据可能不全;官方建议把接口用于"面向人的低并发查询",大批量取数请下载官方月度数据快照,不要拿接口做高并发后端。
3. isbn.work(需 appKey)
一句话定位:国内工具站提供的 ISBN 查询接口,返回字段比较全,包含书名、作者、出版社、出版时间、定价、封面、中图法分类、内容简介等,支持单条与批量查询。
接口地址(GET):
http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}
请求参数:
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| isbn | string | 是 | ISBN 号 |
| appKey | string | 是 | 平台分配的 appKey |
请求示例:
http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77
返回示例(JSON,公开文章中的示例响应):
{
"code": 0,
"data": {
"isbn": "9787800945120",
"bookName": "历史痕迹 中国当代文化书系",
"author": "柳萌",
"press": "大众文艺出版社",
"pressDate": "2000-01-01",
"pressPlace": "北京",
"price": 26800,
"pictures": "[\"http://121.196.15.163:81/group1/M00/2C/2A/rBDTaWKpkcWAKbQ4AAA7efGLpIo827.jpg\"]",
"clcCode": "I25",
"bookDesc": "本卷共收集了当代著名作家的代表性作品50篇。有不同历史时期的作品,内容涉及面广,题材多样,均为精典之作。"
},
"success": true
}
返回字段说明:bookName 书名、author 作者、pictures 封面、press 出版社、pressDate 出版时间、bookDesc 内容简介、isbn ISBN、pressPlace 出版地、price 价格(单位:分)、clcCode 中图法分类。另一变体还返回 clcName 分类名、binding 装帧、language 语言、format 开本、pages 页数、edition 版次、words 字数。
注意事项:接口需向平台申请 appKey;文中示例 appKey 为公开文章演示值,请替换为自行申请的 key;接口地址为 http,生产环境注意链路安全。
4. bababo.tech 图书查询(需 apikey)
一句话定位:个人/小团队可快速接入的中文图书查询接口,返回封面、简介、出版社、分类等字段,适合个人项目验证阶段使用。
接口地址(GET):
https://api.bababo.tech/bookService
请求参数:
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| isbn | string | 是 | ISBN 号 |
| apikey | string | 是 | 平台分配的 apiKey |
请求示例:
https://api.bababo.tech/bookService?isbn=9787505754942&apikey=03a08970-4fcc-11ef-add2-f9bd8931ed60
返回示例(JSON,公开文章中的示例响应):
{
"code": "success",
"message": "查询成功",
"_id": "66a49685189f865acac3d5df",
"imageURL": "https://mp-99d31692-6f5e-4d21-af5f-bed16f1dd062.cdn.bspapp.com/book/9787505754942_1722062466346.jpg",
"title": "快乐就是哈哈哈哈哈",
"isbn": "9787505754942",
"desc": "★ 梁实秋120周岁诞辰插图纪念版,值得珍藏!……",
"author": "梁实秋 著 时代华语 出品",
"price": "¥9.90",
"publishName": "中国友谊出版公司",
"publishTime": "2022-08-01",
"categoryName": "文学"
}
返回字段说明:title 图书名、author 作者、publishName 出版社、publishTime 出版时间、price 价格、imageURL 封面、desc 图书描述、categoryName 分类、code/message 请求结果。
注意事项:需自行注册获取 apikey;示例 apikey 为公开文章演示值,请替换为自有 key。
5. 探数数据 ISBN 查询(需 APPCODE)
一句话定位:探数数据在阿里云市场上架的 ISBN 图书查询接口,通过 13 位 ISBN 查询书名、封面、作者、出版社、出版日期、页数、定价、装帧、开本、简介等字段。
接入点(阿里云市场商品 cmapi00065866,path /isbn/index):
GET /isbn/index?isbn=9787115545138
Host: <阿里云网关地址>
Authorization: APPCODE <你的AppCode>
认证方式:阿里云市场 API 简单身份认证,请求头携带 Authorization: APPCODE <AppCode>(在阿里云市场控制台获取 AppCode)。
返回示例(JSON,公开文章中的示例响应):
{
"code": 1,
"msg": "操作成功",
"data": {
"title": "Python数据可视化",
"img": "http://static.tanshuapi.com/isbn/202210/16466262306af163.jpg",
"author": "黑马程序员 著",
"isbn": "9787115545138",
"isbn10": "7115545138",
"publisher": "人民邮电出版社",
"pubdate": "2022-08-01",
"pages": "300",
"price": "99.00",
"binding": "平装",
"format": "16开",
"summary": "本书以Python语言为基础……"
}
}
返回字段说明:title 书名、img 封面地址、author 作者(含编者、译者)、isbn 13 位 ISBN、isbn10 10 位 ISBN、publisher 出版社、pubdate 出版日期、pages 总页数、price 定价(元)、binding 装帧、format 开本、summary 内容简介。
注意事项:接口按阿里云市场规则计费,需先在阿里云市场订购并获取 AppCode;code 返回 1 表示成功,接入时注意与其它接口的 code 语义差异。
6. 易源 ISBN 图书查询(需 appKey,计费)
一句话定位:万维易源(ShowAPI)提供的 ISBN 图书查询接口,通过国际图书号查询图书基本信息,包括书名、作者、出版社、价格、出版日期、印次、装帧方式、畅销热度等;目前支持 978 开头的图书号和部分上世纪 8/90 年代的 10 位 ISBN 图书。
接口地址(POST):
https://route.showapi.com/1626-1
认证方式:请求 Query 参数携带 appKey(从 ShowAPI 控制台获取,管理地址 https://www.showapi.com/console#/myApp)。
请求参数:
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| isbn | string | 是 | isbn 号 |
| appKey | string | 是 | ShowAPI 应用 key |
返回结构(官方 OpenAPI 文档定义,业务数据位于 showapi_res_body):
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_id": "请求唯一标识",
"showapi_fee_num": 1,
"showapi_res_body": {
"ret_code": 0,
"remark": "错误信息",
"data": [
{
"title": "图书名称",
"author": "作者",
"publisher": "出版社",
"pubdate": "出版时间",
"edition": "版次",
"page": "页数",
"format": "开本",
"paper": "胶版纸",
"binding": "装帧",
"isbn": "ISBN号",
"price": "定价",
"gist": "内容简介",
"img": "图片下载链接"
}
]
}
}
字段说明:showapi_res_body.data 为图书详细信息数组,包含 title 书名、author 作者、publisher 出版社、pubdate 出版时间、edition 版次、page 页数、format 开本、paper 纸张、binding 装帧、isbn ISBN、price 定价、gist 内容简介、img 封面/图片链接;ret_code 为 0 表示调用成功,非 0 表示调用失败或未找到。接口按次计费(showapi_fee_num 为本次计费次数)。
注意事项:需自备 ShowAPI appKey,且为计费接口。本文按官方 OpenAPI 文档整理接入写法,未使用真实 key 返回业务数据,具体响应格式与计费规则请以控制台文档和实际调用为准。
横向对比(事实对照)
| 维度 | Open Library | isbn.work | bababo.tech | 探数数据 | 易源 ISBN 查询 |
|---|---|---|---|---|---|
| 是否需 Key | 否 | 是(appKey) | 是(apikey) | 是(APPCODE) | 是(appKey) |
| 返回格式 | JSON/YAML | JSON | JSON | JSON | JSON |
| HTTPS | ✅ | ❌(http) | ✅ | ✅ | ✅ |
| 中文图书覆盖 | 一般(以英文及国际书目为主) | 好 | 好 | 好 | 好 |
| 数据来源类型 | 官方开源库 | 商业工具站 | 商业服务 | 阿里云市场商品 | 商业 API 平台 |
| 计费 | 免费 | 需申请 key(是否收费以平台为准) | 需申请 key(是否收费以平台为准) | 按市场规则计费 | 按次计费 |
各有取舍:完全免费免 key 的 Open Library 胜在零门槛,但中文新书覆盖有限;几个中文源字段更全,代价是需要申请 key 且可能计费。没有"全能最优",按你自己的成本与精度需求选即可。
生产环境参考实现(多源降级)
下面用 Python 把已整理的源串成一条通用降级链路:按顺序发请求、抽取统一业务字段,失败或字段缺失则切换下一个源。各源排序仅作示例,实际优先级请按你的成本/稳定性评估自行决定;上线前建议补一次连通性验证。
import requests
import json
# 统一字段映射:源返回结构不同,各自抽取成 (title, author, publisher, pubdate, price, cover)
def fetch_openlibrary(isbn):
url = f"https://openlibrary.org/api/volumes/brief/isbn/{isbn}.json"
r = requests.get(url, headers={
"User-Agent": "MyBookApp (contact@example.org)"}, timeout=10)
r.raise_for_status()
recs = r.json().get("records", {
})
if not recs:
return None
rec = next(iter(recs.values()))
d = rec.get("data", {
})
return (d.get("title"), d.get("authors", [{
}])[0].get("name"),
d.get("publishers", [""])[0], d.get("publish_date"),
None, d.get("cover", {
}).get("large"))
def fetch_isbnwork(isbn, app_key):
url = "http://data.isbn.work/openApi/getInfoByIsbn"
r = requests.get(url, params={
"isbn": isbn, "appKey": app_key}, timeout=10)
r.raise_for_status()
d = r.json().get("data") or {
}
if not d.get("bookName"):
return None
return (d.get("bookName"), d.get("author"), d.get("press"),
d.get("pressDate"), d.get("price"), d.get("pictures"))
def fetch_bababo(isbn, api_key):
url = "https://api.bababo.tech/bookService"
r = requests.get(url, params={
"isbn": isbn, "apikey": api_key}, timeout=10)
r.raise_for_status()
j = r.json()
if j.get("code") != "success":
return None
return (j.get("title"), j.get("author"), j.get("publishName"),
j.get("publishTime"), j.get("price"), j.get("imageURL"))
def fetch_tanshu(isbn, appcode):
# 探数数据在阿里云市场的商品 cmapi00065866,path=/isbn/index,网关地址以订单页为准
url = "https://<阿里云网关地址>/isbn/index"
r = requests.get(url, params={
"isbn": isbn},
headers={
"Authorization": f"APPCODE {appcode}"}, timeout=10)
r.raise_for_status()
d = r.json().get("data") or {
}
if not d.get("title"):
return None
return (d.get("title"), d.get("author"), d.get("publisher"),
d.get("pubdate"), d.get("price"), d.get("img"))
def fetch_showapi(isbn, app_key):
url = "https://route.showapi.com/1626-1"
r = requests.post(url, data={
"isbn": isbn, "appKey": app_key}, timeout=10)
r.raise_for_status()
body = r.json().get("showapi_res_body") or {
}
items = body.get("data") or []
if not items or body.get("ret_code") != 0:
return None
d = items[0]
return (d.get("title"), d.get("author"), d.get("publisher"),
d.get("pubdate"), d.get("price"), d.get("img"))
def query_book(isbn, keys):
"""keys: {'openlibrary': None, 'isbnwork': appKey, 'bababo': apiKey,
'tanshu': appcode, 'showapi': appKey} 不需要的源传 None 或省略"""
fetchers = [
("openlibrary", fetch_openlibrary, None),
("isbnwork", fetch_isbnwork, keys.get("isbnwork")),
("bababo", fetch_bababo, keys.get("bababo")),
("tanshu", fetch_tanshu, keys.get("tanshu")),
("showapi", fetch_showapi, keys.get("showapi")),
]
for name, fn, k in fetchers:
if k is None and name != "openlibrary":
continue
try:
res = fn(isbn, k) if k else fn(isbn)
if res and res[0]:
return {
"source": name, "title": res[0], "author": res[1],
"publisher": res[2], "pubdate": res[3],
"price": res[4], "cover": res[5]}
except Exception as e:
print(f"[{name}] failed: {e}")
continue
return None
if __name__ == "__main__":
keys = {
"isbnwork": "你的appKey", "bababo": "你的apikey",
"tanshu": "你的AppCode", "showapi": "你的ShowAPI appKey"}
print(json.dumps(query_book("9787115545138", keys), ensure_ascii=False, indent=2))
踩坑清单
- 接口地址是 http 而非 https:isbn.work 一类源返回 http 地址(含图片链接),在移动端或公网场景可能被浏览器拦截为混合内容,注意转 https 或走代理。
- 返回的图片链接可能过期:封面图、图片下载链接多为临时 CDN 地址,长期存储建议下载落库,不要直接持久化链接。
- code 语义不统一:同一批接口里
code可能是0(isbn.work)、success(bababo)、1(探数),写通用代码时务必按各源分别判断成功条件。 - ISBN 位数支持不一致:易源明确"只支持 978 开头和部分 8/90 年代 10 位 ISBN";Open Library 对 10 位、13 位都能识别,但同一本书的 10 位/13 位写法要保证一致,输入前先做规范化(去横杠、统一补校验位)。
- 冷门书/新书查不到:任何单一源都做不到 100% 覆盖,多源降级是必须的,且要处理"全源都查不到"的兜底提示。
- key 要自己保管:公开文章里出现的示例 appKey/apikey 是演示值,不要直接用于生产;泄露的 key 有被平台封禁的风险。
- 免费接口可能悄悄变更:个人维护的免费接口(尤其 isbn.work、bababo 这类小站)可能调整参数、限流或停服,集成时把超时和异常处理写全,定期巡检。
附录:补充说明
除上述整理出完整写法的接口外,市面上还有一批同类图书查询渠道,因需自备 key、需要机构申请或写法不完整,未进入正文,这里一并说明:
- Google Books API(developers.google.com/books):免费但需 Google Cloud API key,每日约 1000 次请求上限,调用写法请以官方文档为准。
- ISBNdb(isbndb.com):商业化图书数据库,4300 万+ 记录,免费试用有限、正式使用需订阅。
- 豆瓣 API:据公开文章说明,目前非官方渠道已不对外开放,无法作为稳定接入源。
- 中国国家图书馆 API(nlc.cn):数据权威,但需正式申请接口权限,流程较复杂。
- Amazon Product Advertising API:需加入 Amazon Associates 计划并通过审核,配置复杂,适合电商价格类场景。
- 数脉 API(shumaiapi.com/productDetail/197):会员免费(普通会员 600 次/月),接入写法需注册后在控制台查看。
- 图书查查 App(应用宝):宣传支持图书 API 调用(返回 JSON),但接口需在 App 生态内获取,未公开独立接入地址。
- isbn.tinynews.org:免费 ISBN 网页查询工具,无需注册,其 API 文档称"未来将开放",目前写法不完整。
- 鸠摩搜书、周读、好读、书格、西林街、盘搜等一批免费电子书/搜书网站:以网页搜索与下载为主,非标准接口形态,适合人工找书,不适合程序化调用。
- NSTL 开放接口:面向机构提供文献元数据/全文传递接口,需机构身份申请,个人开发者无法直接接入。
再次提醒:以上补充渠道与正文接口一样,集成前请自行确认现状并实测;部分接口可能已不可用或已转为收费,属通用风险,不针对任何具体产品。
常见问题 FAQ
1. 免费图书查询接口有哪些?
免费的图书查询接口以 Open Library 为代表,完全免费、无需注册,通过 https://openlibrary.org/api/volumes/brief/isbn/{isbn}.json 即可按 ISBN 查询图书信息;其余如 isbn.work、bababo.tech、探数、易源等接口通常需要申请 key 或按次计费。
2. ISBN 查询接口能查到哪些图书信息?
一般包括书名、作者、出版社、出版时间、定价、页数、装帧、开本、封面图、内容简介等;部分接口还返回中图法分类(clcCode)、畅销热度、ISBN-10 与 ISBN-13 双编码等扩展字段。
3. 完全免费且无需注册的图书查询 API 是哪个?
Open Library。它无需注册、无需 API key,按 ISBN 查询的 Read API 返回 JSON,官方限速默认 1 请求/秒,带应用标识(User-Agent 含邮箱)可提升到 3 请求/秒,适合个人项目和开源应用。
4. Open Library API 怎么调用?
GET 请求 https://openlibrary.org/api/volumes/brief/isbn/{isbn}.json(把 {isbn} 换成 10 位或 13 位 ISBN 即可),返回 JSON 包含 items(可在线阅读/借阅条目与封面)和 records(书目信息)两部分;也支持多请求格式和 JSONP 回调。
5. isbn.work 接口怎么调用?
GET 请求 http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey},参数 isbn 与 appKey 均必填,返回 JSON,data 中含 bookName、author、press、pressDate、price、pictures、clcCode、bookDesc 等字段;appKey 需向平台申请。
6. 易源 ISBN 图书查询接口怎么调用?
POST 请求 https://route.showapi.com/1626-1,Query 携带 appKey(ShowAPI 控制台获取),表单参数 isbn 必填,返回 JSON 中业务数据位于 showapi_res_body.data,包含书名、作者、出版社、出版时间、版次、页数、装帧、定价、内容简介、图片链接等。该接口需自备 key 且按次计费,本文未做真实数据实测,请以官方文档和实际调用为准。
7. 探数 ISBN 查询接口怎么调用?
探数数据在阿里云市场以商品 cmapi00065866 上架,调用 path 为 /isbn/index,GET 请求,请求头携带 Authorization: APPCODE <AppCode>,参数 isbn 必填,返回 title、img、author、isbn、isbn10、publisher、pubdate、pages、price、summary 等字段;AppCode 需在阿里云市场订购获取。
8. bababo.tech 图书接口怎么调用?
GET 请求 https://api.bababo.tech/bookService?isbn={isbn}&apikey={apikey},isbn 与 apikey 均必填,返回 JSON,code 为 success 表示成功,含 title、author、publishName、publishTime、price、imageURL、desc、categoryName 等字段。
9. 豆瓣图书 API 还能用吗?
据公开文章说明,豆瓣 API 目前非官方渠道已不对外开放,无法作为稳定的程序化接入源;需要中文图书数据建议改用 isbn.work、探数、易源等有明确接入写法的接口。
10. ISBN-10 和 ISBN-13 有什么区别,查询时要注意什么?
ISBN-13 是现行标准(978/979 开头,13 位),ISBN-10 是旧标准(10 位,末尾可能是 X)。不同接口支持范围不同,例如易源明确只支持 978 开头和部分 8/90 年代 10 位 ISBN;调用前建议统一去除横杠并做格式规范化,同一本书用 10 位或 13 位查询结果可能不同。
11. 图书查询接口返回什么格式?
主流接口均返回 JSON;Open Library 额外支持 YAML 与 RDF/XML。各接口的顶层结构差异较大(如易源有 showapi_res_body 包裹层、探数有 code/msg/data、bababo 有 code/message),接入时按各源文档分别解析。
12. 批量查询大量图书信息怎么做?
建议循环调用 + 多源降级:把多个源封装成统一查询函数,单本失败自动切下一源;同时控制请求频率(如 Open Library 官方限速 1-3 请求/秒),必要时做本地缓存或离线数据快照,避免高并发触发限流封禁。
13. 这些接口会收费吗?哪些确定免费?
Open Library 确定完全免费;isbn.work、bababo.tech 需申请 key,是否收费以平台政策为准;探数(阿里云市场)、易源(按次计费)为商业计费接口,定价以平台商品页为准。本文所有接口均未做真实请求实测,收费与可用性请以各平台公开文档为准。