📖 介绍
订阅抖音和 B 站作者,有新作品或动态时推到群聊 / 私聊。插件只负责发现更新,媒体交给 ParseHub 解析、下载并发送。
- 多平台:抖音(主页 / 短链 /
sec_user_id)、B 站(主页 / BV / AV / b23.tv) - 按会话独立:每个群 / 私聊各自记录推送游标,同一个作者可以订阅到多个会话
- 不补发历史:首次订阅只记录当前最新一条,之后只推新内容
- 失败可控:作者级退避、作品级重试 3 次、目标群不可用只跳过该会话
- 下载前控体积:视频类媒体先探远端体积,超过上限直接不下载
- 零配置可跑:抖音匿名即可轮询;B 站不配 Cookie 时只推视频(固定 720p)
💿 安装
使用 nb-cli 安装:
nb plugin install nonebot-plugin-ifollow --upgrade
使用 uv 安装:
uv add nonebot-plugin-ifollow
安装仓库 main 分支:
uv add git+https://github.com/ByteColtX/nonebot-plugin-ifollow@main
用 uv 安装后还需要在 nonebot2 项目根目录的 pyproject.toml 里注册插件(nb-cli 会自动完成这一步):
[tool.nonebot]
plugins = ["nonebot_plugin_ifollow"]
⚙️ 配置
在 nonebot2 项目的 .env 文件中添加下表配置,全部可选:
| 配置项 | 必填 | 默认值 | 说明 |
|---|---|---|---|
IFOLLOW_SUB_INTERVAL |
否 | 1800 |
每个作者的轮询周期(秒),最小 30 |
IFOLLOW_SUB_MAX_ITEMS |
否 | 5 |
每作者每 feed 每轮最多补发的作品数,范围 1-50 |
IFOLLOW_MEDIA_MAX_MB |
否 | 100 |
单个媒体体积上限(MB),视频类会在下载前先探测 |
IFOLLOW_USE_BASE64 |
否 | false |
媒体编码成 base64 发送,仅协议端与插件不同机时需要 |
IFOLLOW_DOUYIN_COOKIE |
否 | 无 | 抖音网页 Cookie,匿名即可轮询,通常无需填写 |
IFOLLOW_BILIBILI_COOKIE |
否 | 无 | B 站 Cookie(SESSDATA);配置后才会轮询动态 |
- 周期:每个作者按自己的节奏到期,订阅 30 个作者也不会互相拖慢;扫描间隔取周期的四分之一 (15 秒 ~ 5 分钟),抓取并发 4。默认 30 分钟按「多数作者月更」定,34 个作者约 1600 次请求/天。
- 补发上限:不是页大小。停机很久后回来最多补发最新 5 条,更早的跳过(日志里有 warning)。
- 媒体传输:默认把本地路径(
file://)交给协议端,插件不读字节也不编码;协议端在另一台机器、 读不到同一路径时才开IFOLLOW_USE_BASE64。单个媒体超过IFOLLOW_MEDIA_MAX_MB时跳过该媒体, 并在文案里注明「另有 N 个媒体超过 XMB 未发送」。 - 旧配置:
IFOLLOW_SUBSCRIBE_INTERVAL/IFOLLOW_SUBSCRIBE_COUNT已废弃且不再读取,请改成新名字。 - 数据格式:订阅数据为 v3,不兼容旧版本;升级需清空插件数据目录里的
subscriptions.json并重新订阅。
关于 Cookie
抖音接口要求 a_bogus 签名 + 自动注册的 ttwid,匿名即可轮询,IFOLLOW_DOUYIN_COOKIE 只是加强项
(其中的 ttwid 会被自动注册值覆盖)。
B 站作者资料与视频投稿走 APP 接口,匿名可用;动态没有稳定的匿名接口,只有配置了
IFOLLOW_BILIBILI_COOKIE 才会轮询动态。获取方式:浏览器登录后按 F12 → Network → 复制请求头里的整段
Cookie。Cookie 等同于账号控制权,建议用小号,不要提交到仓库。
🎉 使用
指令表
| 指令 | 权限 | 需要@ | 范围 | 说明 |
|---|---|---|---|---|
/爱播帮助 |
群员 | 否 | 群聊、私聊 | 查看帮助 |
/爱播订阅 <作者主页或作品链接> |
群员 | 否 | 群聊、私聊 | 订阅一个抖音或 B 站作者 |
/爱播订阅列表 |
群员 | 否 | 群聊、私聊 | 查看当前会话的订阅 |
/爱播取消订阅 <序号、作者 ID、昵称或链接> |
群员 | 否 | 群聊、私聊 | 取消一个作者订阅 |
/爱播状态 |
超级用户 | 否 | 群聊、私聊 | 查看轮询健康度与各作者状态 |
订阅作者
/爱播订阅 https://www.douyin.com/user/MS4wLjABAAAA...
/爱播订阅 https://v.douyin.com/作者主页短链/
/爱播订阅 MS4wLjABAAAA...
/爱播订阅 https://space.bilibili.com/123456
/爱播订阅 https://www.bilibili.com/video/BV1xxxxxxxxx
也可以引用含链接的消息后发送 /爱播订阅(需要适配器支持 get_msg)。
首次订阅只记录当前最新作品或动态,不补发历史;之后发现新内容时,插件把作品链接交给 ParseHub 解析、下载并发送到订阅会话。
管理订阅
取消订阅优先在本地匹配:序号、作者 ID、抖音号 / B 站 UID、主页链接里的 ID、唯一昵称都不联网, 作者注销或接口被风控时也能取消;只有短链和作品链接才请求平台。昵称重名请改用序号。
失败处理
- 作者不存在或已注销 —— 停用该作者(重启后重新尝试),
/爱播状态里标「已停用」; - 作者接口暂时失败(网络、风控、限流)—— 该作者指数退避,30 秒起、上限 5 分钟;
- 作品已删除、不可见、平台不支持 —— 立即放弃该作品并推进游标;
- 网络、限流、下载失败 —— 下个周期重试,连续 3 次后放弃并推进游标;
- 机器人被踢出群、群不存在 —— 只跳过该会话,不影响同一作品的其他会话。
订阅或取消失败时只回一句人话原因、一条建议和一个错误码(如 E-DY-RISK),不会把异常堆栈发到群里;
把错误码贴出来就能在日志里定位到完整堆栈。
🛠️ 开发
uv sync
uv run pytest -q # 只跑测试
uv run poe test # 覆盖率门禁 90%(CI 同款)
uv run ruff check . && uv run ruff format --check .
uv run basedpyright
代码结构
src/nonebot_plugin_ifollow/
├── __init__.py / app.py / settings.py # 元数据、装配、唯一读配置的地方
├── commands.py / formatting.py / reply.py / style.py
├── platforms.py / adapters.py / pagination.py / errors.py
├── douyin_platform.py / douyin_abogus.py
├── bilibili_platform.py
├── media.py / douyin_media.py / bilibili_media.py
├── models.py # 订阅存储(v3,批量写)
└── poller.py / delivery.py / failures.py / status.py
模块设计文档(轮询子系统、存储、媒体、抖音 / B 站拉取与发送)已归档到 archive/specs
分支,不再随源码发布;AGENTS.md 是给 coding agent 的约定。
📄 许可
🙏 致谢
- z-mio/ParseHub:媒体解析与下载能力全部来自这个项目
- fllesser/nonebot-plugin-template:插件标识与 README 结构参考
- Johnserf-Seed/f2:抖音
a_bogus签名算法参考(Apache-2.0) - Nemo2011/bilibili-api:B 站网页接口兜底与
buvid3预热
Metadata
Release files for nonebot-plugin-ifollow 2.0.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| nonebot_plugin_ifollow-2.0.7.tar.gz | 51.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nonebot_plugin_ifollow-2.0.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 113.9 kB
Release files / nonebot_plugin_ifollow-2.0.7.tar.gz
| Download URL | nonebot_plugin_ifollow-2.0.7.tar.gz |
|---|---|
| Size | 51.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d7774d0e66b915d9c76f3a5899c8beeb75d302d349463c995ac5cbf4bb897610
|
|
BLAKE2b-256 checksum How to use checksums |
0164cba51c894d23a57c1bc00aae30d369f29b5ac9bca105cdb5f7a1dec90960
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nonebot_plugin_ifollow-2.0.7-py3-none-any.whl
| Download URL | nonebot_plugin_ifollow-2.0.7-py3-none-any.whl |
|---|---|
| Size | 62.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
adcfa184959ee584442df61c53dc29727b4d1877db1f9c0effc665448d0d5b8c
|
|
BLAKE2b-256 checksum How to use checksums |
3a83574dd7fa496085f08dfa8ea4d19c87edf38ae1663384cf720b4a996e7a06
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for nonebot-plugin-ifollow 2.0.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.