站点用户管理模块(后宫 / 考核 / 消息)
这三个功能围绕 PT 站点的「用户身份」展开:你邀请过的人(后宫)、站点对你的考核任务(考核)、站内私信(消息)。后宫/消息复用站点 capability 范式(第二批消息扩展为含写操作的多方法接口);考核因各平台差异大,新建 per-platform 适配器子包 + DB 持久化。
功能覆盖
| 模块 | 能力 | 数据来源 |
|---|---|---|
| 后宫 | 聚合各站邀请库存(剩余永/临邀请 + 可购买数)+ 被邀请人花名册(流量/分享率/禁用状态),生成可复制药单 | invite.php(NexusPHP)/ MTeam JSON API |
| 站点考核 | 抓各站考核任务(新手/长期/保种/魔力)的真实进度与剩余天数,per-platform 适配 | userdetails.php(NexusPHP HTML 跨行聚合)/ MTeam /api/examine/getMyActiveList |
| 消息 | 聚合各站私信(收件/系统/已发/Staff),支持回复/删除/标记已读写操作 | messages.php(NexusPHP)/ MTeam 通知 API(只读) |
后端结构
后宫(Harem)— capability 范式
internal/site/
├── types.go HaremDef + InviteStatus(含计算字段 TotalRemain/Buyable*/...)+ InviteeInfo(IsDead/IsPending/IsLowRatio 关键词)+ PrescriptionItem + HaremOverview
├── cookie.go ExtractUserIDFromCookie(c_secure_pass base64→JSON user_id / c_secure_uid)
├── harem.go ParseInviteStatus(4 策略:info_block/表单/无权限覆盖/全页回退)+ ParseInvitees(行解析 + 禁用属性扫描)
└── schemas/harem.go NexusPHP(invite.php?id=uid 翻页 ≤20)+ MTeam(/api/member/profile + /api/invite/getUserInviteHistory)
internal/chain/harem.go SiteChain.HaremStatus/HaremInvitees + HaremAll(Semaphore(5)+per-site Mutex+30min 缓存)+ ExportPrescription(药单文本 CRLF)关键点:userId 从 cookie 的 c_secure_pass/c_secure_uid base64 解码提取(NexusPHP 自身 uid 不在页面显式给出);被邀请人禁用检测扫描行 HTML+属性(class=/alt=/src= 含 banned/disabled),非纯文本;NexusPHP 不设 shop 价格(buyable 恒 0,仅 MTeam 按 bonus/80000)。
站点考核(Assessment)— per-platform 子包 + DB 持久化
internal/site/assessment/
├── adapter.go Adapter 接口(Platform/Supported/FetchAssessments)+ Registry(map[platform] + NoOp 兜底)
├── nexusphp.go GET userdetails.php → HTML 归一(<td>→换行)→ 跨行聚合(mergeAssessmentLines)→ header 匹配 → 指标正则 → 结果→isMet(排除「未达标」)→ 单位归一(size→GB/time→小时)→ 状态(endTime 不可解析→UNKNOWN,不伪造)
├── mteam.go POST /api/examine/getMyActiveList(x-api-key)→ 考核指标(字节→GB,**馒头拼写错误字段 uploaed/downloaed/bonuses 逐字匹配**)
└── tnode.go IsSupported=false(朱雀用技能释放系统,无传统考核)
internal/db/models/models.go AssessmentTask(UNIQUE(site_id,task_name) + metrics_json 序列化)
internal/db/oper/assessment.go FindBySite / BatchUpsert(事务删后插)/ CleanupExpired 6h
internal/chain/assessment.go AssessmentChain(3 级缓存 内存30min→DB6h→网络 + convertTaskToCard:progress% 仅对 required>0 指标取均值;UI 状态阈值按指标计数整数除法 ≥6/10→PROGRESS、<3/10→DANGER)关键点:考核任务持久化到 site_assessment_tasks 表(支持进度历史趋势,第 4 批导出仪表盘图可复用);3 级缓存;UI 状态阈值按指标计数整数除法(非 progress% 派生),逐字对齐原版。
消息(Messages)— 含写操作 capability
internal/site/
├── types.go MessageDef(CSRF 字段空=不带 token 直接 POST)+ Message/AdminActions/MailboxType + MessageReplyResult/BatchResult
├── message.go ParseMessages(table tr:has(td.rowfollow) + 日期列探测 + unread + itemId)+ ParseMessageContent(4 级正文策略)+ SynthesizeMsgID(siteID*100000+mailboxOrd*10000+index)
└── schemas/message.go NexusPHP(FetchMessages 多 mailbox + FetchContent + Reply/Delete/MarkRead 写操作,CSRF 可选)+ MTeam(通知 API + 统计伪消息,只读)
internal/chain/message.go SiteChain.Messages + MessagesAll + 写操作透传(Reply/Delete/MarkRead)
internal/api/v1/message.go 列表/正文/回复/删除/标记已读关键修正:原版默认 NexusPHP reply 因 csrfField="" → input[name=''] 取不到 token 而必失败;本批改为空 csrfField = 无 CSRF 直接 POST,非空才取 token 随表单提交。delete/markRead 空 body POST(Content-Type: form-urlencoded)。MTeam 消息只读(API 仅提供通知计数)。
API
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /harem | 后宫聚合(?refresh=1) |
| POST | /harem/sync/:id | 单站后宫 |
| GET | /harem/export | 药单文本 |
| GET | /assessment | 考核聚合(按 progress 降序,?refresh=1) |
| POST | /assessment/sync/:id | 单站考核 |
| GET | /messages?mailbox= | 消息聚合(inbox/sent/system/cheater/reports/staff) |
| POST | /messages/sync/:id | 单站消息 |
| GET | /messages/:id/content?url= | 消息正文 |
| POST | /messages/:id/reply | 回复(body: {url, content}) |
| POST | /messages/:id/delete | 删除(body: {url}) |
| POST | /messages/:id/markread | 标记已读(body: {ids: [...]}) |
均挂 guarded 组。新增 cron:assessment-refresh(每小时,配置 ASSESSMENT_CRON)。
测试
go test ./internal/site/... ./internal/site/assessment/...:
- 后宫:cookie userId 提取、邀请库存 4 策略、被邀请人流量/分享率/禁用属性检测、计算字段。
- 考核:NexusPHP 单行/拆行指标解析(Phase 1/2)、单位归一、MTeam 拼写错误字段。
- 消息:列表解析、mailbox box 参数、ID 合成、正文提取。
待校准(真实环境)
按 [[pt-site-data-references]] 选择器校准工作流,配真实站点后逐项钉值:
- 后宫:cookie
c_secure_passuserId 提取、invitee 禁用属性检测(WAF/皮肤差异)、MTeam invitee 端点字段。 - 考核:NexusPHP userdetails 跨行聚合(各站考核区结构)、MTeam
/api/examine/getMyActiveList字段名(时间已支持字符串日期 startTime/endTime|beginDate/endDate + epoch s/ms + 倒计时串"還有N天",2026/06/28 修:①字符串日期被拼成乱码 epoch、②指标为空被误跳过导致不显示、③过期未判 FAILED)、/api/member/profile新手考核合成。说明串("考核期間不享受所有魔力加成"等)入Description,三端卡片展示。 - 消息:NexusPHP 列表/正文选择器、回复 CSRF 字段名(各站不同,需在站点 YAML
messages.csrf_field配置)、写操作成功判定文案。