Read your Apple Books library, highlights, notes, and reading progress directly from the local SQLite databases on macOS.
在 macOS 上查询本地 Apple Books 资料库。对图书、高亮、笔记、收藏集和阅读进度具有只读访问权限。
数据库文件名在 macOS 安装中保持一致,但始终动态解析它们,以防 Apple 在将来版本中更改:
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
AEANNOTATION_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/*.sqlite 2>/dev/null | head -1)
如果任一变量为空,则表示此 Mac 上尚未设置 Apple Books。
重要提示: 这些是只读查询。切勿 INSERT、UPDATE 或 DELETE 行——这样做可能会损坏 Apple Books 数据或导致 iCloud 同步问题。
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT ZTITLE, ZAUTHOR, ZGENRE, ZPAGECOUNT, ZREADINGPROGRESS, ZISFINISHED, ZASSETID
FROM ZBKLIBRARYASSET
WHERE ZTITLE IS NOT NULL
ORDER BY ZLASTOPENDATE DESC;
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT ZTITLE, ZAUTHOR, ZGENRE, ZREADINGPROGRESS, ZASSETID
FROM ZBKLIBRARYASSET
WHERE ZTITLE IS NOT NULL AND (ZTITLE LIKE %SEARCHTERM% OR ZAUTHOR LIKE %SEARCHTERM%)
ORDER BY ZLASTOPENDATE DESC;
将 SEARCH_TERM 替换为用户查询的内容。
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT ZTITLE, ZAUTHOR, ZGENRE,
printf(%.0f%%, ZREADINGPROGRESS * 100) AS progress,
datetime(ZLASTOPENDATE + 978307200, unixepoch, localtime) AS last_opened
FROM ZBKLIBRARYASSET
WHERE ZTITLE IS NOT NULL
AND ZREADINGPROGRESS > 0.0
AND (ZISFINISHED IS NULL OR ZISFINISHED = 0)
ORDER BY ZLASTOPENDATE DESC;
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT ZTITLE, ZAUTHOR, ZGENRE,
datetime(ZDATEFINISHED + 978307200, unixepoch, localtime) AS finished_date
FROM ZBKLIBRARYASSET
WHERE ZISFINISHED = 1
ORDER BY ZDATEFINISHED DESC;
bash
AEANNOTATION_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/*.sqlite 2>/dev/null | head -1)
sqlite3 $AEANNOTATION_DB \
SELECT ZANNOTATIONSELECTEDTEXT, ZANNOTATIONNOTE, ZANNOTATIONSTYLE,
datetime(ZANNOTATIONCREATIONDATE + 978307200, unixepoch, localtime) AS created
FROM ZAEANNOTATION
WHERE ZANNOTATIONDELETED = 0
AND ZANNOTATIONASSETID = ASSET_ID
AND length(ZANNOTATIONSELECTEDTEXT) > 0
ORDER BY ZPLLOCATIONRANGESTART ASC;
将 ASSET_ID 替换为图书库查询中的图书 ZASSETID。
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
AEANNOTATION_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/AEAnnotation/*.sqlite 2>/dev/null | head -1)
sqlite3 $AEANNOTATION_DB \
ATTACH DATABASE $BKLIBRARY_DB AS lib;
SELECT lib.ZBKLIBRARYASSET.ZTITLE, lib.ZBKLIBRARYASSET.ZAUTHOR,
ZAEANNOTATION.ZANNOTATIONSELECTEDTEXT, ZAEANNOTATION.ZANNOTATIONNOTE,
datetime(ZAEANNOTATION.ZANNOTATIONCREATIONDATE + 978307200, unixepoch, localtime) AS created
FROM ZAEANNOTATION
JOIN lib.ZBKLIBRARYASSET ON ZAEANNOTATION.ZANNOTATIONASSETID = lib.ZBKLIBRARYASSET.ZASSETID
WHERE ZAEANNOTATION.ZANNOTATIONDELETED = 0
AND length(ZAEANNOTATION.ZANNOTATIONSELECTEDTEXT) > 0
ORDER BY ZAEANNOTATION.ZANNOTATIONCREATIONDATE DESC
LIMIT 50;
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT c.ZTITLE, c.ZCOLLECTIONID, COUNT(m.ZPK) AS bookcount
FROM ZBKCOLLECTION c
LEFT JOIN ZBKCOLLECTIONMEMBER m ON m.Z_PK IN (
SELECT Z_PK FROM ZBKCOLLECTIONMEMBER
)
WHERE c.ZDELETEDFLAG = 0 AND c.ZTITLE IS NOT NULL
GROUP BY c.ZCOLLECTIONID
ORDER BY c.ZTITLE;
bash
BKLIBRARY_DB=$(ls ~/Library/Containers/com.apple.iBooksX/Data/Documents/BKLibrary/*.sqlite 2>/dev/null | head -1)
sqlite3 $BKLIBRARY_DB \
SELECT
COUNT(*) AS total_books,
SUM(CASE WHEN ZISFINISHED = 1 THEN 1 ELSE 0 END) AS finished,
SUM(CASE WHEN ZREADINGPROGRESS > 0 AND (ZISFINISHED IS NULL OR ZISFINISHED = 0) THEN 1 ELSE 0 END) AS in_progress,
SUM(CASE WHEN ZREADINGPROGRESS = 0 OR ZREADINGPROGRESS IS NULL THEN 1 ELSE 0 END) AS not_started,
printf(%.0f%%, AVG(ZREADINGPROGRESS) * 100) AS avg_progress
FROM ZBKLIBRARYASSET
WHERE ZTITLE IS NOT NULL;
| 样式值 | 颜色 |
|---|---|
| 1 | 绿色 |
| 2 |
| 类型值 | 含义 |
|---|---|
| 2 | 高亮 |
| 3 |
##
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 apple-books-1776187921 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 apple-books-1776187921 技能
skillhub install apple-books-1776187921
文件大小: 2.87 KB | 发布时间: 2026-4-15 11:06