拍卖操作指南与更新记录

当前版本2.27.1 / Web 1.9.0;历史内容按版本留档,不代表现行命令。

完整文档与版本记录

后台保留完整操作说明、全部配置项、测试命令和历次更新记录。点击标题展开全文;QQ帮助保持简短。

完整操作指南

cym_auction — 拍卖系统

当前版本:插件2.27.1 / 独立Web 1.9.0。管理设置集中于独立网站,QQ群保留12个成员命令与15个经确认的管理命令。所有成员命令、自然口令、图文展示与竞拍规则保持原样。

安装、升级与完整资料

上传 cym_auction.zip 至AstrBot,安装包根目录含 metadata.yaml 与 main.py。先升级重载插件,再更新独立网站。保留数据库、图片、图床缓存、网站账号目录与旧配置备份。插件自动迁移一次旧设置,后续由独立Web保存并自动同步,重启不会覆盖新值。

AstrBot内置页面改为完整文档入口;独立网站“系统设置”也能打开完整说明及历史记录。完整更新日志、当前测试命令、2.26.0操作原文、2.26.0测试原文完整保留。历史中的命令不代表当前可用入口。

首次使用

  1. 在网站创建活动和稿位,设置批次与上新时间;时间统一按北京时间。
  2. 成员先发消息供机器人登记;网站系统设置中选择QQ管理员。网站账号和QQ管理员名单相互独立。
  3. 管理员在每个目标群分别执行 /设置群 前台#秋拍#A群 或 /设置群 后台#秋拍#管理群。同一活动的所有群应使用同一个机器人。
  4. 后台群 /录入余额 @成员#10000,或者网站成员页面录入,确认余额与年龄审核。
  5. 普通成员出价 给1号出价 1000。前台同步有效出价、上新及定时提醒,个人提醒只在其出价来源群提及本人。

竞拍规则与显示

余额跨活动共享,竞拍校验累计持有目高所需余额;QQ失败只提示“出价失败!余额不足。”。第一次出价须大于等于起拍价,后续须高于目高。结算时目高大于等于回收价才成交并全额扣款;未设底价时有效出价可成交;无人出价或未达底价则回收不扣款。

回收价可在网站选择公开。未公开时不显示金额,但达到底价仍显示“交易中/已过回收”。查询单稿位和批次保留当前图文显示,统一小图。附属例图仅在“更多例图”中显示,其他场景只显示主图。“我的稿位”纯文字分组成交与当前目高;“查询目高”纯文字每稿位一行,例如 53号 炊籽xxx | 1000¥。

统一定时在网站设置;设定时发公共通知,提前30分钟和5分钟提及当前最高出价者。不足30分钟立即提醒,不足5分钟合并阶段提醒。最后5分钟有效加价,结算时间再延长5分钟,每次发延期提示。自动任务仍由AstrBot运行,独立Web负责管理与保存。

全部27个QQ群主命令

需要指定成员时,请使用QQ真实@功能选中对方。方括号是可选参数,不发送括号;“成员标识”技术细节只在网站保留。管理员状态不由QQ群主身份自动授予。别名“帮助”“help”不重复计数。

活动管理
/活动列表

权限:全部成员。参数:无。

查看所有未删除活动的名称、状态及起止时间,用于核对群绑定和其他活动命令。

/活动列表
稿位管理
/稿位列表

权限:全部成员。参数:[活动名]。

列出当前活动的全部稿位与例图;需要查询其他活动时追加活动名称。

/稿位列表
/稿位列表 秋拍
/我的稿位

权限:全部成员。参数:(纯文字分组:本人成交的已截止稿位、未截止目高稿位;可不加斜杠)。

查询本人跨活动的已截止成交稿位和当前尚未截止的最高出价稿位,两组均只显示文字。被超价、已回收、撤回后不再领先的稿位不计入。

/我的稿位
我的稿位
/我上传的稿位

权限:全部成员。参数:(自己上传的稿位;可不加斜杠)。

查看本人上传的所有状态稿位,包含图片;不是本人竞拍领先的列表。

/我上传的稿位
我上传的稿位
/查看稿位

权限:全部成员。参数:稿位名/序号。

按序号或完整名称查看状态、画师、例图、起拍价、回收价(按公开设置显示)、备注、目高及最高出价者。不显示上传者、创建时间或定时细节。交易中目高达到已设置的回收价时,状态显示交易中/已过回收。

/查看稿位 1
查询1号稿位
/更多例图

权限:全部成员。参数:[活动名#]稿位号。

单独查看稿位的附属例图,按编号展示小图,不重复主图。无附图时提示暂无更多例图;未指定活动时沿用本群绑定活动或当前活动。也可直接输入 查看1号稿位更多例图。

/更多例图 秋拍#1
查看1号稿位更多例图
批次与查询
/查询批次

权限:全部成员。参数:[批次号]。

无参数时查看批次信息;指定编号可查看该批上新时间、全部稿位和对应例图。

/查询批次
/查询批次 1
查询批次1
/查询批次目高

权限:全部成员。参数:批次号。

显示该批全部稿位的目高、状态、备注及例图。未开拍、已截止、已回收使用相应状态提示。

/查询批次目高 1
查询批次1目高
/查询目高

权限:全部成员。参数:无。

显示已设置的全场批次总览图及批次信息,并提示使用查询批次1目高;不一次刷出全场所有详情。

/查询目高
查询目高
余额与审核
/恢复余额

权限:管理员。参数:活动名。

将指定活动尚未恢复的成交扣款加回成员当前共享余额,每笔只恢复一次。须填写完整活动名,多群模式限后台管理员;支持已关闭及已删除活动,不影响其他活动扣款,不改变成交结果。无扣款记录不退款,恢复后新成交的扣款可再次恢复;清空余额后的恢复不恢复审核资格。

/恢复余额 秋拍
/修复余额

权限:管理员。参数:旧记录号#@成员#最终余额。

只处理余额列表中的待核对旧记录。先核对成员、其现有余额及相关旧记录,再输入最终共享余额,覆盖原金额并确认年龄审核。不是追加金额;同一记录不能重复处理。

/修复余额 3#@成员#5000
/录入余额

权限:管理员。参数:@成员#金额(覆盖全局余额)。

管理员审核余额与年龄后,为选中成员设置最终共享余额。重新录入覆盖原值,金额不能为负,所有活动立即共用;多群模式只允许后台群操作。确认回复显示昵称,不额外@成员。

/录入余额 @成员#10000
@成员录入余额10000
/查询余额

权限:管理员。参数:@成员。

仅管理员可查询被选中成员的具体余额和年龄审核情况;多群模式限后台群。查询回复用昵称显示成员,不触发@。

/查询余额 @成员
查询@成员余额
/余额列表

权限:管理员。参数:(全局记录)。

仅管理员查看所有成员的共享余额及审核记录。每行显示文字昵称,不触发@;没有昵称时显示稳定参拍编号,同名成员加编号区分。成员发群消息时会按身份更新可用群昵称,也可用 /设置显示名 @成员#昵称 指定称呼。多群模式限后台群;待核对旧余额另列记录号。

/余额列表
/清空余额

权限:管理员。参数:(清空所有成员全局余额,影响全部活动)。

清空全部成员的共享余额和审核,影响全部活动,不是只清理当前活动。操作后成员需重新审核录入;多群模式限后台群。成交扣款仍可按活动恢复,恢复不会自动通过审核。

/清空余额
/查看我的余额

权限:全部成员。参数:无。

成员只确认自己的有效审核状态,不展示具体金额。未审核时按提示联系群主。

/查看我的余额
查看我的余额
出价与成交
/出价

权限:全部成员。参数:稿位号 金额。

金额须高于当前目高且大于等于起拍价,活动、稿位、批次均须可出价;还需通过余额和年龄审核。支持空格分隔,推荐自然口令。

/出价 1 1000
给1号出价 1000
/撤回出价

权限:管理员。参数:[活动名#]稿位号#@成员#金额。

时间统一为北京时间(UTC+8)。可在最前面加活动名#;省略时使用本群绑定活动(单群为最新活动),回复与通知注明活动及稿位。按稿位、真实@成员和实际出价金额精确定位;该笔及之后所有出价一并作废,重新计算目高并提醒参拍者。金额必须属于该成员的有效出价。已截止稿位不能再撤回;退回活动扣款请用恢复余额。

/撤回出价 12#@成员#3000
/撤回出价 一周年庆#12#@成员#3000
权限与帮助
/添加管理

权限:管理员。参数:@成员。

仅现有拍卖管理员可授权被@成员。首次管理员由有网站系统设置权限的管理员在独立管理网站的系统设置选择并保存,QQ原有群管理员不会自动获得拍卖管理权。

/添加管理 @成员
/删除管理

权限:管理员。参数:@成员。

移除被@成员的拍卖管理权限。移除不会清空其余额或出价;应保留至少一位可用管理员。

/删除管理 @成员
/管理列表

权限:管理员。参数:无。

查看当前拍卖管理员,成员用昵称或稳定参拍编号展示,不触发@。同名成员附编号区分;管理员增删权限的个人通知仍真实@。

/管理列表
/功能

权限:全部成员。参数:别名:帮助、help。

在QQ显示精简帮助及27个命令。帮助、help为同一命令的别名。发送帮助也会登记本人供网页选择;不会公开账号标识。

/功能
/帮助
/help
多群与显示名
/设置群

权限:管理员。参数:前台/后台#活动名[#群别名]。

在目标群设置前台或后台并绑定已创建活动,群别名可省略。首次设置自动启用多群,其他群须分别设置;同一活动使用同一个机器人。

/设置群 前台#秋拍#A群
/设置群 后台#秋拍#管理群
/取消群设置

权限:管理员。参数:(解除本群绑定)。

解除当前群绑定并取消该群尚未发送的同步通知,不影响其他群。解绑全部群不会自动关闭多群开关,需在系统设置页关闭或重新绑定。

/取消群设置
/群设置

权限:管理员。参数:(查看群角色和活动)。

查看多群开关和全部群的角色、别名、绑定活动,并标记当前群。用于核对设置是否保存。

/群设置
/设置显示名

权限:管理员。参数:@成员#昵称(清空恢复自动)。

设置该成员在公开目高和出价历史中的昵称;填清空恢复自动昵称。不改变余额归属或权限,不追溯修改已经发送的消息。

/设置显示名 @成员#小明
/设置显示名 @成员#清空
/测试提及

权限:管理员。参数:@成员。

仅管理员在QQ官方机器人群使用。向同一成员发送三条标有方案编号的提醒,不要求绑定活动。检查可点击的成员名称与提及效果,再到独立管理网站的系统设置选择对应方案;测试不会自动改设置或更改拍卖数据,结果仅发当前群。

/测试提及 @成员

独立网站全部操作说明

稿位集 · 独立拍卖管理站 1.9.0
系统设置迁移(Web 1.9.0 / 插件2.27.1)

在侧栏进入 系统设置。AstrBot内置插件页面只保留完整操作文档,不再保存管理设置。活动、稿位、附图、批次、定时、状态和通知管理使用独立网站;QQ群保留全部12个成员主命令,以及15个涉及群或成员的管理命令。

升级与首次配置
  1. 保留并备份原 auction.db、图片、图床缓存及网站整个 state-dir(含 admin.json、accounts.db)。按本文的SQLite备份方法操作,不要用空库覆盖现有数据。
  2. 上传 cym_auction.zip 2.27.1 并重载。插件首次启动从原安装目录名称对应的 data/config/<插件目录名>_config.json 自动导入旧设置与管理员,兼容原 config.yaml 的MinIO配置。不扫描其他插件配置。原文件不改动;迁移后的共享数据库是唯一设置来源。
  3. 替换独立网站代码为 1.9.0,沿用原启动参数并重启。网站与插件须访问同一份 auction.db。先只升级网站时,系统设置提示先升级插件,不会自行猜测或覆盖旧配置。
  4. 总管理员登录“系统设置”核对QQ管理员和图床配置;新装实例可在此设置首位QQ管理员。让成员发送一条QQ消息后刷新,成员列表会显示对应标识与昵称,也可填写完整 sender_id。QQ示例仍使用真实 @成员。
  5. 网站保存后,运行中的机器人约2秒内读取;页面显示“等待机器人读取”或“机器人已读取”。停机时也能保存,下次启动生效。网站本身不连接QQ发送消息,通知仍由机器人投递。

插件2.27.1兼容带UTF-8 BOM的旧JSON配置。若2.27.0加载报 Unexpected UTF-8 BOM,更新插件并重载即可,无需手动修改配置或重建数据库。已使用Web 1.9.0时无需更换网站程序;本次配套Web包仅同步文档。

不要切回旧版插件运行迁移后的配置;旧版不读取本次共享设置。新版本移除了 _conf_schema.json 与原内置写入API,因此设置只有独立网站一处生效。

设置项与操作
分区 可管理内容 行为
消息与协同 多群开关、QQ提及方案、图片最长边 三种提及方案可先 /测试提及 @成员;图片80–720像素,默认240
S.EE API Token、图片域名、上传接口、超时 默认HTTPS接口;超时1–300秒;密钥留空保留,勾选清除才删除
MinIO endpoint、Access Key、Secret Key、bucket、HTTPS开关、region、公开URL 原图片存储配置全部保留;密钥不回显;不配置时使用本地图片
QQ管理员 完整名单、从成员选择、手填成员标识 与网站登录账号独立;QQ管理员可操作保留的全部群管理命令
群绑定 群别名、前后台角色、绑定活动、解绑 首次仍须到目标QQ群 /设置群 获取真实会话,之后网站可修改;不再匹配的待发通知自动取消
成员显示名 自定义公开名称,写“清空”恢复自动昵称 不改变余额归属或成员身份;普通消息继续自动采集群昵称
通知投递 最近100条通知状态、失败原因、补发失败通知 保留已成功分段进度,补发注明原时间;目标群解绑或改绑后不能补发旧通知
按活动恢复余额 未退/已退笔数和合计,恢复全部未退扣款 支持已删除活动;每笔只退一次,成交状态不变,不恢复被清空的审核资格
旧余额迁移核对 旧活动、原标识、原余额、错误原因,指定成员与最终余额 覆盖明确的最终全局余额,同时确认年龄审核,不盲目累加旧余额

所有写入先预览再确认;预览后目标数据变化会拒绝执行,需重新核对。编辑中的设置不被自动刷新覆盖,点击“刷新设置与通知”可读取最新表单与通知。凭据只存在共享数据库和机器人内存,不回显、不进入网页审计;原配置文件作为迁移来源仍保留,请按原有敏感配置方式管理备份。

系统功能分级权限

新增11项权限:system.view、settings.behavior、settings.see、settings.minio、qq_admins.manage、groups.manage、members.name、notifications.view、notifications.retry、balance.restore、balance.repair。已有下级管理员默认没有这些新权限,由总管理员或有相应授权范围的上级逐项启用。总计57项细粒度权限,操作接口与预览确认均重新核验;普通用户不能访问系统接口。

QQ管理员授权会授予其全部保留的QQ管理命令能力,因此 qq_admins.manage 是独立的高权限选项,不会自动随“管理网站账号”授予。S.EE和MinIO各自的地址及凭据在同一权限内,避免仅有地址权限即可转发已有密钥。

QQ保留范围
  • 成员:出价、活动列表、稿位列表、查看稿位、更多例图、查询批次、查询批次目高、查询目高、我的稿位、我上传的稿位、查看我的余额、功能(别名帮助/help)。自然口令与单独@机器人快捷说明保持原样。
  • 管理员:添加管理、删除管理、管理列表;设置群、取消群设置、群设置;录入余额、查询余额、余额列表、清空余额、恢复余额、修复余额;撤回出价;设置显示名;测试提及。多群下余额管理仍只在后台群执行。
  • 已删除QQ入口:活动管理、添加/修改/删除/恢复/编号调整稿位、附图管理、备注、批次编排与时间、定时与状态操作、通知查询与重试。相关操作改到网站原有业务页面或系统设置。
  • “设置全场批次图”已闲置,现版本移除,不提供新的上传入口;保留数据库历史值,不影响当前查询目高的纯文字格式。

系统设置页内的“完整操作指南与更新记录”可以阅读全部说明、当前QQ测试命令、历史日志与历史原文。历史原文中的旧命令仅用于查阅,不能当作现版本入口。

这是独立 Python Web 服务,无需安装、导入或启动 AstrBot。网站管理员与拍卖用户共用登录入口,按账号角色进入不同页面;网站账号与 QQ 管理员权限分开管理。前端无需 Node.js、构建服务、CDN 或第三方账号。

推荐与机器人在同一服务器运行,共用一份 auction.db 和图片目录。机器人停止时,网站仍可查看、编辑资料;机器人恢复后直接读取修改后的资料。网站可以独立修改资料、定时及稿位状态,并即时完成状态操作应有的扣款或退款。接收 QQ 出价、自动上新/截止及发送群通知仍需机器人在线,网站不启动第二套拍卖调度器。

附属例图(Web 1.8.0 / 插件2.26.0)

每个稿位保留一张主图,可额外配置最多20张附属例图,展示同一画师的不同风格。普通稿位查询、批次查询、出价和提醒、用户个人页面均沿用主图。只有QQ群明确查询更多例图时发送附图;网页管理员在稿位详情展开“附属例图”管理区查看。

  • 管理员在稿位详情展开“附属例图”,可多选上传(每张≤5MB,PNG/JPG/WebP/GIF,取首帧转JPEG),或填写图床直链,每行一条,点击“添加链接”。添加按选择/输入顺序追加;每张可删除、前移、后移。修改立即保存,不发送群公告;先保存其他资料修改再操作附图。
  • 附属例图由网页稿位详情添加、删除和排序;QQ保留成员查询入口,不再提供附图管理命令。
  • 成员查看:查看1号稿位更多例图;指定活动:/更多例图 一周年庆#1。按顺序显示附图编号和小图,文字与图片分段;没有附图时明确提示,主图不重复发送。沿用现有s.ee/平台图文发送方式。
  • 网站新增独立权限 artwork.examples(管理附属例图),依赖 catalog.view;总管理员自动拥有,已有下级管理员默认不自动获得。可在“账号与权限”逐级授权。原“更换例图”权限仅管理主图,不能用来修改附图。普通用户网页的权限和展示不变。
  • 批量网页上传按张保存;中途失败会显示已保存数量,刷新管理区可核对后只补传剩余图片。QQ同一消息中的图片全部持久化成功后才一起入库。超过20张、版本冲突或无效地址会拒绝本次修改;不覆盖另一窗口或机器人新写入的数据。
  • 附图随稿位改号保留,删除后随快照保留,撤销删除时恢复。删除附图只移除展示引用,不主动清理图片文件,避免破坏历史恢复。

升级:先安装并重载插件 2.26.0,自动为原数据库增加 artworks.extra_images(JSON数组,旧稿位默认为空,主图不变);再替换独立网站代码并重启至 1.8.0。保留原数据库、图片、图床缓存及整个state-dir。只升级网站时原功能可用,附图写入会提示先升级插件。新功能使用共享写锁、记录版本和网页操作审计。

接口:管理员 GET /api/artworks/{id} 的 examples 给出缩略图与图床地址;PATCH /api/artworks/{id} 的 extra_images 为有序来源列表;POST /api/artworks/{id}/examples 上传一张并追加;本地缩略图为 /api/artworks/{id}/examples/{序号}/image。写入需CSRF、If-Match及附图管理权限;禁止从请求传入新的服务器任意文件路径。网站不依赖AstrBot运行。

已实现的功能
  • 分级管理员与账号中心:原管理员升级为总管理员,新增“账号与权限”独立页面;普通用户个人功能保持。总管理员可管全部下设账号,受限管理员只管自己的下属;57项管理权限可逐项选择,支持创建、启停、删除账号、密码重设及逐级授权,操作入口和后台接口共同校验。

  • 拍卖用户账号:管理员统一创建、绑定 sender_id、重设密码、启用/停用。用户登录后只读自己的余额、已成交/当前目高/仍在参与的稿位及个人出价历史;稿位和历史附缩略图,仍在参与稿位同时显示当前目高与本人有效出价,不能访问其他成员身份资料或管理接口。

  • 账号回收价权限:默认关闭;管理员可为指定账号开启“允许查看全部作品回收价”。开启后个人稿位显示回收价,并提供覆盖全部活动作品的回收价目录(含未公开、未参拍作品);支持活动/作品搜索和分页,不改变QQ公开设置。

  • 用户管理:录入或覆盖成员全局余额、清空全部余额与审核记录;查看已记录成员列表、全局余额及审核状态;按昵称、显示名称或成员标识搜索,按审核状态筛选;支持余额、当前目高/已成交的金额与件数升降序排序。每位用户可快捷设置登录账号,创建和重设密码支持随机生成、显示和复制。详情分列已成交作品与当前目高作品,并提供近期出价、成交扣款和退回记录。

  • 活动创建、开启、关闭与删除;新增稿位、指定空闲编号、删除与恢复、调整编号、按每批数量重新编排。全部新增管理操作先预览具体对象及影响,再确认执行。

  • 全部成员的出价历史表:按活动、作品、成员关键词、时间和撤回状态筛选,每页50条,可逐页查看完整历史。按精确记录撤回并同步作废后续出价、重算目高。

  • 全部活动和稿位目录,每 2 秒读取一次已提交数据;后台标签页暂停刷新,返回后立即刷新。连接失败显示旧数据提示,登录会话失效则返回登录页。

  • 按活动、批次、状态及截止时间筛选,搜索名称、画师、序号;截止时间支持已设置/未设置和起止范围,每页 24 份稿位,小图展示。

  • “当前目高合计”卡片内可选择统计范围:开拍中、未开拍、已截止、已回收可任意组合,默认只统计开拍中;选择自动保存在当前浏览器。

  • 已经上传到 s.ee 的本地例图自动复用图床直链;加载失败时回退到本地缩略图。出价刷新保留未变化的图片,翻页后的本地图使用浏览器缓存校验,减少服务器重复发送图片。

  • 查看活动起止时间、状态、批次上新时间、群绑定;查看稿位价格、目高、成员昵称及标识、备注、例图、定时信息与出价历史(包括撤回记录)。

  • 在活动管理中调整批次上新时间,将已上新批次退回筹备中;保留出价和目高,暂停未结束稿位并清除其旧定时。

  • 稿位详情可设置回收价公开开关与统一结算时间;列表同时显示回收价、目高和达价标记。已设定时的稿位在卡片和详情显示截止时间(北京时间);无定时不显示该行。

  • 编辑活动名称和起止时间;编辑稿位名称、画师、起拍价、回收价、备注、例图链接;直接上传 PNG/JPG/WebP/GIF(≤5MB、2000万像素,取首帧转换为 JPEG)。

  • 活动时间变更原子更新待执行任务,保留消息来源。已开启/已关闭活动的开始时间、已结束稿位的价格不可在网页改动。已关闭活动可调整结束时间后手动开启;单独修改时间不会自动重启。已删除活动只读。

  • 网页保存携带记录版本;如果机器人出价或另一窗口已修改同一记录,返回冲突提示,保留草稿,不覆盖数据。

  • 最近 30 条网页修改记录;完整修改前资料、变更字段、时间与操作账号保存在 auction_web_audit 表。

网页现在支持稿位恢复开拍、暂停、截止结算和回收;状态操作会按拍卖规则同步处理余额、定时和通知,不能任意填写成交者或成交价。管理员页面支持活动管理、稿位新增/删除恢复/编号调整、批次编排、余额录入/清空、出价历史及撤回。群绑定、QQ管理员与显示名在系统设置管理,约定的QQ群管理入口仍保留,成员竞价仍通过QQ。

安装和运行

Python 3.10 及以上。解压 cym_auction_web.zip,进入包含 auction_web/ 的外层目录,执行:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r auction_web/requirements.txt
python -m auction_web admin --state-dir ./auction-web-state --username admin

密码交互输入两次,至少12位,不出现在命令历史或启动日志;软件没有默认账号密码。Windows 使用 .venv\Scripts\activate 激活环境。

首次接入真实数据库前,先安装并重载配套 cym_auction.zip(当前配套2.25.0,管理功能最低2.24.0),使机器人启用共享写锁并登记状态管理兼容标记。旧版兼容库可只读查看,未登记时拒绝网页编辑。不要在 Web 仍可编辑时把机器人降级到旧版,因为旧版不遵守共享锁。

在 AstrBot 插件日志中查找“数据库已初始化”,取得 auction.db 的真实绝对路径。路径随 AstrBot 部署方式而变化,不要把插件源码目录或 ZIP 当作数据库路径。网站必须与机器人访问同一个数据库文件,不能各自复制一份作为实时数据源。

python -m auction_web backup --db /实际数据目录/auction.db --output ./backups/auction-before-web.db
python -m auction_web serve --db /实际数据目录/auction.db --state-dir ./auction-web-state

打开 http://127.0.0.1:8088,使用刚设置的网站账号登录。默认只监听本机;远程访问见下一节。backup 使用 SQLite 在线备份 API,包含 WAL 中已提交的数据,拒绝覆盖已有备份;图片需另行备份。

网站需要对数据库所在目录有读写权限,以便 SQLite WAL 和 .write.lock 正常工作;--state-dir 也须可读写,用于保存网站账号库。建议两个进程使用相同系统用户;网站凭据目录与插件数据目录独立,不要放在公开静态目录。

用演示库先体验
python -m auction_web demo --dir ./auction-web-demo
python -m auction_web admin --state-dir ./auction-web-demo/state --username admin
python -m auction_web serve --db ./auction-web-demo/auction.db --state-dir ./auction-web-demo/state

这会生成3个活动、16份演示稿位和抽象示意图,页面明确标记“演示数据库”。拒绝覆盖已有演示库,不连接真实机器人。若端口被占用,追加 --port 8089。

图片路径

默认本地图片根目录为数据库同级的 images/。若原图片在其他目录:

python -m auction_web serve --db /实际数据目录/auction.db --media-root /实际图片目录 --state-dir ./auction-web-state

只读取数据库中记录且位于指定图片根目录内的栅格图片,拒绝路径越界;不会提供任意文件下载。网络图直接使用其原 HTTP/HTTPS URL,不在服务器抓取未知链接。使用 HTTPS 网站时,建议例图也使用 HTTPS,以免浏览器拦截混合内容。

读取旧稿位图片时,Web 1.0.3 支持把数据库中的容器路径 /AstrBot/.../images/文件名 映射到网站实际图片根目录中的同一文件,保留 images/ 下的子目录;同时支持相对路径和 file:// 地址。插件生成的唯一文件名也支持在自定义图片根目录中查找。不会改写数据库原地址,也不会搜索图片根目录以外的任意文件。

网页上传新图片后,写入的绝对路径仍需机器人同样可见。若 AstrBot 在 Docker 中,建议两端挂载相同绝对路径;否则网页修改例图时可使用双方可见的 HTTPS 图床地址。不能只挂载 auction.db 一个文件:数据库、-wal、-shm、.write.lock 必须处于同一共享目录;禁止使用 NFS/网盘跨机器共享 SQLite。

图床直连与流量节省(1.0.2)

网页会优先显示图床图片,图片文件由浏览器直接从图床下载,不经过本网站服务器:

  1. 稿位“例图地址”本来就是 HTTP/HTTPS 直链时,直接使用该链接。编辑稿位时也可手动粘贴 HTTPS 图床直链。
  2. 例图地址是本地文件时,网页按文件内容匹配机器人已有的 s.ee 缓存,找到对应 HTTPS 直链后优先使用它,原始本地文件与数据库地址不变。Web 1.0.3 还支持读取缓存中的来源索引:即使本地原图对网站不可见,只要来源匹配且图床直链有效,仍可显示。
  3. 没有缓存或图床加载失败时,显示本地缩略图。缓存随后由机器人生成或更新后,网页自动识别,无需重启。未曾上传到图床的新图仍由本地提供;网页本身不自动上传图片。

默认读取数据库同级的 image_host/see_cache.json。优先按可见原图内容匹配;没有可见原图时,需要该缓存已有来源索引。配套插件2.20.22会在重载时为已缓存的本地稿位图片补索引,只读本地文件,不新增上传;后续发送图片也会记录来源。正常共用插件数据目录时,无需新设置,也不需要向网站配置 API Token。网站不会读取 AstrBot 配置或发起图床上传。若缓存单独挂载,可指定已有缓存路径:

python -m auction_web serve --db /实际数据目录/auction.db --state-dir ./auction-web-state --image-host-cache /实际插件数据目录/image_host/see_cache.json

列表仍按页、按需加载图片,列表和详情都支持回退。出价、余额或备注刷新不会改变图片地址;列表刷新保留同一图片节点。只有本地图片内容或文件状态变化才更新其图片版本。本地缩略图带私有缓存和 ETag,重复请求可返回304、不重复传输图片正文;接口仍校验管理员登录,活动资料和余额接口不缓存。

这主要节约 Web 服务器的图片出站流量;浏览器和图床仍会产生下载流量。图床直连使用已有原图,并不会只因网页显示尺寸较小而缩小文件体积。新版本不改变 QQ 图片方案或拍卖业务数据。

升级:解压新的 cym_auction_web.zip,替换网站程序的 auction_web/ 目录并重启 Web;保留原数据库、图片和网站凭据目录。默认启动参数不变。可在浏览器开发者工具的网络面板确认图片请求指向图床域名;断开该图片域名后应自动显示本地缩略图。

图片404排查与升级(1.0.3)

如果图片接口返回 {"error":"本地例图不可用,请检查 --media-root 与图片目录。"},这是网站后端无法读取数据库记录的原图片路径。常见于容器内外路径不同、只提供数据库而没有图片目录、或网站进程没有读取权限。

  • 升级网站至1.0.3并重启。图片已位于数据库旁的 images/ 时,原启动命令可以沿用;旧容器路径会自动映射。
  • 图片在别处时,添加 --media-root /网站实际能读取的图片目录,目录应直接包含例图文件,而不是它上一级的插件数据目录。
  • 如希望原图不可见时仍复用图床,升级插件至2.20.22并重载一次,让机器人为已有 s.ee 缓存补来源索引;网站还须能读取同一份 image_host/see_cache.json,或用 --image-host-cache 指向它。只复制数据库、没有图片或可用图床缓存,无法恢复图片内容。
  • 页面顶部与稿位详情会显示具体无法读取的路径及网站图片目录;已确定缺失的图片不再生成必定404的本地请求。目录修复或图床缓存更新后,列表下次刷新重新识别。

例如数据库参数为 --db ./AstrBot/AstrBot/data/plugin_data/cym_auction/auction.db,默认图片目录就是 ./AstrBot/AstrBot/data/plugin_data/cym_auction/images,默认缓存文件是 ./AstrBot/AstrBot/data/plugin_data/cym_auction/image_host/see_cache.json。相对路径都从启动命令所在目录计算。

对外访问和后台运行

本版采用同机数据服务。网站前端和 API 同源运行,可用域名访问;没有开放跨域写入接口。若要部署另一台服务器,应把 API 服务留在数据库所在机器,通过反向代理访问,不能同步两份 SQLite 文件。

使用现有 Nginx/Caddy 处理 HTTPS,Web 进程仍监听 127.0.0.1:8088:

python -m auction_web serve --db /实际数据目录/auction.db --state-dir /实际网站凭据目录 --public-url https://auction.example.com

--public-url 填实际 HTTPS 根域名,不含路径前缀。启用后 Cookie 只通过 HTTPS 发送,本机 HTTP 页面不能维持该会话。deploy/nginx.conf.example 提供反向代理片段;deploy/auction-web.service 提供 systemd 模板,替换目录、用户名及域名后使用。模板不绑定 AstrBot 服务启动顺序。

启动单个 Web 工作进程即可。登录会话保存在内存,8小时到期;重启 Web 会退出全部会话。修改网站管理员账号密码时重新执行 admin 命令并重启 Web;拍卖用户账号由管理员在网页维护,不需要重启。不要在启动参数中放密码或 S.EE Token。

Web 1.1.1起与插件2.22.2起,业务时间固定按北京时间(UTC+8)解释,不依赖服务器或浏览器的时区。systemd 模板仍保留 Asia/Shanghai 环境变量。

编辑方式与注意事项
  1. 在左侧选活动,或在“全部活动”中按名称/画师/序号搜索。
  2. 点击稿位名称打开详情,修改需要的字段后“保存修改”。回收价 0 表示未设置成交底价;回收价默认不公开,可在详情设置公开;管理员网页始终保留实际金额。新画师名只切换当前稿位的关联,不会改名其他共用同一画师的稿位。
  3. 例图上传会立即保存例图;若文字表单已有草稿,先保存文字,再重新打开上传。
  4. 活动管理中点击“查看 / 修改”,调整名称或时间。新时间必须在将来,结束晚于开始。时间编辑不重开已结束活动,也不会为每个稿位新建提前半小时提醒;既有稿位独立定时仍按原规则执行。
  5. 有人同时出价/改资料时,可能收到409冲突提示。核对并暂存草稿,关闭再打开最新记录重新编辑。
  6. “修改记录”显示网站的资料、状态和定时操作,不是所有 QQ 行为日志。网页价格/备注和公开开关修改不会额外向 QQ 广播;状态及定时操作会登记群提醒,由机器人在线后发送。回收价按该稿位的公开选项显示。
数据保护与排错
  • 网页与插件通过同一 auction.db.write.lock 互斥,网页再使用 BEGIN IMMEDIATE 提交资料、任务及审计;同一任务可重入,取消等待会释放资源。锁文件存在不等于被占用,不要手工删除。
  • 网站未登录时不能访问拍卖数据、历史或本地例图。密码使用 scrypt;会话 Cookie 为 HttpOnly/SameSite,写操作校验 CSRF 和来源;登录限流。默认不暴露公网端口。
  • “数据库结构不兼容”:路径不是该插件数据库,或旧库未完成迁移,先用新版插件加载一次。路径错误不会创建空库。
  • “数据正在更新”:机器人正在处理资料或拍卖事务,等待完成后重试。若持续出现,核对文件权限、磁盘容量、日志及锁路径。
  • “例图不可用”:核对图片文件和 --media-root,以及容器与宿主机的绝对路径。已失效的远程图床链接需要更新。
  • 未配置消息来源的活动仅修改时间不会凭空产生群路由;请先通过机器人完成活动及前后台群设置。
开发验收

在项目源码根目录运行 python3 tests/test_auction_web.py,覆盖无 AstrBot 环境启动、鉴权/CSRF、资料编辑、跨活动编号隔离、版本冲突、图片上传与越界拒绝、活动任务重建和失败回滚、账务不变、跨进程锁及取消等待。原有插件回归脚本继续保留。

使用 python3 tools/pack_auction_web.py 生成独立包,bash .claude/pack.sh cym_auction 生成插件安装包。独立 ZIP 不含真实数据库、密码文件、缓存或运行状态。

拍卖价格规则(插件 v2.20.19)

回收价默认不公开,可在独立网站逐稿位设置公开。修改金额或公开开关不发送QQ群公告;之后的查询、批次、上新和出价消息遵循该稿位的公开选项,管理员网页始终显示实际金额。

出价必须大于等于起拍价,并严格高于当前目高;尚无出价时可以按起拍价出价。设置了回收价时,最高出价必须大于等于回收价才能成交;低于回收价的出价可以参与竞拍,截止时统一回收,不扣余额。回收价未设置或为0时,有有效最高出价即可成交。

回收价默认不公开,可在独立网站逐稿位设置公开。修改金额或公开开关不发送QQ群公告;之后的查询、批次、上新和出价消息遵循该稿位的公开选项,管理员网页始终显示实际金额。截止失败提示“最高出价低于回收价,无法成交,已回收”。手动截止、稿位定时截止、活动结束共用规则;手动回收仍直接回收;定时回收参数现在兼容统一按价结算。网页修改底价只影响后续截止判断,不重新结算已经截止的稿位。建议在后台群或管理员网站录入底价,避免管理员自己发送的命令文本暴露金额。

释放稿位(配套插件 v2.21.0)

管理员在网页稿位详情使用“恢复开拍”。已截止或已回收的稿位恢复开拍,原出价历史与目高保留,只退回该稿位尚未退回的实际成交扣款;以后再次成交按新的成交价扣款一次。重复释放或已按活动恢复过的款项不会重复退款。

活动须已开启且结束时间在将来,所属批次须已上新。原稿位定时清除后须重新设置;活动总结束时间仍有效。已结束活动需先在网站调整结束时间并开启,再恢复稿位开拍。

网站自动刷新显示释放后的状态、原目高和历史。Web 1.1.0也支持在稿位详情中直接“释放并恢复开拍”,使用与QQ相同的结算事务。先升级并重载插件2.22.0,再更新网站并重启;旧插件数据库只能编辑资料,状态操作会明确提示升级。释放前打开的旧表单会触发版本冲突,应重新打开再编辑。

网页修改稿位状态(Web 1.1.0 / 插件 v2.22.0)

进入稿位详情,在“修改稿位状态”中选择目标,点击“应用状态”,核对活动名、序号、稿位名和账务影响,再点击“确认执行”。资料有未保存修改时,先保存资料,再操作状态。

当前状态 可执行操作 结果
已截止、已回收 释放并恢复开拍 保留全部历史和目高,只退本稿位本轮未退的实际扣款;清除旧定时,之后成交重新结算
开拍中 暂停竞拍 保留出价及目高,清除旧定时;暂停期间不可加价,目高仍占用竞拍额度
未开拍、暂停 恢复开拍 活动开启且批次已到上新时间时恢复;不凭空产生退款
开拍中 截止并结算 最高有效出价达到回收价才成交并扣款,否则回收、不扣款;实际结果可能是已回收
开拍中、未开拍 回收 停止竞拍、保留出价历史,清除旧定时,不扣款

已结束稿位不能直接改成另一个结束状态,须先释放。活动未开启、已到结束时间、批次确实未到上新时间时,恢复开拍及截止会给出具体原因;已删除活动不能操作。网站暂停显示在“未开拍”状态组。

批次已到上新时间但旧任务漏执行时,释放或截止审查会补齐批次上新状态,只开启同批仍在筹备的稿位;已截止或已回收的其他稿位保持原状态。上新图文提醒交给机器人发送。QQ群批次查询同时显示上新时间与批次状态,不能仅凭显示了一个时间判断已经上新。

网站状态与余额修改无需AstrBot运行,但群提醒需机器人在线。提醒只同步该活动前台群,个人提醒只发送到有记录的原出价群;单群沿用已有定时或出价会话。没有来源会话时网站仍能保存状态,但无法凭空选择QQ群。普通资料编辑、回收价金额与公开开关修改,不产生QQ群公告。

所有状态操作使用同机写锁、版本检查及单一事务。另一人出价或操作后,旧表单必须重新打开;重复确认不会重复扣款或退款。审计保留前后记录,失败整体回滚。生产库迁移由插件执行,网站不自行迁移生产数据库。

当前定时与机器人版本

定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。 网站可直接设置、修改或取消稿位定时。插件2.23.6补齐仍有效定时的5分钟提醒,保留已完成的30分钟提醒记录。

到了上新时间仍不能恢复开拍(Web 1.1.1 / 插件2.22.2)

旧网站使用操作系统本地时间。若网站主机为UTC,而活动和批次按北京时间录入,网页会晚8小时判断开拍;AstrBot设置上海时区不能自动改变另一个独立Python进程的时区。例如北京时间2026-10-02 15:05,UTC主机仍是07:05,旧网站会错误拒绝15:00批次的恢复操作。

  1. 解压新的 cym_auction_web.zip,用其中 auction_web/ 替换实际运行的程序目录,保留数据库、图片及 auction-web-state/。
  2. 在原启动目录运行 python -m auction_web --version,应显示 auction_web 1.1.1。仍报不支持该参数时,说明实际运行目录尚未更新。
  3. 停止并用原启动命令重新启动网站,已有启动参数不变;若使用配套systemd服务,运行 sudo systemctl restart auction-web。新版本业务时间固定为北京时间(UTC+8),无需依赖主机TZ。
  4. 刷新网页,顶部“更新于”须标明北京时间并与当前时间相符。重新打开“活动一周年庆 → 1号稿位 → 释放并恢复开拍”,核对后确认;原15:00上新时间不需要挪到未来。已经到点的批次会补齐状态,出价和目高保留,只退回未退成交款。
  5. 配套更新插件2.22.2,保证QQ定时和网站使用同一时间口径,并修复插件退出卡住问题。单独升级插件不能修复旧网站进程。

只修正“当前时间”的取值,不修改已有活动/批次/稿位的时间字符串,不重写历史账目。既有数据库按北京时间解释;如曾按其他地区时间录入,应先核对实际安排。未到上新时间的批次仍不能提前开放,拒绝提示会列出上新时间与当前北京时间。

插件2.22.2停用时先取消后台任务,再保存昵称并关闭数据库;待执行定时和未完成通知留在数据库,上线后恢复。若旧版本已经卡在退出中,应先保留数据并替换修复版本,再从容器或服务管理器重启AstrBot。管理页面的重复卸载不能替代进程重启。

调整批次上新时间、恢复筹备中(Web 1.2.0)

进入 活动管理 → 找到目标活动和批次 → 调整上新时间,填写新的北京时间,点击 预览调整。核对活动名、批次号、新时间和影响范围,再点击 确认恢复筹备并保存。

例如:活动「一周年庆」批次1已上新,想改到次日16点再上新,在该批次填写次日 16:00:00,预览并确认。该批次立即显示“筹备中”,未结束稿位暂不可出价;机器人在线时,到新时间恢复开拍并发送原有的整批上新提醒。筹备中的批次也可以再次改期。

  • 新时间须晚于当前北京时间,且在活动开始时间及之后、结束时间之前。浏览器即使使用洛杉矶时区,填写的仍是北京时间。活动已结束、已删除或已经超过结束时间时不能改期;先核对活动安排。
  • 本批次的开拍中、未开拍稿位统一回到筹备状态,保留全部出价历史、当前目高和最高出价者。目高仍占用原有竞拍额度,不扣款、不退款。
  • 已截止、已回收稿位保持原状态及账务;不会因为批次改期而重新成交或释放。如需重拍这些稿位,请在新上新时间到达后,单独使用“释放并恢复开拍”。其他活动及批次不受影响。
  • 未结束稿位的原截止、回收、提前提醒任务一并取消,稿位定时字段及延期次数清零。重新上新后如需定时,请重新设置。活动的总结束时间仍有效。
  • 旧批次上新任务和待执行的补上新提醒作废,只保留新时间对应的上新任务,沿用原活动/批次的消息来源。保存本身不立即发QQ群公告;到点上新与群提醒需要机器人在线。
  • 版本校验覆盖批次、活动安排和批次内稿位。预览后有人出价、设置定时、修改状态或重新分批,旧表单保存会提示冲突,不覆盖新数据。关闭表单、重新打开核对后操作。
  • 批次、稿位、定时及修改记录在同一事务保存;出错全部回滚。修改记录能查看具体活动、批次和变更字段,数据库保留完整修改前后资料。

批次改期入口自Web 1.2.0提供,不增加QQ命令。当前完整版本为Web 1.7.0 / 插件2.25.0;本次回收价公开与统一定时需要先升级并重载插件,再更新网站,具体见下方升级说明。

验收建议:选专用测试活动中已经上新的批次,先给其中一个稿位出价并设置定时,再从网页改到几分钟后。检查筹备状态、原目高和余额保留、旧定时清除、筹备期间加价失败、到点只上新一次且可继续加价;另一个批次和已结束稿位不变。再测试过去时间、活动范围外时间、重复提交及两个窗口修改的冲突提示。自动回归见 tests/test_auction_web_batches.py 和 tests/test_auction_web.py。

回收价公开、统一定时结算与价格对比(Web 1.3.0 / 插件2.23.0)
回收价公开开关

在稿位详情的“回收价是否公开”选择“不公开”或“公开”,点击“保存修改”。新稿位和旧稿位升级后默认不公开。切换开关或修改回收价都不会额外向前台群发送公告;后续单稿位查询、稿位列表、批次查询/目高、上新提醒和出价通知按开关显示金额。改回不公开后,后续消息显示“不透露”,已经发出的历史消息无法自动收回。金额为0表示未设置成交底价,公开时显示“未设置”。

一个定时,按最终价格决定结果

进入稿位详情“设置稿位定时”,填写执行时间(北京时间),点击“设置 / 修改定时”,核对活动、稿位、时间和提醒影响后“确认执行”。可以修改或取消已有定时。设置定时本身不扣款或退款。

到点情况 结果
有有效最高出价,且目高大于等于回收价 已截止,交易成功,按成交价扣款一次
目高低于回收价,或无人有效出价 已回收,交易终止,不扣款
回收价未设置或为0 有有效最高出价就成交,无出价则回收

网站不再区分两个互相独立的“定时截止/定时回收”。在稿位详情设置统一结算时间,时间须在活动范围内。升级时旧定时回收自动转为按价结算,保留原时间及延期次数,不改动已经完成的成交或回收;管理员手动“回收稿位”仍是立即主动终止。

网站保存/修改定时后,会登记一次前台提醒,机器人在线时发送。剩余30分钟时再提醒;保存时已不足或等于30分钟,设置公告与预告合并为一条。剩余5分钟时再次提醒;保存时已不足5分钟则合并为一次5分钟提醒。最后5分钟内每次有效加价,将原结算时间再延长5分钟;之后再次进入最后5分钟还可继续延期,每次延期单独显示最新时间。报价失败不延期。已经发送过的30分钟预告不会因延期或重启重复发送。

定时公告和提前提醒仅发送到该活动绑定的前台群,后台群不广播;单独设置/取消公告不@;30分钟和5分钟预告在最高出价者的出价来源前台群@该成员,其他前台只有公共提醒。单群沿用原稿位定时、批次、活动或出价会话。无群绑定且无任何来源记录时,网站仍保存定时并提示交由机器人发送,但不能凭空选群;请先设置活动前台群。修改或取消后,旧任务和未发送的旧定时通知作废;取消也会通知前台,活动总结束时间仍有效。到点结算和群通知均需要机器人在线。

活动必须开启且未结束,批次已到上新时间、稿位可竞拍;新时间必须晚于当前北京时间且不晚于活动结束时间。活动结束不会抢先关闭已经有效加价延期的稿位。有人出价、触发延期或修改资料后,旧网页表单会提示冲突,应重新打开核对。设置、取消、提醒任务和审计在同一事务保存,失败全部回滚。

列表直接观察是否达价

外层稿位卡片同时显示“当前目高”“回收价”“起拍价”和回收价是否公开。目高大于等于回收价显示绿色“已超过回收价”(包括恰好相等);低于回收价或尚无出价显示“未超过”。回收价为0显示“未设置回收价”,不会把无底价误标为未达价。比较徽标仅用于管理员观察,实际状态与成交仍以结算结果为准。

升级与验收

先安装插件2.23.6并重载,让原数据库自动增加所需字段、统一旧定时并补齐有效定时的5分钟提醒;再替换网站 auction_web/ 目录并重启网站。保留原数据库、图片及网站账号目录。python -m auction_web --version 应显示 auction_web 1.9.0。新功能没有完成配套插件升级时只读提示,网站不自行迁移生产库。

验收:给测试稿位设置回收价1000,分别令目高为999、1000、1001,观察“未超过/已超过回收价/已超过回收价”。公开开关保存后群内不主动通知,之后查询显示相应金额或不透露。网页设置一小时后结算,检查立即公告、提前30分钟和5分钟预告并@当前最高出价者;最后5分钟有效加价应顺延并另发通知。到点分别测试无人出价、低于、等于和高于回收价,以及未设置回收价的情况。测试两个窗口冲突、改期、取消、重复提交、旧回收定时升级及机器人重启,不应重复扣款或退款。

QQ前台达价状态(插件2.23.1)

原本显示“交易中”的单稿位详情、稿位列表和“我上传的稿位”,在有有效目高且目高大于等于已设置的回收价时显示“交易中/已过回收”。无人出价、未达价、未设回收价以及其他状态保持原样;撤回或修改回收价后按最新数据重新判断。此标记不公开回收价金额,金额仍遵循公开开关。

此项只需更新并重载插件2.23.1;独立网站继续为1.3.0,无需为本项重启网站。

定时提及规则(2.23.6现行,保留2.23.2说明)

设置、修改、取消定时的单独公告只发公共文字;30分钟和5分钟提前提醒(含临近设置的即时提醒)@当前最高出价者。多群时仅在该成员出价来源前台群提及,其他前台发公共提醒。5分钟延期公告仍为普通文字;到点成交、到点回收及活动结束结果仍按原规则@相关出价者。

定时命令回执不自动@发令者,不改变AstrBot全局回复设置。2.23.2曾关闭所有预告提及;2.23.6起30/5分钟提醒恢复提及,设置和取消公告继续无@。通知重试保留已发送段落进度;本次请同时更新插件2.23.6与独立Web 1.3.4。

成交与扣款条件复核(插件2.23.3 / Web 1.3.1)

有有效最高出价且目高大于等于回收价,才允许成交并按成交价扣款一次。目高低于回收价或无人有效出价时,交易失败,稿位回收,不改变余额,也不产生扣款账单。回收价是否公开不影响判定;未设置回收价或为0时,沿用有有效出价即可成交的规则。

QQ手动截止、稿位定时结算、活动结束、网页“截止并结算”共用成交规则;底层实际扣款再核对一次条件,误调用不能绕过底价。状态、余额、账单和通知仍在同一事务中处理,失败回滚,重试不重复扣款。

升级:安装并重载插件2.23.3,替换独立网站 auction_web/ 目录并重启,python -m auction_web --version 应显示 auction_web 1.9.0。数据库和既有成交账目保持原样,本次无需迁移数据库。

当前目高合计的统计范围(Web 1.3.2)

点击“当前目高合计”卡片右上角的“范围”,勾选需要计入的稿位状态:开拍中、未开拍、已截止、已回收。支持任意组合,即时重算;默认仅勾选开拍中,沿用原来的统计范围。全部取消时显示0,尚无出价的稿位按0计算。未开拍稿位如保留了暂停前的目高,勾选后也会计入。

统计跟随左侧所选活动:“全部活动”合计所有未删除活动,选中某个活动时仅统计该活动。下方搜索、批次和状态筛选仅调整稿位列表,不改变合计范围;其他三张统计卡片保持原规则。合计是所选稿位的当前目高之和,不是成交收入或实际扣款总额。

范围选择保存在当前浏览器,自动刷新、切换活动、重新打开页面后保留;其他浏览器可单独选择。浏览器禁止本地存储时仍可操作,但重开页面会恢复默认。实时数据变化时,已展开的菜单与勾选状态保持,不影响继续操作。点击外部区域或按Esc关闭菜单。

本次保持页面整体布局、配色与四张统计卡片样式,仅在合计卡片内增加范围菜单。现有插件2.23.3可继续使用,只需替换独立网站的 auction_web/ 程序目录并重启网站,保留原数据库、图片和账号目录;python -m auction_web --version 应显示 auction_web 1.9.0。配套插件2.23.4仅同步版本和完整文档,本项不增加QQ命令、不修改拍卖状态或账务。

查询时显示已设置的截止时间(插件2.23.5 / Web 1.3.3)

稿位设置统一结算定时后,QQ单稿位查询、批次查询、批次目高、稿位列表、“我的稿位”和“我上传的稿位”,在对应稿位下显示 截止时间:2026-10-04 20:00:00(北京时间)。已有和没有出价的稿位一致处理,不新增QQ命令;“我的稿位”继续只发文字。

独立网站稿位卡片及详情同步显示此时间,无需额外展开定时操作区。显示的是该稿位当前有效的定时时间,修改或5分钟延期后,QQ下次查询和网页自动刷新读取最新值。未设定时、已取消定时,或结算/释放等操作清除定时后不显示这行;不使用活动结束时间代填,也不显示“截止时间未设置”。截止与回收共用的按价结算规则保持原样。

更新QQ查询请安装并重载插件2.23.5;更新网页请替换独立网站 auction_web/ 程序目录并重启,版本为1.3.3。保留数据库、图片与网站账号目录。页面整体布局、统计范围、余额和原有提醒策略保持原样。

截止时间筛选、全场目高与30/5分钟提醒(Web 1.3.4 / 插件2.23.6)

在稿位目录原有筛选栏点击“截止时间”,选择“全部稿位”“已设置截止时间”或“未设置截止时间”。可填写开始、结束时间后点击“应用筛选”;只填一端也可以,起止时刻均包含在结果内,开始晚于结束会提示错误。日期时间按北京时间解释,不随浏览器所在地转换。填写时间后只匹配已设置定时的稿位;选择未设置会清空时间范围。点击“清除”只重置截止时间筛选。

截止时间筛选可与活动、批次、稿位状态及搜索组合,应用后回到第一页。自动数据刷新和切换活动保留条件;延期导致稿位移出时间范围时,列表自动更新。范围针对稿位自身当前定时,不使用活动结束时间代替。顶部目高合计仍使用自己的状态范围,与目录筛选独立。页面沿用原有布局和配色,仅增加筛选入口。

插件2.23.7起,QQ中直接发送“查询目高”或“/查询目高”,按序号列出当前活动全部稿位,每件一行:53号 炊籽xxx | 1000¥;无人出价为 54号 作品名 | 暂无出价。只保留序号、作品名、当前价格,无标题、批次、上新或截止时间、图片和多余空行。未分批稿位一同按序号排列,长内容自动分段。单批“查询批次1目高”仍保留原图文详情。旧“设置全场批次图”保留参考图存储。本次仅需更新并重载插件至2.23.7,独立Web功能版本仍为1.3.4。

30分钟和5分钟提醒均@发送时的当前最高出价者。多群公共提醒发给该活动全部前台,个人提及仅在其出价来源前台;后台不广播,未参拍的群不@。没有有效出价时仅发公共文字;旧出价缺少来源群时不猜测群号。单独设置、修改、取消公告和延期公告仍为普通文字,成交和超价等通知保持原规则。

设置时不足或等于30分钟立即预告,之后保留5分钟提醒;设置或恢复运行时已不足或等于5分钟,两档合并为一次5分钟提醒。最后5分钟有效出价继续延长原时间5分钟并逐次公告;新的截止时间前5分钟重新提醒,已发送的30分钟提醒不因延期重发。重复执行和重启不重复发送同档提醒;取消、结束、改期会取消对应旧任务,升级补齐有效定时缺失的5分钟节点。

升级顺序:安装并重载插件2.23.6,再替换独立Web程序目录并重启至1.3.4。保留原数据库、图片与网站账号;网站不另开调度器,QQ提醒仍需机器人在线。完整测试步骤见插件 TEST_COMMANDS.md。

用户管理(Web 1.4.0 / 插件2.23.8文档)

登录独立网站后,点击左侧“参拍成员”。显示机器人已经记录或在余额、出价、稿位上传、成交账目中出现的用户,不代表QQ群完整成员名单。同一成员标识只对应一位用户;昵称相同的不同成员不会合并。优先显示管理员设置的显示名称,其次为最近记录的群昵称;尚无昵称时显示“未记录昵称”,同时保留完整成员标识(sender_id)便于核对。

列表显示全局余额、审核状态、当前目高作品件数及金额、已成交作品件数及金额、最近出价时间。余额是所有活动共享的当前余额,不按活动重复累加;从未录入余额显示“未录入”,余额为0则显示0。可搜索昵称、显示名称或成员标识,支持“已审核”“未录入余额”“年龄未审核”筛选,每页24人。上方四项统计针对全部已记录用户,不随搜索和审核筛选变化。

点击“查看”进入用户详情:

  • 身份与审核:成员标识、群昵称、显示名称、全局余额、审核状态、余额更新时间、审核人员标识及历史出价次数。
  • 已成交作品:当前状态为已截止且最高出价者为该用户的作品,显示活动、序号、作品名和成交金额。
  • 当前目高作品:尚未结束且最高出价者为该用户的作品,含恢复筹备后保留的目高,并显示其未开拍状态;显示活动、序号、作品名、价格及已设置的截止时间。
  • 已回收、已删除活动及已被其他人超过的作品不计入以上两组;历史出价和账目仍可追溯。释放重拍、撤回或成交后按当前数据重新分类,不把历史出过价的全部作品算作已拍到。
  • 出价记录:展开后显示最近100条,包含时间、金额、所属活动/作品以及撤回状态,并注明总数。
  • 成交扣款/退回记录:展开后显示最近100条及总数,包含作品、竞拍轮次、扣款时间与金额、扣款前后余额、是否退回、退回时间及退回前后余额。它记录成交扣款及对应退款,不包含所有手动余额录入操作;历史账目不等同于当前作品归属。

点击作品名称可打开原有稿位详情;关闭稿位详情后回到用户详情。用户列表和打开的详情每2秒刷新,搜索、审核筛选和页码保持;暂时断线显示错误提示并保留上次数据。页面隐藏时暂停轮询,重新显示时刷新。用户视图展示跨活动全局数据;点击左侧活动会切回该活动的稿位目录。

用户查询接口 /api/users 和 /api/users/{sender_id} 必须登录网站管理员账号后访问;查询本身只读,不会触发扣款、退款或QQ群通知。Web 1.5.0起,用户列表与详情另有余额录入入口,页面顶部提供全局清空;写入需管理员登录和操作预览确认。金额以普通数字显示,时间统一为北京时间。

升级:解压新的 cym_auction_web.zip,替换原网站 auction_web/ 程序目录并重启;保留原数据库、图片和网站账号目录,沿用原启动参数。python -m auction_web --version 应显示 auction_web 1.9.0。1.4.0的用户查询没有新增业务表或迁移。当前1.5.0管理功能请配合插件2.24.0升级,见下方完整说明。用户查询回归见 tests/test_auction_web_users.py、tests/test_auction_web.py。

完整管理操作(Web 1.5.0 / 插件2.24.0)

保留原有布局、资料编辑、用户查看、状态和定时入口,在对应页面增加以下操作。所有新增操作均采用“预览操作 → 确认执行”:预览显示具体活动、稿位/成员/出价记录和影响范围,5分钟内有效,修改输入后须重新预览;确认时再次核对当前数据。预览后有新出价或相关资料变化会拒绝执行,避免覆盖新数据。同一确认重复提交不重复执行。操作前资料、执行结果与管理员账号进入修改记录。

活动管理
  • “创建活动”:填写唯一名称、开始和结束时间(北京时间)。结束须晚于开始及当前时间;名称不能与现存或已删除活动重名。初始筹备中,机器人在线时按开始时间开启、到结束时间按原规则结算。
  • “查看 / 修改”:保留名称和时间编辑;已关闭活动可以把结束时间改到将来,再点击“开启活动”。改时间本身不会重开;已开启或关闭活动不能改开始时间。
  • “开启活动”:手动开启并重新安排活动结束任务;不自动恢复已取消的稿位定时,未上新批次仍不可出价。
  • “关闭活动”:停止出价,取消该活动、批次和稿位待执行定时,保留稿位和出价,不进行成交扣款或退款。这不同于逐个稿位“截止结算”。
  • “删除活动”:停止竞拍并从常规目录排除,保留历史出价和账目,没有活动恢复入口;不清空共享余额。确认前显示活动名及稿位数。

新活动的前后台群仍需在QQ中使用 /设置群 前台#活动名#群名、/设置群 后台#活动名#群名 绑定。网站不自动猜测通知群。

新增、删除、恢复和编号

在“稿位总览”点击“新增稿位”,或从活动卡片点击同名按钮:选择活动,填写作品名、画师、起拍价、回收价及公开选项、备注,上传一张例图或填写图片直链,两者选其一;可选填上传者成员标识。回收价默认为不公开;网页填写价格不发送群公告。暂存图片15分钟有效、每会话最多12张,过期重新选择后预览。

序号留空自动分配:优先使用通过改号释放的空号,否则接在既有最大编号后。可手动指定空闲或已删除稿位的编号;现有编号或名称被占用时拒绝,不覆盖。普通删除留下的空号不会自动使用,避免破坏原恢复位置;手动指定仍可使用。新稿位未分批,活动开启时可出价;如需分批上新,先在活动筹备时完成分批与时间设置。

进入稿位详情的“稿位管理”:

  • “调整编号”:输入本活动空闲编号,作品与图片、批次、定时保留,原编号释放供下次自动添加优先使用。仅未结束且从未有出价/成交记录的稿位可调整。
  • “删除稿位”:仅无任何出价历史(包括已撤回)、无当前出价和成交账目,且不是已截止的稿位可删除。按精确记录识别对象,不会因编号不存在而匹配其他稿位;预览列明活动、原编号、名称。
  • “已删除稿位”:从总览打开,可按活动筛选。点击“恢复”预览并按原记录/编号恢复;若编号、名称或原记录已占用,拒绝覆盖。资料与例图引用保留,旧定时不恢复。原批次已被替换时,未结束稿位恢复为未分批筹备中,需重新编排。所属活动已删除的记录不能恢复。

例:将新稿位98号调整为69号后,下次自动新增会优先使用释放的98号;若69号已有作品,则改号失败。若原69号已删除,使用69号会使原删除记录暂时无法恢复,须先空出69号。

批次编排

在活动卡片点击“批次编排”,选择活动及每批数量,预览每一批的稿位编号,确认后按编号升序重新分批。会替换原批次、取消旧上新安排和未结束稿位的定时,将这些稿位恢复筹备中;保留所有出价、目高及余额。已截止/已回收稿位保留状态。完成后在各批次点击“调整上新时间”重新安排。正在竞拍的活动重排会暂停其未结束稿位,预览会明确提示。

录入与清空余额

在“参拍成员”点击“录入余额”,或用户详情中点击“录入 / 修改余额”。从已登记成员选取完整成员标识(sender_id),也可输入真实标识;昵称仅供辅助辨认,不能用相同昵称替代身份。填写最终余额并确认已核实余额与年龄,预览旧值和新值后保存。

输入10000表示覆盖为10000,不是增加10000;可为0、最多1万亿,始终显示普通数字。每位成员仍只有一份跨活动全局余额;保存同时标记余额、年龄审核通过,保留原昵称,不发送QQ公告。

“清空全局余额”影响全部活动共用的所有成员余额和审核记录,不受当前活动或搜索筛选限制。它删除审核余额记录,不是设为0;保留成员档案、出价、作品归属和成交扣款/退回账目,不进行退款。成员需重新审核录入后继续竞拍。清空前显示人数,确认期间若新增或修改余额则拒绝执行,须重新预览。

全部出价历史和撤回

左侧“出价历史”查看所有成员、全部活动的历史记录,包括已删除活动的保留历史。按活动、作品、昵称/显示名/成员标识/作品关键词、出价状态和北京时间范围组合筛选;起止边界均包含。每页50条,按记录编号倒序,逐页可查看完整历史,不受用户详情最近100条的限制。“未撤回”只表示记录有效,不表示该成员仍持有目高。列表包含记录号、时间、活动、作品编号和名称、成员昵称与完整标识、金额、撤回状态及撤回时间。

点击目标记录“撤回”后预览:准确列出选中记录、该笔及之后会被作废的出价、新目高及其成员;确认后原子作废并重算。金额相同或成员重复也通过记录号精确区分。已撤回或已成交稿位的出价不能再次撤回;已成交状态应先按既有释放流程处理未退扣款后再操作。撤回不修改余额、不扣款/退款,不回退此前因出价延长的截止时间。

例:A1000、B2000、C3000、B4000,选中B2000那笔,则B2000、C3000、B4000同时作废,目高恢复A1000。撤回第一笔后变为暂无出价。被撤回记录保留在历史表,可筛选查看。

机器人在线后发送公共目高变更和参拍者提醒:多群只向活动绑定的前台发送,成员仅在其出价来源群被@;后台不广播。单群模式在记录来源群提醒该群参拍者。旧记录缺少来源时不猜测成员所在群;新Web活动尚未绑定群时先完成群绑定。网站本身不连接QQ发送消息。

升级与验收

先安装并重载 cym_auction.zip 2.24.0,再替换独立网站的 auction_web/ 1.5.0 并重启;保留原数据库、图片、账号目录和启动参数。运行 python -m auction_web --version 确认为 auction_web 1.9.0。插件包可直接在AstrBot上传安装,ZIP根目录含metadata.yaml;独立Web包单独解压运行。本次不新增业务数据迁移,不自动改动现有活动、余额或出价。

请先在演示库验证创建活动、增加作品、改号释放、删除恢复、重新分批、余额录入/清空,以及出价筛选和撤回;完整步骤在插件TEST_COMMANDS.md。1.5.0仅增加上述管理模块,不增加QQ命令;1.6.0新增的拍卖用户个人页见下文。

拍卖用户账号与个人页面(Web 1.6.0 / 插件2.24.1文档)

总管理员继续使用原网站管理员账号登录;受限管理员使用分配的管理账号,参拍者使用分配的普通账号登录同一网址。下文普通账号操作受“账号与权限”中的授权与层级范围约束。后端决定账号角色,用户不能自行注册、绑定身份或提升权限。创建网站账号不会授予QQ管理权限,也不会自动录入余额或完成年龄审核。

管理员创建和维护账号
  1. 登录网站管理员账号,进入左侧“账号与权限”(也可在“参拍成员”点击“登录账号管理”)。
  2. 点击“创建用户账号”,填写登录账号、绑定成员 sender_id、密码和确认密码。登录账号为3–80位英文字母、数字、点、下划线或短横线,普通用户登录不区分大小写;不能与管理员重名。
  3. sender_id可从已登记成员中选择,也可填写准确的原始标识,兼容已有 <@标识> 形式。昵称仅供辨认,同名成员不会自动合并。不要使用昵称或根据QQ号猜测QQ官方身份。
  4. 点击“核对账号”,检查显示的账号、成员昵称及完整标识,再“确认保存”。每个账号绑定一个 sender_id,同一个 sender_id只能绑定一个账号;已停用账号仍保留绑定,重复时应管理原账号。
  5. 将账号与密码通过私密渠道交给本人。密码为12–256个字符,后台不能查看已保存的密码,只能重设。

账号列表可按登录名、昵称、成员标识搜索。“管理”中可以修改绑定、重设密码、启用或停用账号,以及设置“允许查看全部作品回收价”;密码留空表示保持原密码。登录账号创建后不改名;停用用于停止访问,不删除拍卖资料或账号审计。修改绑定前会列出原、新成员标识并要求核对,因为它会改变该账号能查看的全部个人资料。回收价权限的新旧账号默认关闭,开启范围与操作见文末专节。

保存任何绑定、密码、启停或回收价权限变更后,该账号原有的所有登录会话失效;重新启用不会让旧会话恢复。用户须重新登录。管理员与其他普通账号不受影响。并发编辑同一账号会被版本校验拦截,要求重新核对。账号操作记录显示在账号列表底部,完整审计保存在网站账号库;不包含明文密码、密码散列或盐。

如果所填 sender_id还未出现在拍卖数据中,账号仍可创建,个人页显示“未录入余额”和空稿位/历史;当机器人或管理员为同一标识记录资料后自动出现。网站不按昵称、账号名自动匹配其他身份。若信息为空,管理员先核对绑定,不要反复创建账号。

用户能看到什么

普通用户登录后进入“我的拍卖”,没有管理员导航和修改按钮。页面每2秒更新一次,隐藏标签页暂停刷新;发生断线时明确提示旧数据,退出或会话失效后清空个人信息。

区域 内容
当前余额 本人的一份全局余额与审核状态;未录入和0余额区分;实际成交扣款/恢复后读取新余额
已成交的稿位 已截止且当前最高出价者为本人,显示例图、所属活动、编号、名称和本人成交价
当前目高稿位 本人当前持有最高出价、尚未结束的稿位,包括暂停后保留目高的筹备中稿位
仍在参与的稿位 本人在未结束稿位上有有效出价,但目前已被超过;显示例图、当前目高及本人的有效出价金额,不显示其他出价者身份
我的出价历史 本人全部历史出价,含已撤回记录;每页50条,支持作品/活动/序号搜索和撤回状态筛选,没有最近100条限制

作品分组排除已回收稿位和已删除活动,但本人历史出价仍保留。未撤回不代表仍持有目高。暂停、活动关闭会显示对应状态;设置了稿位截止时间时显示北京时间。个人稿位列表和出价历史提供等比缩略图,“仍在参与”同时列出当前目高与我的有效出价。默认不显示回收价;仅当管理员为账号开启回收价查看权限时,个人稿位增加回收价,且可进入全部作品回收价目录。管理员稿位详情、管理员图片接口、其他人的身份/余额/逐笔历史始终不开放。图片走图床直链或校验本人关联的个人图片接口。余额和出价操作继续由管理员/QQ处理,普通用户网页只读。

权限隔离方式
  • 原管理员接口继续要求管理员身份,并按具体功能权限校验;总管理员拥有完整功能。普通用户仅能访问自身会话、个人概览、个人出价历史、与本人竞拍记录相关的例图以及退出登录;另有单独授权的回收价目录。新增或未知管理接口也默认拒绝。
  • 个人查询从服务端登录会话取得绑定 sender_id,所有数据查询附带该身份条件;不接受浏览器通过参数指定别人。修改地址、成员编号、出价记录号或页面脚本不能获得管理接口或他人数据。
  • 个人响应逐字段构造,不复用包含其他成员资料的管理员完整响应。不返回他人姓名/标识/余额/逐笔出价、图片文件路径、来源群或管理审计;本人相关稿位可显示当前目高金额。无回收价权限时不返回回收价字段;有权限时只增加作品回收价及最小目录信息。
  • 每次请求检查账号是否启用及会话版本;读取期间发生换绑或关闭权限也拒绝返回原资料。密码/绑定/启停/回收价权限变更立即撤销原会话权限;前台在下一次刷新返回登录页并清理资料。
  • 退出、换账号时清空已渲染资料;同一浏览器其他标签页同步清理并重新读取会话。浏览器存储不可用时,旧会话标记也会被接口拦截。页面不将账号资料、余额或令牌写入localStorage;标签页通知只保存无身份含义的随机标记,会话由HttpOnly Cookie管理。
  • 密码使用随机盐和scrypt保存,不提供明文查询;Cookie沿用HttpOnly、SameSite和HTTPS下Secure;账号写操作检查登录、CSRF及请求来源。成功登录不消耗失败限流次数,以支持反向代理下多人访问;持续错误密码会被限流。
部署、升级和备份

本项更新独立Web即可:解压 cym_auction_web.zip,替换 auction_web/ 程序目录并重启,版本应显示 auction_web 1.9.0。当前插件2.24.0可继续使用;配套插件2.24.1同步完整指南、测试步骤和历史日志,运行逻辑不变。不要将独立Web包上传到AstrBot插件安装窗口,插件窗口使用 cym_auction.zip。

继续使用原启动参数、HTTPS域名、拍卖数据库、图片和 --state-dir。网站会在原 --state-dir 中建立独立的 accounts.db(账号及账号审计),原 admin.json 保留。该目录须可写;新账号库文件权限为600。无需修改或迁移 auction.db,也不改变现有余额、出价和QQ规则。机器人离线时,网站仍可读取已保存的数据库状态;自动结算和群通知仍需机器人在线。

升级和迁移时须保留整个网站凭据目录,包括 admin.json 与 accounts.db;不要把它们放进源码安装包或公开静态目录。已有 backup --db /拍卖目录/auction.db 只备份拍卖业务库,账号库另行备份,例如:

python -m auction_web backup --db ./auction-web-state/accounts.db --output ./backups/accounts-before-upgrade.db

输出目标须不存在;管理员凭据 admin.json 单独随凭据目录保留。重启网站会让所有会话失效,但账号、密码与绑定继续保留。忘记用户密码由管理员网页重设;忘记管理员密码仍通过原 admin 命令重设并重启。

示例:创建登录账号 member001,绑定真实成员标识A并设置密码。该用户登录只能看到A的余额、稿位和出价;管理员把账号停用后,原页面刷新立即退出。若将账号绑定改为标识B,必须先核对确为同一用户的正确身份,旧会话作废,重新登录后仅按B查询,绝不会把A/B资料合并。

自动回归见 tests/test_auction_web_portal.py,覆盖两个同名成员的隔离、全部管理路由拒绝、篡改查询参数、全量分页、禁用/重设/换绑、读取中换绑、持久化与查询无账务副作用。完整手工验收见插件TEST_COMMANDS.md。

用户排序、快捷账号与密码生成器(Web 1.6.1 / 插件2.24.2文档)
用户列表排序

管理员进入“参拍成员”,在原有搜索和审核筛选旁选择排序依据及方向。支持“余额”“当前目高金额”“当前目高件数”“已成交金额”“已成交件数”,可选“从高到低”或“从低到高”。默认排序保留原列表顺序;金额按数字比较,不按文字比较,100排在20之后(升序)。

排序作用于搜索、审核筛选后的全部用户,然后每页展示24人,不是只排序当前页;切换排序或筛选回到第一页。自动刷新和打开/关闭用户详情后保持当前排序选择,退出账号后重置。未录入余额始终在余额排序末尾,零余额、负余额按真实数值处理。当前目高和已成交沿用原来的跨活动统计口径,不改变余额或拍卖结果。

每位用户快捷设置账号

用户列表每一行以及用户详情均增加“设置账号”:

  • 尚无账号:直接打开创建窗口,自动填入该用户的sender_id及昵称提示;管理员只需填写登录账号和密码,再核对保存。
  • 已有账号:直接打开此成员绑定的原账号,可重设密码或启停;已停用账号也会打开原记录,不重复创建或自动启用。
  • 快捷入口固定所选成员标识,防止选错同名用户或误绑定。要主动更换绑定,仍从“登录账号管理→管理”进入原完整表单;昵称只辅助辨认,不作为身份依据。

入口打开前读取最新账号列表;读取失败会明确提示,不按过期信息创建。保存仍沿用唯一绑定、版本冲突检查及预览确认。账号保存变更后,该账号原登录会话失效;个人资料仍只限本人,另可独立授权全部作品回收价。

密码生成与复制

创建账号、快捷设置和原账号管理窗口中均提供“生成随机密码”“显示密码”“复制密码”。生成器使用浏览器安全随机源生成20位密码,包含大写字母、小写字母、数字及短横线/下划线,自动填入密码和确认密码两个输入框;默认隐藏。无需向第三方请求密码,不在日志或浏览器持久存储中保存明文。

  1. 填写账号信息或打开原账号,点击“生成随机密码”。
  2. 点击“复制密码”,通过私密渠道交给账号本人;需要核对时可“显示密码”,之后再隐藏。
  3. 点击“核对账号”,确认成员绑定、账号和启停状态,再“确认保存”。生成或复制本身不会修改账号;重设密码只有保存后生效。生成新密码、编辑表单后必须重新核对。

保存后表单清空,后台不能查看旧密码,请在保存前复制;取消、关闭、退出登录同样清空密码并恢复隐藏状态。浏览器限制自动复制时会显示并选中密码输入框,提示用系统快捷键或长按复制;复制信息停留在系统剪贴板,由管理员自行管理。安全随机源不可用时明确提示手动填写,不使用不安全的随机数替代。

本次只更新Web即可:替换auction_web/程序目录、重启,版本为auction_web 1.9.0。保留业务库、图片及整个--state-dir,包含admin.json、accounts.db。配套插件2.24.2仅同步版本及完整文档,原2.24.0及以上插件无需因本功能改变运行配置;不新增QQ命令或数据库迁移。

自动测试:node tests/test_auction_web_user_tools.cjs、python3 tests/test_auction_web_users.py与python3 tests/test_auction_web_portal.py。手工验收见插件TEST_COMMANDS.md。

客户页当前目高与稿位图片(Web 1.6.2 / 插件2.24.3文档)

“仍在参与的稿位”显示两个独立金额:当前目高是该稿位最新最高价,我的有效出价是当前用户在该稿位上的最高有效出价。目高发生变化时随页面自动更新,不把别人的目高误算为自己的出价,也不显示目高成员的姓名或标识。

“已成交的稿位”“当前目高稿位”“仍在参与的稿位”全部增加例图。个人出价历史每条作品也显示更小的缩略图;历史出价金额仍是本人当时的出价,不用当前价格覆盖历史。图片等比完整显示,不裁剪;电脑列表约112×84px、手机约76×60px,历史约64×48px。

图片优先复用原有图床地址,本地图由个人图片接口输出长边最多320px的JPEG,不放大小图;无例图或加载失败分别提示“暂无例图”/“例图不可用”。图床有本地备份时失败会自动回退,不要求重新上传或填写新的图床Token。翻页和价格刷新复用已有图片机制,例图地址只随图片变化而变化。

权限与隐私:

  • 本地例图仅通过/api/me/artworks/稿位内部编号/image读取;从登录会话取得绑定成员,不能通过参数指定他人。无关稿位、未知编号和已删除活动统一拒绝。管理员完整稿位/图片接口继续不对普通用户开放。
  • 允许读取当前归本人持有的稿位,或本人有历史出价记录的稿位图片(含已撤回记录,历史仍归本人)。未曾参与且不归本人持有的稿位图片不能读取。
  • 每次图片请求(含HEAD和浏览器缓存校验)都检查登录与作品关联;停用、换绑、重设密码后的旧登录不能取图。图像转换期间删除活动或换图时重新核对;错误不暴露服务器目录。
  • 个人响应只带可展示的例图地址,不带本地文件路径、管理详情或他人身份。图床直链沿用既有公开图片服务;网站不会下载未知远程地址作为代理。

本次只需更新并重启独立Web,版本为auction_web 1.9.0。保留原数据库、图片、图床缓存及整个state-dir;不改拍卖余额或竞价规则,无业务库迁移。配套插件2.24.3同步完整指南、验收与日志,运行逻辑不变。

自动验收:python3 tests/test_auction_web_portal_images.py、python3 tests/test_auction_web_portal.py、python3 tests/test_auction_web_media.py、python3 tests/test_auction_web.py及node tests/test_auction_web_images.cjs。

账号回收价查看权限(Web 1.6.3 / 插件2.24.4文档)
管理员设置

进入“参拍成员”,在对应用户行或详情点“设置账号”;也可进入“登录账号管理→管理”,或者在创建用户账号时设置。表单增加 允许查看全部作品回收价 选项,账号列表也显示当前是否允许。

  1. 勾选表示允许,不勾选表示保持原有个人页显示方式。新账号与升级前已有账号均默认不勾选。
  2. 点击“核对账号”,确认对应成员、账号以及回收价权限范围,再“确认保存”。单独调整权限时无需输入新密码。
  3. 保存权限变更后,该账号所有旧登录失效;请用户重新登录。其他账号的权限与会话不受影响。关闭后,原页面下一次刷新退出并清空回收价;原先正在读取的请求也不能继续返回价格。
  4. 账号列表底部显示权限操作记录,完整记录保存在账号库,含操作人、时间及变更前后权限。并发修改冲突时需重新核对,不覆盖其他管理员的修改。
开启后用户能查看的范围
  • 个人页已成交、当前目高、仍在参与的作品增加“回收价”一行。
  • 页面顶部增加“查看全部作品回收价”入口,下方提供独立的“全部作品回收价”列表。覆盖所有未删除活动中的现存作品,包括未参拍、未开拍、开拍中、已截止和已回收作品;不恢复已删除作品或已删除活动。
  • 列表仅显示活动、作品编号/名称、状态和回收价。可按活动筛选,按作品名、活动名或序号搜索,每页50条,支持全量翻页。没有设置回收价显示“未设置”,金额采用普通数字,不使用科学计数法。
  • 包含尚未公开的回收价格,不受稿位“公开回收价”开关限制。此授权仅影响该网站账号;不会改变作品的公开设置,不发送QQ群通知,也不会让QQ普通查询公开金额。
  • 其他成员的身份、余额、逐笔出价历史及管理员接口仍不可访问。原个人页/个人图片权限保持:只能查看自己的竞拍记录和相关例图,回收价目录不会额外开放全部作品图片或他人竞价资料。

关闭权限时,不展示回收价目录及入口,个人响应不包含回收价字段,保持本次更新前的显示范围。浏览器修改参数、手动请求目录或篡改页面不能开启权限;权限始终由服务器读取当前账号记录。

示例:管理员为member001开启此项,即使该用户尚未出价,也可以按活动查询全部作品的回收价。member002未开启,仍只查看自己的余额、稿位和出价历史。取消member001权限并保存后,该用户重新登录回到默认个人页。

升级与验证

替换独立网站的auction_web/目录并重启,运行python -m auction_web --version应为auction_web 1.9.0。沿用原启动参数,保留业务数据库、图片、图床缓存及整个state-dir,尤其是admin.json与accounts.db。

启动时自动为旧accounts.db增加默认关闭的权限字段,原账号ID、登录名、绑定、密码和审计保留;可重复升级。升级前可使用前文的backup命令另行备份账号库。此更新不修改拍卖业务库、不改余额与出价,不需要更换图片或重新建立账号。配套插件2.24.4同步完整说明、测试命令及更新日志;本项更新Web即可使用,已有2.24.0及以上插件运行逻辑不变。

自动验收:python3 tests/test_auction_web_reclaim_permission.py、node tests/test_auction_web_reclaim_ui.cjs,并回归原个人页、个人图片和Web接口;覆盖旧账号升级、默认关闭、授权全部作品、跨用户隔离、分页筛选、关闭权限期间的请求、账号切换与移动布局。手工验收见插件TEST_COMMANDS.md。

分级管理员与独立账号管理(Web 1.7.0 / 插件2.25.0文档)
账号类型和层级

网站账号分为管理员和普通用户。管理员中,原admin.json配置的账号为总管理员,始终保留全部权限,不能在网页中被停用、删除或降权;其密码仍按原admin命令维护。其余管理员存放在网站账号库中,按需分配管理功能,不绑定参拍成员身份。

普通用户的余额、个人作品、出价历史、图片和回收价查看选项保持原样。已有普通账号迁移后直属总管理员,原密码、启停状态、成员绑定及回收价许可全部保留。账号类型创建后不转换,现有普通用户不会自动升为管理员。

总管理员可管理全部下设账号,并可在创建时选择已启用的上级管理员。下级管理员获得相应账号管理权限后,可在本人名下继续创建账号、管理本人下属及其后代;不能管理本人、同级、上级或其他分支。现有账号不提供改上级入口。

授权不能超过操作者和目标上级已拥有权限的交集。 例如,上级只给了“录入余额”,下级即使有分配权限的资格,也不能给其他人开启“清空全部余额”。新管理员默认没有管理功能,新版本增加的权限也不会自动授予已有下级。

页面入口与操作
  1. 原管理员登录后进入左侧 账号与权限。原用户数据页改称 参拍成员,余额、排序、作品详情和快捷设置账号等原功能仍在。
  2. 账号中心列出账号类型、上级、绑定成员、功能数量和状态;可搜索登录名/成员,筛选管理员或普通用户、启用/停用/已删除。上级被停用时显示“上级已停用”。下方保留最近账号审计。
  3. 点击“创建管理员”或“创建用户账号”。管理员不需要sender_id;普通用户仍绑定一个真实成员。填写登录名和密码,可沿用随机密码生成、显示/隐藏和复制功能。总管理员可选择上级,下级创建的账号固定归本人管理。
  4. 管理员表单按模块列出全部57项权限。勾选操作会补齐所需的查看权限;取消查看权限会同时取消依赖它的操作。上级未授权的功能不可选择,具体勾选结果在保存前逐项列出。
  5. 点击“核对账号”检查对象、权限、启停和密码变更,再“确认保存”。用户须重新登录,当前账号与下属的旧会话失效;其他分支和总管理员会话不受影响。
  6. 点击列表“查看 / 管理”修改获准操作的项目。可只改权限,无需重设密码。未被授予的功能入口隐藏或只读,直接构造请求也会被服务器拒绝。无任何功能的管理员登录后看到等待授权提示。
  7. 删除账号先核对具体登录名及上级。删除会撤销登录资格,保留账号名与审计,不删除拍卖资料;普通成员绑定可由新账号重新绑定,旧登录名不复用。有未删除下属时拒绝删除,应先处理下属或先停用整个分支。
全部功能权限

以下为当前网站全部管理能力。搜索、排序和分页属于相应查看权限;创建功能包含初始必填资料,后续修改仍逐字段授权。涉及余额的结算/释放按原拍卖规则完成,不直接等同于手工余额修改。

模块 可独立开启的功能 必要查看/管理依赖
拍卖资料 查看活动、批次与稿位 无
拍卖资料 查看回收价格(含未公开) 查看活动、批次与稿位
拍卖资料 查看活动群绑定 查看活动、批次与稿位
成员与余额 查看成员资料、余额、持有作品与账目 无
出价 查看全部出价历史 查看活动、批次与稿位、查看成员资料、余额、持有作品与账目
稿位 查看已删除稿位 查看活动、批次与稿位、查看回收价格(含未公开)
审计 查看拍卖修改记录 查看活动、批次与稿位、查看回收价格(含未公开)、查看成员资料、余额、持有作品与账目、查看全部出价历史、查看活动群绑定
活动 创建活动(含初始名称及时间) 查看活动、批次与稿位
活动 修改活动名称 查看活动、批次与稿位
活动 修改活动开始时间 查看活动、批次与稿位
活动 修改活动结束时间 查看活动、批次与稿位
活动 开启活动 查看活动、批次与稿位
活动 关闭活动并取消相关安排 查看活动、批次与稿位
活动 删除活动 查看活动、批次与稿位
稿位 新增稿位(含初始资料、价格和例图) 查看活动、批次与稿位、查看回收价格(含未公开)
稿位 修改稿位名称 查看活动、批次与稿位
稿位 修改画师 查看活动、批次与稿位
稿位 修改起拍价 查看活动、批次与稿位
稿位 修改回收价 查看回收价格(含未公开)
稿位 修改回收价公开设置 查看回收价格(含未公开)
稿位 修改备注 查看活动、批次与稿位
稿位 更换例图或图片地址 查看活动、批次与稿位
稿位 调整稿位编号 查看活动、批次与稿位
稿位 删除稿位 查看活动、批次与稿位
稿位 恢复已删除稿位 查看已删除稿位
批次 重新编排批次(含暂停与取消旧定时) 查看活动、批次与稿位
批次 设置批次时间及退回筹备中 查看活动、批次与稿位
定时 设置或修改稿位结算时间 查看活动、批次与稿位
定时 取消稿位定时 查看活动、批次与稿位
竞拍状态 释放并恢复开拍(含退回未退成交款) 查看活动、批次与稿位、查看回收价格(含未公开)
竞拍状态 暂停竞拍 查看活动、批次与稿位
竞拍状态 截止并按规则结算扣款 查看活动、批次与稿位、查看回收价格(含未公开)
竞拍状态 回收稿位 查看活动、批次与稿位、查看回收价格(含未公开)
成员与余额 录入或覆盖余额及审核 查看成员资料、余额、持有作品与账目
成员与余额 清空全部余额与审核 查看成员资料、余额、持有作品与账目
出价 撤回指定及后续出价 查看全部出价历史
账号 查看下属账号与账号审计 无
账号 创建下属普通用户账号 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 创建下级管理员账号 查看下属账号与账号审计、分配下级管理员功能权限
账号 修改下属用户成员绑定 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 重设下属账号密码 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 启用或停用下属账号 查看下属账号与账号审计
账号 删除无下属的账号 查看下属账号与账号审计
账号 分配下级管理员功能权限 查看下属账号与账号审计
账号 授予用户全部作品回收价权限 查看下属账号与账号审计、查看回收价格(含未公开)

依赖会递归补齐,并显示在核对清单中。例如,“撤回出价”需要查看出价和成员,“录入余额”需要查看成员余额,“设置结束时间”只需要拍卖资料查看,不会连带开启修改开始时间或删除活动。

“查看成员资料、余额、持有作品与账目”涵盖原参拍成员页的全部查询内容,包含余额、审核、当前目高/已成交统计、本人近期历史与账目。“查看全部出价历史”控制独立历史表和稿位详情的逐笔出价。未授权查看回收价时,目录和稿位详情不传回收价格;未授权查看成员时,不传目高人或上传者标识,但稿位价格与成交件数仍可正常统计。拍卖修改审计可能含价格和成员信息,其依赖会在表单中明确勾选。

权限范围包含独立Web全部管理功能;1.9.0新增的系统设置与QQ管理员授权使用独立权限,参见本文顶部。

停用、收回与删除的影响
  • 停用一个管理员,其整个下属分支(含普通用户)均无法登录;原会话在下一次请求失效,页面清理资料。重新启用后须重新登录,旧会话不会复活;下属自身被停用的状态不自动恢复。
  • 收回管理员某项功能,所有后代相应功能同步收回;缺少必要依赖的操作也撤销。若收回“授予用户全部作品回收价权限”,该分支普通用户相应许可一并关闭。以后恢复上级权限不会自动重新授权下级,需逐个重新分配。
  • 删除仅接受没有未删除下属的账号,不级联清除整树,也不清除竞拍余额或作品。已删除账号不能再启用;通过“已删除”筛选仍可查审计,原账号名保留。
  • 账号类型与上级不可通过编辑接口变更,不能借改绑、重设密码、自授权限或篡改页面越过层级。重设用户密码/改绑本身属于独立管理权限,并包含所需的成员资料查看依赖。
  • 管理修改使用账号版本校验,过期草稿要求刷新重新核对。管理写入与撤权按顺序执行,已撤权的旧会话和旧操作预览不能继续提交;读取过程中撤权也不返回旧资料。
配置示例

余额管理员:勾选“录入或覆盖余额及审核”,自动补齐“查看成员资料、余额、持有作品与账目”。不勾选“清空全部余额与审核”,该账号即可录入/修改余额,但不能一键清空。

活动时间管理员:勾选“修改活动结束时间”“设置批次时间及退回筹备中”“设置或修改稿位结算时间”“取消稿位定时”,自动补齐“查看活动、批次与稿位”。账号可调整上述时间,活动名称、开始时间、价格及余额不可修改,也不能查看未公开回收金额或成员身份。

可带下级的管理员:在所需业务功能之外勾选“创建下级管理员账号”“分配下级管理员功能权限”,并按需勾选启停、删除、密码等账号操作。下级最多获得操作者已有功能,不能越权授予,也不能管理其他分支。

升级、备份与验证

更新独立Web目录并重启,python -m auction_web --version应为auction_web 1.9.0。保留原启动参数、数据库、图片和整个state-dir。升级前停止Web并备份账号目录,尤其是accounts.db与admin.json;若存在SQLite的wal/shm文件,应一同保留或使用前文在线backup命令生成完整账号库备份。

首次启动自动迁移网站账号库,保留旧账号ID、密码散列、绑定、回收价许可、启停、时间与审计;不迁移或修改拍卖业务库。原管理员凭据直接作为总管理员使用。升级不要求重新建立普通账号,不影响QQ权限及余额规则。配套插件2.25.0同步全部文档和版本,运行逻辑保持;原2.24.0及以上插件可继续配合网站使用。

回退至旧Web前应恢复升级前账号库备份,避免旧版本不了解管理员类型与删除状态。不要只将旧程序覆盖到新账号库上。

自动验收:tests/test_auction_web_admin_ui.cjs覆盖权限依赖、预览、删除和退出清理;tests/test_auction_web_admin_permissions.py逐接口/字段验证57项权限、授权正例、拒绝越权、层级收权、停用删除、旧库迁移、读取及预览期间撤权;并回归原Web管理、普通用户、个人图片与回收价授权。手机/桌面手工检查步骤见插件TEST_COMMANDS.md。

单独@机器人的快捷说明

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额

返回文档入口

完整测试命令

当前测试清单 — 2.27.1

使用专门测试活动、群和成员。真实@选中成员,示例“秋拍”替换为测试活动;金额操作会真实修改测试数据。此处包含全部27个主命令;旧版测试完整存档,不用于现版本。

前置与Web迁移检查

  1. 升级插件后重启网站,打开系统设置核对原管理员、图床域名和密钥“已配置”标识。
  2. 消息设置将图片尺寸240改为260,预览保存,等“机器人已读取”;重新登录及重启插件后仍为260。
  3. 留空密钥保存应保留;在测试配置勾选清除后显示未配置;密钥不出现在预览或审计。
  4. 下级管理员只授予消息设置:可以修改尺寸,不能操作图床、QQ管理员或余额修复;普通用户只有个人资料。
  5. 网站创建测试活动、稿位、附图、批次并设置上新;管理页测试删除/恢复空稿位、编号调整、定时与恢复开拍。已成交稿位不得作为删除测试对象。
  6. 系统设置修改群别名/角色/活动;验证解绑或改绑后旧通知不会继续送到此群。失败通知补发只补剩余分段。
  7. 使用专用成交测试数据按活动恢复余额,两次操作不得重复退钱;旧余额核对只处理一次,必须核对最终余额。

自动配置迁移回归:python3 tests/test_auction_settings_migration.py。仅使用临时测试库和配置文件,覆盖普通UTF-8、UTF-8 BOM、原文件不变、管理员合并、重启幂等、损坏配置中止及修复后重试。不要用正式配置进行破坏性测试。

QQ全部命令

活动管理

/活动列表(成员)

/活动列表

预期:查看所有未删除活动的名称、状态及起止时间,用于核对群绑定和其他活动命令。

稿位管理

/稿位列表(成员)

/稿位列表
/稿位列表 秋拍

预期:列出当前活动的全部稿位与例图;需要查询其他活动时追加活动名称。

/我的稿位(成员)

/我的稿位
我的稿位

预期:查询本人跨活动的已截止成交稿位和当前尚未截止的最高出价稿位,两组均只显示文字。被超价、已回收、撤回后不再领先的稿位不计入。

/我上传的稿位(成员)

/我上传的稿位
我上传的稿位

预期:查看本人上传的所有状态稿位,包含图片;不是本人竞拍领先的列表。

/查看稿位(成员)

/查看稿位 1
查询1号稿位

预期:按序号或完整名称查看状态、画师、例图、起拍价、回收价(按公开设置显示)、备注、目高及最高出价者。不显示上传者、创建时间或定时细节。交易中目高达到已设置的回收价时,状态显示交易中/已过回收。

/更多例图(成员)

/更多例图 秋拍#1
查看1号稿位更多例图

预期:单独查看稿位的附属例图,按编号展示小图,不重复主图。无附图时提示暂无更多例图;未指定活动时沿用本群绑定活动或当前活动。也可直接输入 查看1号稿位更多例图。

批次与查询

/查询批次(成员)

/查询批次
/查询批次 1
查询批次1

预期:无参数时查看批次信息;指定编号可查看该批上新时间、全部稿位和对应例图。

/查询批次目高(成员)

/查询批次目高 1
查询批次1目高

预期:显示该批全部稿位的目高、状态、备注及例图。未开拍、已截止、已回收使用相应状态提示。

/查询目高(成员)

/查询目高
查询目高

预期:显示已设置的全场批次总览图及批次信息,并提示使用查询批次1目高;不一次刷出全场所有详情。

余额与审核

/恢复余额(管理员)

/恢复余额 秋拍

预期:将指定活动尚未恢复的成交扣款加回成员当前共享余额,每笔只恢复一次。须填写完整活动名,多群模式限后台管理员;支持已关闭及已删除活动,不影响其他活动扣款,不改变成交结果。无扣款记录不退款,恢复后新成交的扣款可再次恢复;清空余额后的恢复不恢复审核资格。

/修复余额(管理员)

/修复余额 3#@成员#5000

预期:只处理余额列表中的待核对旧记录。先核对成员、其现有余额及相关旧记录,再输入最终共享余额,覆盖原金额并确认年龄审核。不是追加金额;同一记录不能重复处理。

/录入余额(管理员)

/录入余额 @成员#10000
@成员录入余额10000

预期:管理员审核余额与年龄后,为选中成员设置最终共享余额。重新录入覆盖原值,金额不能为负,所有活动立即共用;多群模式只允许后台群操作。确认回复显示昵称,不额外@成员。

/查询余额(管理员)

/查询余额 @成员
查询@成员余额

预期:仅管理员可查询被选中成员的具体余额和年龄审核情况;多群模式限后台群。查询回复用昵称显示成员,不触发@。

/余额列表(管理员)

/余额列表

预期:仅管理员查看所有成员的共享余额及审核记录。每行显示文字昵称,不触发@;没有昵称时显示稳定参拍编号,同名成员加编号区分。成员发群消息时会按身份更新可用群昵称,也可用 /设置显示名 @成员#昵称 指定称呼。多群模式限后台群;待核对旧余额另列记录号。

/清空余额(管理员)

/清空余额

预期:清空全部成员的共享余额和审核,影响全部活动,不是只清理当前活动。操作后成员需重新审核录入;多群模式限后台群。成交扣款仍可按活动恢复,恢复不会自动通过审核。

/查看我的余额(成员)

/查看我的余额
查看我的余额

预期:成员只确认自己的有效审核状态,不展示具体金额。未审核时按提示联系群主。

出价与成交

/出价(成员)

/出价 1 1000
给1号出价 1000

预期:金额须高于当前目高且大于等于起拍价,活动、稿位、批次均须可出价;还需通过余额和年龄审核。支持空格分隔,推荐自然口令。

/撤回出价(管理员)

/撤回出价 12#@成员#3000
/撤回出价 一周年庆#12#@成员#3000

预期:时间统一为北京时间(UTC+8)。可在最前面加活动名#;省略时使用本群绑定活动(单群为最新活动),回复与通知注明活动及稿位。按稿位、真实@成员和实际出价金额精确定位;该笔及之后所有出价一并作废,重新计算目高并提醒参拍者。金额必须属于该成员的有效出价。已截止稿位不能再撤回;退回活动扣款请用恢复余额。

权限与帮助

/添加管理(管理员)

/添加管理 @成员

预期:仅现有拍卖管理员可授权被@成员。首次管理员由有网站系统设置权限的管理员在独立管理网站的系统设置选择并保存,QQ原有群管理员不会自动获得拍卖管理权。

/删除管理(管理员)

/删除管理 @成员

预期:移除被@成员的拍卖管理权限。移除不会清空其余额或出价;应保留至少一位可用管理员。

/管理列表(管理员)

/管理列表

预期:查看当前拍卖管理员,成员用昵称或稳定参拍编号展示,不触发@。同名成员附编号区分;管理员增删权限的个人通知仍真实@。

/功能(成员)

/功能
/帮助
/help

预期:在QQ显示精简帮助及27个命令。帮助、help为同一命令的别名。发送帮助也会登记本人供网页选择;不会公开账号标识。

多群与显示名

/设置群(管理员)

/设置群 前台#秋拍#A群
/设置群 后台#秋拍#管理群

预期:在目标群设置前台或后台并绑定已创建活动,群别名可省略。首次设置自动启用多群,其他群须分别设置;同一活动使用同一个机器人。

/取消群设置(管理员)

/取消群设置

预期:解除当前群绑定并取消该群尚未发送的同步通知,不影响其他群。解绑全部群不会自动关闭多群开关,需在系统设置页关闭或重新绑定。

/群设置(管理员)

/群设置

预期:查看多群开关和全部群的角色、别名、绑定活动,并标记当前群。用于核对设置是否保存。

/设置显示名(管理员)

/设置显示名 @成员#小明
/设置显示名 @成员#清空

预期:设置该成员在公开目高和出价历史中的昵称;填清空恢复自动昵称。不改变余额归属或权限,不追溯修改已经发送的消息。

/测试提及(管理员)

/测试提及 @成员

预期:仅管理员在QQ官方机器人群使用。向同一成员发送三条标有方案编号的提醒,不要求绑定活动。检查可点击的成员名称与提及效果,再到独立管理网站的系统设置选择对应方案;测试不会自动改设置或更改拍卖数据,结果仅发当前群。

自然口令与移除入口

给1号出价 1000
查询1号稿位
查看1号稿位更多例图
查询批次1
查询批次1目高
查询目高
我的稿位
我上传的稿位
查看我的余额
@成员录入余额10000
查询@成员余额

裸@机器人仍显示原快捷说明。非管理员不能执行15条管理命令;多群前台不能查询/修改任何人的具体余额。保留的成员查询和图文格式不变。

以下旧命令不能触发拍卖修改,网站仍能进行相应操作:

/修改活动
/修改稿位
/关闭活动
/创建活动
/删除例图
/删除活动
/删除稿位
/取消定时
/回收稿位
/已删除稿位
/开启活动
/截止稿位
/撤销删除
/替换稿位
/添加例图
/添加稿位
/稿位分批
/设置全场批次图
/设置备注
/设置定时
/设置批次时间
/通知状态
/释放稿位
/重试通知
/释放岗位

帮助不得列出这些旧入口,不再注册内置管理写入API。“设置全场批次图”无现行用途,不再保留功能。

单独@机器人的快捷说明

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额

返回文档入口

完整更新日志

更新日志

v2.27.1:旧配置BOM兼容(2026-10-09)

  • 修复首次导入带UTF-8 BOM的旧JSON配置时插件加载失败;同时兼容普通UTF-8文件,保留原文件内容。
  • 无效编码、损坏JSON或非对象配置明确提示文件名,停止导入,不静默覆盖为默认值;修正文件后可重试。
  • 回归验证设置及管理员完整迁移、既有管理员保留、重启不覆盖网页修改或恢复已撤销授权,以及核心业务和插件停止流程。
  • 独立Web仍为1.9.0,本次仅同步完整指南、测试说明和安装包;修复加载问题只需更新插件。

v2.27.0 / Web 1.9.0(2026-10-09)

  • 内置管理设置全部迁移至独立Web“系统设置”,旧配置与QQ管理员首次自动导入共享数据库,运行中自动同步,密钥不回显。
  • 保留12个成员命令与15个管理命令;活动、稿位、批次、定时、附图及通知的QQ管理入口移除。“设置全场批次图”闲置功能移除,历史数据库值保留。
  • 网站补齐群绑定调整/解绑、QQ管理员、成员显示名、通知补发、活动扣款恢复和旧余额核对;新增11项权限,总计57项,已有下级账号默认关闭新增权限。
  • 系统操作预览确认,重新核验权限与版本。机器人停用时停止设置同步任务。帮助、命令目录与完整测试清单同步更新;2.26.0指南和测试逐字归档。

cym_auction 完整更新日志

当前版本:2.26.0。这里保留全部已找回的历史版本记录(v2.4.0 至 v2.20.4),并补齐后续更新。历史内容按当时版本原文保留,命令数量、图片方案、身份查询与余额策略可能已经变更;实际操作以当前完整指南与当前测试命令为准。

v2.26.0:附属例图(Web 1.8.0)

  • 稿位独立保存最多20张附属例图。新增自然口令“查看1号稿位更多例图”及 /更多例图 [活动名#]稿位号,按序展示小图;普通详情、竞拍、批次、提醒及用户网页只显示原主图。
  • 新增管理员 /添加例图、/删除例图,支持指定活动与多附件追加。帮助同步为51个主命令;无附图、错误口令和无效编号均提示。
  • 独立网页稿位详情增加折叠附图管理区:多选上传、图床直链、删除、排序和缩略图。新增第46项细粒度权限 artwork.examples,已存在的下级管理员默认不自动获权。
  • 旧数据库自动增加附图列;主图不变,附图随改号、删除快照和恢复保存。网页共享写锁、版本校验及审计,禁止通过附图输入新增本机任意路径,不触发群公告。
  • 同步QQ帮助、完整指南、测试清单和两个安装包,保留原历史说明。

v2.25.0:分级管理员与独立账号中心(Web 1.7.0)

  • 原网站管理员成为受保护的总管理员;新增受限管理员,按账号上下级限定管理范围。普通用户身份、绑定、密码、个人查询及回收价功能保留。
  • 新增“账号与权限”页面,按类型、状态和关键词筛选,展示上级与功能数,创建两类账号、启停、重设密码、改绑用户、分配权限、删除无下属账号;保留账号审计和密码工具。
  • 45项权限覆盖现有Web全部管理功能:活动名称/起止时间/开关删除、稿位逐项资料与编号删除恢复、批次、定时、各状态、余额录入/清空、出价查询/撤回、账号操作及审计。按需补齐依赖,界面与每个后台接口共同校验。
  • 下级只能向自己的下属分配已有权限,不能操作本人/上级/同级/其他分支。停用上级使分支登录失效,收回权限向下收敛且不会在恢复上级时自动复活;删除保留审计及业务资料。
  • 旧账号库事务迁移,保留原ID、散列、启停、绑定、已授回收价、审计和自增序号;新管理权限默认关闭。不修改拍卖业务库或QQ群权限。
  • 新增字段/动作权限矩阵、越权、层级、停用删除、读写撤权及迁移回归;原普通用户和全部Web管理回归通过。修正受限用户隐藏竞拍者身份后成交统计仍应正常显示;验证电脑/手机实际界面,同步全部文档与两个安装包。

v2.24.4:账号回收价查看权限(Web 1.6.3)

  • 用户账号增加“允许查看全部作品回收价”,可在快捷设置、创建和管理账号时独立选择;新旧账号默认关闭,账号列表显示权限,核对预览与账号审计包含变更。
  • 开启后个人作品显示回收价,并提供全部作品回收价目录;覆盖所有未删除活动的现存作品,含未参拍、未公开、筹备中和已结束作品,可搜索、筛选活动及每页50条翻页。未设置显示“未设置”。
  • 关闭时保持原个人页与字段范围;后端单独授权目录,每次读取验证账号版本,关闭权限立即撤销全部旧登录,读取途中变更也拒绝返回。退出/换号清空目录与个人价格。
  • 不开放其他成员身份、余额、出价历史或管理操作,不扩大个人图片访问范围;不改变QQ回收价公开设置,不发送群通知,不改业务库或账目。
  • 独立accounts.db自动增加默认关闭字段,保留既有账号绑定、密码与审计。新增迁移、授权、越权、分页、并发撤权及前端清理测试,实测电脑/手机布局;同步全部文档与两个ZIP,插件运行逻辑不变。

v2.24.3:客户页当前目高与例图(Web 1.6.2)

  • “仍在参与”分别显示当前稿位目高、本人有效出价,随页面实时刷新;不提供其他出价成员的身份或逐笔历史。
  • 已成交/当前目高/仍在参与的稿位及个人出价历史均显示等比小图;复用图床、失败回退和稳定图片节点,不随价格变化反复加载。
  • 新增个人图片接口,按会话绑定及本人竞拍关联校验,允许自己的历史记录(含已撤回)取图;无关稿位和已删除活动拒绝。后台图片接口权限不放开。
  • 本地个人图输出长边最多320px,缓存校验同样先鉴权;转换期间状态变化重新核对,账号停用/换绑让旧会话失效,错误不泄漏本地路径。
  • 增加当前价格、个人历史图片、图床回退、HEAD/缓存/未知编号权限及会话失效回归,验证手机图文布局;同步全部指南和安装包,无需数据库迁移或QQ命令变更。

v2.24.2:用户列表排序、快捷账号与密码生成器(Web 1.6.1)

  • 管理员用户列表按余额、当前目高金额/件数、已成交金额/件数升降序排序;搜索/审核筛选后全量排序再分页,空余额始终末尾,刷新保持选择。
  • 每位用户的列表行和详情增加“设置账号”:自动带入精确成员标识,已有账号(含停用)直接管理原记录,避免重复创建;快捷入口固定绑定,原账号管理保留改绑能力。
  • 创建及重设密码提供20位安全随机密码生成、显示/隐藏和复制;自动填入两次密码,生成不自动提交,重新生成使确认预览失效,关闭/退出清空并隐藏。
  • 随机源不可用时拒绝不安全降级,剪贴板受限时提供手动复制提示。既有账号权限、唯一绑定、版本校验与旧会话失效机制保持。
  • 新增排序、分页、空值/负数、实时更新、同名绑定及密码工具草稿边界回归;同步完整Web指南、Pages、验收及ZIP。插件运行逻辑不变,无需数据库迁移。

v2.24.1:独立Web拍卖用户账号与个人页(Web 1.6.0)

  • 管理员在“用户管理→登录账号管理”创建普通用户账号,唯一绑定sender_id,支持改绑、重设密码、启停、搜索和账号审计;用户不能自行注册或升权。
  • 共用登录入口,按服务端角色进入管理台或个人页。个人页只读本人全局余额、已成交稿位、当前目高稿位、仍在参与但已超价的稿位和全量个人出价历史;每页50条,可搜索与筛选撤回状态。
  • 普通账号采用默认拒绝的接口权限,个人SQL始终按会话绑定筛选,显式限制响应字段;不开放其他用户数据、管理详情/图片、私密回收价、群来源和审计。
  • 账号换绑、密码重设和启停均更新会话版本,每次请求及响应前验证;读取过程中换绑也不能返回旧身份资料。退出/换号清空页面与其他标签页缓存,旧标签页会话标记不能继续读取数据。
  • 随机盐+scrypt存储密码;账号库位于state-dir/accounts.db,与拍卖数据库分离。保留原admin.json,启动自动建账号库,不修改业务库或余额。修正成功登录消耗失败限流额度的问题,兼容多人同代理访问。
  • 新增跨用户越权、角色伪造、绑定冲突、全量历史、即时失效及持久化回归;保留完整使用指南与全部历史。此插件包仅同步文档和版本,原2.24.0插件运行逻辑不变;个人页更新独立Web到1.6.0即可使用。

v2.24.0:独立Web完整管理与出价历史(Web 1.5.0)

  • 活动创建、开启、关闭和删除;已关闭活动可改结束时间后再开启。网页关闭/删除不直接结算、不改全局余额,取消相关定时,保留历史。
  • 新增稿位支持一张上传图片或直链、完整资料、回收价公开选项及指定空闲序号;调整编号释放旧号,普通新增优先复用释放空号。
  • 删除以精确记录为准,保留删除快照与图片引用;有任何出价或成交账目的稿位不能删除/改号。恢复按原编号,拒绝覆盖,不恢复旧定时。
  • 按活动和每批数量重新编排;预览全部编号,保留出价目高,取消旧安排并暂停未结束稿位。批次通知记录固定事件标识,重排时可取消未送达的旧上新通知。
  • 网页录入/覆盖全局余额并确认年龄审核,支持从用户详情进入;清空全部余额和审核记录,保留成员、出价及账目,不公开余额。
  • 全部成员出价历史每页50条,可查看超过100条的完整记录,支持活动、作品、成员/作品关键词、时间与撤回状态筛选。
  • 按精确出价记录撤回该笔及后续出价并重算目高;已成交禁止撤回,资金与延期时间不变。通知通过插件队列进入前台及参拍者来源群,单群支持提及该群所有受影响成员。
  • 新增管理操作采用预览与确认,确认时在共享写锁和事务内重查相关数据,拒绝覆盖新出价;同令牌重复提交不重复执行。保留完整审计,沿用登录、CSRF及来源校验。
  • 同步独立网站指南、两个Pages完整文档、验收步骤及安装包;保留历史日志。升级插件2.24.0后更新网站1.5.0,不包含其他新增管理模块。

v2.23.8:独立Web用户管理(Web 1.4.0)

  • 新增管理员用户列表:全局余额、审核状态、当前目高与成交作品数/金额、最近出价时间;支持昵称、显示名称、成员标识搜索及审核筛选、分页。
  • 用户详情分列已成交和当前目高作品,跨活动汇总,兼容筹备中保留目高;近期出价、成交扣款与退回记录可追溯,作品名称可打开原有稿位详情。
  • 补齐仅有余额/历史记录的成员,无余额与零余额明确区分;按成员标识关联、金额普通数字显示,列表和详情定时刷新,手机布局适配。
  • 用户查询接口沿用管理员登录保护,只读无账务和群通知副作用;无数据库迁移。插件运行逻辑保持2.23.7,本包同步完整指南、验收清单及历史日志;升级网站至1.4.0即可使用。

v2.23.7:全场目高精简为价格行

  • “查询目高”和“/查询目高”按序号输出当前活动全部稿位,每件仅一行“53号 炊籽xxx | 1000¥”。无人出价显示“暂无出价”。
  • 去掉活动和批次标题、上新和截止时间、“目高:”标签、多余空行;未分批稿位一同排序,长内容仍自动分段。
  • 单稿位、单批次查询不变;同步完整网页指南、测试命令与安装包。仅需更新并重载插件,独立Web功能版本保持1.3.4。

v2.23.6:30/5分钟提醒提及、全场纯文字目高与截止筛选(Web 1.3.4)

  • 30分钟和5分钟提醒均@执行时的当前最高出价者;多群仅在其出价来源前台提及,其他前台公共提醒,后台不广播。恢复此前停用的5分钟节点,升级补齐有效定时任务。
  • 不足30分钟立即提醒,不足5分钟合并为一次5分钟提醒。延期后按新时间重排5分钟节点,已发30分钟提醒不重复;设置/取消及延期的单独公告仍无@,失败重试保留发送进度。
  • 查询目高直接输出当前活动全部稿位的批次、序号、名称和价格,保留批次上新与已设截止时间,无人出价显示暂无出价。纯文字长内容分段,未分批不遗漏;不附图片或其他详情。
  • 独立Web原筛选栏新增截止时间入口,支持已设/未设、起止区间与单边界,包含边界,可组合现有筛选;北京时间解释,实时刷新保留条件,顶部合计独立,原布局配色延续。
  • 同步QQ精简帮助、完整网页操作指南、历史日志与验收清单,生成两个安装包。先更新重载插件,再更新重启网站;不改变账务或成交底价规则。

v2.23.5:稿位查询显示已设置的截止时间(Web 1.3.3)

  • QQ单稿位、批次、批次目高、全场批次表、稿位列表及两类个人列表,按稿位显示已设置的截止时间(北京时间),与有无出价无关;“我的稿位”保持纯文字。
  • 独立网站卡片和详情同样显示截止时间;无定时不显示该行。修改或反复延期后读取当前最新时间,取消、结束或释放清除定时后不显示旧值,不用活动结束时间代填。
  • 不改变截止/回收判定、提醒、延期、账务或页面整体布局;同步完整指南、测试清单与两个ZIP,保留原有历史记录。

v2.23.4:独立网站目高合计可选统计范围(Web 1.3.2)

  • “当前目高合计”卡片增加范围菜单,可组合勾选开拍中、未开拍、已截止、已回收;默认只统计开拍中,全部取消显示0,无出价按0计算。
  • 合计跟随所选活动;列表搜索、批次和状态筛选、其他统计卡片仍按原规则运行。选择保存在当前浏览器,实时刷新保持菜单和焦点。
  • 保持原有页面整体布局、卡片尺寸与配色;不改变拍卖数据、成交规则或扣款。完整操作指南、验收步骤和两个ZIP同步,原有历史说明保留。
  • 已用插件2.23.3时只需更新并重启独立网站。本次插件包仅同步文档和版本,不增加QQ命令。

v2.23.3:成交扣款再次复核回收底价(Web 1.3.1)

  • 有有效最高出价且目高大于等于回收价,才允许成交并按成交价扣款一次。目高低于回收价或无人有效出价时,交易失败,稿位回收,不改变余额,也不产生扣款账单。回收价是否公开不影响判定;未设置回收价或为0时,沿用有有效出价即可成交的规则。
  • 补齐插件与独立网站共用扣款函数的成交条件复核,异常调用拒绝扣款,事务回滚。
  • 验证QQ手动截止、定时结算、活动结束、Web截止四个入口;覆盖低于/等于/高于、无人出价、小数、公开/私密及重复扣款保护。
  • 保留原数据与历史账目,不进行追溯扣款或退款;完整使用说明、测试清单、两端安装包同步。

v2.23.2:定时设置与提前提醒不@成员

  • 设置、修改、取消定时及提前30分钟提醒(含不足30分钟的即时提醒)只发送公共文字,不@任何成员,也不向最高出价者额外发送一条个人预告。5分钟延期公告仍为普通文字;到点成交、到点回收及活动结束结果仍按原规则@相关出价者。
  • 覆盖单群、多群、QQ官方及OneBot;定时命令回执在框架自动提及前以原事件发送,不更改全局回复设置。
  • 旧待发/失败通知中的定时个人提及段在补发时跳过,保留公共段与发送进度,不重发已完成消息。其他类型个人提及保持原样。
  • 同步完整网页说明、测试清单与安装包;独立Web功能版本保持1.3.0,本项只需重载插件。

v2.23.1:前台交易中稿位显示达价标记

  • 原本显示“交易中”的单稿位详情、稿位列表和“我上传的稿位”,在有有效目高且目高大于等于已设置的回收价时显示“交易中/已过回收”。无人出价、未达价、未设回收价以及其他状态保持原样;撤回或修改回收价后按最新数据重新判断。此标记不公开回收价金额,金额仍遵循公开开关。
  • 只调整显示文字,不修改竞拍状态、出价、定时或账务;其他消息布局保持原样。完整指南、测试命令和安装包同步,独立Web仍为1.3.0。

v2.23.0:回收价公开、网页统一定时结算与达价对比(Web 1.3.0)

  • 每个稿位新增回收价公开开关,旧稿位及新稿位默认不公开。网站修改金额或开关不发公告;后续查询、批次、上新、出价消息按公开选项显示。
  • 独立网站可设置、修改和取消一个结算定时;有有效目高且达到回收价就截止成交,否则回收;未设回收价则有有效出价即成交。旧QQ“截止/回收”参数均兼容,新示例使用“结算”。旧定时回收升级自动转为此规则,已完成账目不变。
  • 网页设置时公告前台,提前30分钟预告;不足30分钟合并一次。取消独立5分钟节点及旧待发记录;最后5分钟有效加价仍逐次延长原时间5分钟并提示,已发送30分钟预告不因延期重发。
  • 列表同时显示目高、回收价与公开状态,等于或高于回收价标“已超过回收价”,低于或无人出价标“未超过”;无底价另标“未设置回收价”。
  • 公开设置静默保存;定时遵守活动/批次/稿位及时间审查、管理员权限、版本检查、前台群与来源群路由、共享写锁、事务回滚和审计。新功能须先升级重载插件,再更新重启独立网站;全文指南、测试与两个ZIP同步。

v2.22.3:同步独立网站批次改期说明(Web 1.2.0)

  • 独立网站“活动管理”新增“调整上新时间”,已上新或筹备批次均可重新安排未来北京时间,并恢复为筹备中。保存前展示具体活动、批次和稿位影响,二次确认后执行。
  • 未结束稿位暂停竞拍,保留出价与目高、继续占用额度;清除截止/回收/提前提醒和延期次数。已结束稿位、其他批次及账务保持原状。机器人按新时间上新,旧上新及补提醒任务取消。
  • 新时间检查活动状态和起止范围,版本检查同时覆盖活动、批次及稿位;任务、状态及完整修改记录在同一事务保存,失败回滚。沿用管理员登录、CSRF和共享写锁,不增加QQ口令。
  • 完整网页说明、测试清单、历史日志及安装包同步。已有2.22.2插件无需为此功能重载,更新独立网站至1.2.0并重启即可;本次插件包只更新版本与文档。

v2.22.2:统一北京时间与退出卡住修复(Web 1.1.1)

  • 修复独立网站按操作系统本地时间判断批次的问题:UTC主机上,北京时间已过15:00仍被当成07:00,导致恢复开拍被拦截。插件和网站统一按北京时间(UTC+8)解释既有活动、批次、定时字符串,不批量移动已有时间。
  • 到点批次仍按原事务补齐上新,恢复开拍保留出价并退回未退扣款;尚未到点仍拒绝,报错增加用于判断的当前北京时间。网页显示明确时区,新增 python -m auction_web --version 便于核对部署版本。
  • 插件退出先停止接收新命令并取消昵称采集、通知和定时任务,再限时保存剩余昵称,最后关闭数据库;修复先等昵称写锁而无法取消占锁定时任务的退出等待。
  • 停止时先取消全部后台任务再等待;命令触发的即时提醒和投递也纳入停止范围。单群主动发送增加30秒等待上限,后台任务停止和昵称收尾均有超时诊断。无法退出的外部任务明确报错并保留连接,避免关闭它仍在使用的数据库。
  • 同步完整后台指南、QQ帮助、独立网站说明、测试清单及两个ZIP。Web报错须更新网站程序并重启;仅更新AstrBot插件不会替换独立网站代码。

v2.22.1:回收双节点提醒与定时通知卡住修复

  • 修复多群通知队列与定时任务相互等待数据库锁/投递锁的问题。已有投递者工作时,新调用不等待投递锁,持久化队列继续处理,避免30分钟提醒及其他定时消息卡住。
  • 定时回收新增独立5分钟提醒,与30分钟档分别保存和去重。设置时剩余5至30分钟先立即提醒,再到5分钟提醒;不超过5分钟或重启已跨过两个节点时,只补一条5分钟提醒,过期不补预告。
  • 重载插件自动为既有有效回收定时补齐5分钟任务;兼容旧30分钟记录,已发送的档位不重复。恢复任务时校准提醒时间并取消重复的待发档位。
  • 单群及多群使用同一提醒文案;多群公共提醒发往目标活动全部前台,个人提醒只在当前最高出价者来源群发送。失败保留重试,不公开余额和回收价。
  • 定时截止仍保留30分钟预告,最后5分钟每次有效加价仍单独通知延期。QQ帮助、网页完整说明和测试清单同步,命令与配置数量不变。

v2.22.0:批次漏上新修复、截止审查与网页状态管理

  • 修复批次已到上新时间但仍为pending时,释放稿位被错误拦截的问题。释放及截止审查补齐该批次的上新状态,保留其他已结束稿位,并补建图文上新通知;未到时间仍不提前开拍。批次查询显示时间和真实状态。
  • 批次时间和上新任务在同一事务保存,不再依赖处理命令时调度器是否就绪;启动时补建旧库漏掉的任务,旧任务执行前复核时间及活动,避免重新定时后提前上新。
  • 设置定时检查具体活动、稿位、批次是否可竞拍及时间是否在将来;手动截止也作同样状态审查。失败不替换旧定时、不修改余额;既有最后五分钟延期继续有效。
  • 独立 Web 1.1.0 增加稿位状态管理:恢复开拍、暂停竞拍、截止并结算、回收;操作前展示活动/稿位和账务影响,再确认执行。已结束稿位先释放才能重拍,不允许表单伪造成交结果。
  • 网站与QQ共用无AstrBot依赖的状态和资金事务,保留历史及每轮账单;网页可离线操作,QQ群通知由机器人上线后发送,遵守前台/来源群路由,回收价仍保密。版本冲突、重复提交和异常均有保护,后台记录完整审计。
  • 同步完整网页说明、测试清单和两份ZIP;先升级重载插件,再重启网站。旧插件数据库状态入口只读提示升级,原有资料编辑仍兼容。

v2.21.1:明确后台回收价保密(配套 Web 1.0.5)

  • 核实后台 Web 保存回收价不创建QQ群通知;保留管理员后台的真实金额及修改记录,群内查询、批次、上新和出价回复沿用不透露金额的规则。
  • 网站回收价字段和保存成功提示明确“仅后台可见,不向QQ群发送通知”;截止低于回收价时仅提示无法成交,不公布底价。
  • 补充真实网页API保存、插件读取、群内展示及多群出价/截止通知的保密回归,同步完整操作说明、测试清单及两份ZIP。命令和配置数量不变。

v2.21.0:释放稿位、保留目高与再次结算

  • 新增管理员 /释放稿位 [活动名#]稿位号,兼容 /释放岗位;已截止或已回收稿位恢复开拍,保留全部出价、当前目高及资料。所属活动须开启且未到结束时间,批次须已上新;不自动开启整个活动。
  • 只退回目标稿位尚未退回的实际成交款;已按活动退款或没有扣款记录不加款。原结算记录无损迁移为按轮记账,再次成交按新成交价扣一次;重复释放、重复截止、重复按活动恢复均不会重复记账。
  • 清除旧稿位定时、待发提前提醒及延期次数;新定时携带竞拍轮次,旧任务不能关闭新一轮,同一截止时间的新一轮提前提醒仍能正常发送。
  • 释放状态、退款、旧定时取消、操作快照和多群通知同事务保存,出错全部回滚。公告只发目标活动前台,当前最高出价者在原出价群收到个人提醒;管理群明确回复活动与稿位,不公开余额。
  • QQ帮助与网页完整指南同步为48个主命令、37个管理员命令,保留全部历史资料和15项配置。独立 Web 1.0.4 同步演示库与使用指南,实际释放仍从QQ执行;两份ZIP同步更新。
  • 补充保留出价、跨活动退款隔离、多轮结算、并发幂等、异常回滚、旧库迁移、权限、旧定时与网页编辑冲突回归。

v2.20.22:修复独立 Web 1.0.3 图片路径404

  • 网站支持把旧容器中的 images/ 路径映射到实际图片根目录,保留相对子目录,并兼容相对路径、file地址及插件生成的唯一文件名。读取始终限制在指定图片目录,不修改数据库原地址。
  • 插件重载时为旧 S.EE 缓存补充本地稿位图片来源索引,不下载或上传图片;后续图片发送同时维护来源。网站在本地原图不可见时可通过精确来源匹配直接显示已有图床链接;来源歧义不猜测,可见图片内容优先。
  • 网站对确实缺失且没有可用图床缓存的图片显示具体原因和实际图片根目录,不再构造必定404的请求。保留本地缩略图回退、缓存校验、管理员登录与文件目录边界。
  • 增加容器路径HTTP 200回归、旧缓存离线补索引、无原图图床复用、路径越界与索引冲突测试,同步完整部署说明、排错步骤及两份ZIP。

v2.20.21:配套独立 Web 1.0.2 图床直连

  • 独立网站复用数据库同级 image_host/see_cache.json 中已有的 s.ee HTTPS 地址,按本地文件内容匹配;可通过 --image-host-cache 指定缓存位置。网站无需图床 Token,不依赖 AstrBot 运行,也不会新增自动上传。
  • 列表及详情优先直接加载图床,失败回退本地缩略图;没有图床缓存时继续本地显示。缓存与文件更新自动识别,原数据库图片地址保持不变。
  • 出价刷新保留未变化图片节点,本地图片版本不再随稿位资料变化;本地图增加需登录校验的私有 ETag 缓存,重复请求可返回304,资料API仍不缓存。
  • 同步独立站部署指南、后台完整文档及验收步骤,提供 Web 和插件 ZIP。主要节省网站服务器图片出站流量,图床及浏览器的原图流量仍存在;QQ命令和拍卖规则沿用2.20.20。

v2.20.20:定时及结束管理支持指定活动

  • 设置定时、取消定时、截止稿位、回收稿位、撤回出价统一支持可选的 活动名# 前缀;保留旧写法,省略活动名时多群使用本群绑定活动,单群使用最新未删除活动。批次定时原有的指定活动写法继续可用。
  • 成功和可定位目标的失败回复标明活动、稿位序号与名称;没有定时、已经结束、时间无效、找不到目标等错误不再产生模糊回执。空字段、多余参数和不存在的活动不会误改当前活动同号稿位。
  • 半小时预告、每次延期、自动/手动截止回收、活动结束结果及撤回通知补充活动名。跨活动管理只通知目标活动前台群;若管理者位于另一活动前台群,仍返回明确操作回执,不改变本群绑定。
  • 补充跨活动同号隔离、权限、错误无副作用、即时/到期提醒、通知目的群、重复截止不扣款测试;同步QQ帮助、网页完整指南、测试命令和可安装ZIP,保留历史更新日志。

v2.20.19:价格边界、回收价隐私与定时目标提示

  • 设置定时成功/失败回复包含具体活动名、稿位序号和名称;已结束稿位明确区分已截止/已回收,过期时间和格式错误同样说明目标。
  • 出价金额必须大于等于起拍价,等于起拍价可以通过;已有目高时仍须严格加价。统一手动截止、稿位定时截止、活动结束的成交判断:有有效最高出价且达到回收价才成交;低于底价或无人出价统一回收,无扣款、无成交祝贺。回收价0表示无底价。
  • 底价不影响竞价阶段的有效性;低于底价的出价可以继续参与,只在截止仍低于底价而回收时解释原因,不披露具体底价金额。明确的回收动作仍直接回收。
  • QQ单稿位、稿位列表、批次查询/目高/上新,以及录入/修改确认均隐藏回收价,独立管理员网页仍保留实际数值;多群同步正确结果,并在最高出价来源群提醒本人。
  • 补齐低于/等于/高于起拍价与回收价、小数、三个截止入口、跨活动同号定时提示、单群/多群、回收不扣款、失败回滚回归;同步帮助、完整网页文档和两个ZIP。历史已成交账务不重算。

v2.20.18:独立管理网站与同机写入协调

  • 新增可单独部署的管理站,管理员登录后查看全部活动/稿位,2秒自动刷新,支持资料编辑、本地例图上传、筛选和网页审计;无需AstrBot导入、服务或Pages入口。
  • 插件业务修改和定时执行增加同机跨进程写锁,初始化登记Web兼容协议;独立站使用同一锁、SQLite事务及版本校验,避免旧表单覆盖新出价。活动时间更改同步替换任务且保留来源,QQ活动修改的任务重建也纳入共享锁。
  • 保留47个QQ主命令、15项原配置和全部历史资料;补充独立网站完整部署/使用/测试说明、演示库、HTTPS/systemd示例与独立ZIP。网页不启动第二套拍卖调度器,原扣款/延期/通知规则保留。

v2.20.17:每次延期独立提醒与不足半小时即时预告

  • 每次最后5分钟内有效出价触发延期,单独发一条包含稿位序号、名称及最新截止时间的纯文字提醒;自然口令、斜杠命令、自我加价均覆盖。多群与出价通知一起持久化,全部前台同步,失败只补未完成段落。
  • 设置稿位截止/回收时,剩余时间不超过30分钟由当次命令立即运行提醒,不再仅注册任务等待扫描;与后台调度共用执行锁和完成标记。超过30分钟按原时点提醒,晚执行仍在有效窗口内发送。
  • 单群提醒发送失败不再误标任务完成,保留重试;无效时间拒绝设置,已取消/变更/结束稿位的旧提醒仍不能发送。多群沿用队列重试与来源群个人提醒。
  • 核对并补充活动到期、稿位定时截止、固定定时回收的差异说明;有出价但低于回收价的活动到期稿位仍回收,仅活动结束时间不会逐稿位建立提前预告。
  • 按确认保留“出价失败!余额不足。”。QQ帮助、网页完整说明、测试命令及安装ZIP同步,历史记录完整保留;新增时间边界、每轮提醒、双入口、多群与失败补发回归。

v2.20.16:简化余额不足提示

  • 所有出价入口的余额不足提示统一为“出价失败!余额不足。”,不展示比例、计算公式、当前余额或额外金额明细;QQ帮助同步隐藏余额计算方式。
  • 余额校验、跨活动合并占用、成交扣款及按活动恢复规则保持原样。后台完整规则、历史说明及测试清单保留,并同步生成安装ZIP。

v2.20.15:成交自动扣款与按活动恢复余额

  • 手动截止、定时截止和活动到期成交统一按最终成交价全额扣除获拍者全局余额,每个稿位只结算一次;原70%参拍门槛保留,余额不足允许负数,后续出价使用扣款后的余额。回收、无人出价、暂停活动不扣款。
  • 新增成交扣款记录,保存活动、稿位、成员、金额及前后余额。结算与截止、定时、通知同一事务提交;失败整体回滚,重复/并发截止、重载和通知重试不重复扣款。旧版无扣款的历史成交不补扣。
  • 新增 /恢复余额 活动名,仅管理员可用,多群时限后台。将指定活动尚未恢复的全部扣款加回当前余额,逐笔只恢复一次;支持关闭或软删除活动,不覆盖其他活动变动,不改变成交结果。后续新成交仍可扣款并再次恢复。
  • Pages新增按活动查看待恢复/已恢复汇总及恢复按钮,与QQ命令共享账务逻辑。重新录入或清空余额不删除成交扣款记录,恢复仍在当前余额上加款;缺失余额记录时从0处理且不恢复审核资格。
  • 已截止稿位禁止撤回出价,以免改变已结算的获拍者;未截止稿位沿用原撤回规则。当前余额不进入公开成交提示,金额使用普通数字。
  • QQ帮助、完整网页操作指南、测试清单同步为47个主命令、36个管理员命令;15项配置及全部历史文档保留。新增账务幂等、跨活动隔离、故障回滚、并发、重启、权限与网页交互回归,安装ZIP同步。

v2.20.14:提及兼容格式与群内对照测试

  • 根据日志确认2.20.13文本模式仍可能原样显示成员标签,连出价失败中的本人提醒也受影响。QQ官方纯文字个人提醒默认使用兼容提及格式,身份与来源群路由保持不变;真实客户端显示仍需验收。
  • 增加qq_mention_mode设置,标准插件配置与Pages同步提供兼容文本、标准标签文本、标准标签Markdown三种方案,保存后对全部群生效。直接回复、主动个人提醒和旧待发缓存均在发送边界统一选择;含图消息保留Markdown与标准标签。
  • 增加管理员命令 /测试提及 @成员,仅当前QQ官方群对同一成员发三条带编号的对照消息,无需绑定活动,不自动修改设置或拍卖数据。一条失败后继续测试后续方案,普通成员无权执行。
  • QQ帮助与网页指南同步为46个主命令、35个管理员命令和15个配置项;完整历史日志、操作指南保留。增加提及协议、真实成员输入、权限、热更新、图片保护、队列缓存与SDK参数回归,安装包同步生成。

v2.20.13:纯文字个人提醒使用QQ文本交互

  • 针对超价提醒中成员标签原样显示的问题,纯文字个人提醒改用QQ官方文本交互:事件回复显式关闭Markdown,主动发送明确提交msg_type=0和content;成员身份、提醒对象和来源群路由保持不变。
  • 图床图片继续使用Markdown发送;包含图片的提及消息也不转换为文本,保留小图、图文分段与整批一条。OneBot继续使用原生At组件。
  • 旧缓存中被标为Markdown的纯文字提醒在投递时兼容转换,保留发送游标,不修改或自动重发已成功消息。新增后台发送模式日志,便于核对部署后的实际路径。
  • 补充文本/Markdown参数区分、同群与跨群超价、个人提醒、旧缓存重启和失败不换格式重发的回归;网页完整说明和测试步骤同步。QQ客户端的真实@显示仍需安装后验收。

v2.20.12:修复4.26.7多群图文被发送为链接

  • 确认 AstrBot 4.26.7 的 QQ 官方主动发送接口固定使用普通文本 content,忽略 Markdown 标志。新增插件内主动发送兼容层,使用目标机器人现有 SDK 明确提交 msg_type=2 与 markdown.content,不修改框架源码或增加密钥配置。
  • 多群队列和单群定时通知共用发送器,涵盖同步出价、整批上新及个人重要提醒;保留小图、空行分段和同批次多图一条消息。普通文本、原生图片与OneBot沿用适配器。
  • 精确匹配连接与群会话,不借用其他群的消息编号;只有取得平台成功消息编号才推进Markdown通知游标。拒绝或异常不把图片语法、提及标签转发为普通文字,继续现有失败重试。
  • 已缓存的待发通知无需重传图片或改数据库,已成功的历史消息不自动重发。新增SDK参数、跨群路由、多图、部分失败和重启回归;完整网页说明、测试清单、历史记录和ZIP同步。

v2.20.11:普通群消息更新群昵称与重点提及

  • 群消息进入拍卖插件过滤器时,按sender_id收集发送者的有效昵称;普通聊天和其他插件命令也可更新,无需已出价、查余额或绑定活动。优先身份匹配的群名片,再使用统一昵称与原始作者资料;相同身份取最近收到的有效名字。
  • 由单个后台任务合并写入,普通聊天不因此唤醒拍卖、不回复或截断原消息。明确机器人、自身及私聊不进入普通群消息采集;空值和身份占位值保留原名,同名成员继续区分,管理员显示名优先。
  • 读取昵称与竞拍写入共用数据库写锁;同一事件不重复回写过时名字,关停前保存待更新记录。相同昵称不重复更新,避免普通聊天消耗新增成员编号。
  • 余额录入确认、余额查询、余额名单及管理员名单改用昵称;公开成功出价、历史与目高继续昵称显示。超价、成交、回收、撤回影响、出价失败和权限变更继续真实@对应成员。
  • 撤回通知中当前目高者用昵称补充说明,参与者统一真实@,避免重复提及。跨群公示只展示昵称,个人提醒沿用出价来源群路由。
  • 全部后台说明、测试清单与安装包同步,旧版本日志和历史原文完整保留。

v2.20.10:按活动设置批次时间与昵称补全

  • /设置批次时间 [活动名#]批次号#上新时间 支持明确指定活动,例如 /设置批次时间 秋拍#1#2026-10-03 15:00;旧写法仍按群绑定活动(单群为最新未删除活动)处理,成功回复显示实际活动名。
  • 校验批次正整数、参数个数、活动及批次是否存在、未来时间;错误或无权限请求不修改批次和定时。只替换目标批次的上新任务,保留其他活动定时与当前群绑定,上新按实际活动通知其前台群。
  • 昵称优先读取统一接口,缺失或只返回身份值时,从身份匹配的原始作者/发送者资料读取;录入余额还兼容平台原始提及中的昵称,支持对象与字典形式。不借用其他成员姓名,不清空已知昵称,管理员显示名优先。
  • 修复含下划线等字符的身份占位值可能经转义后被误作昵称的情况。平台确实没有提供昵称时继续使用稳定参拍编号,可通过设置显示名命令或后台补全,不影响余额与权限。
  • QQ帮助、完整网页操作说明和测试命令同步,历史原文及历次更新记录完整保留;主命令仍为45个,其中34个管理员命令。

v2.20.9:恢复后台完整资料

  • “拍卖插件设置”和“功能与测试指南”均提供完整操作指南、测试命令、更新日志和历史原文入口,可在页面内展开全文,包含各命令用途、权限、参数、示例、配置项及排查说明。
  • 完整保留精简前的 README 与测试清单原文,并标明历史版本;补齐 v2.20.5 起的更新记录。历史中的已移除命令不重新启用。
  • 文档随插件内置,阅读不依赖设置接口加载或外部网站;打包时从 Markdown 自动同步两页内容,避免安装包与网页说明不一致。
  • QQ帮助继续简洁,45个主命令、34个管理员命令以及现有竞拍、图片、余额、群协同逻辑保持不变。

v2.20.8:分批指定活动与余额名单成员显示

  • /稿位分批 [活动名#]每批数量 支持明确指定活动,例如 /稿位分批 秋拍#5;省略名称时沿用群绑定活动,单群模式使用最新未删除活动。回复标明实际活动名。
  • 只重建目标活动批次,未知活动不回退;空名称、非正整数、多余参数或无权限请求不修改批次。指定活动不改变群绑定,后续上新时间和查询仍使用当前活动。
  • /余额列表 每行显示普通文字称呼并保留真实@,避免平台不显示提及时只剩金额。称呼依次取管理员显示名、平台昵称、稳定参拍编号,同名成员附编号。
  • 录入余额时保存真实@组件提供的昵称,旧余额成员补建显示档案;身份和权限继续按平台标识判断,余额继续用完整十进制数字显示。

v2.20.7:全部图片统一缩略

  • QQ官方S.EE图文的单图与多图使用同一缩略上限,覆盖单稿位查询、出价提示、批次、上新、全场批次图和操作预览,默认最长边240像素,允许80–720。
  • 设置名改为“图片最长边(像素)”,保留 multi_image_max_size 配置键和旧值。不裁剪、不放大小图,保留原图文件和链接,无需重新上传。
  • 每张图片仍与前后文本分段;已缓存的待重试消息不重排。未配置S.EE或上传失败时回退的原生图片尺寸仍由QQ客户端决定。

v2.20.6:移除身份查询,完善网页使用说明

  • 删除 /我的ID 命令,不恢复旧身份查询别名;现为45个主命令、34个管理员命令。QQ帮助和错误提示不公开身份标识及程序原理。
  • 成员发送 /help、/功能、/帮助 或单独真实@机器人即可登记供网页选择;这些入口无需已有管理员或群活动绑定,但仍需AstrBot正常接收处理,不会自动授予权限或审核余额。
  • 网页补全45个命令的用途、限制和示例,以及14项配置、首次使用、完整拍卖流程、身份兼容、余额迁移和问题排查说明。

v2.20.5:精简QQ帮助与成员选择

  • QQ的 /功能、/帮助、/help 改为简短口令及必要规则,成员参数示例统一使用真实@,错误提示不再介绍内部实现。当时仍保留的身份确认入口已在v2.20.6删除。
  • 网页管理员配置改为成员勾选,余额迁移修复改为选择成员;保留暂未登记昵称的现有管理员,设置与成员信息加载成功前禁用保存,避免覆盖管理员配置。
  • 显示全部已登记成员,旧余额修复不默认选人;密码留空保留,明确勾选才清除。
  • 此版本曾同步精简README和测试清单;v2.20.9已恢复完整后台资料并保留精简前原文。

v2.20.4及以前:原始更新记录

以下逐字保留旧README中的版本记录;其中“当前版本”等说法均指当时版本。

v2.20.4 修复:图片与前后文字分段
  • QQ 官方 S.EE 图文消息中,每张图片前后使用空行分段,避免 Markdown 软换行导致图片与文字或相邻图片排在同一行。查询单个稿位、批次、批次目高、稿位列表、我上传的稿位、出价成功和新生成的上新及多群同步图文均使用统一排版。
  • 原生图片消息链同样在图片与相邻内容之间添加换行,实际展示由平台客户端决定。多图缩略尺寸设置和整批一条 Markdown 消息的方式保持不变;我的稿位仍为纯文字。
  • 重新查询即可使用新排版;已发送消息和已经缓存的待重试通知不变。WebUI、帮助与测试清单同步更新,无需重新上传例图。
v2.20.3 更新:多图消息缩略展示
  • QQ 官方 S.EE 图文消息包含至少2张有效图片时,每张图片默认等比缩至最长边240像素,不裁剪、不放大小图。例如1493×3114的竖图展示为115×240;原图文件、图床缓存和链接保留。
  • 批次查询、批次目高、整批上新提醒、稿位列表、我上传的稿位以及新生成的多群同步图文统一生效。文字与对应例图保持原顺序,整批仍在一条消息内。单图详情保持原尺寸;我的稿位仍为纯文字。
  • AstrBot 标准插件配置与 Pages“拍卖插件设置 → S.EE 图床”均提供 multi_image_max_size(多图消息图片最长边),默认240,允许80–720像素。Pages保存后新生成的消息立即采用新尺寸;已经生成并缓存的待重试通知保留原排版,已发送消息不会改变。
  • 未配置图床、上传失败后的原生图片,以及OneBot原生图片的展示尺寸由QQ客户端决定,不使用Markdown尺寸设置。无需重传图片或修改拍卖数据。
v2.20.2 修复:多群管理命令漏匹配与排查
  • 为 /设置群、/取消群设置、/群设置、/设置显示名、/通知状态、/重试通知 增加通用监听备用入口。标准命令未匹配时仍可处理明确的斜杠口令;已被框架唤醒的同名命令也适用。两入口共用事件内标记,单条消息只执行、回复一次,不按 sender_id、内容或时间去重;跨群相同内容及新发的重复命令分别处理。
  • 通用监听在框架唤醒阶段只匹配拍卖自然口令、多群管理命令和单独真实 @机器人,避免由本插件将无关闲聊唤醒并占用会话限流额度。不会更改 AstrBot 的群白名单、会话启用状态或限流配置。
  • 群设置成功回复增加实际保存的群别名及 /群设置 核对指引。多群管理命令记录 [拍卖多群命令] 开始处理、准备回复、处理结束日志,包含群会话和消息编号,不记录命令参数;意外异常有日志和核对提示。
  • 主命令仍为46个。WebUI、帮助和测试清单同步更新,无需迁移或修改已有群绑定数据。

不同群命令无回复时: event_bus 日志只证明 AstrBot 已收到消息,不证明命令已进入插件。若没有 [拍卖多群命令] 开始处理,先核对机器人当前配置的唤醒前缀(包含 /)、每个群的白名单、会话启用状态及本插件启用状态,并检查限流是否丢弃或排队。开启 DEBUG 后可查找框架停止事件传播的阶段。拍卖插件管理员名单与 AstrBot 框架管理员/群白名单不是同一项授权。

若有“准备回复”但群内没收到,继续查看 AstrBot 的回复及平台发送错误;插件“处理结束”不代表平台已投递。/通知状态只记录拍卖跨群广播,不包含 /设置群 的直接回复,不能用于重试群设置回执。可在插件设置页核对实际保存的绑定。Q群管家的“请使用新版手机QQ进行查看”是另一机器人消息,不能据此认定拍卖命令已处理。

框架行为参考:消息监听文档、唤醒检查、处理顺序、限流检查。实际配置与日志文字以部署版本为准。

v2.20.1 修复:旧身份格式导致加载失败
  • 修复“旧余额记录N的 sender_id 无效”会阻止整个插件加载的问题。兼容 QQ 官方提及标签 <qqbot-at-user id="sender_id" />;只解析明确的身份包装,不按昵称或片段猜测成员。
  • 仍无法识别的旧身份保留原始记录,并写入 balance_migration_issues 等待管理员核对;这些金额暂不计入任何成员余额。其余正常记录完成一次性加和,重载不会重复导入。/余额列表 会提示待核对数量及记录号,启动日志也会提示。
  • WebUI → 拍卖插件设置 →“旧余额迁移待核对”可查看原身份、活动和金额。确认成员归属、现有余额、其他相关记录及年龄审核后,填写正确 sender_id 和最终全局余额保存。输入为空时不自动填0;同一条记录只能处理一次。
  • 新增管理员命令 /修复余额 3#@成员#5000,也支持直接填写 sender_id。这里5000是核对后的最终全局余额,会覆盖目标成员现有余额,不是增加5000。命令只处理待核对记录,余额与处理状态在同一事务内保存,并记录处理人、金额和时间。启用多群后仅限后台群管理员使用。
  • 主命令现为46个,其中34个管理员命令;帮助、WebUI和测试清单已同步。升级覆盖当前插件后重载即可,不需要删除旧记录或修改数据库。
v2.20.0 更新:全局共享余额
  • 每个 sender_id 只有一份有效余额,所有活动共用。创建、切换、关闭或删除活动不重置该余额;身份仍按 sender_id 匹配,真实 @成员与裸 ID 互通。
  • 首次加载本版本时,将同一成员在全部旧活动中的余额相加,包含已关闭、已删除活动保留的余额。例如活动A为1000、活动B为2000,升级后全局余额为3000。同一活动内因旧提及包装形成的重复记录取最后一次录入值,再跨活动相加。
  • 迁移与完成标记在同一事务内提交;中途异常整体回滚。重载、再次升级、修改或清空余额后均不会重新累加。无效旧金额会中止迁移,不静默丢弃。
  • 管理员 /录入余额 @成员#5000 将该成员的全局余额设置为5000,不是再增加5000;查询和名单读取这份全局记录。/清空余额 清空所有成员、所有活动共用的余额及审核,影响全部活动。启用多群时仍限后台管理员操作。
  • 出价校验使用跨活动的当前目高合计:余额必须≥合计的70%;本人对同一稿位加价用新价替换旧价。已有目高的暂停活动、未上新稿位仍占用额度;稿位截止、回收或所属活动删除后不占用。成交不自动扣减余额,沿用现有规则。
  • 年龄审核沿用该成员最后一次录入的审核状态;未审核时仍无法出价。普通成员只能查询自己的审核状态,不显示余额金额。金额继续使用普通十进制数字。
  • /功能、WebUI 和完整测试命令同步更新,主命令仍为45个。升级迁移在安装后首次加载时执行,无需手动修改数据库。

迁移核对:有效余额在 member_balances;一次性完成标记在 balance_migrations;每位成员的汇总金额、来源活动和采纳记录保存在 balance_migration_records。旧表 activity_balances 仅作为历史来源保留,业务不再读写,也不会在清空后恢复其金额。可由管理员通过 /查询余额 sender_id 或 /余额列表 核对当前余额。

v2.19.0 更新
  • 新增前台/后台群与活动绑定。前台共享出价、批次和当期余额审核;成功出价、上新、半小时提醒、截止及回收同步活动的全部前台群。后台不接收这些公共广播。
  • 超价提醒只在前一次最高出价的来源前台群真实 @;自己加价不提醒。成交、回收及撤回的个人提醒也使用出价来源,不向无关群 @成员。失败出价只回复原群;余额管理仅限后台管理员。
  • 公共出价历史和目高显示普通昵称,不触发 @。显示名优先级:管理员指定、平台昵称、稳定参拍编号;重名加编号。权限和余额仍只按 sender_id 判断,不合并同名成员,不反查 QQ 号。
  • 增加持久化通知队列:按群、按消息段保存进度,重启恢复,最多自动尝试3次,失败后可手动重试。通知重试不重复执行竞价或截止;网络超时仍可能造成重复投递。“平台已接受”不代表成员已读。
  • WebUI“拍卖插件设置”增加协同开关、已登记群绑定、最近200位成员显示名和最近100条通知状态;/功能与网页指南覆盖45个主命令、33个管理员命令。/我的稿位继续纯文字展示。
多群配置示例

先创建活动“秋拍”,再由管理员分别在三个目标群发送:

/设置群 前台#秋拍#A群
/设置群 前台#秋拍#B群
/设置群 后台#秋拍#管理群

首次绑定自动开启多群协同。后台录入全局余额,成员在前台发送 给1号出价 1000。绑定后无显式活动名的命令使用本群绑定活动,不会因创建新活动而切换。不同活动可以分别绑定不同群;同一活动仅接受同一个机器人平台连接。

/群设置
/设置显示名 @成员#小明
/设置显示名 member_openid#清空
/通知状态
/重试通知 12
/取消群设置

以上六种新命令均仅管理员可用,@成员必须使用真实提及。未获取平台昵称时使用参拍编号;旧出价无来源群记录时不猜测该成员所在群。跨群成员可用 /我的ID 核对 sender_id 是否一致;若平台返回不同值,视为不同身份,需分别审核。QQ 官方主动跨群发送和 Markdown 图片显示受实际机器人适配器与平台能力影响,需要按 TEST_COMMANDS.md 在测试群验收。

升级默认仍为单群模式;首次绑定或打开配置项 multi_group_enabled 后启用协同。启用后未绑定群不能执行活动相关命令,帮助、身份查询和管理员绑定命令仍可用。关闭协同会暂停待发队列;再次开启后继续发送。解除群绑定或改为后台会取消其未发送通知。删除全部绑定不会自动关闭开关。

下面为历史版本记录,当前用法以本节、/功能和网页指南为准。

v2.18.0 更新
  • /我的稿位、自然口令 我的稿位 改为纯文字回复,不显示图片、图片链接或缺图提示,也不调用图床。保留“已截止”和“未截止目高稿位”分组,以及活动名、序号、名称、金额和备注。
  • /我上传的稿位、单稿位查询、批次查询等命令继续使用原图文回复方式。帮助、WebUI 和测试清单同步更新。
v2.17.0 更新
  • /我的稿位(也可不加斜杠)先显示“已截止”:本人成交的稿位;再显示“未截止目高稿位”:当前最高出价为自己的未截止稿位。两组均包含历史活动记录,空组显示“暂无”。
  • 每项以“x号 稿位名 金额”展示,已截止组金额为成交价,未截止组金额为当前目高;活动名、备注和例图继续保留。被超价、撤回后不再领先、已回收或无人出价的稿位不计入。
  • /功能、WebUI 及测试清单同步说明分组规则,/我上传的稿位 继续查询上传记录。
v2.16.0 更新
  • 群内单独使用 QQ 的真实 @功能提及机器人,会回复下方快捷口令。@后带命令时执行原命令;提及其他成员、全体成员或普通私聊不触发快捷说明。
  • /功能、/帮助、/help 保持覆盖全部39个主命令,补齐按记录号恢复、指定序号添加、替换空号及个人查询的用法提示;WebUI 与测试清单同步。
  • 我的稿位、我上传的稿位 支持不加斜杠直接查询;与带斜杠版本使用同一查询逻辑和图文回复方式。
  • 本次快捷说明保留指定的星号;其他消息仍遵循既有规则。

单独 @机器人的回复:

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额
v2.15.0 更新
  • 新增管理员命令 /替换稿位 [活动名#]新稿位序号#目标空序号。例如 /替换稿位 99#69 将新99号移到空缺的69号,保留新稿位的内部记录、图片、画师、价格、备注、批次及定时。原99号释放,普通添加优先使用已释放的空位(多个时按序号从小到大),重载后仍有效。
  • 添加稿位支持显式指定空号:/添加稿位 [活动名#]序号=69#稿位名#画师名#起拍价[#回收价],仍须附1张例图。既可使用从未占用的序号,也可使用已删除稿位留下的空号;已有记录(包括已截止、已回收)不能覆盖。
  • 替换仅允许无任何出价历史、尚未截止且未回收的稿位。普通成员无权操作;序号分配、替换、恢复和出价使用同一写锁,冲突或失败时不覆盖其他稿位。
  • 普通删除保留的序号仍不会被普通添加自动占用;明确指定该序号或执行替换可以重新使用。旧删除快照继续保留,原编号被占用时恢复会拒绝。同一编号有多份快照时,用 /已删除稿位 查询恢复记录号,再发送 /撤销删除 记录=123 精确选择。
  • 这两种补号方式不恢复旧稿位的出价历史。指定添加沿用新增稿位的默认批次和定时设置,替换沿用新稿位自身的批次和定时,均不会猜测或继承旧稿位的关联数据。
v2.14.0 更新
  • 新增管理员命令 /已删除稿位 [活动名] 和 /撤销删除 [活动名#]稿位序号。删除和快照保存位于同一事务,重载插件后仍可恢复。
  • 恢复原编号、名称、价格、画师、备注、上传者和例图引用。编号、名称或记录标识冲突时拒绝覆盖,删除快照继续保留。新增稿位会跳过历史删除记录占用的序号。
  • 恢复时不重新启动旧截止、回收和提醒任务,请重新设置定时。仍在的批次按当前上新状态恢复;原批次不存在时解除旧关联并将可竞拍稿位恢复为筹备中,需要重新分批。原已回收状态保持已回收。
  • 此功能只适用于v2.14.0起保存的删除快照。旧版本已经误删的69号无法凭升级自动重建,需提供误删前的数据库备份检查、单独恢复目标记录,不能用旧库整体覆盖当前库。图片恢复依赖原文件或图床链接仍可用。
v2.13.0 更新
  • 修复数字序号不存在时回退到数据库内部 ID 的错误。例如当前活动没有99号,但内部 ID 99 对应69号时,旧逻辑会选错稿位。现在数字只匹配当前活动内序号,找不到就拒绝;修改、备注、查询、出价、定时、撤回、截止及回收同步采用严格匹配。
  • /删除稿位 序号/完整名称 先显示活动、序号、名称、状态及例图预览,不立即删除。管理员核对后,按返回的 /删除稿位 确认 确认码 在5分钟内、同一会话中确认。每次新预览使本人的旧码失效,确认码只能使用一次,重载插件后失效。
  • 有任何出价记录(含已撤回记录)、当前出价或已截止的稿位禁止直接删除;需要停止竞拍时使用回收并保留记录。确认时重新检查目标和出价,期间稿位或所属活动信息变化会拒绝删除。
  • 确认绑定原始记录,不会因创建新活动或同序号稿位被重新添加而选中别的稿位。删除与出价串行执行;失败时整体回滚,成功后取消该稿位关联定时,其他稿位不重新编号。发现重复序号也会拒绝数字匹配,需核对后使用完整名称操作。
v2.12.0 更新
  • 原 /我的稿位 的上传记录查询迁移至 /我上传的稿位,继续显示自己在所有活动中上传的稿位。
  • /我的稿位 改为查询所有活动中当前最高出价为自己的稿位,包括尚未截止的稿位及已成交稿位,按活动展示序号、名称、状态、目高或成交价、备注和例图。被超价、撤回后不再持有目高、已回收或无人出价的稿位不计入。
  • 两条命令均可由普通成员使用,只查询发令者自己的记录;沿用 sender_id 身份和现有多图文混排方式,无需重新录入历史数据。
  • 余额录入、修改、查询与名单统一显示完整十进制数字,例如 1000000、1234567.89,不再出现科学计数法或六位有效数字截断。
v2.11.0 更新
  • 新增管理员口令 /设置备注 稿位号#内容,覆盖原备注;/设置备注 1#清空 可删除备注,旧的 /修改稿位 1#备注#内容 仍有效。
  • 备注统一显示于单稿位查询、出价成功提示、批次目高、批次查询、上新提醒、稿位列表和我的稿位。
  • 定时截止/回收提前30分钟向设置定时的会话发送提醒。设定时不足30分钟立即提醒;回收提醒和回收结果 @当前最高出价者,无人出价时不 @。
  • 截止前5分钟内每次有效出价,将当前截止时间再延长5分钟,不限次数;出价提示显示新截止时间。回收和无效出价不触发延期。
  • 延期同步更新数据库调度任务,避免旧计时器提前截止;活动总截止会等待已经触发延期的稿位。旧定时自动补建提醒;重复重载不重复发送已完成的提醒。
  • 取消或改设定时、手动截止/回收、删除稿位或关闭/删除活动时,同步取消关联的旧提醒。回收提醒保留指定符号;v2.16.0起的 @快捷说明也保留指定星号,其他回复不添加 emoji。
v2.10.0 更新
  • 支持单条消息包含多张稿位图片,并按照“稿位文字 → 对应例图”交错显示,不再把整批图片合成为一张总览图。
  • /查询批次、/查询批次目高、自然口令批次查询、批次上新提醒、/稿位列表 和 /我的稿位 全部启用多图文混排。
  • QQ 官方平台通过 S.EE 逐张托管后写入同一条 Markdown;OneBot v11 使用一条含多个 Plain 与 Image 组件的消息链并保留顺序。
  • 单张图床上传失败时,其余图片仍正常显示,失败图片另外使用平台原生方式发送。
v2.9.0 更新
  • QQ 官方平台的 S.EE 单条图文不再依赖成员提及。查询尚未出价或已有出价的稿位都会用同一方式把文字和图片合并为一条 Markdown。
  • 添加稿位确认、查看稿位、查询批次、批次目高、查询目高、设置全场批次图确认、出价成功和定时上新均接入同一图文发送路径。
  • S.EE 上传失败时保留平台原生图文回退,避免图片丢失。
v2.8.0 更新
  • WebUI Pages 新增统一的“拍卖插件设置”页面,管理员、S.EE 和 MinIO 全部配置可在同一页查看和保存。
  • S.EE API Token 与 MinIO Secret Key 使用密码框;读取页面时不回传密钥明文,留空保存会保留原值,只有勾选清除选项才会删除。
  • MinIO 改为使用 AstrBot 插件配置并可立即刷新;旧版 config.yaml 仍作为兼容回退。
  • _conf_schema.json 与统一设置页保持同一组配置项,也可继续使用 AstrBot 的标准插件配置入口。
v2.7.0 更新
  • 新增 S.EE 图床支持。QQ 官方消息同时包含成员提及和图片时,插件上传图片并把 HTTPS 直链嵌入同一条 Markdown,实现文字、@成员和图片单条发送。
  • S.EE 直链按图片内容哈希缓存在插件数据目录;同一稿位图或批次总览图不会在每次查询时重复上传。
  • S.EE 未配置或上传失败时自动回退为文字与图片两条消息,保证信息仍能发送。OneBot v11 继续使用原生 At 和图片组件。
  • API Token 通过 AstrBot 插件配置填写,不写入源码和安装包。
v2.6.0 更新
  • QQ 官方平台改用 Markdown 的 <qqbot-at-user id="openid" /> 成员标签,并显式启用 AstrBot Markdown 发送。
  • QQ 官方 OpenID 无法通过官方接口反查真实 QQ 号;插件继续只使用 sender_id,不建立 QQ 号映射。
v2.5.0 更新
  • 群消息中的成员身份统一显示为 @成员,覆盖管理员增删与列表、余额录入与查询、出价历史、稿位与批次目高、撤回通知、超价提醒和成交提醒。
  • OneBot v11 使用 AstrBot 标准 At 组件;QQ 官方机器人根据 sender_id 输出 Markdown 成员标签,避免当前 qq_official 适配器忽略 At 组件。
  • 定时任务会保存消息平台类型,使批次上新、自动截止和活动结束后的主动提醒也使用对应平台的 @方式。
  • /我的ID 是唯一保留原始 sender_id 的群命令,用于 WebUI 管理员配置和排障;权限不足提示不再公开 ID。
v2.4.1 更新
  • 删除所有机器人被动回复和主动通知中的 emoji,成功、失败、警告、状态和帮助分组均改用纯文字。
v2.4.0 更新
  • 查询批次及批次目高均附该批次例图;整批文字与按序号排版的例图总览合在一条消息内。查询全部批次时,每批一条。
  • 批次定时上新时,向设置该批次时间的会话发送一条整批提醒,包含稿位序号、稿位名、画师名、起拍价、回收价与例图。
  • 查看稿位不再展示定时、上传者、创建时间。
  • 从真实消息链读取 @成员的 sender_id,和直接填写 sender_id 共用当期审核记录;升级自动合并旧的 <@sender_id> 包装记录,以最近一次录入为准。
  • 出价失败提示不展示余额、所需余额或出价占用合计。

列表和批次消息会把每个稿位的文字与对应例图依次排列;缺失或无法读取的例图会标注对应序号。配置 S.EE 后,QQ 官方平台会把多段文字、多张图片及可能存在的 @成员合成一条 Markdown;单张图片上传失败时会单独回退为平台原生图片。定时提醒需要平台允许向目标会话主动发送消息。

返回文档入口

历史操作指南原文(v2.26.0)

历史原文,完整保留。以下为标题所示版本当时的说明,不代表当前可执行命令。身份查询命令已移除,管理员改用成员选择;现版本所有图床图片均使用缩略尺寸,分批支持指定活动。实际操作请看当前完整指南与当前测试命令。

cym_auction — 拍卖系统

当前版本:2.26.0,配套独立Web 1.8.0。新增多张附属例图:QQ发送“查看1号稿位更多例图”单独查看;管理员通过QQ或网页添加、删除,网页还可排序。普通查询、竞拍消息及用户网页继续只展示主图。保留分级账号权限、完整指南及历史日志。

QQ内的 /功能、/帮助、/help 和错误提示只保留口令与必要规则。需要指定成员的示例统一使用 @成员,请用QQ的@功能选中对方,不要只输入昵称。网页保留详细使用说明,QQ内只提供精简帮助。

后台文档入口与版本记录

进入“插件 → 拍卖系统 → Pages → 拍卖插件设置”或“功能与测试指南”,页面顶部可直接跳转并展开完整操作指南、完整测试命令、完整更新日志、历史原文。所有内容内置于安装包,设置接口暂不可用时也能阅读。

网页完整说明与QQ简短帮助分别维护;后台不因QQ帮助精简而删去参数、限制、配置解释或更新记录。历史中的身份查询命令已移除,不作为当前操作入口。

附属例图命令(v2.26.0)

权限 命令 用法
所有成员 查看1号稿位更多例图 查看本群活动1号稿位的全部附图;不重复主图
所有成员 /更多例图 [活动名#]稿位号 例如 /更多例图 一周年庆#1
管理员 /添加例图 [活动名#]稿位号 +图片 多张按消息顺序追加,每稿位最多20张;例 /添加例图 一周年庆#1
管理员 /删除例图 [活动名#]稿位号#例图编号 例 /删除例图 一周年庆#1#2,删附图2,剩余顺排,主图不变

附图与主图独立保存;普通查询、出价、批次及通知只使用主图,只有更多例图命令发送附图,沿用小图及图文分段。无附图会明确提示。网页操作、权限和升级要求见下方独立网站完整说明;删除稿位的恢复快照会保留附图。

安装与管理

在 AstrBot WebUI 上传 cym_auction.zip,安装或更新后重载插件。安装包根目录包含 metadata.yaml 和 main.py。

进入“插件 → 拍卖系统 → Pages → 拍卖插件设置”,勾选管理员并保存。机器人收到的普通群消息也会登记成员并更新群昵称;成员未出现时,让对方发一条群消息后点击“重新读取”,也可用 /help 或单独 @机器人确认消息可达。首次登记不要求已绑定活动或已有管理员。列表保留已有管理员;昵称缺失时可在群内用 /管理列表 核对。已有管理员也可直接操作:

/添加管理 @成员
/删除管理 @成员
/管理列表

同页提供 S.EE、图片尺寸及多群设置。S.EE 图文中的所有图片(包括单图)默认等比缩至最长边240像素,每张图与前后文字分段;整批仍在一条消息内。单稿位查询、出价提示、全场批次图、操作预览及批次消息均使用同一上限,可在“图片最长边”调整为80–720像素。沿用原有尺寸设置,无需重传例图。原生图片的实际排列由QQ客户端决定。

支持 /稿位分批 秋拍#5 明确指定活动;/稿位分批 5 继续使用当前活动。分批回复会标明活动名。设置上新时间也支持 /设置批次时间 秋拍#1#2026-10-03 15:00;未指定活动名时仍使用当前活动,成功回复会列出实际活动名,群绑定不变。/余额列表 使用文字昵称,缺少昵称时使用稳定参拍编号,同名成员附编号;普通名单不触发@。

成员常用命令

给1号出价 1000
查询1号稿位
查询批次1
查询批次1目高
查询目高
我的稿位
我上传的稿位
查看我的余额
/help

我的稿位 纯文字分为“已截止成交”和“未截止目高稿位”;我上传的稿位 查询上传记录并显示例图。公开出价和目高显示昵称,超价、成交等个人提醒使用 @成员。

在群内单独 @机器人可收到:

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额

活动与稿位示例

时间请替换为实际拍卖日期,格式为 YYYY-MM-DD HH:MM。

/创建活动 秋拍#2026-10-02 10:00#2026-10-05 22:00
/开启活动 秋拍
/添加稿位 枠枠单人插图#测试画师#100#800
/设置备注 1#可加购背景,工期两周
/稿位分批 5
/设置批次时间 1#2026-10-02 12:00
/设置定时 1#2026-10-03 20:00#截止

添加稿位时同条消息附1张例图;回收价可省略。定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。

/删除稿位 69
/已删除稿位
/撤销删除 69
/撤销删除 记录=123
/替换稿位 99#69
/添加稿位 序号=69#稿位名#画师名#100

删除先预览,再在5分钟内按回复确认;有出价或已截止的稿位不能删除。撤销删除后请重新设置定时。替换和指定序号添加仅限空缺序号,已有稿位不会被覆盖。

余额与出价

成交按成交价全额扣除获拍者的共享余额,手动截止、定时截止和活动到期成交使用同一规则。原70%规则只用于出价门槛,成交扣款不是70%;不足时余额可以为负数,后续出价按扣款后的余额校验。回收及无人出价不扣款。

管理员可执行 /恢复余额 秋拍,或在网页按活动恢复已扣款项,每笔只恢复一次。升级前已截止且没有扣款记录的稿位不会补扣或产生退款。详见文末成交扣款规则。

管理员完成余额和年龄审核后操作:

/录入余额 @成员#10000
/查询余额 @成员
/余额列表
/修复余额 3#@成员#5000
/撤回出价 1#@成员#1000

每位成员的余额在所有活动共享。录入和修复使用最终余额,覆盖原金额。出价须高于当前目高且大于等于起拍价,余额须覆盖所有活动中本人未截止、未回收目高合计的70%。成员只能确认自己是否审核,不公开余额金额。余额不足的出价仅回复“出价失败!余额不足。”,不显示比例、计算方法或具体余额;QQ帮助同样不展示计算方式。完整规则仍保留在本网页指南中。

/修复余额 只处理待核对的旧余额;先核对记录归属与金额,也可在设置页选择成员办理。/清空余额 影响全部成员、全部活动,请只在确认需要清空时使用。撤回出价会让该笔及之后的全部出价作废。

多群设置

先创建活动,再在各个目标群分别执行:

/设置群 前台#秋拍#A群
/设置群 前台#秋拍#B群
/设置群 后台#秋拍#管理群
/群设置
/设置显示名 @成员#小明
/通知状态
/重试通知 12

同一活动的前台群共享目高,并同步成功出价、上新、截止、回收及提醒。超价等个人提醒只发往相关出价者所在的群;后台不接收公共广播。启用多群后,余额管理仅允许管理员在后台群操作。失败出价只回复原群。

全部51个命令及必要参数可在 /功能 或 Pages“功能与测试指南”查看。完整测试命令覆盖帮助、权限、出价、图文、备注、定时及多群场景。

网页“功能与测试指南”提供全部51个命令的用途、完整参数、操作限制和可复制示例,另有首次配置、活动流程、全配置项参考、余额规则、图文显示及兼容性排查。每条命令点击“用途与示例”展开;这些详细说明仅用于网页,QQ帮助保持简洁。

全部51个命令:权限、参数、限制与示例

以下为当前可用的全部主命令,标记管理员的命令仅授权成员可用。成员参数使用QQ真实@;别名不另计主命令数量。

活动管理
/创建活动

权限:管理员。格式:/创建活动 活动名#开始时间#结束时间。

创建一场拍卖,名称不能与未删除活动重名,结束时间必须晚于开始时间。活动到开始时间自动开启。示例日期需替换为实际日期。

/创建活动 秋拍#2026-10-02 10:00#2026-10-05 22:00
/修改活动

权限:管理员。格式:/修改活动 活动名#名称/开始时间/结束时间#新值。

字段只能填名称、开始时间或结束时间;使用活动当前名称定位,改名后后续命令使用新名称。

/修改活动 秋拍#结束时间#2026-10-06 22:00
/开启活动

权限:管理员。格式:/开启活动 活动名。

手动开启指定活动。活动开启后,稿位和所在批次仍需上新才能出价。

/开启活动 秋拍
/关闭活动

权限:管理员。格式:/关闭活动 活动名。

停止该活动出价,并取消活动、批次及稿位的待执行定时。再次开启后如需自动操作,请重新设置时间。成员共享余额不会被清空。

/关闭活动 秋拍
/删除活动

权限:管理员。格式:/删除活动 活动名。

删除指定活动,使其不再参与拍卖及默认查询,并取消相关定时。没有撤销删除活动的命令;不清空成员共享余额。

/删除活动 秋拍
/活动列表

权限:所有成员。格式:/活动列表。

查看所有未删除活动的名称、状态及起止时间,用于核对群绑定和其他活动命令。

/活动列表
稿位管理
/添加稿位

权限:管理员。格式:/添加稿位 [活动名#][序号=69#]稿位名#画师名#起拍价[#回收价] +图片。

同一条消息附1张例图。必填名称、画师、起拍价;起拍价大于0,回收价可省略或填0表示未设成交底价;默认显示不透露,可在独立网站逐稿位公开,管理员网站保留实际金额。默认按顺序编号;可指定活动及空缺序号,已有序号不能覆盖。

/添加稿位 秋拍#序号=69#单人插图#画师甲#100#800
/修改稿位

权限:管理员。格式:/修改稿位 稿位名/序号#字段#新值。

可修改名称、画师、起拍价、回收价、备注、图。修改图片时同条消息附新图;稿位使用当前活动内的序号或完整名称。

/修改稿位 1#画师#画师乙
/修改稿位 1#图
/替换稿位

权限:管理员。格式:/替换稿位 [活动名#]新稿位序号#目标空序号(例:99#69)。

将无出价历史且未截止、未回收的新稿位移到目标空号,保留其内容、批次与定时。原序号释放供后续添加优先使用。目标有稿位时拒绝覆盖;不会恢复旧稿位的出价记录。

/替换稿位 99#69
/替换稿位 秋拍#99#69
/设置备注

权限:管理员。格式:/设置备注 稿位号#内容(写清空可删除)。

新增或覆盖备注,内容写清空则删除备注。备注在单稿位、批次查询、出价成功、上新提醒和个人列表中显示。

/设置备注 1#可加购背景,工期两周
/设置备注 1#清空
/删除稿位

权限:管理员。格式:/删除稿位 序号/完整名称(先预览,再按提示确认)。

先显示活动、序号、名称和例图预览,由同一管理员在同一会话5分钟内按回复确认。有出价记录(包括已撤回)或已截止的稿位不能删除;预览后目标发生改变需重新预览。

/删除稿位 69
/删除稿位 确认 回复中的确认码
/稿位列表

权限:所有成员。格式:/稿位列表 [活动名]。

列出当前活动的全部稿位与例图;需要查询其他活动时追加活动名称。

/稿位列表
/稿位列表 秋拍
/已删除稿位

权限:管理员。格式:/已删除稿位 [活动名]。

查看可恢复的删除记录、原序号和恢复记录号。可追加活动名;恢复记录号与稿位序号是不同的编号。

/已删除稿位
/已删除稿位 秋拍
/撤销删除

权限:管理员。格式:/撤销删除 [活动名#]稿位序号(或记录=恢复记录号)。

恢复原序号、内容与例图,编号或名称被占用时不会覆盖。多条同号删除记录可按恢复记录号选择。原定时需重新设置;原批次不存在时需重新分批。

/撤销删除 69
/撤销删除 秋拍#69
/撤销删除 记录=123
/我的稿位

权限:所有成员。格式:/我的稿位 (纯文字分组:本人成交的已截止稿位、未截止目高稿位;可不加斜杠)。

查询本人跨活动的已截止成交稿位和当前尚未截止的最高出价稿位,两组均只显示文字。被超价、已回收、撤回后不再领先的稿位不计入。

/我的稿位
我的稿位
/我上传的稿位

权限:所有成员。格式:/我上传的稿位 (自己上传的稿位;可不加斜杠)。

查看本人上传的所有状态稿位,包含图片;不是本人竞拍领先的列表。

/我上传的稿位
我上传的稿位
/更多例图

权限:所有成员。格式:/更多例图 [活动名#]稿位号,例如 /更多例图 秋拍#1。自然口令:查看1号稿位更多例图。只显示附图,按顺序编号;没有附图明确提示。

/添加例图

权限:管理员。格式:/添加例图 [活动名#]稿位号,例如 /添加例图 秋拍#1,同条消息附一张或多张图片。最多20张附图,按消息顺序追加,主图保持不变。

/删除例图

权限:管理员。格式:/删除例图 [活动名#]稿位号#例图编号,例如 /删除例图 秋拍#1#2。删除附图2,剩余顺排;不存在时不删除任何图片。先查询核对编号,主图不受影响。

/查看稿位

权限:所有成员。格式:/查看稿位 稿位名/序号。

按序号或完整名称查看状态、画师、例图、起拍价、回收价(按公开设置显示)、备注、目高及最高出价者。设置了定时的稿位显示截止时间(北京时间),修改或延期后显示最新时间;未设或已取消定时不显示,不使用活动结束时间代填。仍不显示上传者和创建时间。

/查看稿位 1
查询1号稿位
批次与查询
/稿位分批

权限:管理员。格式:/稿位分批 [活动名#]每批数量。

可用活动名#每批数量明确指定活动;省略活动名时,多群使用本群绑定活动,单群使用最新未删除活动。只按目标活动稿位序号从小到大分组,回复显示实际活动名。再次分批会重建该活动批次并重设未结束稿位为筹备状态,需重新安排上新;本次指定活动不会改变群绑定。

/稿位分批 5
/稿位分批 秋拍#5
/设置批次时间

权限:管理员。格式:/设置批次时间 [活动名#]批次号#上新时间。

可用活动名#批次号#上新时间明确指定活动;省略名称时,多群使用本群绑定活动,单群使用最新未删除活动。时间必须晚于当前时间,批次号需为正整数;成功回复包含活动名。只替换目标批次的上新定时,不改变群绑定和其他活动。到时整批上新并向该活动前台群发送含全部稿位和例图的提醒;单群发往设置命令所在会话。重新设置后该批未结束稿位需等待新时间才能出价。

/设置批次时间 1#2026-10-02 12:00
/设置批次时间 秋拍#1#2026-10-02 12:00
/设置全场批次图

权限:管理员。格式:/设置全场批次图 +图片。

同条消息附1张全场批次参考图并保存;重新设置会替换当前活动的总览图。查询目高现为纯文字全场价格表,不再附带该图。

/设置全场批次图
/查询批次

权限:所有成员。格式:/查询批次 [批次号]。

无参数时查看批次信息;指定编号可查看该批上新时间、全部稿位和对应例图。

/查询批次
/查询批次 1
查询批次1
/查询批次目高

权限:所有成员。格式:/查询批次目高 批次号。

显示该批全部稿位的目高、状态、备注及例图。未开拍、已截止、已回收使用相应状态提示。

/查询批次目高 1
查询批次1目高
/查询目高

权限:所有成员。格式:/查询目高。

按序号列出当前活动全部稿位,每件一行,格式为 53号 炊籽xxx | 1000¥;无人出价为 54号 作品名 | 暂无出价。只显示序号、作品名和当前价格,不显示活动标题、批次、上新时间、截止时间、“目高:”标签、图片或其他信息,行间不加空行。未分批稿位同样列出,长内容自动分段。

/查询目高
查询目高
余额与审核
/修复余额

权限:管理员。格式:/修复余额 旧记录号#@成员#最终余额。

只处理余额列表中的待核对旧记录。先核对成员、其现有余额及相关旧记录,再输入最终共享余额,覆盖原金额并确认年龄审核。不是追加金额;同一记录不能重复处理。

/修复余额 3#@成员#5000
/录入余额

权限:管理员。格式:/录入余额 @成员#金额(覆盖全局余额)。

管理员审核余额与年龄后,为选中成员设置最终共享余额。重新录入覆盖原值,金额不能为负,所有活动立即共用;多群模式只允许后台群操作。确认回复显示昵称,不额外@成员。

/录入余额 @成员#10000
@成员录入余额10000
/查询余额

权限:管理员。格式:/查询余额 @成员。

仅管理员可查询被选中成员的具体余额和年龄审核情况;多群模式限后台群。查询回复用昵称显示成员,不触发@。

/查询余额 @成员
查询@成员余额
/余额列表

权限:管理员。格式:/余额列表 (全局记录)。

仅管理员查看所有成员的共享余额及审核记录。每行显示文字昵称,不触发@;没有昵称时显示稳定参拍编号,同名成员加编号区分。成员发群消息时会按身份更新可用群昵称,也可用 /设置显示名 @成员#昵称 指定称呼。多群模式限后台群;待核对旧余额另列记录号。

/余额列表
/恢复余额

权限:管理员;多群模式限后台群。格式:/恢复余额 活动名。

填写完整活动名称,将该活动已实际扣除、尚未恢复的全部成交款加回成员当前共享余额。每笔只恢复一次,不覆盖余额到历史快照,不退其他活动的扣款,也不改变稿位的截止状态或获拍者。支持已关闭、已删除的活动(使用原活动名)。

/恢复余额 秋拍

回复包括恢复笔数、涉及人数及总金额;不会广播到前台。网页“拍卖插件设置 → 按活动恢复成交扣款”提供相同操作和待恢复/已恢复汇总。活动中仍有未成交稿位时,后续新成交照常扣款,可再次执行命令恢复新增扣款。没有实际扣款记录时不加款。

/清空余额

权限:管理员。格式:/清空余额 (清空所有成员全局余额,影响全部活动)。

清空全部成员的共享余额和审核,影响全部活动,不是只清理当前活动。操作后成员需重新审核录入;多群模式限后台群。成交扣款仍可按活动恢复,恢复不会自动通过审核。

/清空余额
/查看我的余额

权限:所有成员。格式:/查看我的余额。

成员只确认自己的有效审核状态,不展示具体金额。未审核时按提示联系群主。

/查看我的余额
查看我的余额
出价与成交
/出价

权限:所有成员。格式:/出价 稿位号 金额。

金额须高于当前目高且大于等于起拍价,活动、稿位、批次均须可出价;还需通过余额和年龄审核。支持空格分隔,推荐自然口令。

/出价 1 1000
给1号出价 1000
/撤回出价

权限:管理员。格式:/撤回出价 [活动名#]稿位号#@成员#金额。

按稿位、真实@成员和实际出价金额精确定位;该笔及之后所有出价一并作废,重新计算目高并提醒参拍者。金额必须属于该成员的有效出价。已截止稿位不能再撤回;退回活动扣款请使用 /恢复余额 活动名。

/撤回出价 12#@成员#3000
/撤回出价 一周年庆#12#@成员#3000
/设置定时

权限:管理员。格式:/设置定时 [活动名#]稿位号#时间#截止/回收。

可在最前面写活动名和 #,例如 一周年庆#1#时间#截止。省略时,多群协同使用本群绑定活动,单群使用最新未删除活动。这一规则同样适用于取消定时、截止稿位、回收稿位、释放稿位、撤回出价;稿位也可使用完整名称。活动名或稿位不存在时直接报错,不会退回其他活动查找。活动名称中的空格保留;不要输入格式说明中的方括号。

成功与可定位目标的失败回复均说明活动、稿位序号和名称。指定其他活动不改变本群绑定,定时提醒和结束结果仅同步该目标活动的前台群,管理操作所在群收到明确回执;单群通知仍发送到设置定时的会话。

设置前检查活动已开启且未到结束时间、稿位可竞拍、所属批次已上新、时间在未来;回复说明具体活动、序号、名称及失败原因。到点但漏执行的批次可补齐上新;已结束稿位须先释放。类型可填结算,旧的截止/回收参数也按相同规则处理。定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。 多群通知只发目标活动前台。

/设置定时 1#2026-10-03 20:00#截止
/设置定时 2#2026-10-03 20:00#回收
/设置定时 一周年庆#1#2026-10-03 20:00#截止
/设置定时 一周年庆#2#2026-10-03 20:00#回收
/取消定时

权限:管理员。格式:/取消定时 [活动名#]稿位名/序号。

取消指定稿位的定时截止/回收及相关提前提醒,不会删除稿位或改变当前目高。

/取消定时 1
/取消定时 一周年庆#1
/截止稿位

权限:管理员。格式:/截止稿位 [活动名#]稿位号。

手动截止前同样审查活动、批次及稿位是否可竞拍。有效最高出价须大于等于回收价(未设底价除外)才能成交,否则回收且不扣款。成交时按成交价全额扣除获拍者共享余额,每个稿位同一轮只扣一次;通知成交并提示私信群主获取画师联系方式。余额不足可为负数,无人出价或回收不扣款。

/截止稿位 1
/截止稿位 一周年庆#1
/回收稿位

权限:管理员。格式:/回收稿位 [活动名#]稿位号。

立即回收稿位,禁止继续出价;有最高出价者时通知该成员。列表和查询显示已回收。

/回收稿位 2
/回收稿位 一周年庆#2
/释放稿位

权限:管理员。格式:/释放稿位 [活动名#]稿位号,别名 /释放岗位。也可填写稿位完整名称。

将已截止或已回收的稿位恢复开拍,保留原序号、资料、全部出价历史和当前目高,成员可从当前目高继续加价。仅退回该稿位本轮实际扣除、尚未退回的成交款,直接加回原获拍者当前共享余额;已用“恢复余额”退回或没有实际扣款记录时,不再加款。重复释放开拍中稿位会被拒绝,不重复退款。之后再次截止成交,按新的成交价全额扣款一次,即使没有新增出价也会重新结算。

/释放稿位 13
/释放稿位 一周年庆#13
/释放岗位 一周年庆#13
/设置定时 一周年庆#13#2026-10-03 20:00#截止

日期须换为未来时间。省略活动名时,多群使用本群绑定活动,单群使用最新未删除活动。回复注明活动、序号和稿位名。释放公告同步该活动全部前台群;有最高出价者时,只在该成员原出价群发送个人提醒,后台或其他活动管理群收到操作回执,不公开余额或回收价。

所属活动必须已开启、结束时间在将来,且所属批次已上新。已到上新时间却仍标记未上新的旧批次,会在释放事务中自动补齐上新,保留其他已结束稿位状态;尚未到上新时间则继续拒绝。活动已结束时,先用 /修改活动 一周年庆#结束时间#2026-10-03 22:00 调整到未来,再用 /开启活动 一周年庆 开启;未上新的批次先用 /设置批次时间 一周年庆#1#2026-10-03 12:00 安排上新,待其上新后再释放。释放不自动更改活动时间或开启其他稿位。

原稿位的截止/回收定时、未发送的提前提醒和延期次数会清除,需要重新设置;活动自身的结束时间仍然有效。释放后该目高重新计入成员的未结束竞拍额度,后续加价仍检查审核资格及余额。退款不恢复已清空的审核资格,不改变其他稿位或其他活动的扣款。

插件自动升级结算记录为按轮保存,旧扣款/退款记录完整保留;同时记录释放前稿位快照、操作者和退款金额。释放状态、退款、定时清理与通知一起提交,任一步失败全部回滚。独立网站会在刷新时显示新状态和原出价;Web 1.1.0起也可在稿位详情直接修改状态,使用与QQ相同的退款和结算规则。

权限与帮助
/添加管理

权限:管理员。格式:/添加管理 @成员。

仅现有拍卖管理员可授权被@成员。首次管理员由有WebUI权限的人在插件设置页选择并保存,QQ原有群管理员不会自动获得拍卖管理权。

/添加管理 @成员
/删除管理

权限:管理员。格式:/删除管理 @成员。

移除被@成员的拍卖管理权限。移除不会清空其余额或出价;应保留至少一位可用管理员。

/删除管理 @成员
/管理列表

权限:管理员。格式:/管理列表。

查看当前拍卖管理员,成员用昵称或稳定参拍编号展示,不触发@。同名成员附编号区分;管理员增删权限的个人通知仍真实@。

/管理列表
/功能

权限:所有成员。格式:/功能 别名:帮助、help。

在QQ显示精简帮助及51个命令。帮助、help为同一命令的别名。发送帮助也会登记本人供网页选择;不会公开账号标识。

/功能
/帮助
/help
多群与显示名
/设置群

权限:管理员。格式:/设置群 前台/后台#活动名[#群别名]。

在目标群设置前台或后台并绑定已创建活动,群别名可省略。首次设置自动启用多群,其他群须分别设置;同一活动使用同一个机器人。

/设置群 前台#秋拍#A群
/设置群 后台#秋拍#管理群
/取消群设置

权限:管理员。格式:/取消群设置 (解除本群绑定)。

解除当前群绑定并取消该群尚未发送的同步通知,不影响其他群。解绑全部群不会自动关闭多群开关,需在设置页关闭或重新绑定。

/取消群设置
/群设置

权限:管理员。格式:/群设置 (查看群角色和活动)。

查看多群开关和全部群的角色、别名、绑定活动,并标记当前群。用于核对设置是否保存。

/群设置
/设置显示名

权限:管理员。格式:/设置显示名 @成员#昵称(清空恢复自动)。

设置该成员在公开目高和出价历史中的昵称;填清空恢复自动昵称。不改变余额归属或权限,不追溯修改已经发送的消息。

/设置显示名 @成员#小明
/设置显示名 @成员#清空
/通知状态

权限:管理员。格式:/通知状态 (查看最近20条通知)。

查看最近20条多群拍卖通知的编号、群、状态和时间。只涵盖广播通知,不含群设置等直接回复;平台已接受不表示成员已读。

/通知状态
/重试通知

权限:管理员。格式:/重试通知 失败通知编号。

只按实际失败通知编号补发,编号从通知状态查询;不会重新执行出价或截止。发送结果不确定时,补发可能重复。

/重试通知 12
/测试提及

权限:管理员。格式:/测试提及 @成员。

仅在QQ官方机器人群使用,向同一成员发送标有方案1、2、3的三条提醒,仅发当前群,不要求绑定活动。检查实际显示后,在“拍卖插件设置 → QQ个人提醒”选择有效方案并保存。测试不会自动选择方案,也不修改余额、出价、群绑定或通知队列。不能使用此命令反查QQ号。

/测试提及 @成员

全部配置项与图片行为

AstrBot标准插件配置和Pages“拍卖插件设置”对应同一组配置。下表列出全部字段;管理员优先在Pages中按成员选择。设置页保存后生效,图文排版调整应用于新生成的消息,已发送消息及已缓存的待重试图文不会重排。图片设置沿用原配置键 multi_image_max_size,旧值自动用于全部图片,无需重新配置。

QQ官方+S.EE可把多张图片与文本按稿位顺序合并为一条Markdown,图片前后分段。所有图片均应用同一缩略尺寸,包括单稿位详情、出价成功、全场批次总览图和操作预览;等比缩小、不裁剪、不放大小图,原图链接保留。S.EE上传失败时该图片回退为原生图片,可能另发消息;未配置图床及OneBot原生图片的实际排列由QQ客户端决定。

管理员设置页还可编辑已登记群绑定、成员显示名,核对旧余额,以及查看最近100条同步通知。旧余额修复必须先选成员并填写核对后的最终余额;空成员和空金额不会自动选人或填0。

配置项 默认值 完整说明
启用前台/后台多群协同 multi_group_enabled 关闭 默认关闭以兼容单群。/设置群 会自动开启;开启后拍卖命令仅在绑定群执行,余额管理仅在后台群,前台同步成功出价、上新、提醒与结果。群绑定和显示名可在插件设置页管理。
QQ个人提醒提及方案 qq_mention_mode legacy_text 方案1 legacy_text(兼容文本)、方案2 tag_text(标准标签文本)、方案3 tag_markdown(标准标签Markdown)。管理员先用 /测试提及 @成员 对照,再选择正常方案;全群共享设置,保存后新发送的纯文字提及立即生效,带图消息仍为Markdown。
拍卖插件管理员 admins 未设置 建议在设置页按成员勾选。首次成员通过QQ帮助入口登记;已有管理员也可用群命令授权。
S.EE 图床 API Token see_api_token 未设置 S.EE图片托管凭据。设置页留空保留已保存值,勾选清除才移除。
S.EE 图片链接域名(可选) see_domain 未设置 留空时由 S.EE 自动选择;仅在账户已配置可用域名时填写。
S.EE 上传接口 see_api_url https://s.ee/api/v1/file/upload 默认 https://s.ee/api/v1/file/upload,必须使用HTTPS,通常不必修改。
S.EE 上传超时(秒) see_timeout 30 默认30秒,允许1–300秒,用于下载待托管图片及上传图床。
图片最长边(像素) multi_image_max_size 240 默认240,可填80到720。QQ官方S.EE图文中的全部图片统一等比缩小,包括单稿位查询、出价提示、批次查询、全场批次图、上新提醒和操作预览;不裁剪、不放大小图,保留原图链接。平台原生图片的展示尺寸由QQ客户端决定。
MinIO 服务地址 minio_endpoint 未设置 可选,例如 play.min.io。留空时稿位图片保存在插件数据目录。
MinIO Access Key minio_access_key 未设置 MinIO访问凭据,和服务地址、存储桶、Secret Key配套填写。
MinIO Secret Key minio_secret_key 未设置 可选MinIO存储凭据。留空保留已有密钥,勾选清除才移除。
MinIO 存储桶 minio_bucket auction-images 用于保存稿位图片的存储桶名称,需配合可用的MinIO服务。
MinIO 使用 HTTPS minio_secure 开启 MinIO连接是否启用HTTPS,默认开启。
MinIO Region(可选) minio_region 未设置 服务需要时填写区域;通常可留空。
MinIO 公开访问 URL(可选) minio_public_base_url 未设置 用于拼接公开图片地址,末尾无需斜杠。

平台兼容、数据与问题排查

内部按平台 sender_id 识别成员,真实@会解析为同一身份。QQ官方提供的是应用范围内的OpenID,不能可靠反推出真实QQ号;不同机器人可能对应不同身份,不通过相同昵称合并。群内口令只需@成员,网页可以按昵称与参拍编号选择,无需查询或填写身份值。

首次升级为共享余额时,同一成员在不同旧活动中的余额合计为一份全局余额;同一活动的重复身份包装记录以最后录入为准,再跨活动加和。正常迁移只执行一次。无法识别归属的旧记录保留在“旧余额迁移待核对”,暂不计入余额;管理员核对后设置最终余额,修复不是直接把旧款追加进去。

网页找不到成员:先确认该成员发送帮助后收到机器人回复,再点击“重新读取”。帮助入口不依赖本群活动绑定,但仍受AstrBot的唤醒、白名单、会话和插件启用状态影响。不要把普通聊天已收到当作命令已成功处理。

命令无回复:检查机器人连接、插件启用、唤醒前缀、群白名单及限流。多群管理命令可在后台搜索“拍卖多群命令”:收到消息不等于进入处理,准备回复不等于平台送达。QQ内仅给简短失败提示,详细异常在后台日志核对。

同步通知按群记录进度,失败最多自动尝试3次,之后通过网页或 /重试通知 编号 补发;重试不会再次执行出价或成交。网络超时可能导致重复投递。通知列表只覆盖拍卖广播,不能用于补发设置群等直接回复。

恢复误删或迁移数据前,应保留现有备份;不要用旧库覆盖整套当前数据,以免丢失后续出价。普通升级不需要手动修改数据库,也不需要重传已有例图;例图原文件或有效链接仍须可访问。

安装依赖和MinIO兼容配置

本插件支持AstrBot >=4.24.2,<5,平台为QQ官方机器人(qq_official)和OneBot v11(aiocqhttp)。也可将插件文件夹放入AstrBot的 data/plugins/,在对应Python环境执行 pip install -r requirements.txt 后启用。正常网页安装优先使用ZIP包。

管理员、S.EE和MinIO优先在Pages或标准插件配置中保存。MinIO原有 config.yaml 配置仍作兼容回退;配置示例(仅占位值):

minio:
  endpoint: "play.min.io"
  access_key: "YOUR_ACCESS_KEY"
  secret_key: "YOUR_SECRET_KEY"
  bucket: "auction-images"
  secure: true
  public_base_url: ""

无MinIO时例图保存到插件数据目录。S.EE的API Token仅保存在AstrBot插件配置中,不写入源码、config.yaml或公开安装包。重新读取网页不显示已保存密钥明文,空密码框不代表凭据被清空。

身份、提及与昵称

身份继续使用AstrBot事件的 sender_id;QQ官方一般是应用范围内OpenID,OneBot一般是适配器返回的用户ID。真实@和对应平台标识归入同一成员。标准插件配置中的 admins 仍存平台标识;网页使用昵称和参拍编号选择成员,不按昵称鉴权,也不将不同平台身份猜测合并。

公开出价历史和目高只显示昵称;超价、回收、成交等个人提醒才真实@。OneBot使用AstrBot的At组件,QQ官方纯文字个人提醒按配置选择兼容文本、标准标签文本或标准标签Markdown,包含托管图片时继续使用Markdown;实际显示与提醒受平台接口和客户端能力影响。没有已记录昵称时显示稳定参拍编号,同名成员附编号区分。QQ官方OpenID无法可靠反查QQ号。

余额迁移的后台核对

首次全局余额迁移先将同活动中的身份包装重复记录取最后录入值,再跨活动相加,包含关闭、删除活动中保留的旧余额。年龄审核沿用最近一次录入状态。汇总与完成标记在同一事务中保存;重载、修改或清空余额不会再次导入。无法识别的旧身份保留原记录,暂不计入余额,正常记录仍完成迁移;无效金额须先核对,不静默丢弃。

有效余额保存在 member_balances,迁移标记在 balance_migrations,各成员来源与采纳记录在 balance_migration_records;activity_balances 仅为历史来源。旧余额待核对记录在 balance_migration_issues。后台保留原身份、活动、金额供管理员核对,修复时选择成员并填写最终全局余额(覆盖而非追加),同一记录不能重复处理。

编号、删除、恢复与定时边界

数字只匹配目标活动中的稿位序号,不回退查数据库内部ID;完整名称必须精确匹配。有出价历史的稿位即使所有出价已撤回,也不能直接删除。删除预览确认码仅在同一管理员、同一会话5分钟内有效,一次使用;新预览或插件重载使旧码失效,确认时重新核对稿位是否变化。

普通添加跳过历史删除保留的序号,但会优先使用替换操作释放的空号。明确指定空号或替换可填补空缺,不覆盖现存、已截止或已回收记录。恢复冲突时保留删除快照;原批次还在时按当前上新状态恢复,批次已不存在则解除旧关联并需重新分批。恢复不会启动旧定时;例图恢复依赖原文件或链接仍可访问。v2.14.0以前已删且未保存快照的稿位需从误删前备份单独核对恢复。

定时统一按价结算,提前30分钟和5分钟@当前最高出价者。设置时不超过30分钟立即提醒。结算前5分钟每次有效出价在原结算时间上增加5分钟,可连续延期;无效出价不延期。延期同步更新调度任务,活动总截止等待已触发延期的稿位。取消、改设定时或手动截止、回收、关闭/删除活动时取消相关待执行提醒。

同步范围、队列与日志

升级默认单群,首次群绑定会启用多群。同一活动的群使用同一机器人连接;群绑定后不会随新建活动切换,无显式活动参数的命令使用本群活动。修改绑定、改为后台或解除绑定会取消该群不再适用的待发通知。取消所有绑定不自动关闭协同;关闭协同暂停待发队列,再打开后继续。

公共动态发往活动全部前台群,后台不接收;个人提醒按出价来源群发送,无来源记录时不猜测所在群。失败出价只回复原群。通知按群、消息段持久化进度,重启恢复,最多自动尝试3次,网页显示最近100条、命令显示最近20条。平台已接受不代表已读;超时补发仍可能重复,重试不会重新执行拍卖动作。

后台收到事件日志只证明收到消息,不等于进入命令处理。可核对唤醒前缀、白名单、会话、插件启用、限流以及“拍卖多群命令”的开始、准备回复与处理结束日志。插件管理员、AstrBot框架管理员和群白名单是不同设置。准备回复后未送达需查平台错误;通知队列不包含设置群的直接回复。完整历史排查记录保留在更新日志中。

为什么显示参拍者编号而没有昵称

名称优先级为:管理员设置的显示名 → 最近收到的有效群昵称 → 稳定参拍编号。有群名片时优先群名片,无群名片时使用平台昵称。编号只是缺少可用称呼时的备用文字,不是稿位编号,也不会影响成员余额或出价归属。同名成员会附编号区分。

常见原因包括:旧余额仅有成员身份而未登记昵称、成员尚未在插件处理的消息中提供有效昵称,或QQ官方平台/适配器消息根本没有昵称。AstrBot的 get_sender_name() 明确允许为空;QQ官方适配器从消息作者的 username 取值,没有时为空。日志里看见某人的名字,也不代表每个被@成员的资料都有名字。

当前版本优先读取身份匹配的群名片,然后读取AstrBot统一昵称及同一发送者原始资料;录入余额时也读取真实At及原始mentions中与目标身份匹配的昵称。兼容对象和字典形式,只使用匹配的成员信息,不拿管理员或其他被@者的名字代替。空值与身份占位值不覆盖已有昵称,管理员指定显示名仍优先。

成员发普通群消息即可更新这次消息提供的昵称,也可发送 /help、/功能、/帮助 或单独真实@机器人后刷新后台或重新查询。昵称记录不改变余额、审核或权限。平台未提供时,请管理员使用:

/设置显示名 @成员#小明
/设置显示名 @成员#清空

或进入“拍卖插件设置 → 参拍者显示名”,核对成员后填写称呼并保存。清空表示恢复自动昵称;仍无自动昵称时继续使用参拍编号。改名后新查询与新通知采用新名称,已经发送或准备好的待重试通知不会改写。

接口行为参考:AstrBot昵称接口、QQ官方适配器。实际可获取的昵称以部署版本与收到的消息资料为准。

群消息自动记录昵称与提醒规则(v2.20.11)

插件从机器人实际收到、进入本插件消息过滤器的QQ群消息中,按 sender_id 记录发送者与群昵称的对应关系。普通聊天、拍卖命令和其他插件命令都可更新昵称,无需先出价或查余额;未绑定活动的群也可登记。每个身份使用最近一次收到的有效群昵称;同一成员在A、B群名片不同,之后的公开消息统一使用最近收到的有效名字。

群名片优先于账号昵称,来源身份必须与发送者匹配。同名不合并账号,昵称改变不影响余额、竞价历史的归属及权限。管理员指定显示名仍优先显示,但系统会继续更新自动昵称;清空指定名后采用最新自动昵称。没有名字或平台仅返回身份值时保留已有记录;从未获得可用名称时使用稳定参拍编号。

采集在消息过滤阶段收集身份与昵称,由一个后台任务批量保存,不把普通聊天变成拍卖口令,不触发机器人回复、不停止消息传播,也不改变其他插件的原处理。消息正文不因昵称功能保存;明确的机器人消息、机器人自身消息和私聊不进入普通群昵称采集。昵称更新与竞拍写入共用数据库写锁,同一成员短时多次改名保留最后有效值,重载后仍保存;相同名字不重复改写或消耗新编号。

场景 展示方式
出价成功、公示动态、历史出价、稿位/批次目高、普通查询 昵称文字
余额录入确认、余额查询、余额列表、管理员列表 昵称文字,不额外@成员
前一最高出价被超越 真实@被超价成员
成交、回收结果 真实@相关出价者
设置/修改/取消定时的单独公告、5分钟延期公告 公共文字,不@成员
提前30分钟、5分钟及临近设置的即时预告 公共文字同步全部前台;当前最高出价者的出价来源群另发@提醒
撤回导致稿位价格变化 真实@相关参拍者;当前目高说明中的名字用昵称,避免重复提及
出价失败、管理员权限增删的个人通知 保留真实@相关成员
多群公共广播 只显示昵称;个人提醒另发至对应出价来源前台群

昵称只是普通文本,不把“@昵称”拼成假提及;重要提醒按同一身份生成平台提及组件。QQ官方采用官方文本交互成员标签:纯文字提醒显式使用文本消息,含托管图片时继续使用Markdown;OneBot使用At组件。输入命令中的成员参数仍使用QQ真实@,例如 /查询余额 @成员,回复中则按上表决定是否提醒对方。

在后台“参拍者显示名”可查看和设置称呼。已发送消息、已生成公示内容和已准备的重试通知不追溯改写,新查询和新生成消息使用最新名字。平台没有提供的昵称无法从身份值推算,可由管理员手动补全。

多群 Markdown 图片兼容修复(v2.20.12)

AstrBot 4.26.7 的 QQ 官方适配器在主动发送时固定提交 content,未读取消息链的 use_markdown_ 标志。因此直接查询可以正常显示图文,但跨群出价公告、整批上新等主动消息会把 ![稿位图片 …](链接) 当普通文本发送。依据:4.26.7 官方适配器源码。

本版本对 QQ 官方的主动 Markdown 消息使用目标会话所属的已登录机器人连接,向 SDK 明确提交 msg_type=2 和 markdown.content。不需要修改 AstrBot 源码、重设群绑定、增加配置或重新上传例图。跨群公告、来源群超价提醒、定时上新/回收/成交使用相同发送器;不带提及的普通文字、原生图片和 OneBot 仍走原有适配器;纯文字个人提醒使用同一SDK发送器,当前按提及方案配置明确提交对应消息类型。

  • 整批多图仍合在一条 Markdown 消息中,文字与图片保持原顺序,每张图前后空行,继续使用默认240像素的缩略尺寸或已保存设置。
  • 按完整会话定位机器人及目标群,不使用其他群的消息编号;群会话缓存尚未恢复时也可以按已有群绑定提交群主动消息,能否送达仍取决于 QQ 平台权限。
  • QQ 返回发送成功的消息编号后,才推进该分段的投递进度。若平台拒绝 Markdown、连接不可用或请求失败,记录失败并按现有队列重试,不把 Markdown 图片语法作为普通文字补发,也不在发送失败后换格式重发个人提醒。请在后台核对平台异常;如出现“不允许发送原生 markdown”,需检查 QQ 开放平台对应机器人的 Markdown 能力。
  • 旧版已经准备但尚未发送成功的通知保留内容、图片链接、Markdown 标志和游标,升级后直接采用新发送方式。不会自动重发已标记成功的历史链接消息,避免刷屏和重复提醒。

验收请在测试前台群使用下方测试清单中的“4.26.7 多群 Markdown 验收”。失败通知可先通过 /通知状态 核对,再用 /重试通知 编号 补发未成功的分段;重新查询稿位或批次可立即查看当前图文。

纯文字个人提醒的 @ 兼容调整(v2.20.13历史说明)

以下记录上一版实现。用户在4.26.7上的新日志确认该版仍有标签原样显示;当前操作请使用后文v2.20.14的对照测试与设置。

超价提醒显示 <qqbot-at-user id="…" /> 原文,说明客户端没有将该段识别为成员提及,不能仅凭这条文字断定身份错误。QQ 官方文本交互文档规定,同一标签可用于文本、图文和 Markdown 消息。插件不会猜测 QQ 号、改写成员身份或用“@昵称”冒充真实提及。

本版本针对纯文字个人提醒改用文本交互路径:单群直接回复显式设置 use_markdown(False),多群/定时主动提醒通过原机器人 SDK 提交 msg_type=0 与 content。覆盖超价、成交、回收、撤回影响、出价失败与权限变更中的纯文字提醒。图床图片公告继续使用 msg_type=2 与 markdown.content,小图、空行分段和整批一条保持原方式。

新生成的纯文字提醒不再标为 Markdown;升级前已缓存为 Markdown 的纯文字个人通知,会在实际投递时采用文本交互路径,无需清理队列或修改数据库。含 Markdown 图片的缓存不会被转换成文本。跨群个人提醒仍只发送到相关出价的来源群,公示消息只显示昵称。

后台可搜索 [拍卖QQ发送]:个人纯文字提醒应记录 模式=文本交互,个人提及=是,图片公告为 模式=Markdown图文。日志只记录发送模式与是否提及,不记录完整正文、成员身份或密钥。此日志表示即将提交的发送类型,不证明客户端已渲染成功。

本地自动检查覆盖直接回复的显式文本标志、SDK参数、身份与目标群保持一致、旧缓存及重启游标;没有连接真实QQ客户端。安装重载后请用两名测试成员触发一次新的超价提醒。若仍原样显示标签,请核对版本为2.20.13,并提供对应发送模式、平台发送异常,以及同次图片公告是否正常,用于区分部署、发送与客户端显示问题。已经发送的旧消息不会被修改或自动重发。

QQ提及格式兼容与对照测试(v2.20.14)

本次日志确认2.20.13已成功加载,图片公告正常,超价提醒已走文本交互,但客户端仍显示标准成员标签原文;出价失败回复中对发送者本人的提及也失败。因此不能只归因为跨群身份或旧版本未重载。API成功返回、后台出现At组件都不足以证明客户端识别了提及。

当前默认把QQ官方纯文字个人提醒在最终发送前转换为兼容格式 <@成员标识>,并使用文本交互;也提供标准标签文本、标准标签Markdown两个选项,避免反复改代码才能对照。身份值保持原sender_id,不从昵称推测或反查QQ号。普通公示仍用昵称,重要提醒仍尝试真实提及。

方案 设置值 请求形式
1(默认) legacy_text msg_type=0,content中的兼容提及
2 tag_text msg_type=0,content中的标准成员标签
3 tag_markdown msg_type=2,markdown.content中的标准成员标签

QQ官方文本交互文档推荐标准标签,并把旧提及格式标记为即将弃用;NoneBot QQ适配器的成员提及实现仍使用兼容格式。本版默认方案是针对当前故障的兼容尝试,不代表官方推荐旧格式或已在真实QQ验证成功。

管理员在发生问题的目标群发送 /测试提及 @成员(从QQ真实选择成员)。对方比较三条消息是否显示可点击成员名称、是否形成实际提及。若某方案正常,到Pages“拍卖插件设置 → QQ个人提醒”选择相同编号,保存后立即生效。AstrBot标准插件配置也提供同一字段。设置对全部QQ官方群生效,请在相关前台群各验证一次;若群之间只有不同方案可用,保留结果供进一步定位,当前不支持逐群选择。

测试不自动判断成功、不自动改设置,不广播到其他群,也不改变拍卖数据。一条测试被拒绝后仍会继续其他方案;后台搜索“拍卖提及测试”查看错误。实际业务不会一次发送三个版本;发送拒绝沿用失败队列,不自动换群或换格式重发。

直接回复、多群个人提醒、单群定时通知和旧待发缓存均在发送时采用当前方案。图片公告及带图片的提及始终使用Markdown和标准标签,保持小图、独立段落、整批一条。已经成功发送的消息不改写或自动重发。OneBot继续原生At组件。

验收时同时覆盖超价、失败出价、成交、回收和撤回,关注当前目标群与成员是否正确。若三种均显示原文,记录方案编号、实际显示、时间及同次平台返回错误;不要以接口成功宣称已解决。本地回归验证请求与路由,真实QQ显示需要安装后对照确认。

成交扣款与按活动恢复(v2.20.15)

情况 余额处理
手动截止、定时截止,有最高出价 从获拍者共享余额全额扣除成交价,稿位同一轮只扣一次
活动到期并判定成交 同样全额扣款;未达回收价仍按原规则判定回收
回收、无人出价 不扣款
释放已结束稿位 仅退回该稿位未退成交款,保留目高继续竞拍;再次成交重新扣款
手动关闭活动 仅暂停活动并取消定时,不等同成交,不扣款
删除活动 不自动退款;已存在的扣款可按原活动名恢复
已截止稿位撤回出价 拒绝,避免改变已结算的获拍者;恢复余额不改变成交结果
升级前已截止但无扣款记录 不补扣、不生成退款

例如共享余额5000,活动A成交1000,活动B成交800,余额变为3200。执行 /恢复余额 活动A 后余额为4200,活动B的800仍然扣除;重复执行不再加款。若活动A后来又有一笔新的成交,再次恢复只处理新扣款。余额700仍可按70%门槛出价1000,成交后余额为-300;之后的出价会因余额不足失败。

扣款、稿位截止、定时取消和待发通知在同一个事务中保存。异常会整体回滚;重复截止、并发操作、重载与重试通知不重复扣款。恢复逐笔记录时间、操作者及恢复前后余额,整批恢复异常时全部回滚。金额仍用普通十进制展示,不使用科学计数法;因现有余额存储范围导致无法精确保存时,拒绝该次结算并回滚,不写入不准确的扣款。

余额一直是所有活动共享的当前数额。管理员重新录入会覆盖当前余额,但不会删除成交扣款记录;之后执行恢复,会把未恢复扣款加在新录入的余额上。例如扣款后管理员重新录入2000,恢复该活动1000扣款后为3000。请将恢复理解为退回实际记账的扣款,而不是还原整场活动开始前的余额。

/清空余额 清除成员余额和审核,保留扣款记录供追溯和恢复。若余额已清空,恢复以0为基础加回扣款,但不会恢复年龄/余额审核资格;成员仍需管理员重新审核录入。如果已有有效出价在清空后才成交,照常从0扣款并保留未审核状态。已有余额记录的审核状态在扣款和恢复时保持不变。

权限方面,群命令仅插件管理员可用,多群模式限后台群;必须明确填写活动名称,不自动使用当前活动。网页使用既有WebUI访问权限,显示每个活动待恢复/已恢复的笔数和总金额。恢复不会公开成员余额或给前台广播。普通成员仍只能确认审核状态;失败出价不公开具体余额。

本版不增加扣款比例配置项,默认全额扣款。后台完整指南、QQ精简帮助及测试清单同步,现有15项配置保留。

即时提醒、每次延期公告与活动结束规则(v2.20.17)

每次有效出价触发5分钟延期时,额外发送一条独立文字提醒,包含稿位序号、名称和最新结算时间。例如:“1号稿位「单人插图」触发5分钟延时。最新结算时间:2026-10-03 20:05:00。”连续延期、自我加价和两种出价口令均适用,无次数上限;距离结算超过5分钟或无效出价不会触发;旧命令的定时回收也采用相同结算与延期规则。原有出价图文与超价个人提醒保留,多群的延期公告发往活动全部前台,后台不接收广播。

稿位定时设置为将来时间后,剩余时间不超过30分钟(含30分钟整)会由当次命令直接执行提醒,不等待后台扫描;超过30分钟则在剩余30分钟时提醒,后台晚数秒执行也有效。旧代码已有30分钟内的范围判断,并非只能精确卡点,本次补上命令内立即执行。定时时间等于当前或已过去时拒绝设置;已取消、改设、截止或回收的旧提醒不能再发送。

即时执行与后台调度共用任务完成状态和调度锁,正常情况下同一提醒只发送一次。单群平台返回失败或抛错时不再误标完成,保留任务重试;多群继续用已有队列,失败补发只处理未完成的段落,不重新执行竞价或延期。重启恢复待发任务,已完成任务不自动重发。网络超时后平台是否已接收仍可能不确定,补发存在重复可能。旧版本已标记完成的遗漏提醒,可在截止前重新设置该稿位定时以补发。

有出价时是否会提示“将于结束时间自动截止”

要区分活动结束时间和稿位定时:

设置或场景 当前行为
仅设置活动结束时间 不逐稿位提前发送“将于某时自动截止”的预告;到期后发送最终成交或回收结果
活动到期:无人出价 回收,不扣款
活动到期:有出价,且未设置回收价或大于等于回收价 截止成交,通知获拍者并全额扣除共享余额
活动到期:有出价但低于回收价 仍然回收,不扣款
单独设置稿位定时(结算/截止/回收) 按半小时/即时规则预告自动结算;到时有效最高出价达到回收价则成交,否则说明原因并回收、不扣款;提前30/5分钟预告@当前最高出价者,到点结果仍按原规则提醒相关出价者

需要某稿位提前收到截止预告,请使用 /设置定时 1#2026-10-03 20:00#截止;它与活动到期、手动截止使用同一回收价判定规则。仅活动结束时间不会自动赋予每个稿位5分钟延期;已经配置稿位定时截止并实际触发延期的稿位,活动总结束会等待其延期结束。v2.20.19已统一三个截止入口的成交判断,等于回收价可以成交。

余额不足提示按确认继续保留“出价失败!余额不足。”,不显示计算比例、方式或当前余额。

独立拍卖管理站(v2.20.18)

新增独立运行的 cym_auction_web.zip,与插件安装包分开部署。网站仅管理员登录后可访问,支持每2秒刷新全部活动/稿位、按活动/批次/状态筛选、查看例图与出价历史、编辑活动名称/时间和稿位名称/画师/价格/备注/例图,并记录网页修改。

网站无需安装或启动AstrBot,默认同机独立进程、共用同一份 auction.db。升级并重载本版后,机器人与网站通过同一个写锁协调修改;网页另有版本冲突保护。旧插件未登记兼容标记时,网站只读。网站账号单独通过交互命令设置,与QQ管理员列表分开。

快速启动(在独立包解压后的外层目录执行):

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r auction_web/requirements.txt
python -m auction_web admin --state-dir ./auction-web-state --username admin
python -m auction_web serve --db /实际数据目录/auction.db --state-dir ./auction-web-state

浏览器访问 http://127.0.0.1:8088。从插件日志“数据库已初始化”取得真实数据路径。完整安装、演示、HTTPS访问、Docker路径、systemd后台运行、备份及排错说明见独立包 README.md;插件包内也附带 docs/STANDALONE_WEB.md。

机器人停止后,网页仍可查看和改资料;QQ新出价、自动成交/扣款及群通知仍需机器人在线。网站不另外运行拍卖调度器,不直接修改竞价/余额/编号/稿位状态,活动/稿位新建、删除和业务操作继续通过既有命令;网页只对新保存的资料生效,不额外向群广播。

完整独立网站使用说明:

稿位集 · 独立拍卖管理站 1.8.0

这是独立 Python Web 服务,无需安装、导入或启动 AstrBot。网站管理员与拍卖用户共用登录入口,按账号角色进入不同页面;网站账号与 QQ 管理员权限分开管理。前端无需 Node.js、构建服务、CDN 或第三方账号。

推荐与机器人在同一服务器运行,共用一份 auction.db 和图片目录。机器人停止时,网站仍可查看、编辑资料;机器人恢复后直接读取修改后的资料。网站可以独立修改资料、定时及稿位状态,并即时完成状态操作应有的扣款或退款。接收 QQ 出价、自动上新/截止及发送群通知仍需机器人在线,网站不启动第二套拍卖调度器。

附属例图(Web 1.8.0 / 插件2.26.0)

每个稿位保留一张主图,可额外配置最多20张附属例图,展示同一画师的不同风格。普通稿位查询、批次查询、出价和提醒、用户个人页面均沿用主图。只有QQ群明确查询更多例图时发送附图;网页管理员在稿位详情展开“附属例图”管理区查看。

  • 管理员在稿位详情展开“附属例图”,可多选上传(每张≤5MB,PNG/JPG/WebP/GIF,取首帧转JPEG),或填写图床直链,每行一条,点击“添加链接”。添加按选择/输入顺序追加;每张可删除、前移、后移。修改立即保存,不发送群公告;先保存其他资料修改再操作附图。
  • QQ添加:/添加例图 一周年庆#1,同一条消息附上图片,可多张;以后再次添加会继续追加。QQ删除:/删除例图 一周年庆#1#2,删除该稿位第2张附图,后续编号顺排。两条管理命令仅QQ拍卖管理员可用。省略活动名时沿用本群绑定活动(未启用多群则沿用当前活动)。
  • 成员查看:查看1号稿位更多例图;指定活动:/更多例图 一周年庆#1。按顺序显示附图编号和小图,文字与图片分段;没有附图时明确提示,主图不重复发送。沿用现有s.ee/平台图文发送方式。
  • 网站新增独立权限 artwork.examples(管理附属例图),依赖 catalog.view;总管理员自动拥有,已有下级管理员默认不自动获得。可在“账号与权限”逐级授权。原“更换例图”权限仅管理主图,不能用来修改附图。普通用户网页的权限和展示不变。
  • 批量网页上传按张保存;中途失败会显示已保存数量,刷新管理区可核对后只补传剩余图片。QQ同一消息中的图片全部持久化成功后才一起入库。超过20张、版本冲突或无效地址会拒绝本次修改;不覆盖另一窗口或机器人新写入的数据。
  • 附图随稿位改号保留,删除后随快照保留,撤销删除时恢复。删除附图只移除展示引用,不主动清理图片文件,避免破坏历史恢复。

升级:先安装并重载插件 2.26.0,自动为原数据库增加 artworks.extra_images(JSON数组,旧稿位默认为空,主图不变);再替换独立网站代码并重启至 1.8.0。保留原数据库、图片、图床缓存及整个state-dir。只升级网站时原功能可用,附图写入会提示先升级插件。新功能使用共享写锁、记录版本和网页操作审计。

接口:管理员 GET /api/artworks/{id} 的 examples 给出缩略图与图床地址;PATCH /api/artworks/{id} 的 extra_images 为有序来源列表;POST /api/artworks/{id}/examples 上传一张并追加;本地缩略图为 /api/artworks/{id}/examples/{序号}/image。写入需CSRF、If-Match及附图管理权限;禁止从请求传入新的服务器任意文件路径。网站不依赖AstrBot运行。

已实现的功能
  • 分级管理员与账号中心:原管理员升级为总管理员,新增“账号与权限”独立页面;普通用户个人功能保持。总管理员可管全部下设账号,受限管理员只管自己的下属;46项管理权限可逐项选择,支持创建、启停、删除账号、密码重设及逐级授权,操作入口和后台接口共同校验。

  • 拍卖用户账号:管理员统一创建、绑定 sender_id、重设密码、启用/停用。用户登录后只读自己的余额、已成交/当前目高/仍在参与的稿位及个人出价历史;稿位和历史附缩略图,仍在参与稿位同时显示当前目高与本人有效出价,不能访问其他成员身份资料或管理接口。

  • 账号回收价权限:默认关闭;管理员可为指定账号开启“允许查看全部作品回收价”。开启后个人稿位显示回收价,并提供覆盖全部活动作品的回收价目录(含未公开、未参拍作品);支持活动/作品搜索和分页,不改变QQ公开设置。

  • 用户管理:录入或覆盖成员全局余额、清空全部余额与审核记录;查看已记录成员列表、全局余额及审核状态;按昵称、显示名称或成员标识搜索,按审核状态筛选;支持余额、当前目高/已成交的金额与件数升降序排序。每位用户可快捷设置登录账号,创建和重设密码支持随机生成、显示和复制。详情分列已成交作品与当前目高作品,并提供近期出价、成交扣款和退回记录。

  • 活动创建、开启、关闭与删除;新增稿位、指定空闲编号、删除与恢复、调整编号、按每批数量重新编排。全部新增管理操作先预览具体对象及影响,再确认执行。

  • 全部成员的出价历史表:按活动、作品、成员关键词、时间和撤回状态筛选,每页50条,可逐页查看完整历史。按精确记录撤回并同步作废后续出价、重算目高。

  • 全部活动和稿位目录,每 2 秒读取一次已提交数据;后台标签页暂停刷新,返回后立即刷新。连接失败显示旧数据提示,登录会话失效则返回登录页。

  • 按活动、批次、状态及截止时间筛选,搜索名称、画师、序号;截止时间支持已设置/未设置和起止范围,每页 24 份稿位,小图展示。

  • “当前目高合计”卡片内可选择统计范围:开拍中、未开拍、已截止、已回收可任意组合,默认只统计开拍中;选择自动保存在当前浏览器。

  • 已经上传到 s.ee 的本地例图自动复用图床直链;加载失败时回退到本地缩略图。出价刷新保留未变化的图片,翻页后的本地图使用浏览器缓存校验,减少服务器重复发送图片。

  • 查看活动起止时间、状态、批次上新时间、群绑定;查看稿位价格、目高、成员昵称及标识、备注、例图、定时信息与出价历史(包括撤回记录)。

  • 在活动管理中调整批次上新时间,将已上新批次退回筹备中;保留出价和目高,暂停未结束稿位并清除其旧定时。

  • 稿位详情可设置回收价公开开关与统一结算时间;列表同时显示回收价、目高和达价标记。已设定时的稿位在卡片和详情显示截止时间(北京时间);无定时不显示该行。

  • 编辑活动名称和起止时间;编辑稿位名称、画师、起拍价、回收价、备注、例图链接;直接上传 PNG/JPG/WebP/GIF(≤5MB、2000万像素,取首帧转换为 JPEG)。

  • 活动时间变更原子更新待执行任务,保留消息来源。已开启/已关闭活动的开始时间、已结束稿位的价格不可在网页改动。已关闭活动可调整结束时间后手动开启;单独修改时间不会自动重启。已删除活动只读。

  • 网页保存携带记录版本;如果机器人出价或另一窗口已修改同一记录,返回冲突提示,保留草稿,不覆盖数据。

  • 最近 30 条网页修改记录;完整修改前资料、变更字段、时间与操作账号保存在 auction_web_audit 表。

网页现在支持稿位恢复开拍、暂停、截止结算和回收;状态操作会按拍卖规则同步处理余额、定时和通知,不能任意填写成交者或成交价。管理员页面支持活动管理、稿位新增/删除恢复/编号调整、批次编排、余额录入/清空、出价历史及撤回。群绑定、权限、显示名等继续使用既有入口,成员竞价仍通过QQ。

安装和运行

Python 3.10 及以上。解压 cym_auction_web.zip,进入包含 auction_web/ 的外层目录,执行:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r auction_web/requirements.txt
python -m auction_web admin --state-dir ./auction-web-state --username admin

密码交互输入两次,至少12位,不出现在命令历史或启动日志;软件没有默认账号密码。Windows 使用 .venv\Scripts\activate 激活环境。

首次接入真实数据库前,先安装并重载配套 cym_auction.zip(当前配套2.25.0,管理功能最低2.24.0),使机器人启用共享写锁并登记状态管理兼容标记。旧版兼容库可只读查看,未登记时拒绝网页编辑。不要在 Web 仍可编辑时把机器人降级到旧版,因为旧版不遵守共享锁。

在 AstrBot 插件日志中查找“数据库已初始化”,取得 auction.db 的真实绝对路径。路径随 AstrBot 部署方式而变化,不要把插件源码目录或 ZIP 当作数据库路径。网站必须与机器人访问同一个数据库文件,不能各自复制一份作为实时数据源。

python -m auction_web backup --db /实际数据目录/auction.db --output ./backups/auction-before-web.db
python -m auction_web serve --db /实际数据目录/auction.db --state-dir ./auction-web-state

打开 http://127.0.0.1:8088,使用刚设置的网站账号登录。默认只监听本机;远程访问见下一节。backup 使用 SQLite 在线备份 API,包含 WAL 中已提交的数据,拒绝覆盖已有备份;图片需另行备份。

网站需要对数据库所在目录有读写权限,以便 SQLite WAL 和 .write.lock 正常工作;--state-dir 也须可读写,用于保存网站账号库。建议两个进程使用相同系统用户;网站凭据目录与插件数据目录独立,不要放在公开静态目录。

用演示库先体验
python -m auction_web demo --dir ./auction-web-demo
python -m auction_web admin --state-dir ./auction-web-demo/state --username admin
python -m auction_web serve --db ./auction-web-demo/auction.db --state-dir ./auction-web-demo/state

这会生成3个活动、16份演示稿位和抽象示意图,页面明确标记“演示数据库”。拒绝覆盖已有演示库,不连接真实机器人。若端口被占用,追加 --port 8089。

图片路径

默认本地图片根目录为数据库同级的 images/。若原图片在其他目录:

python -m auction_web serve --db /实际数据目录/auction.db --media-root /实际图片目录 --state-dir ./auction-web-state

只读取数据库中记录且位于指定图片根目录内的栅格图片,拒绝路径越界;不会提供任意文件下载。网络图直接使用其原 HTTP/HTTPS URL,不在服务器抓取未知链接。使用 HTTPS 网站时,建议例图也使用 HTTPS,以免浏览器拦截混合内容。

读取旧稿位图片时,Web 1.0.3 支持把数据库中的容器路径 /AstrBot/.../images/文件名 映射到网站实际图片根目录中的同一文件,保留 images/ 下的子目录;同时支持相对路径和 file:// 地址。插件生成的唯一文件名也支持在自定义图片根目录中查找。不会改写数据库原地址,也不会搜索图片根目录以外的任意文件。

网页上传新图片后,写入的绝对路径仍需机器人同样可见。若 AstrBot 在 Docker 中,建议两端挂载相同绝对路径;否则网页修改例图时可使用双方可见的 HTTPS 图床地址。不能只挂载 auction.db 一个文件:数据库、-wal、-shm、.write.lock 必须处于同一共享目录;禁止使用 NFS/网盘跨机器共享 SQLite。

图床直连与流量节省(1.0.2)

网页会优先显示图床图片,图片文件由浏览器直接从图床下载,不经过本网站服务器:

  1. 稿位“例图地址”本来就是 HTTP/HTTPS 直链时,直接使用该链接。编辑稿位时也可手动粘贴 HTTPS 图床直链。
  2. 例图地址是本地文件时,网页按文件内容匹配机器人已有的 s.ee 缓存,找到对应 HTTPS 直链后优先使用它,原始本地文件与数据库地址不变。Web 1.0.3 还支持读取缓存中的来源索引:即使本地原图对网站不可见,只要来源匹配且图床直链有效,仍可显示。
  3. 没有缓存或图床加载失败时,显示本地缩略图。缓存随后由机器人生成或更新后,网页自动识别,无需重启。未曾上传到图床的新图仍由本地提供;网页本身不自动上传图片。

默认读取数据库同级的 image_host/see_cache.json。优先按可见原图内容匹配;没有可见原图时,需要该缓存已有来源索引。配套插件2.20.22会在重载时为已缓存的本地稿位图片补索引,只读本地文件,不新增上传;后续发送图片也会记录来源。正常共用插件数据目录时,无需新设置,也不需要向网站配置 API Token。网站不会读取 AstrBot 配置或发起图床上传。若缓存单独挂载,可指定已有缓存路径:

python -m auction_web serve --db /实际数据目录/auction.db --state-dir ./auction-web-state --image-host-cache /实际插件数据目录/image_host/see_cache.json

列表仍按页、按需加载图片,列表和详情都支持回退。出价、余额或备注刷新不会改变图片地址;列表刷新保留同一图片节点。只有本地图片内容或文件状态变化才更新其图片版本。本地缩略图带私有缓存和 ETag,重复请求可返回304、不重复传输图片正文;接口仍校验管理员登录,活动资料和余额接口不缓存。

这主要节约 Web 服务器的图片出站流量;浏览器和图床仍会产生下载流量。图床直连使用已有原图,并不会只因网页显示尺寸较小而缩小文件体积。新版本不改变 QQ 图片方案或拍卖业务数据。

升级:解压新的 cym_auction_web.zip,替换网站程序的 auction_web/ 目录并重启 Web;保留原数据库、图片和网站凭据目录。默认启动参数不变。可在浏览器开发者工具的网络面板确认图片请求指向图床域名;断开该图片域名后应自动显示本地缩略图。

图片404排查与升级(1.0.3)

如果图片接口返回 {"error":"本地例图不可用,请检查 --media-root 与图片目录。"},这是网站后端无法读取数据库记录的原图片路径。常见于容器内外路径不同、只提供数据库而没有图片目录、或网站进程没有读取权限。

  • 升级网站至1.0.3并重启。图片已位于数据库旁的 images/ 时,原启动命令可以沿用;旧容器路径会自动映射。
  • 图片在别处时,添加 --media-root /网站实际能读取的图片目录,目录应直接包含例图文件,而不是它上一级的插件数据目录。
  • 如希望原图不可见时仍复用图床,升级插件至2.20.22并重载一次,让机器人为已有 s.ee 缓存补来源索引;网站还须能读取同一份 image_host/see_cache.json,或用 --image-host-cache 指向它。只复制数据库、没有图片或可用图床缓存,无法恢复图片内容。
  • 页面顶部与稿位详情会显示具体无法读取的路径及网站图片目录;已确定缺失的图片不再生成必定404的本地请求。目录修复或图床缓存更新后,列表下次刷新重新识别。

例如数据库参数为 --db ./AstrBot/AstrBot/data/plugin_data/cym_auction/auction.db,默认图片目录就是 ./AstrBot/AstrBot/data/plugin_data/cym_auction/images,默认缓存文件是 ./AstrBot/AstrBot/data/plugin_data/cym_auction/image_host/see_cache.json。相对路径都从启动命令所在目录计算。

对外访问和后台运行

本版采用同机数据服务。网站前端和 API 同源运行,可用域名访问;没有开放跨域写入接口。若要部署另一台服务器,应把 API 服务留在数据库所在机器,通过反向代理访问,不能同步两份 SQLite 文件。

使用现有 Nginx/Caddy 处理 HTTPS,Web 进程仍监听 127.0.0.1:8088:

python -m auction_web serve --db /实际数据目录/auction.db --state-dir /实际网站凭据目录 --public-url https://auction.example.com

--public-url 填实际 HTTPS 根域名,不含路径前缀。启用后 Cookie 只通过 HTTPS 发送,本机 HTTP 页面不能维持该会话。deploy/nginx.conf.example 提供反向代理片段;deploy/auction-web.service 提供 systemd 模板,替换目录、用户名及域名后使用。模板不绑定 AstrBot 服务启动顺序。

启动单个 Web 工作进程即可。登录会话保存在内存,8小时到期;重启 Web 会退出全部会话。修改网站管理员账号密码时重新执行 admin 命令并重启 Web;拍卖用户账号由管理员在网页维护,不需要重启。不要在启动参数中放密码或 S.EE Token。

Web 1.1.1起与插件2.22.2起,业务时间固定按北京时间(UTC+8)解释,不依赖服务器或浏览器的时区。systemd 模板仍保留 Asia/Shanghai 环境变量。

编辑方式与注意事项
  1. 在左侧选活动,或在“全部活动”中按名称/画师/序号搜索。
  2. 点击稿位名称打开详情,修改需要的字段后“保存修改”。回收价 0 表示未设置成交底价;回收价默认不公开,可在详情设置公开;管理员网页始终保留实际金额。新画师名只切换当前稿位的关联,不会改名其他共用同一画师的稿位。
  3. 例图上传会立即保存例图;若文字表单已有草稿,先保存文字,再重新打开上传。
  4. 活动管理中点击“查看 / 修改”,调整名称或时间。新时间必须在将来,结束晚于开始。时间编辑不重开已结束活动,也不会为每个稿位新建提前半小时提醒;既有稿位独立定时仍按原规则执行。
  5. 有人同时出价/改资料时,可能收到409冲突提示。核对并暂存草稿,关闭再打开最新记录重新编辑。
  6. “修改记录”显示网站的资料、状态和定时操作,不是所有 QQ 行为日志。网页价格/备注和公开开关修改不会额外向 QQ 广播;状态及定时操作会登记群提醒,由机器人在线后发送。回收价按该稿位的公开选项显示。
数据保护与排错
  • 网页与插件通过同一 auction.db.write.lock 互斥,网页再使用 BEGIN IMMEDIATE 提交资料、任务及审计;同一任务可重入,取消等待会释放资源。锁文件存在不等于被占用,不要手工删除。
  • 网站未登录时不能访问拍卖数据、历史或本地例图。密码使用 scrypt;会话 Cookie 为 HttpOnly/SameSite,写操作校验 CSRF 和来源;登录限流。默认不暴露公网端口。
  • “数据库结构不兼容”:路径不是该插件数据库,或旧库未完成迁移,先用新版插件加载一次。路径错误不会创建空库。
  • “数据正在更新”:机器人正在处理资料或拍卖事务,等待完成后重试。若持续出现,核对文件权限、磁盘容量、日志及锁路径。
  • “例图不可用”:核对图片文件和 --media-root,以及容器与宿主机的绝对路径。已失效的远程图床链接需要更新。
  • 未配置消息来源的活动仅修改时间不会凭空产生群路由;请先通过机器人完成活动及前后台群设置。
开发验收

在项目源码根目录运行 python3 tests/test_auction_web.py,覆盖无 AstrBot 环境启动、鉴权/CSRF、资料编辑、跨活动编号隔离、版本冲突、图片上传与越界拒绝、活动任务重建和失败回滚、账务不变、跨进程锁及取消等待。原有插件回归脚本继续保留。

使用 python3 tools/pack_auction_web.py 生成独立包,bash .claude/pack.sh cym_auction 生成插件安装包。独立 ZIP 不含真实数据库、密码文件、缓存或运行状态。

拍卖价格规则(插件 v2.20.19)

回收价默认不公开,可在独立网站逐稿位设置公开。修改金额或公开开关不发送QQ群公告;之后的查询、批次、上新和出价消息遵循该稿位的公开选项,管理员网页始终显示实际金额。

出价必须大于等于起拍价,并严格高于当前目高;尚无出价时可以按起拍价出价。设置了回收价时,最高出价必须大于等于回收价才能成交;低于回收价的出价可以参与竞拍,截止时统一回收,不扣余额。回收价未设置或为0时,有有效最高出价即可成交。

回收价默认不公开,可在独立网站逐稿位设置公开。修改金额或公开开关不发送QQ群公告;之后的查询、批次、上新和出价消息遵循该稿位的公开选项,管理员网页始终显示实际金额。截止失败提示“最高出价低于回收价,无法成交,已回收”。手动截止、稿位定时截止、活动结束共用规则;手动回收仍直接回收;定时回收参数现在兼容统一按价结算。网页修改底价只影响后续截止判断,不重新结算已经截止的稿位。建议在后台群或管理员网站录入底价,避免管理员自己发送的命令文本暴露金额。

释放稿位(配套插件 v2.21.0)

管理员在QQ使用 /释放稿位 活动名#稿位号,例如 /释放稿位 一周年庆#13;别名 /释放岗位。已截止或已回收的稿位恢复开拍,原出价历史与目高保留,只退回该稿位尚未退回的实际成交扣款;以后再次成交按新的成交价扣款一次。重复释放或已按活动恢复过的款项不会重复退款。

活动须已开启且结束时间在将来,所属批次须已上新。原稿位定时清除后须重新设置;活动总结束时间仍有效。已结束活动需先通过QQ修改结束时间并开启,再释放稿位;网页活动时间编辑仍限未结束的活动。

网站自动刷新显示释放后的状态、原目高和历史。Web 1.1.0也支持在稿位详情中直接“释放并恢复开拍”,使用与QQ相同的结算事务。先升级并重载插件2.22.0,再更新网站并重启;旧插件数据库只能编辑资料,状态操作会明确提示升级。释放前打开的旧表单会触发版本冲突,应重新打开再编辑。

网页修改稿位状态(Web 1.1.0 / 插件 v2.22.0)

进入稿位详情,在“修改稿位状态”中选择目标,点击“应用状态”,核对活动名、序号、稿位名和账务影响,再点击“确认执行”。资料有未保存修改时,先保存资料,再操作状态。

当前状态 可执行操作 结果
已截止、已回收 释放并恢复开拍 保留全部历史和目高,只退本稿位本轮未退的实际扣款;清除旧定时,之后成交重新结算
开拍中 暂停竞拍 保留出价及目高,清除旧定时;暂停期间不可加价,目高仍占用竞拍额度
未开拍、暂停 恢复开拍 活动开启且批次已到上新时间时恢复;不凭空产生退款
开拍中 截止并结算 最高有效出价达到回收价才成交并扣款,否则回收、不扣款;实际结果可能是已回收
开拍中、未开拍 回收 停止竞拍、保留出价历史,清除旧定时,不扣款

已结束稿位不能直接改成另一个结束状态,须先释放。活动未开启、已到结束时间、批次确实未到上新时间时,恢复开拍及截止会给出具体原因;已删除活动不能操作。网站暂停显示在“未开拍”状态组。

批次已到上新时间但旧任务漏执行时,释放或截止审查会补齐批次上新状态,只开启同批仍在筹备的稿位;已截止或已回收的其他稿位保持原状态。上新图文提醒交给机器人发送。QQ群批次查询同时显示上新时间与批次状态,不能仅凭显示了一个时间判断已经上新。

网站状态与余额修改无需AstrBot运行,但群提醒需机器人在线。提醒只同步该活动前台群,个人提醒只发送到有记录的原出价群;单群沿用已有定时或出价会话。没有来源会话时网站仍能保存状态,但无法凭空选择QQ群。普通资料编辑、回收价金额与公开开关修改,不产生QQ群公告。

所有状态操作使用同机写锁、版本检查及单一事务。另一人出价或操作后,旧表单必须重新打开;重复确认不会重复扣款或退款。审计保留前后记录,失败整体回滚。生产库迁移由插件执行,网站不自行迁移生产数据库。

当前定时与机器人版本

定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。 网站可直接设置、修改或取消稿位定时。插件2.23.6补齐仍有效定时的5分钟提醒,保留已完成的30分钟提醒记录。

到了上新时间仍不能恢复开拍(Web 1.1.1 / 插件2.22.2)

旧网站使用操作系统本地时间。若网站主机为UTC,而活动和批次按北京时间录入,网页会晚8小时判断开拍;AstrBot设置上海时区不能自动改变另一个独立Python进程的时区。例如北京时间2026-10-02 15:05,UTC主机仍是07:05,旧网站会错误拒绝15:00批次的恢复操作。

  1. 解压新的 cym_auction_web.zip,用其中 auction_web/ 替换实际运行的程序目录,保留数据库、图片及 auction-web-state/。
  2. 在原启动目录运行 python -m auction_web --version,应显示 auction_web 1.1.1。仍报不支持该参数时,说明实际运行目录尚未更新。
  3. 停止并用原启动命令重新启动网站,已有启动参数不变;若使用配套systemd服务,运行 sudo systemctl restart auction-web。新版本业务时间固定为北京时间(UTC+8),无需依赖主机TZ。
  4. 刷新网页,顶部“更新于”须标明北京时间并与当前时间相符。重新打开“活动一周年庆 → 1号稿位 → 释放并恢复开拍”,核对后确认;原15:00上新时间不需要挪到未来。已经到点的批次会补齐状态,出价和目高保留,只退回未退成交款。
  5. 配套更新插件2.22.2,保证QQ定时和网站使用同一时间口径,并修复插件退出卡住问题。单独升级插件不能修复旧网站进程。

只修正“当前时间”的取值,不修改已有活动/批次/稿位的时间字符串,不重写历史账目。既有数据库按北京时间解释;如曾按其他地区时间录入,应先核对实际安排。未到上新时间的批次仍不能提前开放,拒绝提示会列出上新时间与当前北京时间。

插件2.22.2停用时先取消后台任务,再保存昵称并关闭数据库;待执行定时和未完成通知留在数据库,上线后恢复。若旧版本已经卡在退出中,应先保留数据并替换修复版本,再从容器或服务管理器重启AstrBot。管理页面的重复卸载不能替代进程重启。

调整批次上新时间、恢复筹备中(Web 1.2.0)

进入 活动管理 → 找到目标活动和批次 → 调整上新时间,填写新的北京时间,点击 预览调整。核对活动名、批次号、新时间和影响范围,再点击 确认恢复筹备并保存。

例如:活动「一周年庆」批次1已上新,想改到次日16点再上新,在该批次填写次日 16:00:00,预览并确认。该批次立即显示“筹备中”,未结束稿位暂不可出价;机器人在线时,到新时间恢复开拍并发送原有的整批上新提醒。筹备中的批次也可以再次改期。

  • 新时间须晚于当前北京时间,且在活动开始时间及之后、结束时间之前。浏览器即使使用洛杉矶时区,填写的仍是北京时间。活动已结束、已删除或已经超过结束时间时不能改期;先核对活动安排。
  • 本批次的开拍中、未开拍稿位统一回到筹备状态,保留全部出价历史、当前目高和最高出价者。目高仍占用原有竞拍额度,不扣款、不退款。
  • 已截止、已回收稿位保持原状态及账务;不会因为批次改期而重新成交或释放。如需重拍这些稿位,请在新上新时间到达后,单独使用“释放并恢复开拍”。其他活动及批次不受影响。
  • 未结束稿位的原截止、回收、提前提醒任务一并取消,稿位定时字段及延期次数清零。重新上新后如需定时,请重新设置。活动的总结束时间仍有效。
  • 旧批次上新任务和待执行的补上新提醒作废,只保留新时间对应的上新任务,沿用原活动/批次的消息来源。保存本身不立即发QQ群公告;到点上新与群提醒需要机器人在线。
  • 版本校验覆盖批次、活动安排和批次内稿位。预览后有人出价、设置定时、修改状态或重新分批,旧表单保存会提示冲突,不覆盖新数据。关闭表单、重新打开核对后操作。
  • 批次、稿位、定时及修改记录在同一事务保存;出错全部回滚。修改记录能查看具体活动、批次和变更字段,数据库保留完整修改前后资料。

批次改期入口自Web 1.2.0提供,不增加QQ命令。当前完整版本为Web 1.7.0 / 插件2.25.0;本次回收价公开与统一定时需要先升级并重载插件,再更新网站,具体见下方升级说明。

验收建议:选专用测试活动中已经上新的批次,先给其中一个稿位出价并设置定时,再从网页改到几分钟后。检查筹备状态、原目高和余额保留、旧定时清除、筹备期间加价失败、到点只上新一次且可继续加价;另一个批次和已结束稿位不变。再测试过去时间、活动范围外时间、重复提交及两个窗口修改的冲突提示。自动回归见 tests/test_auction_web_batches.py 和 tests/test_auction_web.py。

回收价公开、统一定时结算与价格对比(Web 1.3.0 / 插件2.23.0)
回收价公开开关

在稿位详情的“回收价是否公开”选择“不公开”或“公开”,点击“保存修改”。新稿位和旧稿位升级后默认不公开。切换开关或修改回收价都不会额外向前台群发送公告;后续单稿位查询、稿位列表、批次查询/目高、上新提醒和出价通知按开关显示金额。改回不公开后,后续消息显示“不透露”,已经发出的历史消息无法自动收回。金额为0表示未设置成交底价,公开时显示“未设置”。

一个定时,按最终价格决定结果

进入稿位详情“设置稿位定时”,填写执行时间(北京时间),点击“设置 / 修改定时”,核对活动、稿位、时间和提醒影响后“确认执行”。可以修改或取消已有定时。设置定时本身不扣款或退款。

到点情况 结果
有有效最高出价,且目高大于等于回收价 已截止,交易成功,按成交价扣款一次
目高低于回收价,或无人有效出价 已回收,交易终止,不扣款
回收价未设置或为0 有有效最高出价就成交,无出价则回收

网站不再区分两个互相独立的“定时截止/定时回收”。QQ可用 /设置定时 一周年庆#1#2026-10-04 20:00#结算;旧参数“截止”“回收”均兼容同一结算规则,示例时间须替换为活动范围内的未来时间。升级时旧定时回收自动转为按价结算,保留原时间及延期次数,不改动已经完成的成交或回收;管理员手动“回收稿位”仍是立即主动终止。

网站保存/修改定时后,会登记一次前台提醒,机器人在线时发送。剩余30分钟时再提醒;保存时已不足或等于30分钟,设置公告与预告合并为一条。剩余5分钟时再次提醒;保存时已不足5分钟则合并为一次5分钟提醒。最后5分钟内每次有效加价,将原结算时间再延长5分钟;之后再次进入最后5分钟还可继续延期,每次延期单独显示最新时间。报价失败不延期。已经发送过的30分钟预告不会因延期或重启重复发送。

定时公告和提前提醒仅发送到该活动绑定的前台群,后台群不广播;单独设置/取消公告不@;30分钟和5分钟预告在最高出价者的出价来源前台群@该成员,其他前台只有公共提醒。单群沿用原稿位定时、批次、活动或出价会话。无群绑定且无任何来源记录时,网站仍保存定时并提示交由机器人发送,但不能凭空选群;请先设置活动前台群。修改或取消后,旧任务和未发送的旧定时通知作废;取消也会通知前台,活动总结束时间仍有效。到点结算和群通知均需要机器人在线。

活动必须开启且未结束,批次已到上新时间、稿位可竞拍;新时间必须晚于当前北京时间且不晚于活动结束时间。活动结束不会抢先关闭已经有效加价延期的稿位。有人出价、触发延期或修改资料后,旧网页表单会提示冲突,应重新打开核对。设置、取消、提醒任务和审计在同一事务保存,失败全部回滚。

列表直接观察是否达价

外层稿位卡片同时显示“当前目高”“回收价”“起拍价”和回收价是否公开。目高大于等于回收价显示绿色“已超过回收价”(包括恰好相等);低于回收价或尚无出价显示“未超过”。回收价为0显示“未设置回收价”,不会把无底价误标为未达价。比较徽标仅用于管理员观察,实际状态与成交仍以结算结果为准。

升级与验收

先安装插件2.23.6并重载,让原数据库自动增加所需字段、统一旧定时并补齐有效定时的5分钟提醒;再替换网站 auction_web/ 目录并重启网站。保留原数据库、图片及网站账号目录。python -m auction_web --version 应显示 auction_web 1.8.0。新功能没有完成配套插件升级时只读提示,网站不自行迁移生产库。

验收:给测试稿位设置回收价1000,分别令目高为999、1000、1001,观察“未超过/已超过回收价/已超过回收价”。公开开关保存后群内不主动通知,之后查询显示相应金额或不透露。网页设置一小时后结算,检查立即公告、提前30分钟和5分钟预告并@当前最高出价者;最后5分钟有效加价应顺延并另发通知。到点分别测试无人出价、低于、等于和高于回收价,以及未设置回收价的情况。测试两个窗口冲突、改期、取消、重复提交、旧回收定时升级及机器人重启,不应重复扣款或退款。

QQ前台达价状态(插件2.23.1)

原本显示“交易中”的单稿位详情、稿位列表和“我上传的稿位”,在有有效目高且目高大于等于已设置的回收价时显示“交易中/已过回收”。无人出价、未达价、未设回收价以及其他状态保持原样;撤回或修改回收价后按最新数据重新判断。此标记不公开回收价金额,金额仍遵循公开开关。

此项只需更新并重载插件2.23.1;独立网站继续为1.3.0,无需为本项重启网站。

定时提及规则(2.23.6现行,保留2.23.2说明)

设置、修改、取消定时的单独公告只发公共文字;30分钟和5分钟提前提醒(含临近设置的即时提醒)@当前最高出价者。多群时仅在该成员出价来源前台群提及,其他前台发公共提醒。5分钟延期公告仍为普通文字;到点成交、到点回收及活动结束结果仍按原规则@相关出价者。

定时命令回执不自动@发令者,不改变AstrBot全局回复设置。2.23.2曾关闭所有预告提及;2.23.6起30/5分钟提醒恢复提及,设置和取消公告继续无@。通知重试保留已发送段落进度;本次请同时更新插件2.23.6与独立Web 1.3.4。

成交与扣款条件复核(插件2.23.3 / Web 1.3.1)

有有效最高出价且目高大于等于回收价,才允许成交并按成交价扣款一次。目高低于回收价或无人有效出价时,交易失败,稿位回收,不改变余额,也不产生扣款账单。回收价是否公开不影响判定;未设置回收价或为0时,沿用有有效出价即可成交的规则。

QQ手动截止、稿位定时结算、活动结束、网页“截止并结算”共用成交规则;底层实际扣款再核对一次条件,误调用不能绕过底价。状态、余额、账单和通知仍在同一事务中处理,失败回滚,重试不重复扣款。

升级:安装并重载插件2.23.3,替换独立网站 auction_web/ 目录并重启,python -m auction_web --version 应显示 auction_web 1.8.0。数据库和既有成交账目保持原样,本次无需迁移数据库。

当前目高合计的统计范围(Web 1.3.2)

点击“当前目高合计”卡片右上角的“范围”,勾选需要计入的稿位状态:开拍中、未开拍、已截止、已回收。支持任意组合,即时重算;默认仅勾选开拍中,沿用原来的统计范围。全部取消时显示0,尚无出价的稿位按0计算。未开拍稿位如保留了暂停前的目高,勾选后也会计入。

统计跟随左侧所选活动:“全部活动”合计所有未删除活动,选中某个活动时仅统计该活动。下方搜索、批次和状态筛选仅调整稿位列表,不改变合计范围;其他三张统计卡片保持原规则。合计是所选稿位的当前目高之和,不是成交收入或实际扣款总额。

范围选择保存在当前浏览器,自动刷新、切换活动、重新打开页面后保留;其他浏览器可单独选择。浏览器禁止本地存储时仍可操作,但重开页面会恢复默认。实时数据变化时,已展开的菜单与勾选状态保持,不影响继续操作。点击外部区域或按Esc关闭菜单。

本次保持页面整体布局、配色与四张统计卡片样式,仅在合计卡片内增加范围菜单。现有插件2.23.3可继续使用,只需替换独立网站的 auction_web/ 程序目录并重启网站,保留原数据库、图片和账号目录;python -m auction_web --version 应显示 auction_web 1.8.0。配套插件2.23.4仅同步版本和完整文档,本项不增加QQ命令、不修改拍卖状态或账务。

查询时显示已设置的截止时间(插件2.23.5 / Web 1.3.3)

稿位设置统一结算定时后,QQ单稿位查询、批次查询、批次目高、稿位列表、“我的稿位”和“我上传的稿位”,在对应稿位下显示 截止时间:2026-10-04 20:00:00(北京时间)。已有和没有出价的稿位一致处理,不新增QQ命令;“我的稿位”继续只发文字。

独立网站稿位卡片及详情同步显示此时间,无需额外展开定时操作区。显示的是该稿位当前有效的定时时间,修改或5分钟延期后,QQ下次查询和网页自动刷新读取最新值。未设定时、已取消定时,或结算/释放等操作清除定时后不显示这行;不使用活动结束时间代填,也不显示“截止时间未设置”。截止与回收共用的按价结算规则保持原样。

更新QQ查询请安装并重载插件2.23.5;更新网页请替换独立网站 auction_web/ 程序目录并重启,版本为1.3.3。保留数据库、图片与网站账号目录。页面整体布局、统计范围、余额和原有提醒策略保持原样。

截止时间筛选、全场目高与30/5分钟提醒(Web 1.3.4 / 插件2.23.6)

在稿位目录原有筛选栏点击“截止时间”,选择“全部稿位”“已设置截止时间”或“未设置截止时间”。可填写开始、结束时间后点击“应用筛选”;只填一端也可以,起止时刻均包含在结果内,开始晚于结束会提示错误。日期时间按北京时间解释,不随浏览器所在地转换。填写时间后只匹配已设置定时的稿位;选择未设置会清空时间范围。点击“清除”只重置截止时间筛选。

截止时间筛选可与活动、批次、稿位状态及搜索组合,应用后回到第一页。自动数据刷新和切换活动保留条件;延期导致稿位移出时间范围时,列表自动更新。范围针对稿位自身当前定时,不使用活动结束时间代替。顶部目高合计仍使用自己的状态范围,与目录筛选独立。页面沿用原有布局和配色,仅增加筛选入口。

插件2.23.7起,QQ中直接发送“查询目高”或“/查询目高”,按序号列出当前活动全部稿位,每件一行:53号 炊籽xxx | 1000¥;无人出价为 54号 作品名 | 暂无出价。只保留序号、作品名、当前价格,无标题、批次、上新或截止时间、图片和多余空行。未分批稿位一同按序号排列,长内容自动分段。单批“查询批次1目高”仍保留原图文详情。旧“设置全场批次图”保留参考图存储。本次仅需更新并重载插件至2.23.7,独立Web功能版本仍为1.3.4。

30分钟和5分钟提醒均@发送时的当前最高出价者。多群公共提醒发给该活动全部前台,个人提及仅在其出价来源前台;后台不广播,未参拍的群不@。没有有效出价时仅发公共文字;旧出价缺少来源群时不猜测群号。单独设置、修改、取消公告和延期公告仍为普通文字,成交和超价等通知保持原规则。

设置时不足或等于30分钟立即预告,之后保留5分钟提醒;设置或恢复运行时已不足或等于5分钟,两档合并为一次5分钟提醒。最后5分钟有效出价继续延长原时间5分钟并逐次公告;新的截止时间前5分钟重新提醒,已发送的30分钟提醒不因延期重发。重复执行和重启不重复发送同档提醒;取消、结束、改期会取消对应旧任务,升级补齐有效定时缺失的5分钟节点。

升级顺序:安装并重载插件2.23.6,再替换独立Web程序目录并重启至1.3.4。保留原数据库、图片与网站账号;网站不另开调度器,QQ提醒仍需机器人在线。完整测试步骤见插件 TEST_COMMANDS.md。

用户管理(Web 1.4.0 / 插件2.23.8文档)

登录独立网站后,点击左侧“参拍成员”。显示机器人已经记录或在余额、出价、稿位上传、成交账目中出现的用户,不代表QQ群完整成员名单。同一成员标识只对应一位用户;昵称相同的不同成员不会合并。优先显示管理员设置的显示名称,其次为最近记录的群昵称;尚无昵称时显示“未记录昵称”,同时保留完整成员标识(sender_id)便于核对。

列表显示全局余额、审核状态、当前目高作品件数及金额、已成交作品件数及金额、最近出价时间。余额是所有活动共享的当前余额,不按活动重复累加;从未录入余额显示“未录入”,余额为0则显示0。可搜索昵称、显示名称或成员标识,支持“已审核”“未录入余额”“年龄未审核”筛选,每页24人。上方四项统计针对全部已记录用户,不随搜索和审核筛选变化。

点击“查看”进入用户详情:

  • 身份与审核:成员标识、群昵称、显示名称、全局余额、审核状态、余额更新时间、审核人员标识及历史出价次数。
  • 已成交作品:当前状态为已截止且最高出价者为该用户的作品,显示活动、序号、作品名和成交金额。
  • 当前目高作品:尚未结束且最高出价者为该用户的作品,含恢复筹备后保留的目高,并显示其未开拍状态;显示活动、序号、作品名、价格及已设置的截止时间。
  • 已回收、已删除活动及已被其他人超过的作品不计入以上两组;历史出价和账目仍可追溯。释放重拍、撤回或成交后按当前数据重新分类,不把历史出过价的全部作品算作已拍到。
  • 出价记录:展开后显示最近100条,包含时间、金额、所属活动/作品以及撤回状态,并注明总数。
  • 成交扣款/退回记录:展开后显示最近100条及总数,包含作品、竞拍轮次、扣款时间与金额、扣款前后余额、是否退回、退回时间及退回前后余额。它记录成交扣款及对应退款,不包含所有手动余额录入操作;历史账目不等同于当前作品归属。

点击作品名称可打开原有稿位详情;关闭稿位详情后回到用户详情。用户列表和打开的详情每2秒刷新,搜索、审核筛选和页码保持;暂时断线显示错误提示并保留上次数据。页面隐藏时暂停轮询,重新显示时刷新。用户视图展示跨活动全局数据;点击左侧活动会切回该活动的稿位目录。

用户查询接口 /api/users 和 /api/users/{sender_id} 必须登录网站管理员账号后访问;查询本身只读,不会触发扣款、退款或QQ群通知。Web 1.5.0起,用户列表与详情另有余额录入入口,页面顶部提供全局清空;写入需管理员登录和操作预览确认。金额以普通数字显示,时间统一为北京时间。

升级:解压新的 cym_auction_web.zip,替换原网站 auction_web/ 程序目录并重启;保留原数据库、图片和网站账号目录,沿用原启动参数。python -m auction_web --version 应显示 auction_web 1.8.0。1.4.0的用户查询没有新增业务表或迁移。当前1.5.0管理功能请配合插件2.24.0升级,见下方完整说明。用户查询回归见 tests/test_auction_web_users.py、tests/test_auction_web.py。

完整管理操作(Web 1.5.0 / 插件2.24.0)

保留原有布局、资料编辑、用户查看、状态和定时入口,在对应页面增加以下操作。所有新增操作均采用“预览操作 → 确认执行”:预览显示具体活动、稿位/成员/出价记录和影响范围,5分钟内有效,修改输入后须重新预览;确认时再次核对当前数据。预览后有新出价或相关资料变化会拒绝执行,避免覆盖新数据。同一确认重复提交不重复执行。操作前资料、执行结果与管理员账号进入修改记录。

活动管理
  • “创建活动”:填写唯一名称、开始和结束时间(北京时间)。结束须晚于开始及当前时间;名称不能与现存或已删除活动重名。初始筹备中,机器人在线时按开始时间开启、到结束时间按原规则结算。
  • “查看 / 修改”:保留名称和时间编辑;已关闭活动可以把结束时间改到将来,再点击“开启活动”。改时间本身不会重开;已开启或关闭活动不能改开始时间。
  • “开启活动”:手动开启并重新安排活动结束任务;不自动恢复已取消的稿位定时,未上新批次仍不可出价。
  • “关闭活动”:停止出价,取消该活动、批次和稿位待执行定时,保留稿位和出价,不进行成交扣款或退款。这不同于逐个稿位“截止结算”。
  • “删除活动”:停止竞拍并从常规目录排除,保留历史出价和账目,没有活动恢复入口;不清空共享余额。确认前显示活动名及稿位数。

新活动的前后台群仍需在QQ中使用 /设置群 前台#活动名#群名、/设置群 后台#活动名#群名 绑定。网站不自动猜测通知群。

新增、删除、恢复和编号

在“稿位总览”点击“新增稿位”,或从活动卡片点击同名按钮:选择活动,填写作品名、画师、起拍价、回收价及公开选项、备注,上传一张例图或填写图片直链,两者选其一;可选填上传者成员标识。回收价默认为不公开;网页填写价格不发送群公告。暂存图片15分钟有效、每会话最多12张,过期重新选择后预览。

序号留空自动分配:优先使用通过改号释放的空号,否则接在既有最大编号后。可手动指定空闲或已删除稿位的编号;现有编号或名称被占用时拒绝,不覆盖。普通删除留下的空号不会自动使用,避免破坏原恢复位置;手动指定仍可使用。新稿位未分批,活动开启时可出价;如需分批上新,先在活动筹备时完成分批与时间设置。

进入稿位详情的“稿位管理”:

  • “调整编号”:输入本活动空闲编号,作品与图片、批次、定时保留,原编号释放供下次自动添加优先使用。仅未结束且从未有出价/成交记录的稿位可调整。
  • “删除稿位”:仅无任何出价历史(包括已撤回)、无当前出价和成交账目,且不是已截止的稿位可删除。按精确记录识别对象,不会因编号不存在而匹配其他稿位;预览列明活动、原编号、名称。
  • “已删除稿位”:从总览打开,可按活动筛选。点击“恢复”预览并按原记录/编号恢复;若编号、名称或原记录已占用,拒绝覆盖。资料与例图引用保留,旧定时不恢复。原批次已被替换时,未结束稿位恢复为未分批筹备中,需重新编排。所属活动已删除的记录不能恢复。

例:将新稿位98号调整为69号后,下次自动新增会优先使用释放的98号;若69号已有作品,则改号失败。若原69号已删除,使用69号会使原删除记录暂时无法恢复,须先空出69号。

批次编排

在活动卡片点击“批次编排”,选择活动及每批数量,预览每一批的稿位编号,确认后按编号升序重新分批。会替换原批次、取消旧上新安排和未结束稿位的定时,将这些稿位恢复筹备中;保留所有出价、目高及余额。已截止/已回收稿位保留状态。完成后在各批次点击“调整上新时间”重新安排。正在竞拍的活动重排会暂停其未结束稿位,预览会明确提示。

录入与清空余额

在“参拍成员”点击“录入余额”,或用户详情中点击“录入 / 修改余额”。从已登记成员选取完整成员标识(sender_id),也可输入真实标识;昵称仅供辅助辨认,不能用相同昵称替代身份。填写最终余额并确认已核实余额与年龄,预览旧值和新值后保存。

输入10000表示覆盖为10000,不是增加10000;可为0、最多1万亿,始终显示普通数字。每位成员仍只有一份跨活动全局余额;保存同时标记余额、年龄审核通过,保留原昵称,不发送QQ公告。

“清空全局余额”影响全部活动共用的所有成员余额和审核记录,不受当前活动或搜索筛选限制。它删除审核余额记录,不是设为0;保留成员档案、出价、作品归属和成交扣款/退回账目,不进行退款。成员需重新审核录入后继续竞拍。清空前显示人数,确认期间若新增或修改余额则拒绝执行,须重新预览。

全部出价历史和撤回

左侧“出价历史”查看所有成员、全部活动的历史记录,包括已删除活动的保留历史。按活动、作品、昵称/显示名/成员标识/作品关键词、出价状态和北京时间范围组合筛选;起止边界均包含。每页50条,按记录编号倒序,逐页可查看完整历史,不受用户详情最近100条的限制。“未撤回”只表示记录有效,不表示该成员仍持有目高。列表包含记录号、时间、活动、作品编号和名称、成员昵称与完整标识、金额、撤回状态及撤回时间。

点击目标记录“撤回”后预览:准确列出选中记录、该笔及之后会被作废的出价、新目高及其成员;确认后原子作废并重算。金额相同或成员重复也通过记录号精确区分。已撤回或已成交稿位的出价不能再次撤回;已成交状态应先按既有释放流程处理未退扣款后再操作。撤回不修改余额、不扣款/退款,不回退此前因出价延长的截止时间。

例:A1000、B2000、C3000、B4000,选中B2000那笔,则B2000、C3000、B4000同时作废,目高恢复A1000。撤回第一笔后变为暂无出价。被撤回记录保留在历史表,可筛选查看。

机器人在线后发送公共目高变更和参拍者提醒:多群只向活动绑定的前台发送,成员仅在其出价来源群被@;后台不广播。单群模式在记录来源群提醒该群参拍者。旧记录缺少来源时不猜测成员所在群;新Web活动尚未绑定群时先完成群绑定。网站本身不连接QQ发送消息。

升级与验收

先安装并重载 cym_auction.zip 2.24.0,再替换独立网站的 auction_web/ 1.5.0 并重启;保留原数据库、图片、账号目录和启动参数。运行 python -m auction_web --version 确认为 auction_web 1.8.0。插件包可直接在AstrBot上传安装,ZIP根目录含metadata.yaml;独立Web包单独解压运行。本次不新增业务数据迁移,不自动改动现有活动、余额或出价。

请先在演示库验证创建活动、增加作品、改号释放、删除恢复、重新分批、余额录入/清空,以及出价筛选和撤回;完整步骤在插件TEST_COMMANDS.md。1.5.0仅增加上述管理模块,不增加QQ命令;1.6.0新增的拍卖用户个人页见下文。

拍卖用户账号与个人页面(Web 1.6.0 / 插件2.24.1文档)

总管理员继续使用原网站管理员账号登录;受限管理员使用分配的管理账号,参拍者使用分配的普通账号登录同一网址。下文普通账号操作受“账号与权限”中的授权与层级范围约束。后端决定账号角色,用户不能自行注册、绑定身份或提升权限。创建网站账号不会授予QQ管理权限,也不会自动录入余额或完成年龄审核。

管理员创建和维护账号
  1. 登录网站管理员账号,进入左侧“账号与权限”(也可在“参拍成员”点击“登录账号管理”)。
  2. 点击“创建用户账号”,填写登录账号、绑定成员 sender_id、密码和确认密码。登录账号为3–80位英文字母、数字、点、下划线或短横线,普通用户登录不区分大小写;不能与管理员重名。
  3. sender_id可从已登记成员中选择,也可填写准确的原始标识,兼容已有 <@标识> 形式。昵称仅供辨认,同名成员不会自动合并。不要使用昵称或根据QQ号猜测QQ官方身份。
  4. 点击“核对账号”,检查显示的账号、成员昵称及完整标识,再“确认保存”。每个账号绑定一个 sender_id,同一个 sender_id只能绑定一个账号;已停用账号仍保留绑定,重复时应管理原账号。
  5. 将账号与密码通过私密渠道交给本人。密码为12–256个字符,后台不能查看已保存的密码,只能重设。

账号列表可按登录名、昵称、成员标识搜索。“管理”中可以修改绑定、重设密码、启用或停用账号,以及设置“允许查看全部作品回收价”;密码留空表示保持原密码。登录账号创建后不改名;停用用于停止访问,不删除拍卖资料或账号审计。修改绑定前会列出原、新成员标识并要求核对,因为它会改变该账号能查看的全部个人资料。回收价权限的新旧账号默认关闭,开启范围与操作见文末专节。

保存任何绑定、密码、启停或回收价权限变更后,该账号原有的所有登录会话失效;重新启用不会让旧会话恢复。用户须重新登录。管理员与其他普通账号不受影响。并发编辑同一账号会被版本校验拦截,要求重新核对。账号操作记录显示在账号列表底部,完整审计保存在网站账号库;不包含明文密码、密码散列或盐。

如果所填 sender_id还未出现在拍卖数据中,账号仍可创建,个人页显示“未录入余额”和空稿位/历史;当机器人或管理员为同一标识记录资料后自动出现。网站不按昵称、账号名自动匹配其他身份。若信息为空,管理员先核对绑定,不要反复创建账号。

用户能看到什么

普通用户登录后进入“我的拍卖”,没有管理员导航和修改按钮。页面每2秒更新一次,隐藏标签页暂停刷新;发生断线时明确提示旧数据,退出或会话失效后清空个人信息。

区域 内容
当前余额 本人的一份全局余额与审核状态;未录入和0余额区分;实际成交扣款/恢复后读取新余额
已成交的稿位 已截止且当前最高出价者为本人,显示例图、所属活动、编号、名称和本人成交价
当前目高稿位 本人当前持有最高出价、尚未结束的稿位,包括暂停后保留目高的筹备中稿位
仍在参与的稿位 本人在未结束稿位上有有效出价,但目前已被超过;显示例图、当前目高及本人的有效出价金额,不显示其他出价者身份
我的出价历史 本人全部历史出价,含已撤回记录;每页50条,支持作品/活动/序号搜索和撤回状态筛选,没有最近100条限制

作品分组排除已回收稿位和已删除活动,但本人历史出价仍保留。未撤回不代表仍持有目高。暂停、活动关闭会显示对应状态;设置了稿位截止时间时显示北京时间。个人稿位列表和出价历史提供等比缩略图,“仍在参与”同时列出当前目高与我的有效出价。默认不显示回收价;仅当管理员为账号开启回收价查看权限时,个人稿位增加回收价,且可进入全部作品回收价目录。管理员稿位详情、管理员图片接口、其他人的身份/余额/逐笔历史始终不开放。图片走图床直链或校验本人关联的个人图片接口。余额和出价操作继续由管理员/QQ处理,普通用户网页只读。

权限隔离方式
  • 原管理员接口继续要求管理员身份,并按具体功能权限校验;总管理员拥有完整功能。普通用户仅能访问自身会话、个人概览、个人出价历史、与本人竞拍记录相关的例图以及退出登录;另有单独授权的回收价目录。新增或未知管理接口也默认拒绝。
  • 个人查询从服务端登录会话取得绑定 sender_id,所有数据查询附带该身份条件;不接受浏览器通过参数指定别人。修改地址、成员编号、出价记录号或页面脚本不能获得管理接口或他人数据。
  • 个人响应逐字段构造,不复用包含其他成员资料的管理员完整响应。不返回他人姓名/标识/余额/逐笔出价、图片文件路径、来源群或管理审计;本人相关稿位可显示当前目高金额。无回收价权限时不返回回收价字段;有权限时只增加作品回收价及最小目录信息。
  • 每次请求检查账号是否启用及会话版本;读取期间发生换绑或关闭权限也拒绝返回原资料。密码/绑定/启停/回收价权限变更立即撤销原会话权限;前台在下一次刷新返回登录页并清理资料。
  • 退出、换账号时清空已渲染资料;同一浏览器其他标签页同步清理并重新读取会话。浏览器存储不可用时,旧会话标记也会被接口拦截。页面不将账号资料、余额或令牌写入localStorage;标签页通知只保存无身份含义的随机标记,会话由HttpOnly Cookie管理。
  • 密码使用随机盐和scrypt保存,不提供明文查询;Cookie沿用HttpOnly、SameSite和HTTPS下Secure;账号写操作检查登录、CSRF及请求来源。成功登录不消耗失败限流次数,以支持反向代理下多人访问;持续错误密码会被限流。
部署、升级和备份

本项更新独立Web即可:解压 cym_auction_web.zip,替换 auction_web/ 程序目录并重启,版本应显示 auction_web 1.8.0。当前插件2.24.0可继续使用;配套插件2.24.1同步完整指南、测试步骤和历史日志,运行逻辑不变。不要将独立Web包上传到AstrBot插件安装窗口,插件窗口使用 cym_auction.zip。

继续使用原启动参数、HTTPS域名、拍卖数据库、图片和 --state-dir。网站会在原 --state-dir 中建立独立的 accounts.db(账号及账号审计),原 admin.json 保留。该目录须可写;新账号库文件权限为600。无需修改或迁移 auction.db,也不改变现有余额、出价和QQ规则。机器人离线时,网站仍可读取已保存的数据库状态;自动结算和群通知仍需机器人在线。

升级和迁移时须保留整个网站凭据目录,包括 admin.json 与 accounts.db;不要把它们放进源码安装包或公开静态目录。已有 backup --db /拍卖目录/auction.db 只备份拍卖业务库,账号库另行备份,例如:

python -m auction_web backup --db ./auction-web-state/accounts.db --output ./backups/accounts-before-upgrade.db

输出目标须不存在;管理员凭据 admin.json 单独随凭据目录保留。重启网站会让所有会话失效,但账号、密码与绑定继续保留。忘记用户密码由管理员网页重设;忘记管理员密码仍通过原 admin 命令重设并重启。

示例:创建登录账号 member001,绑定真实成员标识A并设置密码。该用户登录只能看到A的余额、稿位和出价;管理员把账号停用后,原页面刷新立即退出。若将账号绑定改为标识B,必须先核对确为同一用户的正确身份,旧会话作废,重新登录后仅按B查询,绝不会把A/B资料合并。

自动回归见 tests/test_auction_web_portal.py,覆盖两个同名成员的隔离、全部管理路由拒绝、篡改查询参数、全量分页、禁用/重设/换绑、读取中换绑、持久化与查询无账务副作用。完整手工验收见插件TEST_COMMANDS.md。

用户排序、快捷账号与密码生成器(Web 1.6.1 / 插件2.24.2文档)
用户列表排序

管理员进入“参拍成员”,在原有搜索和审核筛选旁选择排序依据及方向。支持“余额”“当前目高金额”“当前目高件数”“已成交金额”“已成交件数”,可选“从高到低”或“从低到高”。默认排序保留原列表顺序;金额按数字比较,不按文字比较,100排在20之后(升序)。

排序作用于搜索、审核筛选后的全部用户,然后每页展示24人,不是只排序当前页;切换排序或筛选回到第一页。自动刷新和打开/关闭用户详情后保持当前排序选择,退出账号后重置。未录入余额始终在余额排序末尾,零余额、负余额按真实数值处理。当前目高和已成交沿用原来的跨活动统计口径,不改变余额或拍卖结果。

每位用户快捷设置账号

用户列表每一行以及用户详情均增加“设置账号”:

  • 尚无账号:直接打开创建窗口,自动填入该用户的sender_id及昵称提示;管理员只需填写登录账号和密码,再核对保存。
  • 已有账号:直接打开此成员绑定的原账号,可重设密码或启停;已停用账号也会打开原记录,不重复创建或自动启用。
  • 快捷入口固定所选成员标识,防止选错同名用户或误绑定。要主动更换绑定,仍从“登录账号管理→管理”进入原完整表单;昵称只辅助辨认,不作为身份依据。

入口打开前读取最新账号列表;读取失败会明确提示,不按过期信息创建。保存仍沿用唯一绑定、版本冲突检查及预览确认。账号保存变更后,该账号原登录会话失效;个人资料仍只限本人,另可独立授权全部作品回收价。

密码生成与复制

创建账号、快捷设置和原账号管理窗口中均提供“生成随机密码”“显示密码”“复制密码”。生成器使用浏览器安全随机源生成20位密码,包含大写字母、小写字母、数字及短横线/下划线,自动填入密码和确认密码两个输入框;默认隐藏。无需向第三方请求密码,不在日志或浏览器持久存储中保存明文。

  1. 填写账号信息或打开原账号,点击“生成随机密码”。
  2. 点击“复制密码”,通过私密渠道交给账号本人;需要核对时可“显示密码”,之后再隐藏。
  3. 点击“核对账号”,确认成员绑定、账号和启停状态,再“确认保存”。生成或复制本身不会修改账号;重设密码只有保存后生效。生成新密码、编辑表单后必须重新核对。

保存后表单清空,后台不能查看旧密码,请在保存前复制;取消、关闭、退出登录同样清空密码并恢复隐藏状态。浏览器限制自动复制时会显示并选中密码输入框,提示用系统快捷键或长按复制;复制信息停留在系统剪贴板,由管理员自行管理。安全随机源不可用时明确提示手动填写,不使用不安全的随机数替代。

本次只更新Web即可:替换auction_web/程序目录、重启,版本为auction_web 1.8.0。保留业务库、图片及整个--state-dir,包含admin.json、accounts.db。配套插件2.24.2仅同步版本及完整文档,原2.24.0及以上插件无需因本功能改变运行配置;不新增QQ命令或数据库迁移。

自动测试:node tests/test_auction_web_user_tools.cjs、python3 tests/test_auction_web_users.py与python3 tests/test_auction_web_portal.py。手工验收见插件TEST_COMMANDS.md。

客户页当前目高与稿位图片(Web 1.6.2 / 插件2.24.3文档)

“仍在参与的稿位”显示两个独立金额:当前目高是该稿位最新最高价,我的有效出价是当前用户在该稿位上的最高有效出价。目高发生变化时随页面自动更新,不把别人的目高误算为自己的出价,也不显示目高成员的姓名或标识。

“已成交的稿位”“当前目高稿位”“仍在参与的稿位”全部增加例图。个人出价历史每条作品也显示更小的缩略图;历史出价金额仍是本人当时的出价,不用当前价格覆盖历史。图片等比完整显示,不裁剪;电脑列表约112×84px、手机约76×60px,历史约64×48px。

图片优先复用原有图床地址,本地图由个人图片接口输出长边最多320px的JPEG,不放大小图;无例图或加载失败分别提示“暂无例图”/“例图不可用”。图床有本地备份时失败会自动回退,不要求重新上传或填写新的图床Token。翻页和价格刷新复用已有图片机制,例图地址只随图片变化而变化。

权限与隐私:

  • 本地例图仅通过/api/me/artworks/稿位内部编号/image读取;从登录会话取得绑定成员,不能通过参数指定他人。无关稿位、未知编号和已删除活动统一拒绝。管理员完整稿位/图片接口继续不对普通用户开放。
  • 允许读取当前归本人持有的稿位,或本人有历史出价记录的稿位图片(含已撤回记录,历史仍归本人)。未曾参与且不归本人持有的稿位图片不能读取。
  • 每次图片请求(含HEAD和浏览器缓存校验)都检查登录与作品关联;停用、换绑、重设密码后的旧登录不能取图。图像转换期间删除活动或换图时重新核对;错误不暴露服务器目录。
  • 个人响应只带可展示的例图地址,不带本地文件路径、管理详情或他人身份。图床直链沿用既有公开图片服务;网站不会下载未知远程地址作为代理。

本次只需更新并重启独立Web,版本为auction_web 1.8.0。保留原数据库、图片、图床缓存及整个state-dir;不改拍卖余额或竞价规则,无业务库迁移。配套插件2.24.3同步完整指南、验收与日志,运行逻辑不变。

自动验收:python3 tests/test_auction_web_portal_images.py、python3 tests/test_auction_web_portal.py、python3 tests/test_auction_web_media.py、python3 tests/test_auction_web.py及node tests/test_auction_web_images.cjs。

账号回收价查看权限(Web 1.6.3 / 插件2.24.4文档)
管理员设置

进入“参拍成员”,在对应用户行或详情点“设置账号”;也可进入“登录账号管理→管理”,或者在创建用户账号时设置。表单增加 允许查看全部作品回收价 选项,账号列表也显示当前是否允许。

  1. 勾选表示允许,不勾选表示保持原有个人页显示方式。新账号与升级前已有账号均默认不勾选。
  2. 点击“核对账号”,确认对应成员、账号以及回收价权限范围,再“确认保存”。单独调整权限时无需输入新密码。
  3. 保存权限变更后,该账号所有旧登录失效;请用户重新登录。其他账号的权限与会话不受影响。关闭后,原页面下一次刷新退出并清空回收价;原先正在读取的请求也不能继续返回价格。
  4. 账号列表底部显示权限操作记录,完整记录保存在账号库,含操作人、时间及变更前后权限。并发修改冲突时需重新核对,不覆盖其他管理员的修改。
开启后用户能查看的范围
  • 个人页已成交、当前目高、仍在参与的作品增加“回收价”一行。
  • 页面顶部增加“查看全部作品回收价”入口,下方提供独立的“全部作品回收价”列表。覆盖所有未删除活动中的现存作品,包括未参拍、未开拍、开拍中、已截止和已回收作品;不恢复已删除作品或已删除活动。
  • 列表仅显示活动、作品编号/名称、状态和回收价。可按活动筛选,按作品名、活动名或序号搜索,每页50条,支持全量翻页。没有设置回收价显示“未设置”,金额采用普通数字,不使用科学计数法。
  • 包含尚未公开的回收价格,不受稿位“公开回收价”开关限制。此授权仅影响该网站账号;不会改变作品的公开设置,不发送QQ群通知,也不会让QQ普通查询公开金额。
  • 其他成员的身份、余额、逐笔出价历史及管理员接口仍不可访问。原个人页/个人图片权限保持:只能查看自己的竞拍记录和相关例图,回收价目录不会额外开放全部作品图片或他人竞价资料。

关闭权限时,不展示回收价目录及入口,个人响应不包含回收价字段,保持本次更新前的显示范围。浏览器修改参数、手动请求目录或篡改页面不能开启权限;权限始终由服务器读取当前账号记录。

示例:管理员为member001开启此项,即使该用户尚未出价,也可以按活动查询全部作品的回收价。member002未开启,仍只查看自己的余额、稿位和出价历史。取消member001权限并保存后,该用户重新登录回到默认个人页。

升级与验证

替换独立网站的auction_web/目录并重启,运行python -m auction_web --version应为auction_web 1.8.0。沿用原启动参数,保留业务数据库、图片、图床缓存及整个state-dir,尤其是admin.json与accounts.db。

启动时自动为旧accounts.db增加默认关闭的权限字段,原账号ID、登录名、绑定、密码和审计保留;可重复升级。升级前可使用前文的backup命令另行备份账号库。此更新不修改拍卖业务库、不改余额与出价,不需要更换图片或重新建立账号。配套插件2.24.4同步完整说明、测试命令及更新日志;本项更新Web即可使用,已有2.24.0及以上插件运行逻辑不变。

自动验收:python3 tests/test_auction_web_reclaim_permission.py、node tests/test_auction_web_reclaim_ui.cjs,并回归原个人页、个人图片和Web接口;覆盖旧账号升级、默认关闭、授权全部作品、跨用户隔离、分页筛选、关闭权限期间的请求、账号切换与移动布局。手工验收见插件TEST_COMMANDS.md。

分级管理员与独立账号管理(Web 1.7.0 / 插件2.25.0文档)
账号类型和层级

网站账号分为管理员和普通用户。管理员中,原admin.json配置的账号为总管理员,始终保留全部权限,不能在网页中被停用、删除或降权;其密码仍按原admin命令维护。其余管理员存放在网站账号库中,按需分配管理功能,不绑定参拍成员身份。

普通用户的余额、个人作品、出价历史、图片和回收价查看选项保持原样。已有普通账号迁移后直属总管理员,原密码、启停状态、成员绑定及回收价许可全部保留。账号类型创建后不转换,现有普通用户不会自动升为管理员。

总管理员可管理全部下设账号,并可在创建时选择已启用的上级管理员。下级管理员获得相应账号管理权限后,可在本人名下继续创建账号、管理本人下属及其后代;不能管理本人、同级、上级或其他分支。现有账号不提供改上级入口。

授权不能超过操作者和目标上级已拥有权限的交集。 例如,上级只给了“录入余额”,下级即使有分配权限的资格,也不能给其他人开启“清空全部余额”。新管理员默认没有管理功能,新版本增加的权限也不会自动授予已有下级。

页面入口与操作
  1. 原管理员登录后进入左侧 账号与权限。原用户数据页改称 参拍成员,余额、排序、作品详情和快捷设置账号等原功能仍在。
  2. 账号中心列出账号类型、上级、绑定成员、功能数量和状态;可搜索登录名/成员,筛选管理员或普通用户、启用/停用/已删除。上级被停用时显示“上级已停用”。下方保留最近账号审计。
  3. 点击“创建管理员”或“创建用户账号”。管理员不需要sender_id;普通用户仍绑定一个真实成员。填写登录名和密码,可沿用随机密码生成、显示/隐藏和复制功能。总管理员可选择上级,下级创建的账号固定归本人管理。
  4. 管理员表单按模块列出全部46项权限。勾选操作会补齐所需的查看权限;取消查看权限会同时取消依赖它的操作。上级未授权的功能不可选择,具体勾选结果在保存前逐项列出。
  5. 点击“核对账号”检查对象、权限、启停和密码变更,再“确认保存”。用户须重新登录,当前账号与下属的旧会话失效;其他分支和总管理员会话不受影响。
  6. 点击列表“查看 / 管理”修改获准操作的项目。可只改权限,无需重设密码。未被授予的功能入口隐藏或只读,直接构造请求也会被服务器拒绝。无任何功能的管理员登录后看到等待授权提示。
  7. 删除账号先核对具体登录名及上级。删除会撤销登录资格,保留账号名与审计,不删除拍卖资料;普通成员绑定可由新账号重新绑定,旧登录名不复用。有未删除下属时拒绝删除,应先处理下属或先停用整个分支。
全部功能权限

以下为当前网站全部管理能力。搜索、排序和分页属于相应查看权限;创建功能包含初始必填资料,后续修改仍逐字段授权。涉及余额的结算/释放按原拍卖规则完成,不直接等同于手工余额修改。

模块 可独立开启的功能 必要查看/管理依赖
拍卖资料 查看活动、批次与稿位 无
拍卖资料 查看回收价格(含未公开) 查看活动、批次与稿位
拍卖资料 查看活动群绑定 查看活动、批次与稿位
成员与余额 查看成员资料、余额、持有作品与账目 无
出价 查看全部出价历史 查看活动、批次与稿位、查看成员资料、余额、持有作品与账目
稿位 查看已删除稿位 查看活动、批次与稿位、查看回收价格(含未公开)
审计 查看拍卖修改记录 查看活动、批次与稿位、查看回收价格(含未公开)、查看成员资料、余额、持有作品与账目、查看全部出价历史、查看活动群绑定
活动 创建活动(含初始名称及时间) 查看活动、批次与稿位
活动 修改活动名称 查看活动、批次与稿位
活动 修改活动开始时间 查看活动、批次与稿位
活动 修改活动结束时间 查看活动、批次与稿位
活动 开启活动 查看活动、批次与稿位
活动 关闭活动并取消相关安排 查看活动、批次与稿位
活动 删除活动 查看活动、批次与稿位
稿位 新增稿位(含初始资料、价格和例图) 查看活动、批次与稿位、查看回收价格(含未公开)
稿位 修改稿位名称 查看活动、批次与稿位
稿位 修改画师 查看活动、批次与稿位
稿位 修改起拍价 查看活动、批次与稿位
稿位 修改回收价 查看回收价格(含未公开)
稿位 修改回收价公开设置 查看回收价格(含未公开)
稿位 修改备注 查看活动、批次与稿位
稿位 更换例图或图片地址 查看活动、批次与稿位
稿位 调整稿位编号 查看活动、批次与稿位
稿位 删除稿位 查看活动、批次与稿位
稿位 恢复已删除稿位 查看已删除稿位
批次 重新编排批次(含暂停与取消旧定时) 查看活动、批次与稿位
批次 设置批次时间及退回筹备中 查看活动、批次与稿位
定时 设置或修改稿位结算时间 查看活动、批次与稿位
定时 取消稿位定时 查看活动、批次与稿位
竞拍状态 释放并恢复开拍(含退回未退成交款) 查看活动、批次与稿位、查看回收价格(含未公开)
竞拍状态 暂停竞拍 查看活动、批次与稿位
竞拍状态 截止并按规则结算扣款 查看活动、批次与稿位、查看回收价格(含未公开)
竞拍状态 回收稿位 查看活动、批次与稿位、查看回收价格(含未公开)
成员与余额 录入或覆盖余额及审核 查看成员资料、余额、持有作品与账目
成员与余额 清空全部余额与审核 查看成员资料、余额、持有作品与账目
出价 撤回指定及后续出价 查看全部出价历史
账号 查看下属账号与账号审计 无
账号 创建下属普通用户账号 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 创建下级管理员账号 查看下属账号与账号审计、分配下级管理员功能权限
账号 修改下属用户成员绑定 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 重设下属账号密码 查看下属账号与账号审计、查看成员资料、余额、持有作品与账目
账号 启用或停用下属账号 查看下属账号与账号审计
账号 删除无下属的账号 查看下属账号与账号审计
账号 分配下级管理员功能权限 查看下属账号与账号审计
账号 授予用户全部作品回收价权限 查看下属账号与账号审计、查看回收价格(含未公开)

依赖会递归补齐,并显示在核对清单中。例如,“撤回出价”需要查看出价和成员,“录入余额”需要查看成员余额,“设置结束时间”只需要拍卖资料查看,不会连带开启修改开始时间或删除活动。

“查看成员资料、余额、持有作品与账目”涵盖原参拍成员页的全部查询内容,包含余额、审核、当前目高/已成交统计、本人近期历史与账目。“查看全部出价历史”控制独立历史表和稿位详情的逐笔出价。未授权查看回收价时,目录和稿位详情不传回收价格;未授权查看成员时,不传目高人或上传者标识,但稿位价格与成交件数仍可正常统计。拍卖修改审计可能含价格和成员信息,其依赖会在表单中明确勾选。

权限范围为当前独立Web已有功能,不新增原先仅在QQ操作的群绑定修改、机器人管理员配置等入口,不改变QQ群管理员名单或机器人命令权限。

停用、收回与删除的影响
  • 停用一个管理员,其整个下属分支(含普通用户)均无法登录;原会话在下一次请求失效,页面清理资料。重新启用后须重新登录,旧会话不会复活;下属自身被停用的状态不自动恢复。
  • 收回管理员某项功能,所有后代相应功能同步收回;缺少必要依赖的操作也撤销。若收回“授予用户全部作品回收价权限”,该分支普通用户相应许可一并关闭。以后恢复上级权限不会自动重新授权下级,需逐个重新分配。
  • 删除仅接受没有未删除下属的账号,不级联清除整树,也不清除竞拍余额或作品。已删除账号不能再启用;通过“已删除”筛选仍可查审计,原账号名保留。
  • 账号类型与上级不可通过编辑接口变更,不能借改绑、重设密码、自授权限或篡改页面越过层级。重设用户密码/改绑本身属于独立管理权限,并包含所需的成员资料查看依赖。
  • 管理修改使用账号版本校验,过期草稿要求刷新重新核对。管理写入与撤权按顺序执行,已撤权的旧会话和旧操作预览不能继续提交;读取过程中撤权也不返回旧资料。
配置示例

余额管理员:勾选“录入或覆盖余额及审核”,自动补齐“查看成员资料、余额、持有作品与账目”。不勾选“清空全部余额与审核”,该账号即可录入/修改余额,但不能一键清空。

活动时间管理员:勾选“修改活动结束时间”“设置批次时间及退回筹备中”“设置或修改稿位结算时间”“取消稿位定时”,自动补齐“查看活动、批次与稿位”。账号可调整上述时间,活动名称、开始时间、价格及余额不可修改,也不能查看未公开回收金额或成员身份。

可带下级的管理员:在所需业务功能之外勾选“创建下级管理员账号”“分配下级管理员功能权限”,并按需勾选启停、删除、密码等账号操作。下级最多获得操作者已有功能,不能越权授予,也不能管理其他分支。

升级、备份与验证

更新独立Web目录并重启,python -m auction_web --version应为auction_web 1.8.0。保留原启动参数、数据库、图片和整个state-dir。升级前停止Web并备份账号目录,尤其是accounts.db与admin.json;若存在SQLite的wal/shm文件,应一同保留或使用前文在线backup命令生成完整账号库备份。

首次启动自动迁移网站账号库,保留旧账号ID、密码散列、绑定、回收价许可、启停、时间与审计;不迁移或修改拍卖业务库。原管理员凭据直接作为总管理员使用。升级不要求重新建立普通账号,不影响QQ权限及余额规则。配套插件2.25.0同步全部文档和版本,运行逻辑保持;原2.24.0及以上插件可继续配合网站使用。

回退至旧Web前应恢复升级前账号库备份,避免旧版本不了解管理员类型与删除状态。不要只将旧程序覆盖到新账号库上。

自动验收:tests/test_auction_web_admin_ui.cjs覆盖权限依赖、预览、删除和退出清理;tests/test_auction_web_admin_permissions.py逐接口/字段验证46项权限、授权正例、拒绝越权、层级收权、停用删除、旧库迁移、读取及预览期间撤权;并回归原Web管理、普通用户、个人图片与回收价授权。手机/桌面手工检查步骤见插件TEST_COMMANDS.md。

明确定时对象与价格边界(v2.20.19)

/设置定时 1#10-2 12:50#截止 若命中了已结束稿位,会回复具体活动、序号、名称及状态,例如:“活动「一周年庆」的 1号稿位「枠枠单人插图」当前已截止,不能设置定时。”已回收时明确显示已回收;成功、时间已过期及格式错误也注明同一目标。使用群绑定的活动范围,不按全局编号匹配其他活动。

  • 出价必须大于等于起拍价,同时严格高于当前目高。起拍价100且暂无出价时,100与100.01均可进入其余资格/余额校验;99.99失败。
  • 回收价800时,799可以正常竞价,但若最终仍低于800,截止时回收、不扣余额;800及以上可以成交。未设置回收价或填0时,有有效最高出价即可成交。
  • 手动 /截止稿位、稿位定时截止和活动结束使用同一成交判定;无人有效出价统一回收。显式 /回收稿位 仍为手动立即回收;“定时回收”现在与截止共用按价结算规则。
  • 回收价默认不公开,可在独立网站逐稿位设置公开。修改金额或公开开关不发送QQ群公告;之后的查询、批次、上新和出价消息遵循该稿位的公开选项,管理员网页始终显示实际金额。只有截止不成交时说明“最高出价低于回收价,无法成交,已回收”,不透露底价金额。多群向全部前台同步原因,仅在出价来源群提醒当前最高出价者。
  • 已经截止的历史成交及既有扣款不重算、不补扣、不自动退款。底价调整作用于之后的截止。管理员自发的含金额命令仍是群消息,底价建议在后台群或管理员网站录入。

统一定时结算与提醒(v2.23.0)

定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。

网页设置时向前台公告,超过30分钟的定时另在30分钟节点预告;不足30分钟合并为一条。升级会补齐仍有效定时的5分钟任务。完整旧版本行为保留在CHANGELOG历史记录中。

北京时间与插件停止(v2.22.2)

活动时间、批次上新时间、稿位定时、释放/网页恢复开拍的审查统一使用北京时间(UTC+8)。不依赖独立网站或Docker的本地时区;现有数据库时间字符串保留。网站顶部显示北京时间,未到点批次的错误提示列出用于判断的当前时间。北京时间15:05时,15:00批次允许补齐上新并释放;15:06批次仍须等待。

如果只在独立网站恢复失败,必须更新 cym_auction_web.zip 至Web 1.1.1并重启网站。配套插件为2.22.2,更新插件不会自动替换独立Web。网站仍由管理员确认具体稿位及账务影响,原出价和目高保留,已成交稿位只退未退款。

退出顺序修复为停止接收新命令、取消后台任务、限时保存昵称、关闭数据库。单群主动发送最长等30秒;后台任务停止最长等5秒;昵称收尾最长等2秒,已存昵称保留,未存部分在成员下次发言时更新。若外部任务不响应取消,明确提示重启并保留数据库连接,不假报退出成功。数据库关闭最长等待15秒。后台日志依次出现“拍卖插件正在停止后台任务”“拍卖后台任务已停止,正在保存昵称并关闭数据库”“拍卖插件已停止”。

正常停用不删除稿位、余额、出价或待执行任务。重载后恢复有效定时;网络发送已被平台接收但未返回时,重新投递仍可能重复消息。旧进程卡住时,需要先保留数据、替换程序,再从容器或系统服务重启;不要把插件数据删除当成恢复手段。

返回文档入口

历史测试清单原文(v2.26.0)

历史原文,完整保留。以下为标题所示版本当时的说明,不代表当前可执行命令。身份查询命令已移除,管理员改用成员选择;现版本所有图床图片均使用缩略尺寸,分批支持指定活动。实际操作请看当前完整指南与当前测试命令。

cym_auction 测试命令(v2.26.0)

覆盖51个主命令、帮助别名及常用自然口令。请在专用测试群执行,日期替换为实际测试日期,定时必须设在将来。下文的 @A、@B、@管理员 必须使用QQ的@功能选中成员,不能只输入昵称。

1. 帮助和成员设置

/功能
/帮助
/help

预期:三条显示相同的精简帮助,包含全部命令及必要参数;不出现程序原理、日志排查、图床实现、账号标识说明或余额比例计算方式。网页使用说明保留完整参数、操作示例和配置指引。

先让成员发送 /help 或单独 @机器人,再在网页“拍卖插件设置”点击重新读取,应能按昵称或参拍编号勾选成员作为管理员。保存后重新读取,选择应保持;原先存在但暂未显示昵称的管理员仍被勾选,不应因保存图片设置而失去权限。同名成员显示不同参拍编号。

/添加管理 @管理员
/管理列表
/删除管理 @管理员

由已有管理员添加测试管理员,再验证名单和移除。不要移除唯一可用的管理员。普通成员执行管理命令应只收到权限不足及 /添加管理 @成员 授权提示。

群内单独 @机器人,预期:

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额

@机器人后带命令时只执行命令,不重复弹快捷帮助。

2. 活动

/创建活动 测试拍卖#2026-10-01 00:00#2026-10-30 22:00
/活动列表
/修改活动 测试拍卖#结束时间#2026-10-31 22:00
/开启活动 测试拍卖

预期:活动信息和修改时间正确;未授权成员不能创建或修改。

3. 稿位、备注与批次

每条添加命令附1张图片,准备至少一张长竖图和一张横图。

/添加稿位 测试稿位1#画师甲#100#800
/添加稿位 测试稿位2#画师乙#200
/添加稿位 测试稿位3#画师丙#300#1200
/添加稿位 测试稿位4#画师丁#100
/稿位列表
/修改稿位 1#名称#测试稿位一
/设置备注 1#可加购背景,工期两周
/查看稿位 1
查询1号稿位
/稿位分批 2
/设置批次时间 1#2026-10-02 10:00
/设置批次时间 2#2026-10-02 11:00
/设置全场批次图
/查询批次
/查询批次 1
查询批次1
/查询批次目高 1
查询批次1目高
/查询目高
查询目高

也可使用 /稿位分批 测试拍卖#2 明确指定活动。另建一个测试活动后,分别验证默认分批作用于本群绑定活动(单群为最新活动),指定名称只改变目标活动的批次,回复显示正确活动名;其他活动不变,群绑定不变。未知活动、空活动名、0、负数、小数、额外参数和普通成员操作均不得改变批次。重新分批后在对应活动的绑定群重新安排上新。

设置全场批次图时附1张图片作为参考存储;查询目高不再使用该图。批次时间换成几分钟后的时间,等待上新后再测试成功出价;上新前出价应失败。

预期:稿位按添加顺序编号,回收价默认在QQ显示“不透露”;在网站切换公开后显示金额,后台始终保存真实金额。查看稿位不显示上传者、创建时间;已设置定时才显示截止时间(北京时间),未设置不显示。备注出现在单稿位、批次及上新消息中。上新提醒包含该批次全部稿位的名称、序号、画师、价格和图片。

启用S.EE图文后,查询批次和批次目高应在同一条消息里包含全部例图。每张图片独立成段,不与前后文字或相邻图片同一行;所有图片最长边默认240像素,单图详情、出价成功、全场批次图及操作预览同样生效。设置页“图片最长边”改为160后重新查询,单图和多图均应缩至160;恢复240后再测。0、721或小数应拒绝保存。测试长名称、多行备注和无出价/有出价两种情况,并比较横图、竖图与小于240像素的图片:等比缩小、不裁剪、不放大小图,图片前后仍独立成段,不额外增加消息。未配置图床或图床失败回退的原生图片,实际显示由QQ客户端决定。

/设置备注 1#清空
/设置备注 1#最终备注
/修改稿位 2#起拍价#250
/修改稿位 2#回收价#900
/修改稿位 2#画师#画师乙新名
/修改稿位 2#图

最后一条附新图片。重新查询确认对应字段更新。

4. 余额、审核与出价

管理员先完成余额和年龄审核;多群模式下在后台群执行。

/录入余额 @A#10000
/查询余额 @A
@A录入余额1000000
查询@A余额
/录入余额 @A#1000
/录入余额 @B#10000
/余额列表

预期:两种录入及查询写法操作同一个成员,重新录入覆盖原金额;大金额使用纯数字显示。普通成员不能查询他人金额或查看名单。余额列表每行必须有文字昵称或稳定参拍编号,不触发@;录入确认与余额查询也只显示昵称。检查两名同昵称成员、没有昵称的新成员和旧余额记录;重复查询及重载后编号应稳定。给成员设置显示名后,重新查询应使用新名字,原余额不变;普通成员及多群模式前台群不能查看列表。

A和B各自执行:

/查看我的余额
查看我的余额

只显示审核情况,不显示金额。未审核成员应收到联系群主的提示。

第一批上新后,由A、B交替执行:

给1号出价 500
/出价 1 700
给1号出价 700
给1号出价 1000
给2号出价 500

预期:高于当前目高且大于等于起拍价且满足审核、余额条件时成功;同价或低价失败。让A同时持有1号1000和2号500的目高,A余额1000时最后一笔应失败,因为总额1500的70%为1050。失败提示仅为“出价失败!余额不足。”(仍可包含对出价者的提及),不展示70%、合计计算、当前余额或额外金额明细;分别验证“给1号出价 金额”与“/出价 1 金额”两种入口。

出价成功应显示价格、历史、对应例图和备注,文字与图片分段;被超价者另收到 @提醒。再测试未审核、未上新、已截止及已回收稿位的失败提示。

5. 我的稿位与上传记录

/我的稿位
我的稿位
/我上传的稿位
我上传的稿位

预期:我的稿位纯文字分为“已截止”和“未截止目高稿位”,每项显示序号、名称、金额及备注;无记录的组显示“暂无”。我上传的稿位显示本人上传记录和例图。两种写法结果一致。

6. 撤回、定时、成交与回收

将金额替换成实际存在的A的一笔报价。

/撤回出价 1#@A#1000
/设置定时 1#2026-10-02 20:00#截止
/设置定时 2#2026-10-02 20:00#回收
/取消定时 2

预期:撤回该笔及其后的出价,重新计算目高,并提醒参与成员。定时统一按价结算:有有效目高且达到回收价则截止成交,未达到或无人出价则回收;未设回收价时有有效目高即可成交。提前30分钟和5分钟提醒,并@当前最高出价者;最后5分钟内每次有效加价,当前结算时间再延长5分钟,并逐次提示新时间。

快速测试可将截止设为5分钟后:有效出价一次,截止时间延长5分钟;进入新的最后5分钟再次有效出价,再延长5分钟。每次均另发一条纯文字提醒,包含序号、名称及新截止时间,自己再次加价也需提醒。失败出价不延期;旧参数定时回收与截止共用同一结算及延期规则。

/截止稿位 1
/回收稿位 2
/我的稿位
/查询批次目高 1

预期:有效最高出价达到回收价(或未设回收价)才成交,获拍者余额按成交价全额扣除并收到成交提醒,重复截止不重复扣款;已截止的本人获拍稿位出现在“已截止”组。回收稿位不再允许出价,并从本人的未截止目高列表移除。无人出价的稿位截止时不发送空 @。

7. 删除、恢复与补空号

使用尚无出价的3号、4号,先核对序号。

/删除稿位 99
/稿位列表
/删除稿位 3

不存在的99号只报错,其他稿位不变。3号只显示预览,按回复中的 /删除稿位 确认 确认码 在5分钟内确认;普通成员不能确认,有出价或已截止的稿位不能删除。

/已删除稿位
/撤销删除 3
/删除稿位 3
/已删除稿位
/撤销删除 记录=123

再次删除时仍需确认。123替换为实际恢复记录号;恢复原序号、名称、备注和图片,但定时需重新设置。被占用的序号不得覆盖。

再确认删除3号后执行:

/替换稿位 4#3
/添加稿位 替换后新稿位#画师戊#100
/添加稿位 序号=69#指定序号稿位#画师己#100#800
/稿位列表

两次添加均附图片。预期原4号移至空缺3号,普通添加使用释放的4号,指定添加使用69号;重复指定69号应拒绝。

8. 多群协同与昵称

先在测试活动的前台A、前台B、后台H分别发送前三条命令:

/设置群 前台#测试拍卖#A群
/设置群 前台#测试拍卖#B群
/设置群 后台#测试拍卖#管理群
/群设置
/设置显示名 @A#小明
/设置显示名 @B#小红
/通知状态
/重试通知 12

12替换为实际失败通知编号,没有失败通知时应提示不能重试。后台可录入余额,前台不能管理余额。

在A、B群交替竞价同一已上新稿位:两群均收到公共图文,只有前一次出价来源群额外 @被超价者,后台没有公共广播。本人加价不提醒自己;公开目高和历史只显示昵称。上新、截止、回收及提前提醒同步前台。

/设置显示名 @A#清空
/取消群设置

清空显示名后恢复自动昵称;取消只解除当前群绑定。另测设置页成员选择:同名成员不能选错,修改余额不会影响另一成员。

9. 待核对余额

仅在存在待核对记录的测试数据上执行;3替换为实际记录号。

/余额列表
/查询余额 @A
/修复余额 3#@A#5000
/查询余额 @A

预期最终余额为5000,不追加旧金额,重复修复被拒绝。网页选择成员后填写最终余额,效果相同;未选成员、空金额、负数应拒绝。页面中不要求输入账号标识。没有待核对记录时跳过修复。

10. 错误提示与清理

/添加管理
/删除管理
/录入余额
/录入余额 @A#错误
/查询余额
/设置显示名
/撤回出价
/修复余额
给1号出价 错误
查询批次错误

预期:提示简短的失败原因与正确示例,成员参数统一为 @成员,不出现程序原理或账号标识说明。

以下仅用于清理专用测试数据。清空余额影响所有活动,不要在正式拍卖时执行:

/关闭活动 测试拍卖
/删除活动 测试拍卖
/清空余额

后台完整资料保留(v2.20.9)

在“拍卖插件设置”和“功能与测试指南”分别点击完整操作指南、测试命令、更新日志及两份历史原文入口,确认均能在当前页展开阅读全文,目录可跳转到各节,返回文档入口仍可操作。两页均包含51个命令的完整参数、权限、说明、示例及15个配置项。

更新日志应含v2.4.0至v2.20.4原有全部版本及v2.20.5至v2.20.9后续记录,历史操作与测试清单有明确版本提示,已移除命令仅保留在历史说明。当前操作指南中的按活动分批、余额名单昵称、全局余额、统一小图等说明应与当前版本一致。

后台保留全部设置、群绑定、显示名、旧余额修复、通知状态和保存规则;阅读文档不修改数据。刷新页面或设置接口加载失败后,静态说明仍可阅读;窄屏可正常阅读段落与横向滚动表格。QQ /help、/功能、/帮助 继续返回精简口令,不输出后台原理或历史日志。

精简前的完整测试原文和操作指南原文永久保留供逐项核对;其中旧命令和旧期望以本清单及更新日志的后续变更为准。

按活动设置批次时间与昵称补全(v2.20.10)

准备活动A、活动B各至少1个批次。在绑定活动A的后台群依次发送,日期换成未来时间:

/设置批次时间 活动B#1#2026-10-03 15:00
/设置批次时间 1#2026-10-03 16:00
/设置批次时间 活动B#1#2026-10-03 17:00

预期:第一条仅设置B的批次1;第二条使用本群绑定A;第三条仅替换B的同批次任务,A定时不变。回复包含活动名,群绑定不变;上新通知仅发往对应活动前台群。单群省略活动名时使用最新未删除活动,上新提醒发往设置命令所在会话。

未知或空活动名、不存在批次、0/负数/小数批次、空时间、过去时间、额外参数和普通成员请求均不得修改定时或稿位状态。示例:/设置批次时间 活动B#0#2026-10-03 15:00、/设置批次时间 #1#2026-10-03 15:00。在绑定对应活动的群用 查询批次1 核对时间。

昵称显示顺序为管理员指定名、平台昵称、稳定参拍编号。让仅显示编号的成员发 /help 后重新查询余额列表;平台提供昵称时自动补全,原余额和年龄审核不变。如果仍无昵称,用 /设置显示名 @A#测试称呼 或后台显示名编辑,查询、目高及后续公开历史应显示新称呼。发送无昵称消息不能清空已知名字,自动昵称不能覆盖管理员指定名;用 /设置显示名 @A#清空 恢复自动昵称。

确认真实@资料含目标昵称时,两种 /录入余额 @A#10000、@A录入余额10000 都保存A的昵称,不得用管理员或其他被@者的昵称。无任何昵称资料时仍使用稳定编号,同名成员保持区分;重载插件后名称保留,已发送和已准备的旧通知不追溯修改。

普通群消息更新昵称与重点提醒(v2.20.11)

  1. 在机器人能收到消息的测试群,让A发送普通聊天“大家好”,不加任何口令。刷新后台成员列表,应记录A当前群名片或平台昵称,聊天本身没有拍卖回复。未绑定活动的群、无拍卖权限的普通成员也应能登记;不产生余额审核或管理授权。
  2. 修改A群名片,再发一条聊天或其他插件命令。后台、稿位目高及后续历史查询显示新名字,余额和拍卖归属不变。重复发相同昵称消息后参拍编号不改变;重载插件后保留新名字。
  3. 让B使用与A相同的群名片,确认两人以不同参拍编号区分,不合并余额。A在另一群使用不同名片发消息后,各处统一使用最近收到的有效名字。给A设置管理员显示名后自动采集仍更新,但展示指定名;清空指定名恢复最新自动昵称。
  4. 检查无昵称消息保留原名;机器人自身、明确的其他机器人及私聊不进入普通群昵称采集。消息可达但平台始终没有提供昵称时使用稳定编号,可在后台手动补名。
  5. A与B交替出价:成功图文、历史和目高只显示昵称;另发真实@前一最高出价者的超价提醒。自己加价不提醒自己。
  6. 管理员执行下列命令,回复显示昵称,不应向被查询成员触发@。输入的@仍使用QQ选人功能:
/录入余额 @A#10000
/查询余额 @A
查询@A余额
/余额列表
/管理列表
查询1号稿位
查询批次1目高
  1. 依次测试撤回、成交和回收:受影响成员收到真实@;撤回通知的当前目高说明只显示昵称,不重复@同一目高者。多群时公共动态在各前台显示昵称,个人提醒仅在出价来源群发送;无关前台群不@,后台不接收公共广播。
  2. OneBot检查真实At提及,QQ官方检查真实成员提醒且不显示原始成员标签。出价失败和管理员权限增删继续保留相关成员的个人提醒。批次与例图仍按当前小图方式显示。

4.26.7 多群 Markdown 验收(v2.20.12)

沿用前文的测试活动,准备三个前台群 A/B/C、一个后台群 H;都使用同一个 QQ 官方机器人,S.EE 配置有效。准备已上新的带图稿位1,给两个测试成员完成审核与余额录入。不要在正式拍卖中制造测试出价。

  1. 在 A 群由成员甲发送 给1号出价 1000,B 群由成员乙发送 给1号出价 1200(金额需满足起拍价、目高和余额要求)。A/B/C 均应收到文字与图片合一的公告;不显示 ![稿位图片 …](链接) 原文。只有 A 群额外收到真实@甲的超价提醒,H 群不接收前台公告。
  2. 分别在 A、B 群发送 查询1号稿位 和 查询批次1目高,与同步公告比较:图片都使用保存的缩略尺寸,前后文字分段,无裸图片链接。
  3. 对另一个尚未上新的测试批次,用 /设置批次时间 测试活动#2#2026-10-03 15:00 设置未来时间(活动名、批次号和时间替换为真实测试值)。到时 A/B/C 每群只收到一条包含该批次全部稿位的图文上新公告,图片与稿位顺序一致,H 群不收到。
  4. 在后台对测试稿位设置定时截止/回收,检查设置公告不@、30/5分钟预告@当前最高出价者,到点成交或回收结果仍按原规则@;不能出现 <qqbot-at-user …> 标签原文。平台拒绝发送时应记录失败,不应换成原始图片语法补发;纯文字个人提醒按设置的方案发送,默认方案1;见末尾提及对照验收。
  5. 如有发送失败,在后台 /通知状态 查看编号,排除平台问题后用 /重试通知 编号。只补发该通知未完成的部分,已成功的公告和其他群不重复发送,出价不重新执行。
  6. 升级前如有已缓存的待发图文,升级后仍应正确按 Markdown 投递;重启后沿用投递游标。之前已标记发送成功的裸链接消息不会自动重发,可重新查询查看当前图文。

本地自动回归另外检查 QQ SDK 的实际参数:图文群消息为 msg_type=2、内容放在 markdown.content、无普通文本 content;纯文字个人提醒默认方案1为 msg_type=0 和 content,方案3为Markdown,机器人及群路由准确;拒绝、空响应、部分失败和重启均不错误推进发送进度。测试不连接真实 QQ 或 S.EE。

纯文字 @ 提醒验收(当前版本)

确认安装并重载 2.20.17。使用专用测试活动、已上新的测试稿位及已完成审核的成员甲乙,金额按实际起拍价和余额调整。

  1. 甲先发送 给1号出价 1000,乙再发送 给1号出价 1200。应额外发出一条真实@甲的超价提醒,不显示 <qqbot-at-user …> 标签原文;成功出价的公共公告继续显示昵称。
  2. 先在同群完成步骤1,再在绑定同活动的两个前台群分别出价。跨群时个人提醒只发甲原来的出价群;没有该出价的前台群只收公共公告,后台群不收前台同步。
  3. 查看后台 [拍卖QQ发送] 日志:默认方案1的主动纯文字个人提醒应为 模式=文本交互,个人提及=是。带图公告仍为 模式=Markdown图文,图片仍正常显示、小图独立成段。单群直接命令回复走事件接口,不一定出现主动发送日志。
  4. 对测试稿位检查截止成交、回收结果和撤回出价,仍应按需要@对应成员;提前30/5分钟预告@当前最高出价者。成员自我加价不产生“被超越”提醒,余额列表、历史出价及查询目高不额外@。
  5. 如升级前有失败的纯文字个人提醒,用 /通知状态 找到失败编号、/重试通知 编号 补发:旧纯文字缓存按所选方案发送,只补未完成的提醒。已经成功的公告不重发,已有图片缓存仍按Markdown发送。

请记录QQ客户端的实际显示结果。自动测试能核对请求类型、标签及成员身份完整性,不能代替真实客户端的提及渲染验收。

提及方案对照与配置验收(v2.20.14)

  1. 管理员在故障群使用QQ真实@选择一名在群成员,发送 /测试提及 @成员。应按顺序出现标有方案1、2、3的提醒,最后显示测试结束;只发当前群,未绑定活动也能测试。测试不会改变余额、出价、群绑定或提及设置。
  2. 让被@者比较每条是否显示可点击的成员名称并形成实际提及,不能仅凭发送日志判断。方案1为兼容文本,2为标准标签文本,3为标准标签Markdown。一条被平台拒绝后仍会继续其他方案,提示失败的编号。
  3. 在Pages“拍卖插件设置 → QQ个人提醒”选择实际有效的方案,保存并重新读取,应保持所选值;原管理员、Token、图片尺寸不丢失。标准插件配置中同样应存在 qq_mention_mode。没有该配置的旧安装默认方案1;非法值拒绝保存。
  4. 用两名成员进行一次有效超价和一次无效出价,对照直接回复与来源群提醒是否均按所选方案显示;继续验证成交、回收结果和撤回仍保留@,提前30/5分钟预告@当前最高出价者。不同群各测一次,提醒不能发错群或错人,后台不接收业务广播。
  5. 普通成员执行测试命令应提示权限不足且不发送测试消息;缺参数、多个被@成员、@所有人、非QQ官方群都应拒绝并给出提示。使用真实At组件、QQ原始提及文本两种输入时均保持同一成员身份。
  6. 切换方案后,新发送和旧待重试纯文字通知采用所选格式,已发消息不自动重发。图片公告、批次查询继续小图、独立段落、整批一条;OneBot继续原生At。
  7. 本地回归覆盖三个SDK请求形态、直接回复与主动通知、图片保护、重启缓存、失败游标、权限和设置保存。无真实QQ网络调用;如果三种方案均显示原文,记录每种方案结果供进一步定位,不能认定接口成功就是提及成功。

成交扣款与活动恢复验收(v2.20.15)

请使用专用测试活动和测试余额。多群时在后台录入/查询/恢复余额,在对应前台出价。先准备“退款测试A”“退款测试B”两个活动,各至少两个已上新稿位,起拍价100;以下金额足够通过70%门槛。

/录入余额 @A#5000
/查询余额 @A
  1. 在退款测试A中让A对1号出价1000,管理员截止,查询A余额应为4000;重复截止仍为4000。该稿位不能再次撤回出价。回收另一稿位不应扣款;无人出价的稿位截止不应扣款。
  2. 在退款测试B中让A以800成交,余额应为3200。分别验证一次定时截止和活动到期成交,均只扣一次;低于回收价的活动到期稿位被回收且不扣款。手动关闭活动只暂停,不扣款。
/恢复余额 退款测试A
/查询余额 @A
/恢复余额 退款测试A
/查询余额 @A
  1. 第一次恢复后A余额应为4200,回复1笔、1人、1000;第二次提示没有未恢复扣款,余额仍4200。B的800不恢复;A的成交状态和获拍者不改变。重载后再次恢复也不应重复加款。
  2. 同一活动多名获拍者、多稿位成交,应逐人恢复全部未恢复扣款;一个活动先恢复后又产生新成交,再次恢复只加回新增扣款。活动关闭或删除后仍可按原名称恢复。
  3. 页面对照:进入“拍卖插件设置 → 按活动恢复成交扣款”,核对各活动待恢复/已恢复金额和笔数。点击目标活动“恢复本活动扣款”,只恢复该活动;刷新后显示已恢复,QQ群命令再次执行不重复加款。
  4. 普通成员执行、前台管理员执行、缺少活动名和不存在的活动,都必须拒绝且余额不变。后台管理员明确填写其他活动名时允许恢复,不改变后台群绑定。
  5. 负余额边界:录入测试成员B余额700,让其以1000成交,余额应为-300。普通出价失败只提示余额不足,不显示-300;按活动恢复1000后余额回到700。0.3余额扣0.1应为0.2,恢复后为0.3,无科学计数法。
  6. 重录余额:成交扣1000后管理员重新录入2000,再恢复该活动1000,结果应为3000;不覆盖回旧余额。清空余额后恢复扣款以0为基础,但成员仍未审核;其他尚未成交的已有出价继续成交时从0扣款,也不能自动恢复审核。
  7. 升级前已截止、没有成交扣款记录的稿位,安装后不补扣,恢复时不产生金额。恢复与扣款均不得改变其他活动的记录。收到消息重复、通知补发也不应重复加减余额。
  8. 本地自动测试还覆盖扣款记录写入失败与多笔退款中途失败,检查余额、稿位状态和退款标记整体回滚;并发截止/恢复及重启后仍保持每笔一次。

即时提醒与独立延期提醒验收(v2.20.17)

  1. 对有效活动的未截止稿位,分别设置截止/回收为1秒后、10分钟后、29分59秒后、正好30分钟后;应在设置命令之后立即看到预告,不等到后台轮询。时间必须在将来,人工测试建议用10分钟;30分1秒后则等待至进入30分钟窗口才提醒,稍晚执行仍应发送。
  2. 重复扫描、重载、在设置后等待数秒,同一次已发送的提醒不应再发。改设时间、改设类型或取消后,旧任务不得补发。设置过去时间/当前时间应拒绝并给出正确原因。模拟平台发送失败,提醒任务保留待重试;成功后不再重复。
  3. 定时回收前先让A成为最高出价者,再设置10分钟后回收;预告应包含序号、名称、准确时间和回收文案,并@A。多群时公共预告发往全部前台,对A的个人提醒仅发出价来源群,后台仅操作确认。
  4. 对定时截止稿位,在最后5分钟用 /出价 1 1000 与 给1号出价 1100 交替测试;每次进入新的最后5分钟后继续加价,至少连续5轮。每轮都应有出价图文,以及独立的“触发5分钟延时”文字消息,写明对应稿位和最新截止时间。自我加价也提醒,失败出价和距离截止超过5分钟的出价不提醒。
  5. 多群两个前台均应收到每轮延期文字,后台不收到。若一群出价图文已送达、延期文字失败,重试只补延期文字,不再次修改截止时间或重复发送已成功图文。
  6. 活动到期分别测试无人出价、有出价低于回收价、等于回收价、高于回收价、未设置回收价五种情况,预期依次为回收、回收、成交、成交、成交。只设置活动结束时间时,不应误以为系统已建立每个稿位的半小时预告或5分钟延期。
  7. 定时回收与截止共用结算规则,到点达到回收价成交,否则回收。活动总结束仍等待已经触发延期的定时截止稿位。
  8. 余额不足仍只显示“出价失败!余额不足。”,不显示比例、计算方式或具体余额。

独立 Web 验收(v2.20.18)

  1. 更新插件ZIP并重载,按独立包说明设置网站管理员,指向同一个 auction.db;未登录访问 /api/snapshot、稿位详情和本地图片必须返回401。
  2. 登录后切换活动,查询同一序号在不同活动中的稿位;编辑某一期的备注和画师,仅该稿位更新,其他活动与共用画师的稿位不变。
  3. 网页修改稿位备注后,在QQ发送 查询1号稿位(按群绑定活动和实际序号调整),确认显示新备注;QQ出价后2秒左右网页看到目高更新。
  4. 开两个网页编辑同一稿位,先保存一个,另一个保存应提示冲突并保留草稿;稿位有新出价时旧表单同样不能覆盖。
  5. 上传PNG/JPG,验证例图更新;无效文件/超过5MB拒绝。既有本地图路径需位于配置的图片根目录。
  6. 在活动管理调整未结束活动的未来结束时间,确认原任务取消、新任务生效、群来源保留;重复名称和无效时间不能留下半笔任务。
  7. 检查修改记录有操作账号、时间和修改字段;资料编辑不改变出价历史和成员余额。
  8. 停止机器人但保留网站进程,仍可查看和改备注;此时QQ通知及自动成交不会运行。重启机器人后查询读取最新资料。
  9. 手机上筛选、编辑、退出登录可操作;网络断开显示旧数据提示,不虚报已同步。正式外网部署用HTTPS和实际域名。

价格边界与定时目标验收(v2.20.19)

使用专用测试活动“价格验收”,录入充足余额并审核年龄;稿位1至7都设起拍价100、回收价800,附例图,保证活动已开启、稿位已上新。以下为分开测试,时间替换成未来时间。每次最后5分钟内有效出价会延时,验收定时结果时等待最新截止时间。

操作 预期
给1号出价 99 / /出价 1 99.99 均失败,提示不能低于起拍价100,无有效出价记录
给1号出价 100 暂无出价且审核/余额足够时成功;其他人再出100因等于当前目高失败
给1号出价 100.01 审核/余额足够时成功,即使低于回收价也不提前判失败
查询1号稿位 / /稿位列表 / 查询批次1 / 查询批次1目高 回收价显示不透露,不输出800作为回收价
给1号出价 799,然后 /截止稿位 1 已回收,提示最高出价低于回收价,无法成交;余额不变,无恭喜成交
给2号出价 800,然后 /截止稿位 2 等于底价可成交,扣800且只扣一次
给3号出价 800.01,然后 /截止稿位 3 成交,扣800.01,重复截止不重复扣款
/设置定时 3#10-2 12:50#截止 指明活动“价格验收”、3号、稿位名称、当前已截止,不能设置定时
/设置定时 1#10-2 12:50#截止 指明同活动1号及名称、当前已回收,不能设置定时
对4号出价799.99,对5号出价800,分别设置未来定时截止 4号回收不扣,5号成交扣款;两者最终通知与手动相同
对6号出价799.99,对7号出价800,设置活动在未来结束 到期6号回收不扣,7号成交扣款
另建稿位回收价0,出价高于起拍价,再截止 无额外成交底价,正常成交
未出价稿位直接截止;高价稿位明确手动/定时回收 均回收,不扣款

多群时在前台A出价,在后台手动截止:前台A/B均收到成交或回收结果;底价不通过只解释低于回收价,后台不收广播,当前最高出价者只在其来源群被提醒。管理员网站仍能读取和编辑真实回收价。已有历史成交与扣款不因更新而改动。

指定活动的定时与结束命令(v2.20.20)

准备两个活动“一周年庆”“秋拍”,各有1—6号未截止稿位;后台群绑定“秋拍”,每个活动各绑定一个前台群。以下时间仅为示例,请换为将来时间。

/设置定时 一周年庆#1#2099-10-03 20:00#截止
/设置定时 一周年庆#2#2099-10-03 20:00#回收
/取消定时 一周年庆#1
/取消定时 一周年庆#1
/截止稿位 一周年庆#3
/回收稿位 一周年庆#4
/撤回出价 一周年庆#5#@成员#1000
/设置批次时间 一周年庆#1#2099-10-03 19:00

预期:每条操作说明目标活动;涉及稿位时同时显示序号、稿位名。一周年庆的5号须先由该成员有效出价1000,撤回后该笔及后续出价作废。第二次取消1号回复该活动稿位没有定时任务。秋拍同号稿位和批次均不改变。3号如有效最高出价达到回收价则成交且只扣一次,否则回收;4号直接回收且不扣款。

继续测试:

  1. 省略活动名:发送 /设置定时 1#2099-10-04 20:00#截止、/取消定时 1,回复应为后台绑定的“秋拍”。关闭多群协同后,旧写法使用最新未删除活动;旧空格写法 /设置定时 1 2099-10-04 20:00 截止 仍可使用。
  2. 把活动名改为“不存在”,或留空为 /设置定时 #1#2099-10-04 20:00#截止;稿位99不存在时也应拒绝,不能操作秋拍1号或任何其他稿位。空字段、多余字段、无效时间、无效截止类型均不改动原定时。
  3. 对一周年庆已截止或已回收的稿位设置定时、再次截止或回收,回复须带该活动、序号、名称、当前状态。活动名含空格或为纯数字也可使用 # 前缀精确定位。
  4. 把一周年庆的定时设为10分钟后,应立即在一周年庆前台群看到带活动名的预告,秋拍前台与后台均不接收该公共提醒。到期结果、每次延期及撤回通知也须带目标活动;后台只收到操作回复。
  5. 在秋拍前台以管理员身份截止一周年庆稿位,该群仍收到明确的一周年庆操作回执,成交/回收公告仅同步一周年庆前台;本群活动绑定始终为秋拍。没有前台群的活动应提示未生成同步通知,操作结果仍保存。
  6. 普通成员执行上述管理命令应被拒绝;重复截止不重复扣款,活动间的同号稿位互不影响。查看 /功能、/help 及两个网页入口,均应包含新写法;网页历史说明与更新记录仍保留。

独立 Web 图床直连验收(Web 1.0.2 / 插件 v2.20.21)

  1. 保留原数据库、图片及网站凭据,更新独立站程序并重启。网页登录权限和所有编辑功能应照常使用。
  2. 选择机器人已上传到 s.ee 的本地例图稿位;确保网站可以读取数据库同级 image_host/see_cache.json。列表、详情图片应请求对应的 HTTPS 图床域名,原“例图地址”仍保留本地路径。
  3. 暂时在浏览器开发者工具中阻止该图床图片URL,应自动回退 /api/artworks/稿位ID/image 并显示缩略图;两者都失败时显示“例图不可用”,不能不断重新请求失败链接。
  4. 选择尚未上传到图床的图片,仍正常显示本地缩略图。机器人以后上传且写入缓存后,网页下一次刷新自动切换图床,无需重启。手动设置的 HTTPS 例图地址直接显示,不经网站代理。
  5. 对稿位加价、修改备注,图片URL应保持稳定,列表已显示的图不重新下载;换图后应正常刷新为新图。翻页重新加载本地图时可返回304;退出登录后,本地图片接口仍返回未登录,不能通过旧缓存校验访问。
  6. 缓存缺失、JSON损坏或其中个别URL无效时,页面继续工作并回退本地图;网站不用设置或返回 s.ee Token。缓存不在默认位置时,使用 --image-host-cache /实际路径/see_cache.json。

网页图片404与容器路径验收(Web 1.0.3 / 插件 v2.20.22)

  1. 测试库中记录 /AstrBot/data/plugin_data/cym_auction/images/文件名,而图片实际位于网站数据库旁的 images/。升级网站后,列表、详情、本地缩略图接口应正常显示、返回200;数据库地址不变。
  2. 将图片移至另一目录并使用 --media-root 指向该目录,仍应正常映射;相对路径、file地址和Windows式旧路径可识别。图片目录外的文件、含上级目录跳转的路径或指向外部的软链接不能访问。
  3. 已有 s.ee 图床缓存但未记录来源时,重载配套插件;只为已有缓存内容补索引,不额外上传。网站能读取该缓存、但读不到机器人原图时,应仍显示对应图床图片。
  4. 同一路径替换图片后,能读取文件的网站必须优先使用新内容;不能被旧索引指向旧图。一个来源存在歧义时不随意选图。
  5. 图片及对应图床索引都缺失时,页面顶部和详情显示缺失路径、实际图片根目录;不重复发送必定404的图片请求。恢复图片目录后,下一次列表刷新应自动恢复。
  6. 仍验证登录保护、图床失败后本地回退、本地ETag 304、换图刷新,以及出价/备注变化不重复下载原图。

释放稿位与再次成交(v2.21.0)

仅在测试群操作。准备开启中的“释放测试A”“释放测试B”,结束时间在将来;A的1、2号稿位及B的同号稿位均已上新,起拍100、回收价800。管理员先将成员A、B余额各录入5000,前台绑定“释放测试A”;把示例中的@成员换成QQ真实提及。

/录入余额 @A#5000
/录入余额 @B#5000
  1. A在前台发送 给1号出价 1000,管理员执行 /截止稿位 释放测试A#1。A余额应为4000,1号显示已截止。
  2. 管理员执行 /释放稿位 释放测试A#1。回复须明确“释放测试A”的1号,显示恢复开拍、保留目高、扣款已退回、原定时清除。A余额为5000,原例图/备注/画师/编号和全部出价记录不变,目高仍为A的1000;“我的稿位”转入未截止目高组。B活动的1号完全不变。
  3. 再执行相同命令,提示当前开拍中,不能重复释放;余额仍5000。B出价1000失败,出价1100成功;管理员再 /截止稿位 释放测试A#1,只扣B的1100,余额3900。重复截止不再扣款。
  4. /恢复余额 释放测试A 只恢复这次尚未退回的1100;随后 /释放岗位 释放测试A#1(别名)恢复开拍,不重复退款。直接再次截止,即使无人追加出价,也应新扣1100一次。
  5. 管理员 /回收稿位 释放测试A#2,再 /释放稿位 释放测试A#2:无出价可恢复、无退款;有出价回收再释放须保留出价,同样不凭空加余额。再测试最高价低于回收价而自动回收的稿位,释放后可以继续加价。
  6. 给已恢复的稿位重新 /设置定时 释放测试A#2#未来20分钟的时间#截止,立即收到提前提醒;回收、释放后重设同一时间,应再次收到本次提醒。旧轮次定时不能关闭本轮稿位,截止前5分钟有效出价继续逐次延期。
  7. 在绑定A的群使用 /释放稿位 2,应定位A的2号;单群模式省略活动应定位最新活动。普通成员执行释放或别名均拒绝。缺参数、不存在的活动、99号不存在、空字段和多余字段均不得改变任何余额或稿位。
  8. 关闭活动后释放须提示先开启;结束时间已过去须提示先修改到未来;批次未上新须提示先安排上新。不自动修改活动或其他稿位状态。已删除稿位应使用“撤销删除”,不能通过释放恢复。
  9. 多群:从后台或另一活动管理群指定A的稿位,只广播至A的全部前台群;当前最高出价者只在原出价群收到@提醒,管理群有明确回执,不公开余额或底价。再次成交仍有新成交通知。
  10. 重载插件,确认旧扣款和退款记录仍保留,释放后的目高与状态不变;重复恢复不再加款。独立网站刷新能看到新状态,释放前打开的旧编辑表单应提示冲突,不覆盖新记录。

/功能、/help及网页完整命令表包含 /释放稿位,共48个主命令;网页保留完整使用说明和历史日志。

后台 Web 回收价保密(v2.21.1 / Web 1.0.5)

  1. 管理员登录独立网站,将测试稿位的回收价录入或修改为987654.32。保存提示说明仅后台可见,前台群和后台群都不应收到修改公告;重新打开编辑页仍可查看真实金额。
  2. 保持回收价不公开,在QQ执行单稿位查询、稿位列表、批次查询、批次目高,并触发一次批次上新。涉及回收价的位置只显示“不透露”,不显示该金额。切换公开后的新增验收见本文末尾。
  3. 出价1000后检查直接回复、多群同步和超价提醒,均不显示回收价;最终截止时提示低于回收价无法成交,仍不显示987654.32,余额不扣款。
  4. 后台将回收价改为0,清除底价时同样不向任何QQ群发送修改通知。管理员网页和修改记录保留实际数据,不精简后台信息。

批次漏上新修复、截止审查及网页状态(v2.22.0 / Web 1.1.0)

  1. 升级并重载插件,然后针对原问题执行 /释放稿位 一周年庆#1。活动开启、未到结束时间,且批次上新时间已过去时,应恢复开拍,保留出价和目高,退回本稿位未退的成交款。批次尚未到时仍拒绝,并显示批次号与上新时间;批次查询须显示实际状态。
  2. 针对已释放的稿位执行 /设置定时 一周年庆#1#未来时间#截止。回复明确活动、稿位和时间。分别在活动未开启、活动已结束、批次未到上新时间、稿位已截止/回收/暂停、时间过期、活动或稿位错误时测试;均应拒绝且不改余额、状态或旧定时。直接“截止稿位”也检查是否可竞拍。
  3. 设置批次时间后重载,批次任务仍应存在;模拟旧批次保存过时间但任务遗漏,重载后应补建,到点后一次上新;重设批次时间后,旧任务不能提前上新。
  4. 网站登录后打开稿位详情,在“修改稿位状态”选“截止并结算”,先点“应用状态”,核对完整活动名/稿位号/名称/影响,再点“确认执行”。达到回收价时实际扣款,未达则显示已回收且不扣款;回收价金额不进入QQ群消息。
  5. 对已截止稿位选择“释放并恢复开拍”:目高和历史保留,未退成交款加回一次;再截止可重新结算。连续点击、旧表单、并发提交不得重复记账。
  6. 选择“暂停竞拍”应保留目高、清除定时、禁止出价;再“恢复开拍”可继续加价。普通回收不扣款。尚未上新的稿位不能仅靠网页选择状态提前开拍。
  7. 网页有未保存资料时,状态操作提示先保存;别人出价或修改后,提交旧状态表单须拒绝。非法状态、未登录、缺少验证信息均拒绝。
  8. 机器人离线时,网页状态与账务仍能保存;上线后处理群提醒。多群公告只发目标活动前台,个人提醒发出价来源群;不向后台广播回收价。网页修改回收价本身仍不产生任何群公告。
  9. 管理后台完整说明、测试命令和更新日志仍保留;48个主命令、37个管理员命令和15项配置不变。

统一结算提醒与通知并发(v2.23.0)

  1. QQ /设置定时 测试活动#1#未来时间#结算(旧参数截止/回收同效),在30分钟和5分钟节点预告;不足30分钟立即提醒,不足5分钟合并为一次5分钟提醒。
  2. 独立网站设置定时应立即向目标前台公告,超过30分钟再预告;不足30分钟两条合并一次。后台不广播,单独设置公告不@成员,30/5分钟预告@当前最高出价者。
  3. 最后5分钟有效加价再顺延5分钟,失败出价不延期;每次有效延期有单独通知。旧时刻不能提前结束,重启不重复预告或扣款。
  4. 机器人暂时离线或消息失败后重试,只补未完成消息;取消/改期/释放后,旧提醒与未投递旧公告失效。升级会取消旧的5分钟任务。

时区与退出流程(v2.22.2 / Web 1.1.1)

  1. 使用UTC主机运行独立网站,插件使用北京时间。北京时间15:05时,将测试批次设为当日15:00、所属活动开启且未结束、稿位已截止;网页“释放并恢复开拍”应成功,原目高和历史保留,未退成交款退一次。插件 /释放稿位 一周年庆#1 使用相同时间口径。
  2. 将另一测试批次设为15:06,在15:05时操作应拒绝,报错显示当前北京时间15:05;到15:06后可恢复,不需要改动上新时间。
  3. 网页顶部标明北京时间;网站进程和机器人处于不同系统时区时,设置10分钟后的回收仍立即预告,5分钟节点再提醒,到期执行回收。北京时间跨日后省略日期/年份的命令按北京时间补全。
  4. 插件正在发送单群/多群提醒,同时有昵称待保存时,点击停用:应能停止后台任务并关闭数据库,日志有“拍卖插件已停止”;出价、余额、原定时均保留。重新启用后正常处理,重复停用不报数据库错误。
  5. 测试平台发送超时、昵称写入失败和外部任务不响应取消:有限时间内完成清理或明确返回错误,不一直转圈。未能确认后台任务退出时保留数据库连接,并提示重启AstrBot。
  6. 管理后台操作指南、历史更新日志均保留。网站在原目录执行 python -m auction_web --version 应为1.1.1;插件页面应显示2.22.2。仅升级插件、未重启旧网站时,不应误判独立网站已经更新。

独立网站批次改期测试(Web 1.2.0 / 插件2.22.3文档)

本次无新增QQ命令。先在测试活动准备一个已上新批次和一个未上新批次,记录目高与余额,可用 /设置定时 测试活动#1#未来时间#回收 给开拍稿位安排定时。

  1. 网站“活动管理 → 目标批次 → 调整上新时间”,将已上新批次改到几分钟后,点击“预览调整”。预览应列明活动、批次、新北京时间、暂停数量及清除旧定时的影响,第一次点击不保存。
  2. 确认保存,批次为“筹备中”,未结束稿位为“未开拍”,目高与出价历史保留,余额不变,原定时清除。QQ群 给1号出价 1000(改为高于目高)应失败;在其他稿位加价仍计算暂停稿位占用的额度。
  3. 机器人在线时到点只发一次原有整批上新提醒,稿位恢复开拍,可以接着旧目高出价。需要截止或回收时重新设置定时。已截止/回收稿位以及其他批次、其他活动不变。
  4. 筹备中再次改期,旧时间到达不应上新或弹旧提醒;新时间到达才上新。保存本身不立即发送QQ群公告。
  5. 测试过去时间、活动开始前/结束时及之后的时间、已结束/已删除活动:全部拒绝。两个窗口同时打开,另一窗口保存或QQ产生新出价/新定时后,旧窗口必须提示冲突;连续重复保存不产生重复任务。
  6. “修改记录”显示活动名、批次号、上新时间和状态变更;原有完整操作指南、测试命令与历史更新日志仍可阅读。浏览器时区为洛杉矶时,输入16:00仍按北京时间16:00保存。

新功能手动验收:回收价公开、统一定时结算与价格对比(Web 1.3.0 / 插件2.23.0)

回收价公开开关

在稿位详情的“回收价是否公开”选择“不公开”或“公开”,点击“保存修改”。新稿位和旧稿位升级后默认不公开。切换开关或修改回收价都不会额外向前台群发送公告;后续单稿位查询、稿位列表、批次查询/目高、上新提醒和出价通知按开关显示金额。改回不公开后,后续消息显示“不透露”,已经发出的历史消息无法自动收回。金额为0表示未设置成交底价,公开时显示“未设置”。

一个定时,按最终价格决定结果

进入稿位详情“设置稿位定时”,填写执行时间(北京时间),点击“设置 / 修改定时”,核对活动、稿位、时间和提醒影响后“确认执行”。可以修改或取消已有定时。设置定时本身不扣款或退款。

到点情况 结果
有有效最高出价,且目高大于等于回收价 已截止,交易成功,按成交价扣款一次
目高低于回收价,或无人有效出价 已回收,交易终止,不扣款
回收价未设置或为0 有有效最高出价就成交,无出价则回收

网站不再区分两个互相独立的“定时截止/定时回收”。QQ可用 /设置定时 一周年庆#1#2026-10-04 20:00#结算;旧参数“截止”“回收”均兼容同一结算规则,示例时间须替换为活动范围内的未来时间。升级时旧定时回收自动转为按价结算,保留原时间及延期次数,不改动已经完成的成交或回收;管理员手动“回收稿位”仍是立即主动终止。

网站保存/修改定时后,会登记一次前台提醒,机器人在线时发送。剩余30分钟时再提醒;保存时已不足或等于30分钟,设置公告与预告合并为一条。剩余5分钟时再次提醒;保存时已不足5分钟则合并为一次5分钟提醒。最后5分钟内每次有效加价,将原结算时间再延长5分钟;之后再次进入最后5分钟还可继续延期,每次延期单独显示最新时间。报价失败不延期。已经发送过的30分钟预告不会因延期或重启重复发送。

定时公告和提前提醒仅发送到该活动绑定的前台群,后台群不广播;单独设置/取消公告不@;30分钟和5分钟预告在最高出价者的出价来源前台群@该成员,其他前台只有公共提醒。单群沿用原稿位定时、批次、活动或出价会话。无群绑定且无任何来源记录时,网站仍保存定时并提示交由机器人发送,但不能凭空选群;请先设置活动前台群。修改或取消后,旧任务和未发送的旧定时通知作废;取消也会通知前台,活动总结束时间仍有效。到点结算和群通知均需要机器人在线。

活动必须开启且未结束,批次已到上新时间、稿位可竞拍;新时间必须晚于当前北京时间且不晚于活动结束时间。活动结束不会抢先关闭已经有效加价延期的稿位。有人出价、触发延期或修改资料后,旧网页表单会提示冲突,应重新打开核对。设置、取消、提醒任务和审计在同一事务保存,失败全部回滚。

列表直接观察是否达价

外层稿位卡片同时显示“当前目高”“回收价”“起拍价”和回收价是否公开。目高大于等于回收价显示绿色“已超过回收价”(包括恰好相等);低于回收价或尚无出价显示“未超过”。回收价为0显示“未设置回收价”,不会把无底价误标为未达价。比较徽标仅用于管理员观察,实际状态与成交仍以结算结果为准。

升级与验收

先安装插件2.23.6并重载,让原数据库自动增加所需字段、统一旧定时并补齐有效定时的5分钟提醒;再替换网站 auction_web/ 目录并重启网站。保留原数据库、图片及网站账号目录。python -m auction_web --version 应显示 auction_web 1.3.4。新功能没有完成配套插件升级时只读提示,网站不自行迁移生产库。

验收:给测试稿位设置回收价1000,分别令目高为999、1000、1001,观察“未超过/已超过回收价/已超过回收价”。公开开关保存后群内不主动通知,之后查询显示相应金额或不透露。网页设置一小时后结算,检查立即公告、提前30分钟和5分钟预告并@当前最高出价者;最后5分钟有效加价应顺延并另发通知。到点分别测试无人出价、低于、等于和高于回收价,以及未设置回收价的情况。测试两个窗口冲突、改期、取消、重复提交、旧回收定时升级及机器人重启,不应重复扣款或退款。

前台“已过回收”标记(v2.23.1)

原本显示“交易中”的单稿位详情、稿位列表和“我上传的稿位”,在有有效目高且目高大于等于已设置的回收价时显示“交易中/已过回收”。无人出价、未达价、未设回收价以及其他状态保持原样;撤回或修改回收价后按最新数据重新判断。此标记不公开回收价金额,金额仍遵循公开开关。

在专用测试活动设置1号稿位起拍价100、回收价800,分别使用 查询1号稿位、/稿位列表 活动名、/我上传的稿位 验收(最后一条由上传者发送)。无人出价及目高799时仍显示“交易中”;有效出价800或800.01后显示“交易中/已过回收”。撤回800及后续出价,恢复目高799后应去掉标记;回收价改为0时也不显示标记。暂停、截止、回收状态保持原文。公开开关只影响金额是否显示,不影响达价标记。

定时提及验收(v2.23.6;保留设置/取消无@)

设置、修改、取消定时的单独公告只发公共文字;30分钟和5分钟提前提醒(含临近设置的即时提醒)@当前最高出价者。多群时仅在该成员出价来源前台群提及,其他前台发公共提醒。5分钟延期公告仍为普通文字;到点成交、到点回收及活动结束结果仍按原规则@相关出价者。

  1. 先让成员A对测试稿位有效出价,分别从QQ和网页设置未来一小时的结算时间,检查设置通知没有@。
  2. 到30分钟节点检查预告;再改为未来10分钟,检查即时预告。每个前台群收公共提醒,当前目高者A的出价来源群另有@A的个人提醒,后台群不广播。
  3. 从网页取消定时,取消通知同样无@;打开AstrBot“回复时@发令者”后发送QQ设置/取消命令,回执仍不@管理员。
  4. 最后5分钟有效加价继续延期且另发纯文字公告;到点成交/回收仍按原规则@,超价提醒也保留。
  5. 模拟旧定时通知在公共段发出后中断,更新插件再补发,不应重发公共段;30/5分钟提醒保留个人@段,设置/取消公告跳过个人@段。自动回归:tests/test_auction_timer_mentions.py。

达价才能扣款验收(插件2.23.3 / Web 1.3.1)

有有效最高出价且目高大于等于回收价,才允许成交并按成交价扣款一次。目高低于回收价或无人有效出价时,交易失败,稿位回收,不改变余额,也不产生扣款账单。回收价是否公开不影响判定;未设置回收价或为0时,沿用有有效出价即可成交的规则。

给专用测试活动准备不同稿位,回收价均设为800,目高分别为799.99、800、800.01,并留一个无人出价稿位。分别用 /截止稿位 测试活动#序号、/设置定时 测试活动#序号#活动内未来时间#结算、活动自然结束以及网页“截止并结算”测试。799.99与无人出价应显示已回收、余额不变、无扣款记录;800与800.01应显示已截止,仅扣除对应成交款一次。将回收价公开/不公开各测一遍,结果应一致。重发截止或重复执行到期任务不能再次扣款。底层与四入口自动回归见 tests/test_auction_debit_guard.py、tests/test_auction_price_rules.py。

目高合计范围验收(Web 1.3.2 / 插件2.23.4文档)

  1. 初次打开网站,“当前目高合计”默认只包含开拍中稿位。原有四张卡片、目录和页面布局保持原样。
  2. 点击合计卡片右上角“范围”,依次单选及组合勾选开拍中、未开拍、已截止、已回收,核对结果等于对应稿位当前目高之和;全部取消应显示0,无出价按0计,未开拍保留的目高也可纳入。
  3. 左侧切换活动,范围勾选保留,合计仅针对当前活动;切回全部活动,统计所有未删除活动。列表搜索、批次、状态筛选和分页不改变合计范围。
  4. 保持范围菜单展开,让测试稿位产生新的目高或更改状态,等待自动刷新。合计及时变化,菜单保持展开,焦点及勾选不重置,其他三张统计卡片仍按原规则更新。
  5. 选择多个状态后刷新页面,选择仍保留;全部取消后刷新仍为0。在另一浏览器首次打开默认只选开拍中。点击菜单外或按Esc可收起,键盘可勾选状态,窄屏菜单不超出屏幕。
  6. 本项只改显示,无需新QQ命令,不扣款也不改动稿位。替换独立网站程序并重启;版本应为1.3.2。已有插件2.23.3可继续使用,2.23.4插件包同步了完整指南与本测试步骤。

查询截止时间验收(插件2.23.5 / Web 1.3.3)

准备同一批次的两个未结束稿位:1号设置未来的定时,2号不设置。测试时间必须在活动期间。执行:

/设置定时 测试拍卖#1#2026-10-04 20:00#结算
查询1号稿位
查询2号稿位
/查看稿位 1
查询批次1
查询批次1目高
/查询批次 1
/查询批次目高 1
查询目高
/稿位列表 测试拍卖
/我上传的稿位
/我的稿位
  • 除精简的“查询目高”外,1号稿位所在信息段包含 截止时间:2026-10-04 20:00:00(北京时间),2号没有截止时间行。有出价/无出价均如此;个人查询由上传者或目高持有者执行,“我的稿位”仍只有文字。
  • 修改1号定时后查询只显示新时间;最后5分钟有效加价触发延期后,查询显示延长后的时间。取消定时后该行消失,结算完成或释放清除定时后不残留旧截止时间。活动虽然设有结束时间,2号仍不显示截止时间。
  • Web卡片和详情与QQ一致,刷新后及时更新;时间可换行完整显示,统计范围和原有管理功能继续可用,无定时不显示“截止时间未设置”。
  • 自动回归在 tests/test_auction_timing.py 覆盖QQ官方和OneBot的查询入口、无定时、有定时、连续延期、取消与结束,tests/test_auction_core.py 验证带图查询。

30/5分钟@、全场目高与截止筛选验收(插件2.23.6 / Web 1.3.4)

  1. 让A在前台甲群出价,设置未来一小时结算。在30分钟节点,全部前台收到公共预告,仅甲群额外@A;换B在乙群成为目高后,5分钟节点仅乙群@B。后台不广播,没人出价不@。
  2. 在最后5分钟内加价,检查延期公告、查询和Web显示新时间;新时间前5分钟再次@新目高者,30分钟提醒不重复。设置未来10分钟立即发30分钟预告;设置未来3分钟只发一轮5分钟预告。重启、失败重试、取消或重新设置均不重复/错发旧提醒。
  3. 同时执行“查询目高”和“/查询目高”,按序号核对全场,每行仅为“53号 炊籽xxx | 1000¥”,无报价显示暂无出价,未分批稿位不遗漏;无标题、批次、上新或截止时间、“目高:”标签及空行。不得含图片、图床链接、备注、余额或回收价;超过一条消息长度时自动分段。单批查询保持原有图文。
  4. Web目录点击“截止时间”:全部/已设置/未设置分别核对;给测试稿位设置20:00、23:00及次日12:00,范围20:00—23:00应包含前两件。单填上限、单填下限、等于边界均可;开始晚于结束提示错误,原结果保留。
  5. 截止条件与活动、批次、状态、搜索组合有效;点击清除仅重置截止筛选。让机器人延期一件稿位,自动刷新后按新截止时间筛选,菜单和条件不重置;顶部合计仍按自己的范围统计。手机上检查菜单无横向溢出。
  6. 自动回归:tests/test_auction_reminder_stages.py、tests/test_auction_timer_mentions.py、tests/test_auction_timer_notifications.py、tests/test_auction_web_controls.py、tests/test_auction_all_top.py。后者覆盖42批次、211件稿位、超大单批、未分批和纯文字长消息无遗漏。

全场目高精简输出(插件2.23.7)

执行“查询目高”和“/查询目高”,每件只显示一行 53号 炊籽xxx | 1000¥;无人出价为 54号 作品名 | 暂无出价。核对按序号排序、未分批稿位同样列出,不含标题、批次、上新时间、截止时间、“目高:”、图片或空行;长内容自动分段且不遗漏。单稿位和单批查询仍显示原有详情。更新并重载插件即可,独立Web仍为1.3.4。

Web用户管理验收(Web 1.4.0 / 插件2.23.8文档)

  1. 未登录直接访问 /api/users 或某成员详情应提示先登录;网站管理员登录后在左侧进入“用户管理”。仅有余额、历史出价或上传记录而暂无昵称的成员仍应出现,同一标识不重复,同名不同标识不合并。
  2. 搜索昵称、显示名称或成员标识,组合“已审核 / 未录入余额 / 年龄未审核”;检查零余额显示0、大额余额没有科学计数法。超过24人翻页,刷新后筛选与页码保留。
  3. 给同一成员准备不同活动的已成交、开拍目高、筹备中保留目高、已回收和已被超价作品。详情前两组只能出现当前有效归属,显示正确活动、序号、名称与价格;余额只读全局一份。
  4. 展开历史出价与成交扣款/退回记录,核对撤回状态、竞拍轮次、金额、前后余额和时间;最多显示最近100条,并显示总数。只有历史出价不代表当前拍到;已退记录不能重复计入当前成交归属。
  5. 在独立测试库模拟更新余额、昵称、目高归属及成交状态,检查列表和详情自动刷新;点击作品打开原稿位详情,关闭后能回到用户详情。测试无余额、无出价、无成交、未知用户和删除记录。
  6. 手机上检查列表与详情不横向溢出。退出后清除用户信息;接口请求无授权不能取余额。用户查询本身不写数据库、不通知QQ群;当前Web1.5.0另有余额录入/清空入口,见下方管理验收。
  7. 自动检查:python3 tests/test_auction_web_users.py、python3 tests/test_auction_web.py。本次只需更新并重启独立Web至1.4.0;插件2.23.8同步完整说明。

Web完整管理与出价历史验收(Web 1.5.0 / 插件2.24.0)

以下写入测试在演示库或专用测试活动/群执行;清空余额覆盖所有活动,请只在独立测试库进行。保持原48个QQ主命令,本版不增加QQ命令。先升级并重载插件2.24.0,再替换网站程序并重启到1.5.0。

操作 测试方式 预期
创建活动 活动管理→创建活动→填写名称和未来起止时间→预览→确认 筹备中;展示具体名称/北京时间;创建任务。重名/结束早于开始应拒绝
活动编辑 查看/修改名称及时间 数据实时同步;已开启/关闭不能改开始时间,关闭后可改结束时间
开关活动 开启→关闭→再次开启 关闭停止出价并取消定时,保持出价及余额;重开须未来结束时间且不自动恢复旧批次/稿位定时
删除活动 对专用测试活动预览后确认删除 常规稿位目录排除,出价与账目保留;无恢复活动入口
新增稿位 选择活动,录入名称/画师/价格/备注,一张上传图片或直链 图文可查看;不公开底价默认保密;新稿位未分批;图片与直链同时填拒绝
自动编号 新增两件不填编号 按活动顺序分配,不串活动
改号释放 将1号移到空闲69号,再自动添加 原作品成为69号,新增优先补1号;目标已有作品拒绝覆盖
指定空号 手动指定空闲或已删除编号 精确新增该号;名称或序号占用拒绝
删除保护 对无出价稿位删除;尝试删除有出价/已撤回历史/已成交稿位 前者进入删除列表,后者拒绝;预览必须列明活动+编号+名称
恢复保护 已删除稿位→筛选活动→恢复 恢复原资料、图和编号,不恢复旧定时;占用原号后拒绝,不误改其他作品
批次编排 选择活动,每批2件,核对预览后确认 按序号分组,旧批次替换;未结束作品筹备中,出价/目高保留,定时清除;结束作品保持状态
批次时间 对新批次点击调整上新时间 未来时间且在活动期间;到点由机器人上新,只有前台收到通知
录入余额 用户页选择成员,填写最终余额并勾选审核→预览→确认 显示旧值和新值,覆盖全局余额;昵称不变,审核通过,不公开QQ公告
大额与零余额 录入1000000000000、0;再试负数/非数字 有效金额普通数字显示;非法金额拒绝;0和未录入明确区分
清空余额 用户页清空全局余额,核对人数 全活动审核余额删除,成员/作品/出价/账目保留,必须重新审核,无退款或QQ公告
历史查询 活动、作品、成员关键词、时间范围、撤回状态组合筛选 结果一致,边界包含;未撤回并不代表当前目高,显示成员昵称与完整标识
历史分页 测试库写入超过100笔记录,翻全部页 每页50条,全量可见,无最近100条截断;页面间无重复/遗漏
精准撤回 A1000、B2000、C3000、B4000,选择B2000的记录 后三笔作废、目高A1000;全部原记录仍在;撤回第一笔后暂无目高
撤回限制 已撤回/已成交的记录点击撤回 禁止重复或绕过成交账目;不改余额与既有延时
撤回通知 A在前台甲、B在前台乙、另有前台丙和后台丁 甲乙丙公共提醒;只在甲@A、乙@B;丙无个人提醒,丁无广播;单群提及该群参拍者
并发保护 先预览删除/撤回/批次/余额操作,再从QQ产生相关新出价或改变余额,随后确认 拒绝过期确认并要求重新预览,不覆盖新数据;重复点击已成功确认不重复执行
操作记录 打开修改记录 人类可读的活动/作品/成员操作说明、操作者、时间;操作前资料与执行结果留存在数据库审计
手机与退出 390px宽度查看历史、表单和删除列表;退出登录 表格分行,无横向溢出;表单可填写,退出清除数据,未登录接口拒绝读取/写入

QQ群联动对照(将“Web测试”换为专用活动名,真实@选人;不要在生产库清空):

/设置群 前台#Web测试#测试前台
查询1号稿位
查询批次1
/查询余额 @A
给1号出价 1000
给1号出价 2000
查询1号稿位
查询目高

网站录入审核余额后,在对应前台分别由A/B出价;在网页出价历史撤回指定记录,再查询确认目高/历史已同步。公共群消息不得暴露具体余额或未公开回收价。

自动回归:tests/test_auction_web_management.py 覆盖全部新增HTTP操作、身份/CSRF校验、二次确认、图片上传、编号冲突、连锁撤回、121笔分页及并发防覆盖;tests/test_auction_web_management_integration.py 用真实插件表验证双端互通、前后台通知路由、单群@、重复任务不重复发送、资金不变和失败回滚。既有网页资料/批次/定时/共享锁回归继续运行。

拍卖用户账号与个人页验收(Web 1.6.0 / 插件2.24.1文档)

在独立演示库准备成员A、B,昵称可相同,余额、稿位和出价不同。管理员使用网站原账号;拍卖账号仅用于本人只读查询。本项不增加QQ命令,不改变QQ余额隐私提示。

  1. 管理员进入“用户管理→登录账号管理”,分别创建账号member001、member002,绑定A、B,设置不少于12位密码并核对保存。账号/成员重复(包括停用账号)均拒绝;不能用管理员账号名创建普通账号。选择没有数据的新sender_id时,应得到空个人页,不能自动匹配同名用户。
  2. 分别登录A/B账号,核对余额仅来自各自身份,已成交与当前目高稿位正确,其他人姓名、标识、逐笔出价和余额不可见。A在B持有目高的未结束作品有有效出价时,在A的“仍在参与”同时显示当前目高和A自己的有效出价;已回收不列入持有稿位。
  3. 个人出价超过100条后翻页核对所有记录,每页50条,无其他成员记录;按作品/活动/序号和撤回状态筛选。保留已撤回历史,“未撤回”不等于目高。未录入、0和大额余额正确显示;时间北京时间。
  4. 普通用户直接访问/api/snapshot、/api/users、/api/users/其他人、/api/bids、/api/accounts、/api/artworks/编号及图片接口,均应拒绝;所有资料/余额/定时/撤回/账号修改接口也拒绝。篡改/api/me或/api/me/bids中的sender_id/member/role参数应拒绝,不返回他人资料。
  5. 管理员停用A后,A的已有页面下次刷新退回登录,旧会话请求401,新登录失败;重新启用后旧会话仍无效。重设密码后旧密码及旧会话失效,新密码可登录。B账号不受影响。
  6. 管理员将A账号改绑到未绑定身份C,先核对原、新标识;A的旧会话全部失效,重新登录仅见C数据。读取过程中改绑的请求也须拒绝返回A数据。两位管理员窗口同时修改账号,旧版本操作应409冲突。
  7. 同一浏览器先管理员再用户、先A再B;检查旧表格、隐藏详情、昵称、标识、金额和表单内容均清空。其他标签页同步清理,带旧会话标记的请求不得继续显示前一账号资料。退出后没有个人记录残留。
  8. 手机390px宽度检查账号管理表单、个人余额、稿位列表与出价表,无横向溢出;隐藏页面暂停轮询,重新显示更新。失去网络应提示旧数据,会话失效应清空并返回登录。
  9. 重启Web后重新登录,账号和绑定仍在;升级保留state-dir里的admin.json与accounts.db。账号API/审计中没有密码、散列或盐;账号管理与个人查询不得扣款、退款、改出价或发QQ群消息。
  10. 自动运行:python3 tests/test_auction_web_portal.py,并回归tests/test_auction_web.py与tests/test_auction_web_management.py,确认原管理员功能完整。对外访问继续使用原HTTPS配置;不要以关闭权限校验的方式解决用户登录问题。

用户排序与快捷账号验收(Web 1.6.1 / 插件2.24.2文档)

在独立演示库测试,不在生产成员账号上试改密码。

  1. 用户列表分别选择余额、当前目高金额/件数、已成交金额/件数,再切换从高到低、从低到高。核对20/100按数字排序,余额为负、0及未录入均正确;未录入余额两种方向都在末尾。
  2. 准备超过24名用户,确认全列表排序后再分页;搜索昵称/标识、审核筛选继续配合排序。改变排序后返回第一页,自动刷新保持所选排序,最新余额或目高反映到顺序中。
  3. 对没有账号的成员点“设置账号”:带入该成员标识且不可误改,登录名待填写。对已有/停用账号点相同入口:打开原账号,不重复创建、不自动启用。两位同名成员按标识准确进入各自账号。详情中的入口同样可用。
  4. 在创建或管理账号窗口点“生成随机密码”:两处密码一致、20位、包含大写/小写/数字及-或_,可显示/隐藏、复制。再次生成应不同。生成/复制/取消不创建账号或重设密码;完成核对保存后才生效。
  5. 进入确认预览后重新生成密码,应回到“核对账号”;取消/保存/关闭/退出后密码清空且恢复隐藏。重新打开已有账号不能读回旧密码。剪贴板受限时给出手动复制提示,安全随机源不可用时明确报错且不使用弱随机替代。
  6. 手机390px宽度检查排序栏、用户行按钮和账号表单没有横向溢出。回归普通用户本人数据隔离、账号停用/重设后的旧会话失效,以及原“登录账号管理”中的改绑。
  7. 自动测试:node tests/test_auction_web_user_tools.cjs;python3 tests/test_auction_web_users.py;python3 tests/test_auction_web_portal.py。

客户图文与当前目高验收(Web 1.6.2 / 插件2.24.3文档)

  1. 演示库中A对某稿位出价123,B目高660。A登录后“仍在参与”显示例图、当前目高660和我的有效出价123,不显示B姓名/标识。将目高更新为880,页面自动更新到880,自己的出价仍为123。
  2. 已成交、本人当前目高、仍在参与以及个人历史均显示小图,缩略图等比、不裁剪。无图和失效图有占位;历史金额不被当前目高替换。手机390px宽度长作品名/截止时间/两种价格不挤出屏幕。
  3. 分别测试图床直链、本地图、旧容器图片路径;图床不可用且有本地备份时回退成功。不暴露本地目录。刷新价格保留原图片地址,换图后取得新图。
  4. 成员访问无关/未知编号的个人图片接口返回404;修改参数指定他人返回400,未登录返回401。旧管理员图片接口仍403。本人已撤回的历史稿位图片可查看,已删除活动不再取图。
  5. 缓存命中和HEAD同样核对权限;停用或换绑后旧登录不能读取旧图片,新身份无法取无关图片。其他账号不受影响,图片和查询不改余额、不新增出价、不发群消息。
  6. 自动运行:python3 tests/test_auction_web_portal_images.py、python3 tests/test_auction_web_portal.py、python3 tests/test_auction_web_media.py、python3 tests/test_auction_web.py、node tests/test_auction_web_images.cjs。

账号回收价权限验收(Web 1.6.3 / 插件2.24.4文档)

在独立演示库操作,使用测试账号A、B,不调整真实成员权限。

  1. 升级旧Web账号库并重启,原账号可用、绑定和审计保留,所有已有账号的“允许查看全部作品回收价”默认关闭。创建新账号同样默认关闭,不勾选保存后与原个人页一致。
  2. 管理员从“用户管理→设置账号”开启A权限,核对预览显示全部作品(含未公开)的范围;保存后账号列表显示允许,操作审计记录该变更。原“登录账号管理→管理”及创建账号入口同样能设置。
  3. A原登录在下次刷新退出并清空内容,重新登录后个人稿位增加回收价,顶部可进入全部作品回收价目录。B仍无目录和价格字段,不受A变更影响。
  4. 目录包含A从未出价的作品和其他活动,含筹备中、已截止、已回收作品;未公开价格也显示,未设置显示“未设置”。已删除作品/活动不显示。活动、作品名及序号搜索正常;超过100件时可完整翻页,无遗漏。
  5. A不因此看到其他人的姓名/标识/余额/逐笔出价,不获得管理按钮;直接请求管理接口或无关作品个人图片仍拒绝。B手动访问回收价接口返回403,伪造权限或其他成员参数不能获取价格。
  6. 保持A目录打开,管理员关闭权限并保存:旧会话立即无权访问,下次刷新返回登录并清空原价格;重新登录无回收价入口,个人稿位不再显示该行。读取期间关闭也不能返回原价格。其他账号正常。
  7. 测试退出、同浏览器换账号、其他标签页登录,不能残留原账号价格;手机390px宽度下账号表单和目录无横向溢出。筛选输入过程中自动刷新不清除未提交选择。
  8. 核对整个流程业务库、余额、竞价、QQ公开开关保持原样,QQ群没有授权或价格公告。重启后权限持久保存;重复升级不重置既有许可,不丢账号密码。
  9. 自动回归:python3 tests/test_auction_web_reclaim_permission.py、node tests/test_auction_web_reclaim_ui.cjs;并运行原tests/test_auction_web_portal.py、tests/test_auction_web_portal_images.py与tests/test_auction_web.py。

分级管理员与账号中心验收(Web 1.7.0 / 插件2.25.0文档)

使用独立演示库,测试账号均为虚构;不在真实账号或实际拍卖上进行权限/删除测试。

  1. 从1.6.3或更早账号库升级:原管理员能登录为总管理员;原用户密码、绑定、启停、回收价许可和审计保留。总管理员不在可停用/删除的账号表中,旧普通用户不自动升权。
  2. 进入“账号与权限”:独立页面展示类型、上级、权限数量和状态;搜索、类型及启用/停用/已删除筛选正确。原“参拍成员”页面的查询、排序、余额、快捷账号功能仍正常。
  3. 创建空权限管理员,登录后显示等待授权;不能读取拍卖、余额、账号或历史。为其只授“录入余额”,表单补齐成员查看,核对逐项清单后保存;该账号只能进入对应页面并录入余额,不能清空余额或管理活动。
  4. 为时间管理员只授结束时间、批次时间、设置/取消定时:名称及开始时间输入只读,无新增/删除/开关活动按钮;可正常修改被授权的时间。稿位价格和已成交数量可见,回收价、竞拍者身份和出价历史不可见。
  5. 检查45项权限均可单独勾选;活动开始/结束分开,起拍价/回收价/公开开关/备注/图片分开,定时设置/取消分开,各状态分开。取消查看权限时依赖操作自动取消,授权范围不超过上级。
  6. 总管理员创建A,A创建B,B创建C和普通用户。A只能管理该分支,B只看到C和其下属;A/B均不能管理自己、上级或其他分支。尝试授予本人未拥有的功能或在请求中修改上级/角色应拒绝。
  7. 收回A的余额操作:B/C相应功能被收回,旧登录失效;以后恢复A不会自动还原B/C。收回回收价授权时,分支内普通用户该许可关闭;其他分支保持原状。
  8. 停用A:B/C与其普通用户不能登录,已打开页面下次请求退出并清理资料。启用A后需要重新登录;本来单独停用的下属仍停用。总管理员仍能管理被停用分支的子账号。
  9. 有下属的A/B不能直接删除,提示先处理下属或停用分支。删除叶账号后旧登录失效、不能重新登录;已删除筛选有审计,拍卖数据库、余额、作品和出价不变。可新建另一登录名重新绑定已删除普通账号的成员,旧登录名不能复用。
  10. 修改表单同时夹带无权字段,整个请求拒绝、不部分保存;直接请求隐藏的接口也拒绝。预览管理操作后撤权,旧token不可提交。读取期间撤权也不返回原资料。
  11. 手机390px和桌面测试账号表格、权限分组、筛选及确认窗口无横向溢出;勾选操作补齐依赖,取消依赖同步清除操作。退出/换号时清理上个账号所有成员资料、父级选项、权限草稿和删除预览。
  12. 自动运行python3 tests/test_auction_web_admin_permissions.py、node tests/test_auction_web_admin_ui.cjs,并回归原test_auction_web.py、test_auction_web_management.py、test_auction_web_portal.py、test_auction_web_portal_images.py、test_auction_web_reclaim_permission.py及两项账号UI测试。权限变更本身不修改QQ群设置,不发送群消息。

附属例图验收(v2.26.0 / Web 1.8.0)

先升级并重载插件,再更新网站。准备活动“附图测试”、其1号稿位及主图,使用专用测试库。

/添加例图 附图测试#1
(同一条消息附两张不同图片,预期共2张)
查看1号稿位更多例图
/更多例图 附图测试#1
/添加例图 附图测试#1
(同一条消息再附一张图片,预期共3张)
/删除例图 附图测试#1#2
/更多例图 附图测试#1
/删除例图 附图测试#1#99
查看x号稿位更多例图
查询1号稿位
/功能
  • 将查询群绑定“附图测试”:自然口令与指定活动的查询均按序显示全部附图小图,图文分段,不混入主图;删除后两张按顺序重排。99号附图不存在时不删除其他图;错误口令提示正确示例。无附图稿位提示暂无更多例图。
  • 普通成员可查看更多例图,尝试添加/删除必须拒绝;另建同序号活动,确认修改仅影响指定活动。/功能包含三个新增主命令,共51个。
  • 普通稿位查询、批次、出价提醒仍仅用主图;“我的稿位”和全场“查询目高”继续原纯文本。重载后附图仍在;无出价稿位删除/撤销删除后主图、附图均保留。
  • 网站展开稿位详情的“附属例图”,多选上传或逐行填写直链;尝试前移、后移、删除,重开及QQ群查询顺序一致。添加附图不更换主图,不向QQ群广播。两窗口修改同一版本会拒绝过期保存。
  • 总管理员可管理附图;只有主图权限的下级管理员不能操作附图,授予“管理附属例图”后可操作。普通用户网站仍只见原来的主图及自己的资料。
  • 未升级插件的旧库可读,网站附图编辑不可用且提示升级。超过20张、单张超5MB、无效图或本地任意路径应拒绝;网页批量中途失败应明确显示已保存数量。

自动回归:tests/test_auction_gallery.py、tests/test_auction_web_gallery.py;同时运行原权限、核心业务与图文发送回归。

返回文档入口

历史操作指南原文(v2.20.4)

历史原文,完整保留。以下为标题所示版本当时的说明,不代表当前可执行命令。身份查询命令已移除,管理员改用成员选择;现版本所有图床图片均使用缩略尺寸,分批支持指定活动。实际操作请看当前完整指南与当前测试命令。

cym_auction — 拍卖系统

QQ群拍卖管理插件,支持活动、稿位、分批上新、全局共享余额审核、竞拍出价、目高查询、撤回、回收和成交。

v2.20.4 修复:图片与前后文字分段
  • QQ 官方 S.EE 图文消息中,每张图片前后使用空行分段,避免 Markdown 软换行导致图片与文字或相邻图片排在同一行。查询单个稿位、批次、批次目高、稿位列表、我上传的稿位、出价成功和新生成的上新及多群同步图文均使用统一排版。
  • 原生图片消息链同样在图片与相邻内容之间添加换行,实际展示由平台客户端决定。多图缩略尺寸设置和整批一条 Markdown 消息的方式保持不变;我的稿位仍为纯文字。
  • 重新查询即可使用新排版;已发送消息和已经缓存的待重试通知不变。WebUI、帮助与测试清单同步更新,无需重新上传例图。
v2.20.3 更新:多图消息缩略展示
  • QQ 官方 S.EE 图文消息包含至少2张有效图片时,每张图片默认等比缩至最长边240像素,不裁剪、不放大小图。例如1493×3114的竖图展示为115×240;原图文件、图床缓存和链接保留。
  • 批次查询、批次目高、整批上新提醒、稿位列表、我上传的稿位以及新生成的多群同步图文统一生效。文字与对应例图保持原顺序,整批仍在一条消息内。单图详情保持原尺寸;我的稿位仍为纯文字。
  • AstrBot 标准插件配置与 Pages“拍卖插件设置 → S.EE 图床”均提供 multi_image_max_size(多图消息图片最长边),默认240,允许80–720像素。Pages保存后新生成的消息立即采用新尺寸;已经生成并缓存的待重试通知保留原排版,已发送消息不会改变。
  • 未配置图床、上传失败后的原生图片,以及OneBot原生图片的展示尺寸由QQ客户端决定,不使用Markdown尺寸设置。无需重传图片或修改拍卖数据。
v2.20.2 修复:多群管理命令漏匹配与排查
  • 为 /设置群、/取消群设置、/群设置、/设置显示名、/通知状态、/重试通知 增加通用监听备用入口。标准命令未匹配时仍可处理明确的斜杠口令;已被框架唤醒的同名命令也适用。两入口共用事件内标记,单条消息只执行、回复一次,不按 sender_id、内容或时间去重;跨群相同内容及新发的重复命令分别处理。
  • 通用监听在框架唤醒阶段只匹配拍卖自然口令、多群管理命令和单独真实 @机器人,避免由本插件将无关闲聊唤醒并占用会话限流额度。不会更改 AstrBot 的群白名单、会话启用状态或限流配置。
  • 群设置成功回复增加实际保存的群别名及 /群设置 核对指引。多群管理命令记录 [拍卖多群命令] 开始处理、准备回复、处理结束日志,包含群会话和消息编号,不记录命令参数;意外异常有日志和核对提示。
  • 主命令仍为46个。WebUI、帮助和测试清单同步更新,无需迁移或修改已有群绑定数据。

不同群命令无回复时: event_bus 日志只证明 AstrBot 已收到消息,不证明命令已进入插件。若没有 [拍卖多群命令] 开始处理,先核对机器人当前配置的唤醒前缀(包含 /)、每个群的白名单、会话启用状态及本插件启用状态,并检查限流是否丢弃或排队。开启 DEBUG 后可查找框架停止事件传播的阶段。拍卖插件管理员名单与 AstrBot 框架管理员/群白名单不是同一项授权。

若有“准备回复”但群内没收到,继续查看 AstrBot 的回复及平台发送错误;插件“处理结束”不代表平台已投递。/通知状态只记录拍卖跨群广播,不包含 /设置群 的直接回复,不能用于重试群设置回执。可在插件设置页核对实际保存的绑定。Q群管家的“请使用新版手机QQ进行查看”是另一机器人消息,不能据此认定拍卖命令已处理。

框架行为参考:消息监听文档、唤醒检查、处理顺序、限流检查。实际配置与日志文字以部署版本为准。

v2.20.1 修复:旧身份格式导致加载失败
  • 修复“旧余额记录N的 sender_id 无效”会阻止整个插件加载的问题。兼容 QQ 官方提及标签 <qqbot-at-user id="sender_id" />;只解析明确的身份包装,不按昵称或片段猜测成员。
  • 仍无法识别的旧身份保留原始记录,并写入 balance_migration_issues 等待管理员核对;这些金额暂不计入任何成员余额。其余正常记录完成一次性加和,重载不会重复导入。/余额列表 会提示待核对数量及记录号,启动日志也会提示。
  • WebUI → 拍卖插件设置 →“旧余额迁移待核对”可查看原身份、活动和金额。确认成员归属、现有余额、其他相关记录及年龄审核后,填写正确 sender_id 和最终全局余额保存。输入为空时不自动填0;同一条记录只能处理一次。
  • 新增管理员命令 /修复余额 3#@成员#5000,也支持直接填写 sender_id。这里5000是核对后的最终全局余额,会覆盖目标成员现有余额,不是增加5000。命令只处理待核对记录,余额与处理状态在同一事务内保存,并记录处理人、金额和时间。启用多群后仅限后台群管理员使用。
  • 主命令现为46个,其中34个管理员命令;帮助、WebUI和测试清单已同步。升级覆盖当前插件后重载即可,不需要删除旧记录或修改数据库。
v2.20.0 更新:全局共享余额
  • 每个 sender_id 只有一份有效余额,所有活动共用。创建、切换、关闭或删除活动不重置该余额;身份仍按 sender_id 匹配,真实 @成员与裸 ID 互通。
  • 首次加载本版本时,将同一成员在全部旧活动中的余额相加,包含已关闭、已删除活动保留的余额。例如活动A为1000、活动B为2000,升级后全局余额为3000。同一活动内因旧提及包装形成的重复记录取最后一次录入值,再跨活动相加。
  • 迁移与完成标记在同一事务内提交;中途异常整体回滚。重载、再次升级、修改或清空余额后均不会重新累加。无效旧金额会中止迁移,不静默丢弃。
  • 管理员 /录入余额 @成员#5000 将该成员的全局余额设置为5000,不是再增加5000;查询和名单读取这份全局记录。/清空余额 清空所有成员、所有活动共用的余额及审核,影响全部活动。启用多群时仍限后台管理员操作。
  • 出价校验使用跨活动的当前目高合计:余额必须≥合计的70%;本人对同一稿位加价用新价替换旧价。已有目高的暂停活动、未上新稿位仍占用额度;稿位截止、回收或所属活动删除后不占用。成交不自动扣减余额,沿用现有规则。
  • 年龄审核沿用该成员最后一次录入的审核状态;未审核时仍无法出价。普通成员只能查询自己的审核状态,不显示余额金额。金额继续使用普通十进制数字。
  • /功能、WebUI 和完整测试命令同步更新,主命令仍为45个。升级迁移在安装后首次加载时执行,无需手动修改数据库。

迁移核对:有效余额在 member_balances;一次性完成标记在 balance_migrations;每位成员的汇总金额、来源活动和采纳记录保存在 balance_migration_records。旧表 activity_balances 仅作为历史来源保留,业务不再读写,也不会在清空后恢复其金额。可由管理员通过 /查询余额 sender_id 或 /余额列表 核对当前余额。

v2.19.0 更新
  • 新增前台/后台群与活动绑定。前台共享出价、批次和当期余额审核;成功出价、上新、半小时提醒、截止及回收同步活动的全部前台群。后台不接收这些公共广播。
  • 超价提醒只在前一次最高出价的来源前台群真实 @;自己加价不提醒。成交、回收及撤回的个人提醒也使用出价来源,不向无关群 @成员。失败出价只回复原群;余额管理仅限后台管理员。
  • 公共出价历史和目高显示普通昵称,不触发 @。显示名优先级:管理员指定、平台昵称、稳定参拍编号;重名加编号。权限和余额仍只按 sender_id 判断,不合并同名成员,不反查 QQ 号。
  • 增加持久化通知队列:按群、按消息段保存进度,重启恢复,最多自动尝试3次,失败后可手动重试。通知重试不重复执行竞价或截止;网络超时仍可能造成重复投递。“平台已接受”不代表成员已读。
  • WebUI“拍卖插件设置”增加协同开关、已登记群绑定、最近200位成员显示名和最近100条通知状态;/功能与网页指南覆盖45个主命令、33个管理员命令。/我的稿位继续纯文字展示。
多群配置示例

先创建活动“秋拍”,再由管理员分别在三个目标群发送:

/设置群 前台#秋拍#A群
/设置群 前台#秋拍#B群
/设置群 后台#秋拍#管理群

首次绑定自动开启多群协同。后台录入全局余额,成员在前台发送 给1号出价 1000。绑定后无显式活动名的命令使用本群绑定活动,不会因创建新活动而切换。不同活动可以分别绑定不同群;同一活动仅接受同一个机器人平台连接。

/群设置
/设置显示名 @成员#小明
/设置显示名 member_openid#清空
/通知状态
/重试通知 12
/取消群设置

以上六种新命令均仅管理员可用,@成员必须使用真实提及。未获取平台昵称时使用参拍编号;旧出价无来源群记录时不猜测该成员所在群。跨群成员可用 /我的ID 核对 sender_id 是否一致;若平台返回不同值,视为不同身份,需分别审核。QQ 官方主动跨群发送和 Markdown 图片显示受实际机器人适配器与平台能力影响,需要按 TEST_COMMANDS.md 在测试群验收。

升级默认仍为单群模式;首次绑定或打开配置项 multi_group_enabled 后启用协同。启用后未绑定群不能执行活动相关命令,帮助、身份查询和管理员绑定命令仍可用。关闭协同会暂停待发队列;再次开启后继续发送。解除群绑定或改为后台会取消其未发送通知。删除全部绑定不会自动关闭开关。

下面为历史版本记录,当前用法以本节、/功能和网页指南为准。

v2.18.0 更新
  • /我的稿位、自然口令 我的稿位 改为纯文字回复,不显示图片、图片链接或缺图提示,也不调用图床。保留“已截止”和“未截止目高稿位”分组,以及活动名、序号、名称、金额和备注。
  • /我上传的稿位、单稿位查询、批次查询等命令继续使用原图文回复方式。帮助、WebUI 和测试清单同步更新。
v2.17.0 更新
  • /我的稿位(也可不加斜杠)先显示“已截止”:本人成交的稿位;再显示“未截止目高稿位”:当前最高出价为自己的未截止稿位。两组均包含历史活动记录,空组显示“暂无”。
  • 每项以“x号 稿位名 金额”展示,已截止组金额为成交价,未截止组金额为当前目高;活动名、备注和例图继续保留。被超价、撤回后不再领先、已回收或无人出价的稿位不计入。
  • /功能、WebUI 及测试清单同步说明分组规则,/我上传的稿位 继续查询上传记录。
v2.16.0 更新
  • 群内单独使用 QQ 的真实 @功能提及机器人,会回复下方快捷口令。@后带命令时执行原命令;提及其他成员、全体成员或普通私聊不触发快捷说明。
  • /功能、/帮助、/help 保持覆盖全部39个主命令,补齐按记录号恢复、指定序号添加、替换空号及个人查询的用法提示;WebUI 与测试清单同步。
  • 我的稿位、我上传的稿位 支持不加斜杠直接查询;与带斜杠版本使用同一查询逻辑和图文回复方式。
  • 本次快捷说明保留指定的星号;其他消息仍遵循既有规则。

单独 @机器人的回复:

🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额
v2.15.0 更新
  • 新增管理员命令 /替换稿位 [活动名#]新稿位序号#目标空序号。例如 /替换稿位 99#69 将新99号移到空缺的69号,保留新稿位的内部记录、图片、画师、价格、备注、批次及定时。原99号释放,普通添加优先使用已释放的空位(多个时按序号从小到大),重载后仍有效。
  • 添加稿位支持显式指定空号:/添加稿位 [活动名#]序号=69#稿位名#画师名#起拍价[#回收价],仍须附1张例图。既可使用从未占用的序号,也可使用已删除稿位留下的空号;已有记录(包括已截止、已回收)不能覆盖。
  • 替换仅允许无任何出价历史、尚未截止且未回收的稿位。普通成员无权操作;序号分配、替换、恢复和出价使用同一写锁,冲突或失败时不覆盖其他稿位。
  • 普通删除保留的序号仍不会被普通添加自动占用;明确指定该序号或执行替换可以重新使用。旧删除快照继续保留,原编号被占用时恢复会拒绝。同一编号有多份快照时,用 /已删除稿位 查询恢复记录号,再发送 /撤销删除 记录=123 精确选择。
  • 这两种补号方式不恢复旧稿位的出价历史。指定添加沿用新增稿位的默认批次和定时设置,替换沿用新稿位自身的批次和定时,均不会猜测或继承旧稿位的关联数据。
v2.14.0 更新
  • 新增管理员命令 /已删除稿位 [活动名] 和 /撤销删除 [活动名#]稿位序号。删除和快照保存位于同一事务,重载插件后仍可恢复。
  • 恢复原编号、名称、价格、画师、备注、上传者和例图引用。编号、名称或记录标识冲突时拒绝覆盖,删除快照继续保留。新增稿位会跳过历史删除记录占用的序号。
  • 恢复时不重新启动旧截止、回收和提醒任务,请重新设置定时。仍在的批次按当前上新状态恢复;原批次不存在时解除旧关联并将可竞拍稿位恢复为筹备中,需要重新分批。原已回收状态保持已回收。
  • 此功能只适用于v2.14.0起保存的删除快照。旧版本已经误删的69号无法凭升级自动重建,需提供误删前的数据库备份检查、单独恢复目标记录,不能用旧库整体覆盖当前库。图片恢复依赖原文件或图床链接仍可用。
v2.13.0 更新
  • 修复数字序号不存在时回退到数据库内部 ID 的错误。例如当前活动没有99号,但内部 ID 99 对应69号时,旧逻辑会选错稿位。现在数字只匹配当前活动内序号,找不到就拒绝;修改、备注、查询、出价、定时、撤回、截止及回收同步采用严格匹配。
  • /删除稿位 序号/完整名称 先显示活动、序号、名称、状态及例图预览,不立即删除。管理员核对后,按返回的 /删除稿位 确认 确认码 在5分钟内、同一会话中确认。每次新预览使本人的旧码失效,确认码只能使用一次,重载插件后失效。
  • 有任何出价记录(含已撤回记录)、当前出价或已截止的稿位禁止直接删除;需要停止竞拍时使用回收并保留记录。确认时重新检查目标和出价,期间稿位或所属活动信息变化会拒绝删除。
  • 确认绑定原始记录,不会因创建新活动或同序号稿位被重新添加而选中别的稿位。删除与出价串行执行;失败时整体回滚,成功后取消该稿位关联定时,其他稿位不重新编号。发现重复序号也会拒绝数字匹配,需核对后使用完整名称操作。
v2.12.0 更新
  • 原 /我的稿位 的上传记录查询迁移至 /我上传的稿位,继续显示自己在所有活动中上传的稿位。
  • /我的稿位 改为查询所有活动中当前最高出价为自己的稿位,包括尚未截止的稿位及已成交稿位,按活动展示序号、名称、状态、目高或成交价、备注和例图。被超价、撤回后不再持有目高、已回收或无人出价的稿位不计入。
  • 两条命令均可由普通成员使用,只查询发令者自己的记录;沿用 sender_id 身份和现有多图文混排方式,无需重新录入历史数据。
  • 余额录入、修改、查询与名单统一显示完整十进制数字,例如 1000000、1234567.89,不再出现科学计数法或六位有效数字截断。
v2.11.0 更新
  • 新增管理员口令 /设置备注 稿位号#内容,覆盖原备注;/设置备注 1#清空 可删除备注,旧的 /修改稿位 1#备注#内容 仍有效。
  • 备注统一显示于单稿位查询、出价成功提示、批次目高、批次查询、上新提醒、稿位列表和我的稿位。
  • 定时截止/回收提前30分钟向设置定时的会话发送提醒。设定时不足30分钟立即提醒;回收提醒和回收结果 @当前最高出价者,无人出价时不 @。
  • 截止前5分钟内每次有效出价,将当前截止时间再延长5分钟,不限次数;出价提示显示新截止时间。回收和无效出价不触发延期。
  • 延期同步更新数据库调度任务,避免旧计时器提前截止;活动总截止会等待已经触发延期的稿位。旧定时自动补建提醒;重复重载不重复发送已完成的提醒。
  • 取消或改设定时、手动截止/回收、删除稿位或关闭/删除活动时,同步取消关联的旧提醒。回收提醒保留指定符号;v2.16.0起的 @快捷说明也保留指定星号,其他回复不添加 emoji。
v2.10.0 更新
  • 支持单条消息包含多张稿位图片,并按照“稿位文字 → 对应例图”交错显示,不再把整批图片合成为一张总览图。
  • /查询批次、/查询批次目高、自然口令批次查询、批次上新提醒、/稿位列表 和 /我的稿位 全部启用多图文混排。
  • QQ 官方平台通过 S.EE 逐张托管后写入同一条 Markdown;OneBot v11 使用一条含多个 Plain 与 Image 组件的消息链并保留顺序。
  • 单张图床上传失败时,其余图片仍正常显示,失败图片另外使用平台原生方式发送。
v2.9.0 更新
  • QQ 官方平台的 S.EE 单条图文不再依赖成员提及。查询尚未出价或已有出价的稿位都会用同一方式把文字和图片合并为一条 Markdown。
  • 添加稿位确认、查看稿位、查询批次、批次目高、查询目高、设置全场批次图确认、出价成功和定时上新均接入同一图文发送路径。
  • S.EE 上传失败时保留平台原生图文回退,避免图片丢失。
v2.8.0 更新
  • WebUI Pages 新增统一的“拍卖插件设置”页面,管理员、S.EE 和 MinIO 全部配置可在同一页查看和保存。
  • S.EE API Token 与 MinIO Secret Key 使用密码框;读取页面时不回传密钥明文,留空保存会保留原值,只有勾选清除选项才会删除。
  • MinIO 改为使用 AstrBot 插件配置并可立即刷新;旧版 config.yaml 仍作为兼容回退。
  • _conf_schema.json 与统一设置页保持同一组配置项,也可继续使用 AstrBot 的标准插件配置入口。
v2.7.0 更新
  • 新增 S.EE 图床支持。QQ 官方消息同时包含成员提及和图片时,插件上传图片并把 HTTPS 直链嵌入同一条 Markdown,实现文字、@成员和图片单条发送。
  • S.EE 直链按图片内容哈希缓存在插件数据目录;同一稿位图或批次总览图不会在每次查询时重复上传。
  • S.EE 未配置或上传失败时自动回退为文字与图片两条消息,保证信息仍能发送。OneBot v11 继续使用原生 At 和图片组件。
  • API Token 通过 AstrBot 插件配置填写,不写入源码和安装包。
v2.6.0 更新
  • QQ 官方平台改用 Markdown 的 <qqbot-at-user id="openid" /> 成员标签,并显式启用 AstrBot Markdown 发送。
  • QQ 官方 OpenID 无法通过官方接口反查真实 QQ 号;插件继续只使用 sender_id,不建立 QQ 号映射。
v2.5.0 更新
  • 群消息中的成员身份统一显示为 @成员,覆盖管理员增删与列表、余额录入与查询、出价历史、稿位与批次目高、撤回通知、超价提醒和成交提醒。
  • OneBot v11 使用 AstrBot 标准 At 组件;QQ 官方机器人根据 sender_id 输出 Markdown 成员标签,避免当前 qq_official 适配器忽略 At 组件。
  • 定时任务会保存消息平台类型,使批次上新、自动截止和活动结束后的主动提醒也使用对应平台的 @方式。
  • /我的ID 是唯一保留原始 sender_id 的群命令,用于 WebUI 管理员配置和排障;权限不足提示不再公开 ID。
v2.4.1 更新
  • 删除所有机器人被动回复和主动通知中的 emoji,成功、失败、警告、状态和帮助分组均改用纯文字。
v2.4.0 更新
  • 查询批次及批次目高均附该批次例图;整批文字与按序号排版的例图总览合在一条消息内。查询全部批次时,每批一条。
  • 批次定时上新时,向设置该批次时间的会话发送一条整批提醒,包含稿位序号、稿位名、画师名、起拍价、回收价与例图。
  • 查看稿位不再展示定时、上传者、创建时间。
  • 从真实消息链读取 @成员的 sender_id,和直接填写 sender_id 共用当期审核记录;升级自动合并旧的 <@sender_id> 包装记录,以最近一次录入为准。
  • 出价失败提示不展示余额、所需余额或出价占用合计。

列表和批次消息会把每个稿位的文字与对应例图依次排列;缺失或无法读取的例图会标注对应序号。配置 S.EE 后,QQ 官方平台会把多段文字、多张图片及可能存在的 @成员合成一条 Markdown;单张图片上传失败时会单独回退为平台原生图片。定时提醒需要平台允许向目标会话主动发送消息。

安装

  1. 将 cym_auction 文件夹放入 AstrBot 的 data/plugins/ 目录
  2. 安装依赖:pip install -r requirements.txt
  3. 在插件 Pages 打开“拍卖插件设置”,配置管理员,并按需填写 S.EE 或 MinIO
  4. 在 WebUI 面板中启用插件

本插件要求 AstrBot 4.24.2 或更高版本。成员身份统一使用 AstrBot 消息事件提供的 sender_id:QQ 官方机器人通常为 openid,OneBot v11(aiocqhttp,例如 NapCat)通常为数字用户 ID。插件不会做额外的身份转换。

公开出价历史和目高使用昵称文字;个人超价、成交、回收等提醒将 sender_id 渲染为真实 @成员。aiocqhttp 使用 AstrBot 的 Comp.At;qq_official 使用 <qqbot-at-user id="openid" /> 并强制启用 Markdown,因为当前 AstrBot QQ 官方适配器会忽略 At 组件。QQ 官方群消息接口没有独立的 mentions 字段,最终是否产生通知由 QQ 官方客户端和接口能力决定。/我的ID 会有意显示原始值,供成员交给管理员配置。

QQ 官方平台只向机器人提供该应用范围内的 OpenID。OpenID 不能可靠转换或反查为真实 QQ 号,不同机器人应用取得的 OpenID 也可能不同,因此插件不会尝试反推 QQ 号。

MinIO 配置

在 AstrBot WebUI 的“插件 → 拍卖系统 → Pages → 拍卖插件设置”中填写服务地址、Access Key、Secret Key、存储桶、HTTPS、Region 和公开访问 URL。以下旧版 config.yaml 写法仍可作为兼容回退:

minio:
  endpoint: "play.min.io"          # MinIO 服务地址
  access_key: "YOUR_ACCESS_KEY"    # Access Key
  secret_key: "YOUR_SECRET_KEY"    # Secret Key
  bucket: "auction-images"         # 存储桶名称
  secure: true                     # 是否 HTTPS
  public_base_url: ""              # 公开访问 URL(可选)

若不配置 MinIO,稿位例图会落盘到插件数据目录。

S.EE 图床配置

在 AstrBot WebUI 的“插件 → 拍卖系统 → Pages → 拍卖插件设置”中填写 S.EE API Token。图片链接域名可留空,上传接口保持默认值。保存后新客户端立即生效。也可在 AstrBot 的标准插件配置中填写同名字段。

Token 只保存在 AstrBot 的插件配置数据中,不应填写进 config.yaml、源码或公开安装包。S.EE 用于 QQ 官方平台的全部图文消息;图片上传失败时插件自动使用平台原生图文回退。

命令列表

当前版本共有 46 个主命令,其中 34 个为管理员命令。在群内发送 /功能、/帮助 或 /help 可查看同步的功能列表。插件 WebUI Pages 中提供“拍卖插件设置”和“功能与测试指南”两个页面。

管理员配置

管理员只按平台 sender_id 识别,可通过以下入口维护:

  • AstrBot WebUI → 插件 → 拍卖系统 → Pages → 拍卖插件设置,可直接添加、删除并保存。
  • AstrBot WebUI → 配置 → 插件配置 → admins,每行填写一个 sender_id。
  • 群内由现有管理员发送 /添加管理 sender_id;使用 /删除管理 sender_id 移除授权。

AstrBot 的角色标记不会绕过此列表。普通成员不会因为管理员列表为空而自动获得权限。/管理列表 仅管理员可查询,列表中的成员以 @方式显示。

成员可发送 /我的ID 或 /我的sender_id 查询自己的值。例如机器人回复 你的 sender_id:member_openid 后,管理员可发送 /添加管理 member_openid 授权,或发送 /录入余额 member_openid#10000 完成全局余额与年龄审核。

所有以 sender_id 为参数的命令都兼容直接 @成员。QQ 官方机器人消息中的 <@7FCACA8BA399674102AD0361A62082E4> 会自动解析为 7FCACA8BA399674102AD0361A62082E4。例如:

/添加管理 @成员
/删除管理 @成员
/录入余额 @成员#10000
/查询余额 @成员
/撤回出价 12#@成员#3000
权限命令 说明
/我的ID 查看自己的 sender_id,别名 /我的sender_id、/sender_id
/添加管理 sender_id或@成员 添加插件管理员
/删除管理 sender_id或@成员 删除插件管理员
/管理列表 查看当前管理员来源和添加时间

除 /我的ID 外,机器人不会在群消息中直接打印成员 sender_id。管理员确认和余额名单保留 @成员;公开出价记录与目高显示昵称文字。

活动管理
命令 说明
/创建活动 活动名#开始时间#结束时间 创建活动并安排自动开始/结束
/修改活动 活动名#名称/开始时间/结束时间#新值 修改活动并重排定时任务
/开启活动 活动名 开启活动
/关闭活动 活动名 关闭活动
/删除活动 活动名 删除活动
/活动列表 查看所有活动
稿位管理
命令 说明
/添加稿位 [活动名#][序号=69#]稿位名#画师名#起拍价[#回收价] +图 添加稿位,需1张例图;不指定时优先使用替换释放的空号,再顺延
/替换稿位 [活动名#]新稿位序号#目标空序号 例如 99#69:将无出价的99号移到空缺69号,原99号可供后续添加使用
/修改稿位 稿位名/序号#字段#新值 修改稿位(名称/画师/起拍价/回收价/备注/图)
/设置备注 稿位号#内容 新增或覆盖备注;/设置备注 1#清空 删除备注,仅管理员可用
/删除稿位 序号/完整名称 预览删除目标;仅限无出价记录且未截止的稿位
/删除稿位 确认 确认码 按预览提示,在5分钟内由同一管理员在同一会话确认;复用同一主命令
/已删除稿位 [活动名] 管理员查看可恢复的删除记录;默认当前活动
/撤销删除 [活动名#]稿位序号 管理员恢复原编号;多份快照用 记录=123 代替稿位序号精确选择;不会覆盖已有稿位或恢复旧定时
/稿位列表 [活动名] 查看活动稿位,文字与各稿位例图交错显示
/我的稿位 纯文字分为“已截止”(本人成交)和“未截止目高稿位”(本人当前领先)两组;显示序号、名称、金额、活动和备注,不显示图片,空组显示“暂无”;可不加斜杠
/我上传的稿位 查看自己在所有活动中上传的稿位,文字与各稿位例图交错显示
/查看稿位 稿位名/序号 查看稿位详情及例图

数字只表示当前活动中的稿位序号,不是数据库内部 ID;缺号或超出已有序号时不会改查其他稿位。名称必须完整匹配。删除成功会明确回复活动、序号和名称;已有出价记录的稿位不能通过先撤回出价来绕过删除限制。

批次管理
命令 说明
/稿位分批 10 按稿位序号分批,每批最多10个
/设置批次时间 1#09-10 15:00 设置批次定时上新;到时发送整批多图文提醒
/设置全场批次图 + 图片 设置查询目高时展示的批次图
查询批次 / 查询批次1 查询全部或指定批次,每个稿位后显示对应例图
查询批次1目高 查询指定批次全部目高,多张例图与文字交错显示
查询目高 显示查询引导、全场批次和批次图
余额与资格

录入余额表示管理员已经同时完成该成员的余额和年龄审核。每个 sender_id 只有一份余额,所有活动共享。

对同一成员再次 /录入余额 即覆盖全局余额。录入、修改、查询和余额列表中的金额均使用完整十进制显示,例如 1000000,不会显示为 1e+06。

命令 说明
/录入余额 sender_id#金额 管理员录入或覆盖全局余额,例如 /录入余额 member_openid#10000
sender_id录入余额金额 上一口令的无斜杠写法,如 member_openid录入余额10000
/查询余额 sender_id / 查询sender_id余额 管理员查询成员余额,例如 /查询余额 member_openid
/余额列表 管理员查看全局审核名单及旧余额待核对提示
/修复余额 3#sender_id或@成员#5000 核对旧记录3后,将目标全局余额设为最终值5000并确认年龄审核;多群时仅后台管理员可用
/清空余额 管理员清空所有成员的全局余额及审核,影响全部活动
查看我的余额 成员确认自己的审核状态(不公开金额)
出价、撤回与成交

余额必须不少于该成员在所有活动的未截止、未回收目高稿位上出价合计的 70%。被超价后,该稿位不再占用余额。

余额不足时仅回复:“出价失败!余额需≥全部当前目高出价合计的70%。”不会在这条群内提示中公开具体余额、所需余额、占用金额或附加说明。

命令 说明
给1号出价 1000 群内快速出价,成功后显示例图与历史出价
/出价 1 1000 斜杠兼容口令
/撤回出价 12#sender_id或@成员#3000 管理员撤回指定成员的该笔价格及其后的全部出价
/设置定时 12#09-10 22:00#截止/回收 定时截止或回收
/取消定时 稿位名 取消定时
/截止稿位 13 立即截止并通知成交成员
/回收稿位 13 立即回收稿位

支持平台

  • QQ 官方机器人 API(qq_official):使用平台 openid 作为 sender_id;配置 S.EE 后把所有图文回复合并为一条 Markdown,公共名单显示昵称,个人提醒保留真实 @,失败时回退为平台原生图文
  • OneBot v11(aiocqhttp):使用适配器返回的用户 ID 作为 sender_id,公开名单显示昵称;个人提醒使用 AstrBot At 组件

完整测试

按 TEST_COMMANDS.md 的顺序可覆盖全部命令、别名、自然口令、权限拒绝和主要失败分支。

返回文档入口

历史测试清单原文(v2.20.4)

历史原文,完整保留。以下为标题所示版本当时的说明,不代表当前可执行命令。身份查询命令已移除,管理员改用成员选择;现版本所有图床图片均使用缩略尺寸,分批支持指定活动。实际操作请看当前完整指南与当前测试命令。

cym_auction 完整测试命令

本清单对应 v2.20.4,覆盖 46 个主命令、4 个别名和全部自然口令。请在专用测试群按顺序执行。仅 @快捷说明和回收提醒保留指定符号,其他机器人消息不添加 emoji。

多图缩略展示与图文分段(v2.20.4)

在QQ官方测试群启用S.EE,准备至少2张大例图,包含长竖图和横图。使用已有测试活动中包含多张例图的批次:

查询批次1
查询批次1目高
/稿位列表
/我上传的稿位
查询1号稿位
/我的稿位

预期:前四项的同一条消息内,所有例图等比缩至最长边240像素,文字及图片顺序完整,无裁剪和额外图片消息;每张图片独立成段,与前后的文字及相邻图片分行,不出现同一行混排。单稿位查询保留单图尺寸且图文分段;我的稿位不带图片。在专用测试活动设置批次上新时间后,上新提醒及各前台同步消息采用相同缩略展示和分段。

给测试稿位设置较长名称及多行备注后重复查询,确认备注、例图、下一稿位文字分隔清楚;完成一次有效出价,确认成功提示与例图分段。未配置图床或上传失败时,原生图片前后同样添加换行,最终排列以QQ客户端为准。

在标准插件配置和Pages“拍卖插件设置 → S.EE 图床”均能找到“多图消息图片最长边”。Pages改为160后保存、重新读取并再次查询,多图最长边应为160;小于上限的原图不放大。0、721或小数应拒绝保存。单图保持原尺寸,旧图片无需重传。已发送消息及已经缓存的待重试通知不变;图床失败回退的原生图片尺寸由QQ客户端决定。测试结束恢复240。

测试前准备

  1. 在 AstrBot WebUI 进入“插件 → 拍卖系统 → Pages → 拍卖插件设置”,将测试管理员的 sender_id 保存进列表;需要测试 QQ 官方单条图文时,在同一页填写 S.EE API Token。
  2. 准备管理员、成员 A、成员 B 三个账号,以及三张测试图。
  3. 文档中的 @A、@B、@TEST_ADMIN 要用 QQ 的真实 @功能选中对应成员;也可改成对方的完整 sender_id。
  4. 带“+图片”的命令要在同一条消息中附上 1 张图片。

1. 功能、别名与身份

/功能
/帮助
/help
/我的ID
/我的sender_id
/sender_id

预期:三个帮助口令都显示当前功能;三个身份口令都返回同一个 sender_id。

帮助中应包含近期新增或调整的 /设置备注、/我的稿位、/我上传的稿位、/已删除稿位、/撤销删除 记录=123、/替换稿位 99#69、/添加稿位 序号=69#...,以及删除确认、30分钟提醒和5分钟延期说明。

@机器人快捷说明(v2.16.0)
  1. 群内通过真实 @功能选中机器人,单独发送,或只在前后加空格、换行。应只收到一条以下内容(包含星号):
🌟出价口令
给x号出价[空格]xxx
🌟查询口令
查询x号稿位 / 查询批次x/ 查询批次x目高 / 查询目高/我的稿位
🌟余额
查看我的余额
  1. 发送 @机器人 查询1号稿位、@机器人 给1号出价 1000、@机器人 /功能,应执行对应命令,不额外弹快捷说明。出价测试需要先完成下方活动、稿位和余额准备。
  2. 发送 @机器人 给1号出价错误,应收到正确出价示例;单独 @其他成员、@全体成员、普通消息和私聊不应触发这份快捷说明。
  3. 直接发送 我的稿位、我上传的稿位,与 /我的稿位、/我上传的稿位 返回内容一致。带 @机器人再次查询时也应只回复一次。
  4. 管理员发送不完整的 /添加稿位 稿位名、/撤销删除,用法提示应分别包含 序号=69、记录=123;不得改变数据。

2. 管理员权限

/添加管理 @TEST_ADMIN
/管理列表
/删除管理 @TEST_ADMIN

再让普通成员执行:

/管理列表
/创建活动 无权限测试#2099-01-01 00:00#2099-12-31 23:59

预期:普通成员被拒绝,提示其使用 /我的ID 获取后台配置所需 ID,但权限提示本身不显示原始 ID。不要删除当前唯一可用的管理员。

3. 活动管理

/创建活动 功能测试拍卖#2099-01-01 00:00#2099-12-31 23:59
/活动列表
/修改活动 功能测试拍卖#名称#功能测试拍卖V2
/修改活动 功能测试拍卖V2#开始时间#2099-01-02 00:00
/修改活动 功能测试拍卖V2#结束时间#2099-12-30 23:59
/开启活动 功能测试拍卖V2
/关闭活动 功能测试拍卖V2
/开启活动 功能测试拍卖V2

4. 稿位新增、修改与查询

以下三条均要附 1 张图片:

/添加稿位 功能测试拍卖V2#测试稿位A#测试画师A#100#1000
/添加稿位 功能测试拍卖V2#测试稿位B#测试画师B#200
/添加稿位 功能测试拍卖V2#测试稿位C#测试画师C#300#3000

预期:稿位自动编为 1、2、3 号;B 的回收价显示“不透露”。继续执行:

/稿位列表 功能测试拍卖V2
/我上传的稿位
/查看稿位 1
查询1号稿位
/修改稿位 1#名称#测试稿位A改
/修改稿位 1#画师#测试画师A改
/修改稿位 1#起拍价#120
/修改稿位 1#回收价#1200
/修改稿位 1#备注#这是功能测试备注
/设置备注 1#可加购背景,工期两周

下一条附上新图片:

/修改稿位 1#图#替换例图

删除命令在结尾用临时稿位测试,避免影响后续竞价。

5. 批次与目高

/稿位分批 2
/设置批次时间 1#<当前时间后1分钟>
/设置批次时间 2#<当前时间后1分钟>
/查询批次
/查询批次 1
查询批次
查询批次1
/查询批次目高 1
查询批次1目高

将占位时间替换为当前时间之后的同一个时间,例如 2026-09-09 23:10。设置后先在上新前尝试出价,预期被拒绝;等两个批次自动上新后再继续。下一条要附 1 张批次总览图:

/设置全场批次图
/查询目高
查询目高

上新时预期每个批次各收到一条消息,内含该批次全部稿位的序号、名称、画师名、起拍价、回收价及对应例图。文字和多张例图按照稿位顺序交错出现。上面的查询批次、查询批次目高命令也须采用相同排版;正常情况下同一批次不能拆成多条消息。

6. 全局余额与年龄审核

/录入余额 @A#1000
/录入余额 @B#10000
/查询余额 @A
查询@A余额
/余额列表

由成员 A 执行:

/查看我的余额
查看我的余额

再测试无斜杠录入(管理员发送):

@A录入余额1200

7. 出价成功与失败

成员 A 发送:

给1号出价 120
/出价 1 500
给2号出价 1300

第一条应等于起拍价并成功;第二条为斜杠出价;第三条使 A 在 1、2 号稿位上的目高合计达到 1800,所需余额为 1260,应因 A 只有 1200 而失败。

第三条失败提示只能说明 70% 规则并引导联系群主,不得出现 1800、1260、1200、已录余额或占用明细。

成员 B 发送:

给1号出价 800
给1号出价 800

预期:第一条成功并通知上一位出价者;第二条因小于或等于目高失败。再用未审核成员出价,应得到“没有查询到有效余额”提示。

8. 撤回、定时、截止与回收

/撤回出价 1#@B#800
/设置定时 1#2099-06-01 22:00#截止
/取消定时 1
/设置定时 2#2099-06-01 22:00#回收
/取消定时 2
/截止稿位 1
/回收稿位 2

预期:撤回 B 的 800 及其后出价,并 @所有参与者;截止 1 号时通知成交成员;2 号显示已回收并禁止后续出价。

9. 清理命令

清理前还可执行文末的 v2.12.0 个人稿位与余额显示测试。

先附图新增临时稿位,再删除:

/添加稿位 功能测试拍卖V2#待删除稿位#测试画师#100
/删除稿位 待删除稿位

预期只显示预览。核对活动、序号、名称及例图,复制机器人返回的 /删除稿位 确认 确认码,在5分钟内由同一管理员在同一会话发送。收到包含活动、序号及名称的成功回复后再执行:

/清空余额
/关闭活动 功能测试拍卖V2
/删除活动 功能测试拍卖V2

错误口令回归

给1号出价
查询批次x
查询x号稿位
/创建活动 参数不足
/录入余额 @A
/撤回出价 1#@A
/设置备注 1

预期:每条都明确说明失败原因,并给出正确口令示例。

v2.7.0 身份互通、S.EE 单条图文与详情回归

在上文清理活动之前执行。先让 A 发送 /我的ID,将回复的完整值替换下面的 A_SENDER_ID;@A 要在 QQ 成员列表中实际选中。

/录入余额 A_SENDER_ID#1000
/查询余额 @A
/录入余额 @A#2000
/查询余额 A_SENDER_ID
查询@A余额
@A录入余额3000
/查询余额 A_SENDER_ID
/余额列表

预期:查询分别读到最近录入的值,余额列表中 A 只有一条记录。由 A 发送 /查看我的余额 应显示审核有效;满足批次、活动和金额条件时可正常出价。

先在 Pages 的“拍卖插件设置”中填写 S.EE API Token 并保存。管理员确认、余额查询与列表保留真实 @;公开出价历史、稿位目高、批次目高只显示昵称文字,不应触发 @或直接打印 sender_id。个人超价、成交、回收、撤回提醒保留真实 @。/我的ID 用于取得原始身份值。QQ 官方查询已有出价的稿位或批次时,应在同一条消息内显示完整文字、昵称和图片,不能显示原始提及标签。S.EE 上传失败时允许回退为一条文字和一条图片。OneBot v11 应发送标准群 @。QQ 官方 OpenID无法反查真实 QQ 号。

/查看稿位 1
查询1号稿位

预期:两种详情均保留序号、名称、状态、画师、起拍价、回收价、目高及例图;不显示定时、上传者、创建时间。批次 1 两个例图均显示正确序号;修改例图后再次查询应展示新图。

v2.8.0 统一设置页回归

打开“拍卖插件设置”,确认同一页面内完整显示以下区域和设置:

  • 管理员 sender_id
  • S.EE API Token、上传接口、图片链接域名、上传超时
  • MinIO 服务地址、Access Key、Secret Key、存储桶、HTTPS、Region、公开访问 URL

填写 Token 后保存,再重新读取页面。预期 S.EE 状态显示“已配置”,密码框保持空白;直接再次保存不会清除 Token。只有勾选“清除已保存的 Token”并保存后,状态才变为“未配置”。MinIO Secret Key 行为相同。

v2.9.0 统一图文回归

在 QQ 官方平台配置 S.EE 后,分别选择一个从未有人出价的稿位和一个已有目高的稿位执行:

/查看稿位 1
查询1号稿位
/查看稿位 2
查询2号稿位
/查询批次 1
/查询批次目高 1
/查询目高

预期:上述命令只要有例图,就始终把全部文字和图片放在同一条消息中。无出价稿位与有出价稿位的排版和图片显示方式一致,差别只在目高状态;有出价人时还应正常 @当前出价人。添加稿位成功和设置全场批次图成功后的确认消息也应采用同一图文方式。OneBot v11 继续使用原生文字与图片消息链。

v2.10.0 多图片混排回归

确保批次 1 至少有两个带不同例图的稿位,再执行:

/稿位列表 功能测试拍卖V2
/我上传的稿位
/查询批次 1
/查询批次目高 1
查询批次1
查询批次1目高

预期:每条列表消息按稿位顺序显示文字和对应例图,例如“1号文字、1号图、2号文字、2号图”。QQ 官方平台应在一条 Markdown 消息中显示多张图片;OneBot v11 应在一条消息链中显示多张图片。删除其中一张本地例图后重试,应标明缺失稿位,其他稿位的图片继续显示。

v2.11.0 备注、半小时提醒与自动延期

在测试活动清理前执行。下面的时间示例需要换为服务器当前时间之后,不能直接使用过去的时间。

管理员添加、覆盖和清除备注:

/设置备注 1#可加购背景,工期两周
/查看稿位 1
查询1号稿位
/查询批次目高 1
查询批次1目高
/稿位列表
/我上传的稿位

预期:每处都显示同一备注。让余额充足的成员有效加价,成功消息也应显示该备注。普通成员发送 /设置备注 1#修改 应被拒绝。管理员可再次用同一命令覆盖备注,旧的 /修改稿位 1#备注#新内容 仍有效;/设置备注 1#清空 后,各处不再显示备注。

/设置定时 1#2026-10-01 20:00#截止
/设置定时 2#2026-10-01 20:00#回收

假设以上为未来时间,预期19:30在设置口令所在群出现提醒。截止提醒包含序号、稿位名、完整日期和时间,以及以下提示:

1号稿位「测试稿位A改」将于2026-10-01 20:00自动截止
想打的板板尽快摸摸哦
截止前5分钟内每次有效出价,当前截止时间再延迟5分钟,不限次数。

回收提醒先 @当时的最高出价者,再显示:

2号稿位「测试稿位B」将于2026-10-01 20:00自动回收
老板们可以私信群主询问♻价,摸一把带走~

快速测试可将时间设在当前时间后10分钟,预期立即收到一次提醒。回收稿位没有出价人时,不应出现空 @或原始 sender_id。

延期测试:将截止设在当前时间后4分钟,然后让余额充足的成员出高于目高的价格。预期成功消息显示“延长5分钟”和新的完整截止时间;此时低于或等于目高、余额不足等失败出价不能再次延期。在新的最后5分钟继续有效加价,截止时间继续加5分钟,连续超过3次也应有效。到原截止时间不能成交,必须等最新截止时间到达。定时回收在最后5分钟出价不能延期。

取消和恢复测试:取消定时、把截止改为回收、手动截止/回收、删除稿位或关闭活动后,不能再收到旧的半小时提醒或旧的截止通知。设置未来任务后重载插件,提醒应恢复;已发送的提醒再次重载或延期后不能重复发送。若停机期间定时已经到期,只执行截止/回收,不补发已经失效的半小时提醒。

我的稿位与上传记录(v2.18.0 纯文字分组展示)

在清理前执行,使用新稿位避免影响前面的测试。管理员分别附图发送:

/添加稿位 功能测试拍卖V2#个人列表测试A#测试画师#100
/添加稿位 功能测试拍卖V2#个人列表测试B#测试画师#100
/设置备注 个人列表测试A#工期两周
/录入余额 @A#10000
/录入余额 @B#10000
/我上传的稿位
/我的稿位

预期:上传列表包含新稿位及例图、备注;管理员没有出价时,新稿位不能出现在管理员的“我的稿位”中。新加稿位无需重新分批即可测试出价。

成员 A 发送:

/出价 个人列表测试A 100
/出价 个人列表测试B 200
/我的稿位
/我上传的稿位

预期:/我的稿位 先显示“已截止”,再显示“未截止目高稿位”。这两个稿位应立即显示在未截止组,每项以纯文字显示“x号 稿位名 金额”及备注,不发送图片、图片链接或缺图提示;直接发送 我的稿位 也应一致。没有本人成交记录时,已截止组显示“暂无”。成员没有上传过稿位时,/我上传的稿位 应提示暂无上传记录;上传者使用该命令仍能看到图片。两条口令普通成员均可使用,只能查询自己的记录。

成员 B 发送:

/出价 个人列表测试A 300
/我的稿位

预期:B 的列表出现个人列表测试A;A 再次 /我的稿位 只保留个人列表测试B。管理员执行:

/撤回出价 个人列表测试A#@B#300

预期:A 的列表恢复个人列表测试A,目高100;B 的列表移除该稿位。再执行:

/截止稿位 个人列表测试A

成员 A 查询 /我的稿位 或直接发送 我的稿位:个人列表测试A移到“已截止”组,金额100;个人列表测试B仍在“未截止目高稿位”组,金额200。两组均只显示文字,备注跟随对应稿位。其他成员查询不得看到A的成交记录。管理员继续发送:

/回收稿位 个人列表测试B

预期:A 的“已截止”组保留个人列表测试A,金额100;已回收的个人列表测试B不再显示。如果没有其他在拍目高,未截止组显示“暂无”。上传者的 /我上传的稿位 仍显示两个稿位及各自状态。历史活动的本人成交记录也应保留在已截止组,各组内按活动区分;其他成员、无人出价和已回收的记录不能混入。全无记录的成员也应看到两个标题,各显示“暂无”。重载后结果一致。

v2.12.0 大额余额显示

管理员发送,真实 @选择成员 A:

/录入余额 @A#1000000
/查询余额 @A
/录入余额 @A#1234567.89
查询@A余额
/余额列表
@A录入余额1000000000000
/查询余额 @A
/录入余额 @A#0.0000001
/查询余额 @A

预期:首次录入和再次修改均成功,录入确认、两种查询和余额列表分别完整显示 1000000、1234567.89、1000000000000、0.0000001;不得出现 1e+06、1.23457e+06 等科学计数法或有效数字截断。普通成员执行余额修改仍须拒绝;成员自己的 /查看我的余额 仍只显示审核状态,不公开金额。测试结束后按需恢复 A 的余额。

v2.13.0 防误删与严格定位

请在专用测试活动中执行,确认当前活动中不存在999999号:

/稿位列表
/删除稿位 999999
/查看稿位 999999
/设置备注 999999#不能写入其他稿位
/截止稿位 999999
/回收稿位 999999
/稿位列表

预期:不存在的序号都提示未找到,不会按内部 ID 命中其他稿位;前后稿位列表完全一致。实际只有1至98号的活动也可测试 /删除稿位 99,69号必须保持原样。普通成员发送任何删除口令(包括复制管理员确认码)都应被拒绝。

管理员附图添加临时稿位:

/添加稿位 功能测试拍卖V2#安全删除测试#测试画师#100
/删除稿位 安全删除测试

预期只收到活动、序号、名称、状态和例图预览,稿位尚未删除。复制返回的确认口令,依次验证:

  1. 换另一名管理员或换群发送,必须拒绝,原稿位仍在。
  2. 发送 /删除稿位 确认 错误确认码,必须提示错误,不能抛出异常。
  3. 由原管理员在原会话中于5分钟内确认,才删除这一稿位。重复确认不能删除任何其他稿位,其他稿位序号保持不变。
  4. 重新添加临时稿位,预览后等待超过5分钟或重载插件,旧确认码必须失效;需要重新预览。
  5. 预览后修改该稿位备注,再确认旧码应提示信息变更、未删除;需重新核对预览。
  6. 预览后让已审核成员对该稿位有效出价,再确认必须拒绝;即使撤回了全部出价,历史记录仍须保留,不能删除。已截止的稿位同样拒绝。

本地自动测试 tests/test_auction_deletion.py 另外覆盖:旧活动30个稿位、新活动98个稿位时内部 ID 99 与显示序号69的冲突;序号重复、序号空缺、跨活动、原稿位删除后同号重建、并发出价,以及删除异常时事务回滚。

v2.14.0 撤销删除与原编号恢复

请在专用测试活动清理前测试。新增一个带例图的无出价稿位,记录机器人分配的序号;以下示例用69,实际测试请替换为分配到的序号。

/设置备注 69#恢复后应保留此备注
/设置定时 69#2099-12-01 20:00#截止
/删除稿位 69

复制预览中的确认口令,确认删除后执行:

/已删除稿位
/已删除稿位 功能测试拍卖V2

预期:回收站显示69号、完整名称和删除时间,普通查询已找不到69号。重载插件,再由管理员执行:

/撤销删除 69
/查看稿位 69
/已删除稿位
/撤销删除 69

预期:第一次恢复回原69号,保留价格、画师、备注、上传者及例图引用,并明确提示旧定时未恢复。图文使用统一发送方式。回收站不再列出该条未恢复记录;重复恢复拒绝,不产生副本。图片源已失效时应提示缺图,不能伪造图片恢复成功。

再次删除并确认后,可测试指定活动恢复:

/撤销删除 功能测试拍卖V2#69

其他检查:

  • 普通成员发送 /已删除稿位、/撤销删除 69 都被拒绝。
  • 删除最高序号后再添加新稿位,新稿位应取得更大序号,不占用被删稿位的原序号。
  • 如果在删除后新增了同名稿位,恢复必须拒绝覆盖,回收站记录保留。
  • 原批次已删除或重新分批时,恢复不会关联错误批次;原可竞拍稿位恢复为筹备中并提示重新分批。
  • 对旧版本误删、没有快照的69号执行恢复,应明确提示需要数据库备份,不能宣称已恢复或创建空白占位稿位。

v2.15.0 替换空号与指定添加

在专用测试活动中执行,不要直接拿已有出价的正式稿位测试。以下假定69号为空、99号是无出价的新稿位,均需按实际情况替换。

/替换稿位 99#69
/查看稿位 69
/查看稿位 99

预期:99号改为69号,仍是同一份新稿位信息,图片、价格、画师、备注、上传者、批次及定时保持原设置。99号查询未找到。重载插件后,普通附图添加一个稿位,若没有更小的替换释放空号,应分配99;下一次继续正常分配,不出现重复序号。

测试指定序号添加(以下两条分别附1张例图,序号需为空):

/添加稿位 序号=70#指定补位测试#测试画师#100#800
/添加稿位 功能测试拍卖V2#序号=71#指定活动补位#测试画师#100

预期:分别添加到70、71号;已有删除快照也允许明确占用空号,快照仍保留。目标号仍有现存记录时拒绝,即使记录状态是已回收或已截止也不能覆盖。

其他回归:

  • 普通成员执行替换或指定添加都被拒绝。
  • /替换稿位 69#69、/替换稿位 999999#69、/替换稿位 0#69、/添加稿位 序号=abc#稿位#画师#100 均明确报错,其他数据不变。
  • 已有出价(包括已撤回)、已截止、已回收的来源稿位不能改号。
  • 同时抢占同一空号的两个添加或替换,最多一个成功。
  • 替换释放多个中间空号后,普通添加按空号从小到大填入;显式指定其中一个空号后,普通添加不能再次占用它。
  • 回收站中旧69号被新稿位占用时,显示占用提示,/撤销删除 69 不得覆盖新稿位。
  • 同一个序号有多份未恢复快照时,/已删除稿位 会显示恢复记录号;用 /撤销删除 记录=123(替换为实际记录号)精确选择。编号或名称仍被占用时继续拒绝恢复。

多群命令接收与漏回复排查(v2.20.2)

使用测试活动“协同测试”,让同一管理员在同一机器人连接的两个不同测试群中分别发送:

/设置群 前台#协同测试#冰块

预期:两群各有一条回执,包含“群别名:冰块”;/群设置 显示两个绑定(别名可以相同)。在其中一群重新发送同样的命令,应仍有一条回执;随后在该群发送 /设置群 前台#协同测试#食堂,只更新该群,另一群仍为“冰块”。

  • 通过真实 @机器人加 /设置群 前台#协同测试#测试前台 再试一次,应只执行并回复一次,不额外弹快捷帮助。/设置群、/设置群 错误#协同测试 要给出正确用法。普通成员仍须收到权限不足,不得改变绑定。
  • /群设置、/设置显示名 @成员#测试昵称、/通知状态、/重试通知 错误编号、/取消群设置 都应有对应答复;最后一条只在可解除的测试群执行。
  • 后台 INFO 日志应有 [拍卖多群命令] 开始处理、准备回复和处理结束,通过 origin 和 message_id 区分不同群和消息;日志不输出完整命令参数。普通闲聊、群管家回复不应进入这些处理日志。
  • 若仅有 event_bus 收到消息日志,没有“开始处理”:检查当前机器人配置的群白名单、会话启用状态、拍卖插件启用状态、/ 唤醒前缀及限流。DEBUG 日志能显示停止事件传播的框架阶段。discard 表示可能直接丢弃,stall 表示可能延后处理;插件不会绕过这些配置。
  • 若有“准备回复”但群内没收到,查看 AstrBot 回复/平台发送错误,并在插件设置页核对保存结果。/通知状态只跟踪跨群广播,不能诊断或补发命令直接回复。

多群协同、昵称与通知(v2.19.0)

单群测试可保持协同关闭。多群测试另建专用活动“协同测试”,准备同一机器人连接下的前台A/B/C群及后台H群,C不安排竞拍者。为活动添加至少6个附图稿位并开启;所有时间替换为实际测试时间。

  1. 管理员在各群分别执行(不要在同一个群连续执行四条):
/设置群 前台#协同测试#A群
/设置群 前台#协同测试#B群
/设置群 前台#协同测试#C群
/设置群 后台#协同测试#H群
/群设置

预期:首次绑定自动开启协同,四群绑定同一活动。未绑定群发查询/出价得到绑定说明。普通成员不能设置、解绑、修改显示名或重试;私聊绑定和跨机器人绑定被拒绝。

  1. 后台H群录入参与者 sender_id(若成员不在H群,直接用前台 /我的ID 取得的完整值),审核余额10000。普通成员无权查看金额;前台管理员的余额录入/查询/清空/名单也应被拒绝。成员 查看我的余额 只显示审核情况。
/录入余额 memberA#10000
/录入余额 memberB#10000
/录入余额 memberC#10000
/设置显示名 memberA#小明
/设置显示名 memberB#小红
  1. A群memberA发送 给1号出价 1000,B群memberB发送 给1号出价 1666。A/B/C群各收到一条新的公共图文,历史显示“小明”“小红”的普通文字,无 @、无原始 sender_id。第二次出价仅A群额外收到真实 @memberA“已被超越”,后台H没有广播。B再发送 给1号出价 1700,三前台仅各一条公共图文,无超价 @。
  2. A群的两位成员交替出价2号,B/C只有公共图文。A群memberA报价1号1800,再在B群用同一sender_id报价1900时也不向自己发送超价提醒;该笔成为最高价后,来源更新为B群。
  3. 未审核成员出价、低于/等于目高、全部在拍目高合计余额不足70%:只原群出现失败理由,不出现余额数字;其他前台和后台没有广播。后台出价应失败。新建另一活动后,原前台的 查询1号稿位 仍查询“协同测试”;两活动同号并发查询/出价不串活动。
  4. 缺少昵称的成员显示稳定“参拍者编号”。管理员用真实 @或sender_id指定显示名、重名、清空;单稿位、批次目高和后续出价使用新名称。两个人同名仍使用各自余额,重名附编号。WebUI最近200位成员可改显示名;更早成员用命令修改。修改名称不回写已经发送的历史消息。
/设置显示名 @成员#测试昵称
/设置显示名 @成员#清空
/查询批次目高 1
查询1号稿位
/我的稿位

预期:前两个需要管理员。查询的目高姓名无真正 @;/我的稿位仍为两组纯文字,无图片或图片链接。

  1. 先分批、设未来1分钟上新(用尚未出价的专用活动验证),观察三前台每批一条图文,含全部稿位图片、画师及价格,后台不广播。后台为稿位设置30分钟内的截止/回收,提前提醒同步三前台;回收另在当前最高出价来源前台 @。最后5分钟成功出价继续延长5分钟;到期/手动截止三前台收到结果,胜者只在来源前台收到恭喜 @。回收同理。撤回指定出价后刷新三前台目高,参拍者提醒只发往各自曾出价的前台群。
  2. WebUI → 插件 → 拍卖系统 → Pages → 拍卖插件设置:核对协同开关、群角色、活动、群别名、显示名和通知状态。变更绑定必须即时生效,后台不收到后续公共广播。仅支持修改已在真实群内登记的会话。
  3. 在测试环境暂时使一个目标群发送失败,其他前台仍正常收到消息。最多尝试3次后状态为失败;恢复发送能力后执行:
/通知状态
/重试通知 12

用真实失败编号替换12;预期只补发该通知尚未成功发送的段,补发注明原时间,不增加出价记录,不重新执行截止,正常目标群不重复发送。插件重载后待发通知继续;平台接收状态不代表成员已读,超时可能导致重复投递,需检查实际消息。QQ官方跨群主动发送、真实 @与单条Markdown图文需在你的机器人环境验证。

  1. 测试完成后,在各测试群执行 /取消群设置。对应待发/失败通知变为取消,重试被拒绝;协同开关不会自动关闭,按需要在WebUI关闭。若关闭后再开启,仍绑定群的待发队列会恢复。

全局共享余额与升级迁移(v2.20.0)

请使用专用测试库和账号;/清空余额 现在影响所有活动的全部成员,不要在正式拍卖中用它做测试。

  1. 升级前在旧版测试库中给同一个 sender_id 分别录入活动A余额1000、活动B余额2000。保留两活动数据后安装新版;首次加载后查询应为3000。已关闭、已删除活动中仍存在的旧余额也应参与合计。其他成员分别汇总,昵称相同不能合并身份。
  2. 重载插件两次,每次查询仍为3000,不能变成6000或9000。原始记录保留在旧表,汇总明细保存在 balance_migration_records,完成标记保存在 balance_migrations;有效余额只在 member_balances。这些表用于核对,无需手动编辑。
  3. 在后台群(单群模式可在普通管理会话)依次执行:
/查询余额 测试成员sender_id
/录入余额 测试成员sender_id#5000
/查询余额 测试成员sender_id
/余额列表

预期:第一条为3000,录入后为5000,不是8000;其他活动群的后台查询也为5000,名单中同一成员只有一条。改用真实 @成员查询/录入仍是同一份余额。再重载后仍为5000。

  1. 新建并开启测试活动C,无需再次录入余额;成员 查看我的余额 显示有效审核但不显示5000。关闭、切换或删除活动不重置全局余额。单群模式下,没有任何活动也能管理余额。
  2. 给测试成员设置全局余额700,在活动A有效出价1000成功后,再去活动B为另一稿位出价100应失败(总价1100需要770)。失败消息只说明70%规则,不公开700或770。被其他成员超价后释放相应占用,再测试活动B出价。
  3. 同一成员对同一稿位从800加到1000,只计算新价1000,不叠加旧价800。暂停活动或把已有目高的稿位改为未上新仍应占用;稿位截止、回收或所属活动删除后不占用。成交不会自动扣款。
  4. 同时在两个活动各出价600,全局余额700时只能有一个成功,另一个因合计超过额度失败。普通成员查询他人余额、修改余额或清空余额都应被拒绝;前台群即使管理员也不能管理余额。
  5. 最后仅在专用测试库执行 /清空余额:所有活动查询均无有效记录,成员出价被拒绝。重载后仍为空,旧活动余额不会重新导入;重新 /录入余额 可恢复审核。迁移后的金额、录入和查询继续使用十进制数字,不显示科学计数法。
  6. 年龄审核使用同一成员最后一次录入的审核状态。若最后状态未审核,迁移仍保存余额合计,但出价和自查不能显示审核已通过;管理员重新录入余额即确认审核。

旧余额身份异常与加载恢复(v2.20.1)

  1. 安装本版并重载。如果旧记录包含明确的 QQ 官方 <qqbot-at-user id="sender_id" /> 标签,应正确解析并与裸ID的记录合并;不应再出现“sender_id无效,迁移已中止”的加载错误。
  2. 空身份、手写 @昵称或混合多个提及等无法确认归属的记录,原件必须保留,放入“旧余额迁移待核对”;金额不自动分配给任何人。正常成员余额仍应正常合计。重载两次,正常余额及待核对数量均不重复增长。
  3. 管理员 /余额列表 查看待核对提示,再打开 Pages → 拍卖插件设置 →“旧余额迁移待核对”,核对原身份、原金额、活动。原值中的标签应作为文字显示,不能被网页执行或变为真实 @。
  4. 确认记录3实际属于某成员,并查询其现有全局余额;核对其他相关旧记录、判断是否重复及年龄审核后,明确最终余额。假设最终应为5000,管理员在后台执行:
/查询余额 目标sender_id
/修复余额 3#目标sender_id#5000
/查询余额 目标sender_id
/余额列表

预期:余额是5000,不是“旧余额+5000”;记录3变为已处理,保存处理人及金额时间,原旧记录仍保留。真实 @输入同样有效,如 /修复余额 3#@成员#5000。第二次处理同一记录应被拒绝,不能再次覆盖余额。 5. 页面表单使用正确 sender_id 和最终全局余额,效果与命令相同。空身份、空金额、手写 @昵称、负数、无穷大等输入应报错,不改变余额或处理状态。输入0只有在管理员明确填写0时才允许。 6. 普通成员发送 /修复余额 3#目标sender_id#5000 应被拒绝;前台群中的管理员也应被要求去后台群。普通成员 /余额列表 不能看到待核对数据。 7. 修复后重载,余额仍为最终值;清空余额后再重载,已处理的旧记录不能再次导入,剩余待核对原件继续保留。待核对记录只能人工明确归属,不按相似昵称或片段匹配。

返回文档入口