Skip to content

站点用户管理模块(后宫 / 考核 / 消息) ​

这三个功能围绕 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]] 选择器校准工作流,配真实站点后逐项钉值:

  1. 后宫:cookie c_secure_pass userId 提取、invitee 禁用属性检测(WAF/皮肤差异)、MTeam invitee 端点字段。
  2. 考核:NexusPHP userdetails 跨行聚合(各站考核区结构)、MTeam /api/examine/getMyActiveList 字段名(时间已支持字符串日期 startTime/endTime|beginDate/endDate + epoch s/ms + 倒计时串"還有N天",2026/06/28 修:①字符串日期被拼成乱码 epoch、②指标为空被误跳过导致不显示、③过期未判 FAILED)、/api/member/profile 新手考核合成。说明串("考核期間不享受所有魔力加成"等)入 Description,三端卡片展示。
  3. 消息:NexusPHP 列表/正文选择器、回复 CSRF 字段名(各站不同,需在站点 YAML messages.csrf_field 配置)、写操作成功判定文案。