dbmask 是什么:API 里精确控制搜索范围的位掩码
如果你写脚本或调 API,SauceNAO 用三个参数控制搜索哪些数据库——db、dbmask、dbmaski。它们不是随便给的,是一套基于位掩码(bitmask)的精确控制机制。
数据库都有编号
每个数据库在 SauceNAO 内部都有一个固定的数字 ID:
| 编号 | 数据库 |
|---|---|
| 0 | H-Magazines |
| 1 | H-Game CG |
| 2 | DoujinshiDB |
| 3 | Pixiv Images |
| 4 | Nico Nico Seiga |
| 5 | Danbooru |
| 6 | drawr Images |
| 7 | Nijie Images |
| 8 | Yande.re |
| 9 | Shutterstock |
| 10 | FAKKU |
| ... | ...(完整列表见 SauceNAO API 文档) |
总共有约 46 个有编号的数据库(不同版本可能增减)。
三个参数的作用
db
最简单的参数——单个数据库编号。db=999 表示搜所有数据库(ALL 模式),db=3 表示只搜 Pixiv。
dbmask
位掩码方式——一个整数,每个 bit 代表一个数据库是否搜索。比如:
- bit 0 = 搜编号 0 的数据库
- bit 1 = 搜编号 1 的数据库
- bit 3 = 搜编号 3 的数据库
- ……
要搜 Pixiv(3)+ Danbooru(5),计算:
- 3 的二进制位 = bit 3 →
1 << 3= 8 - 5 的二进制位 = bit 5 →
1 << 5= 32 - 组合 = 8 + 32 = 40
- 所以
dbmask=40就是搜 Pixiv + Danbooru
dbmaski
和 dbmask 相反——排除模式。dbmaski=40 意思是「搜所有数据库,但排除 40 对应的那些」。
Python 里怎么算
# 定义数据库编号常量(部分)
DB_PIXIV = 3
DB_DANBOORU = 5
DB_TWITTER = 27 # 具体编号以 API 文档为准
# 构建 dbmask
dbmask = (1 << DB_PIXIV) | (1 << DB_DANBOORU) | (1 << DB_TWITTER)
# 结果:一个整数,可以直接传给 SauceNAO API 的 dbmask 参数
什么时候用哪个
| 场景 | 用什么 |
|---|---|
| 只搜 ALL | 什么都不用传,或 db=999 |
| 只搜单个数据库 | db=3(Pixiv) |
| 搜多个指定数据库 | dbmask=xxx |
| 排除几个不想搜的库 | dbmaski=xxx |
实战:排除成人内容数据库
假设你想搜 ALL 但跳过所有 H 向数据库——它们通常编号较小(0~2、10、11 等):
# 假设 H-Magazines=0, H-Game CG=1, DoujinshiDB=2, FAKKU=10
dbmaski = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 10)
# 然后传 dbmaski=xxx 给 API
注意
- 数据库编号会随 SauceNAO 版本变化,写脚本时不要硬编码,最好从 API 返回值里动态获取。
db和dbmask互斥——传了db=999就别同时传dbmask。- 用第三方 Python 库(比如
pysaucenao、saucenao-api)时,库已经帮你封装了位运算,直接用枚举值就行。