首个正式版本,累积 v0.1.0 ~ v0.5.2 全部功能与修复。
- detail 模式推送图片只发送 URL:新增
_send_image方法通过Image组件发送真实 QQ 图片_format_post_detail_text只输出文本,图片由_send_image单独发送
- 新消息推送展示方式可选:新增
push_mode配置项list(原有形式):标题列表 + 🆕 标识detail:先发标题列表,再逐条展开完整详情(含有序图文和图片链接)
- 关键词触发的列表和序号交互详情功能不受影响
_conf_schema.json新增push_mode配置项(options: list/detail)push_handler新增_format_post_detail()方法
/刷新百分之一消息命令:管理员可立即触发一次爬取刷新缓存- 仅管理员可用(受
admin_qq控制) - 先回复"正在刷新",完成后回复当前缓存总数
- 仅管理员可用(受
- 抽象
_check_admin()方法,减少权限检查重复代码
- 插件加载/重载后自动执行首次爬取:不再等待用户首次发送关键词
- 通过
loop.call_soon在事件循环就绪后延迟调度_do_initial_crawl - 同时保留
on_astrbot_loaded和_ensure_crawled作为兜底
- 通过
- 黑名单模式不推送:改为记录所有交互过的群/用户作为推送目标
AccessControl维护_seen_groups/_seen_privates- 每次消息事件自动记录群号和用户 QQ
get_push_targets()返回所有见过的会话(已按黑白名单过滤)
- 群聊/私聊独立黑白名单:
- 新增
group_access_mode+group_blacklist/group_whitelist - 新增
private_access_mode+private_blacklist/private_whitelist - 删除旧
access_mode、group_list、private_list
- 新增
- 自动推送一体化:
- 删除
push_groups、push_privates配置项 - 白名单模式下:自动推送到白名单中的所有群/用户
- 黑名单模式下:无法枚举全部目标,自动推送不生效(请使用白名单模式)
- 删除
| 模式 | 名单为空 | 名单不为空 |
|---|---|---|
| 黑名单 | 全部允许 | 名单内禁止,其余允许 |
| 白名单 | 全部禁止 | 名单内允许,其余禁止 |
- 管理员权限控制:
/清除百分之一消息缓存命令仅管理员可用- 新增
admin_qq配置项:管理员 QQ 号列表 - 非管理员执行清除命令时提示"权限不足"
- 新增
_conf_schema.json:删除clear_history文本说明,新增admin_qq列表配置
- 自动推送失败:
Context.send_message参数数量错误(传了 3 个参数,实际签名为 2 个)- 改为
send_message(target_id, text)纯文本发送
- 改为
- 自动推送改为消息列表:不再逐帖推送完整详情
- 新消息到达时发送一条含标题列表的摘要消息
- 🆕 标识标记本轮新增的消息(关键词触发的常规列表不受影响)
push_handler重写:移除_send_ordered_post,新增_send_text- 推送格式:
🆕 1. 标题A (3图)\n🆕 2. 标题B (1图)
- 图文顺序错误:
parse_ordered_content改用 BeautifulSoup 按 DOM 顺序遍历- 正则方案存在边界 bug:多个连续
<img>标签之间切分逻辑出错导致图片全堆末尾 - BeautifulSoup 确保文本节点和图片严格按 HTML 顺序提取
- 正则方案存在边界 bug:多个连续
- 删除不再使用的
re导入
- 清除缓存后不重爬:
/清除百分之一消息缓存执行后未重置_initial_crawl_done标志- 导致
_ensure_crawled()认为已完成爬取,用户发关键词直接读空缓存 - 清空命令中增加
self._initial_crawl_done = False
- 导致
- 自动检测旧缓存:插件加载时检测
ordered_content为空的旧数据,自动清空并触发重爬 - 清除缓存命令:
/清除百分之一消息缓存一键清空全部历史数据,下次查询时重新爬取最新消息 PostCache新增clear_all()和count_stale()方法_conf_schema.json新增clear_history配置项说明清除缓存方法
- 图文按原文顺序混排:
- 新增
PostItem.ordered_content字段,存储有序段落列表 - 爬虫获取帖子后调用详情 API 获取 HTML 原文
parse_ordered_content()解析 HTML 中的<img>标签,按原文顺序提取文本段和图片event.chain_result()按序构造[Plain(text), Image(url), Plain(text), ...]- 推送同样使用
ordered_content保持图文顺序
- 新增
TapTapClient新增fetch_post_detail(topic_id)调用详情接口PostItem新增topic_id字段PostCacheSQLite 表新增ordered_content列(兼容旧表 ALTER TABLE)query_handler.handle_index_reply返回(bool, str, list[dict])— ordered_content 替代 images
- 图文合并为一条消息:改用 AstrBot 官方
event.chain_result([Plain, Image, ...])API- 之前用
yield MessageChain()裸对象,框架管道不识别,消息被丢弃 chain_result()是AstrMessageEvent官方方法,返回MessageEventResult,框架正确解析- 图文按序在同一消息中展示
- 之前用
Image(url=...)报错:Image.__init__()的file是位置参数,不是url=关键字- 改为
Image(img_url)位置传参 - push_handler 同步修复
- 改为
- 图文分散为多条消息且顺序错误:多
yield导致框架每次发送独立消息- 改为构造单一
MessageChain:[Plain(text), Image(url=url1), Image(url=url2), ...] - 一次
yield chain→ 框架收到完整图文链 → aiocqhttp 适配器一次发送 Image(url=...)替代Image(file=...)以确保 HTTP URL 被正确解析
- 改为构造单一
- 图片未渲染,显示为链接文本:
plain_result不会解析[CQ:image]CQ 码- 改用
event.image_result(url)发送图片(AstrBot 标准图片 API) - 文本和图片分条发送:先文字、再逐张图
- 改用
- 图片发送失败:
Image(file=http_url)不被 aiocqhttp/NapCat 识别- 改用
[CQ:image,file=<url>]嵌入文本,一条plain_result发出 - 图文在同一消息中按序展示
- 改用
push_handler方式二同步改为[CQ:image]嵌入式发送
- 图文合并为一条消息:序号交互回复时,用
MessageChain将文本和图片合并为单条混合消息- 之前:文本和图片分别
yield→ 多条独立消息 - 现在:
MessageChain([Plain(text), Image(file=url), ...])→ 一条消息
- 之前:文本和图片分别
- 图片推送:自动推送时附带帖子中的图片(aiocqhttp / NapCat)
- 图片查询:序号交互查看详情时,发送帖内图片
- 图片数标识:关键词触发列表显示每条消息的图片数量
(N图)
- 图片提取路径错误:
topic.images而非topic.footer_images.images- 同时补充
sharing.image、cover.image等兜底路径 - 图片 URL 优先取
original_url(原图)
- 同时补充
query_handler接口变更:handle_index_reply返回(bool, str, list[str])push_handler推送逻辑重写,支持构造MessageChain发送图文消息main.py序号交互时yield event.image_result(img_url)发送图片- 版本号更新到 0.2.0
- 爬虫获取 0 条:
limit=20超出 TapTap API 限制(最大 10),请求返回 400- 改为
limit=10,已验证正常返回 10 条帖子
- 改为
- 爬虫错误日志不可见:所有模块统一改用
from astrbot.api import logger- 之前
taptap_client/cache/parser/filter/handler用logging.getLogger(__name__),日志在 AstrBot 面板不可见,错误被静默吞掉
- 之前
- 增强 HTTP 错误处理:记录 HTTP 状态码和响应体,区分网络异常和 API 业务错误
- 爬虫日志不可见:改用
from astrbot.api import logger替代logging.getLogger(__name__),确保日志在 AstrBot 面板中可见 - 首次交互仍返回"暂无消息":
on_message中关键词触发时改为 同步等待 爬取完成(await self._ensure_crawled()),再回复用户 - 移除不稳定的
loop.call_later:改用on_message首次交互直接触发爬取,更简单可靠
- 精简
__init__,移除延迟调度逻辑 - 首次爬取由用户首次发关键词时同步等待完成
- 爬虫热重载后仍不执行:单层
on_astrbot_loaded钩子在插件热重载时不触发- 改为三重保障:
loop.call_later(5)延迟调度 +on_astrbot_loaded补充 +on_message首次交互兜底 _do_initial_crawl幂等设计,确保只执行一次
- 改为三重保障:
- 爬取日志增强:每次爬取输出"本次获取 X 条,新增 Y 条,当前共 Z 条"
- 使用 emoji 标记关键日志(📋🔔🚀🔍📥❌),便于在 AstrBot 日志面板中快速定位
- 爬虫不执行:移除 Playwright 依赖,改用 httpx + X_UA 直连 TapTap API(参照 RSSHub 方案)
- 根因:AstrBot 事件循环在
__init__阶段未就绪,asyncio.ensure_future()无法启动爬虫 - 改用
@filter.on_astrbot_loaded()生命周期钩子延迟启动,AstrBot 完全加载后自动执行首次爬取 - httpx 直连已验证可用(无需浏览器/Chromium)
- 根因:AstrBot 事件循环在
- 移除
playwright依赖,减少部署环境要求 - 版本号更新到 0.1.3
- 致命 Bug:修复
_running永远为 False 导致on_message和爬虫均不执行的问题- 根因:
start()不是 AstrBot 生命周期钩子,AstrBot 只会调用__init__和terminate - 修复:删除
start(),在__init__末尾调用_start_crawl()立即启动
- 根因:
- 版本号从 0.1.0 更新到 0.1.2(metadata.yaml、pyproject.toml)
- 修复插件
on_message未被 AstrBot 调用的 bug(缺少@filter.event_message_type(ALL)装饰器) - 修复关键词/序号消息被 LLM 重复消费的问题(添加
event.stop_event()) - 修复消息回复方式错误:
event.reply()不存在 → 改用yield event.plain_result() - 修复
push_handler消息发送 API 不可用的问题(改用context.send_messageAstrBot 标准 API)
query_handler改为纯数据层:handle_keyword_trigger/handle_index_reply改为同步方法,返回(bool, str|None)元组- 消息回复统一由
main.py用yield方式发送
- 初始化项目目录结构和 Git 仓库
- 添加 Playwright 无头浏览器爬虫,支持 TapTap 用户动态获取
- 确认公开 API 端点:
/webapiv2/feed/v7/by-user - 实现 SQLite 消息缓存与去重
- 实现白名单/黑名单访问控制
- 实现关键词触发查询(默认:五维消息/百分之一消息/五维通知/百分之一通知)
- 实现序号交互查看详情
- 实现新消息自动推送到 QQ 群聊/私聊
- 添加 AstrBot WebUI 可视化配置(_conf_schema.json)
- 添加 README、.gitignore、.env.example
- 依赖:httpx、beautifulsoup4、lxml、playwright
- 存储:SQLite(posts.db)
- 配置:AstrBot WebUI + _conf_schema.json
- 需 AstrBot + NapCat 环境进行完整集成测试
- Playwright 首次使用需安装 Chromium(
playwright install chromium)