Files
auto_news_upload/发布流程操作记录与自动化规范.md
T

217 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 广谈大湾网:下载、导入排版、人工发布与换号
本文中的帐号名称和用户编号已匿名化;真实记录保存在本地排除目录中。
记录日期:2026-10-31(北京时间)。本文依据用户指导、Chrome 实际操作和现有源码检查编写。它是后续实现的流程依据;需求不等于功能已经实现。
## 1. 不可改变的边界
- **“发表帖子”只能由用户亲手点击。** 自动化只下载、选择、上传、填写、排版、校验、提示审核、观察提交结果和记录计数。禁止模拟点击发布、调用提交函数、直接发送发帖请求或通过快捷键提交。
- 标题被截断、正文或来源被修改后,都必须重新进入人工审核。发生标题过长错误后,“重新尝试发表”也由用户再次点击。
- 用户决定分区和文章根目录;“理财财经”只是本次例子,不能成为所有文章的固定分区。
- 全流程页面常驻“终止流程”按钮。点击后立即取消后续动作、重试、队列领取和自动换号,不自动恢复。已经到达网站的请求不能撤回,需保留记录并核对。
- 已发表或已被网站接收待审核的文章不能再次排入发布队列,换账号也不能绕过去重。
## 2. 本次演示记录
| 项目 | 结果 |
| --- | --- |
| 站点 | https://www.dww11.com/ |
| 当前账号 | 示例用户,页面用户编号 <已匿名> |
| 分区 | 理财财经,fid=125 |
| 入口 | 首页右上角“免费发布信息”→ 分区页“理财财经” |
| 分区页 | https://www.dww11.com/special/post/ |
| 新帖页 | https://www.dww11.com/forum.php?mod=post&action=newthread&fid=125 |
| 标签行为 | 点击分区后新开标签,原分区页保留 |
| 测试标题 | 刚靠新电影赚23亿票房,周星驰就卖掉内地影院 |
| 原标题长度 | 22 个 Unicode 码点;本篇无需截断。网站计数方式尚未实测 |
| 目录 | `<项目根目录>/tanshuapi_news_downloader/downloads/刚靠新电影赚23亿票房,周星驰就卖掉内地影院` |
| 目录内容 | 1 个 Markdown + 26 张 JPG,共 27 个文件 |
| 来源 | 洲洲影视娱评(取文章末尾来源,不取正文“信息来源”截图) |
| 导入 | 已完成;面板提示“已填写标题、正文和 26 张配图” |
| 排版 | 已完成,正文 4 号黑色,尾注 1 号银色 |
| 核对 | 编辑器 DOM 中图片 26 张,最终来源尾注仅 1 条 |
| 发布 | 用户已亲手点击;网站已受理,详情页显示“审核中” |
| 帖子链接 | https://www.dww11.com/thread/23697411.html |
| 帖子标识 | 主题 ID 23697411;首帖 PID 238766 |
| 数量 | 已明确受理 1 篇;已确认审核通过并公开 0 篇 |
| 发布后图片 | 正文 21 张 + 附件区 5 张,共 26 张 |
| 换号 | 未执行;本次未设置最小值和最大值 |
本次页面没有“终止流程”按钮。用户明确同意本次演示暂用浏览器控制条停止,常驻页面按钮仍是后续自动化的必备条件。该例外只适用于本次演示。
本次已验证导入、排版、用户亲手发表以及网站受理后的帖子详情页;页面明确显示“审核中”。尚未验证审核通过后的访客可见性、标题超限错误或换号链路。用户称发表后自动回首页,但本次实际读取的原编辑器标签已导航至帖子详情页,不能将“提交后必然自动回首页”写成网站行为。应在结果登记后主动回首页并核对。
## 3. 用户操作步骤与自动化对应
1. 启动前让用户选择分区、下载目录、待处理文章范围,并填写每个账号发布数量的最小值和最大值。展示当前账号。先初始化常驻终止按钮与持久任务记录。
2. 从下载器接收完整落盘的文章目录。检查正文、图片引用、来源和去重记录;保存中或缺文件的目录不进入导入队列。
3. 点击“免费发布信息”,展示实际可用分区,由用户选择。等待新标签打开并核对分区名称及 fid;不能继续操作旧标签或仅凭坐标判断。
4. 在右下角“本地文章导入 · 1.0”选择“选择文章目录”。日常演示选择单篇目录,目录应包含 Markdown 和全部配图;不要只选 `.md`。如果选择根目录导致出现多个 Markdown,必须明确选中哪一篇。
5. 在系统文件选择器进入用户指定根目录,再选择对应文章文件夹。系统“Upload”是把所选文件提供给页面读取,不是发表帖子;浏览器另有目录文件数量确认。
6. 阅读导入面板标题、正文预览、图片数量和告警。点击“上传配图并填写”后才开始向网站上传正文引用的图片。等待明确完成提示,不能用固定等待时间代替完成判断。
7. 读取文章最后的标准尾注 `来源:名称,如有侵权,请联系删除。`,只取名称。本篇是“洲洲影视娱评”;用户先前茅台文章例子是“酒业内参”,不能硬编码。
8. 点击编辑工具栏绿色“一键排版”(不是网站自带“自动排版”,也不是“一键导入微信公众号并排版”)。实际弹窗要求输入**来源公众号名称**,并非标题。本篇填“洲洲影视娱评”,确认后会提示排版完成。
9. 标题由本地导入器填入页面标题框;仍需核对完整标题。当前“一键排版”不弹标题输入框。如果用户说“输入标题”,应在标题框填写和确认,而不是填到来源弹窗。
10. 校验标题、正文、图片数量和顺序、尾注唯一性、账号和分区。保留用户原文;本篇的发布时间、“打开网易新闻 查看精彩图片”等原始文字未擅自清理。需要清理时应成为用户可见的规则。
11. 页面提示“已完成,等待人工审核,请自行点击发表帖子”。自动化停止修改编辑器,保留终止按钮,等待用户操作;不自动保存草稿或发表。网站原有自动保存仍可能运行。
12. 用户自行点击“发表帖子”。自动化只观察结果。若标题超长,按第 5 节修正,重新提示审核,等待用户再次点击。
13. 收集帖子链接/编号、作者、分区和结果证据后记账。审核中单独记录并阻止重发;结果不明时先核对,不能自动重试发布。
14. 已明确成功后先持久保存发布记录与计数,再回到首页。达到当前账号目标篇数且没有未决提交时,点击页面顶部“登陆下一帐号”,核对登录成功后再处理下一篇。
## 4. 页面适配依据与当前缺口
以下选择器来自本次可见页面或本地源码,未来运行时须重新检查,不能保证网站改版后仍成立。
| 控件 | 当前依据 | 注意事项 |
| --- | --- | --- |
| 当前用户 | `#mumucms_username` | 同时读取页面用户名与用户链接编号 |
| 下一账号 | `#dww11-extension-next` | 完成记录后才允许换号;核对成功,不以按钮点击作为成功 |
| 标题 | `#subject` | 本次读取到 maxLength=-1,不能只依赖 HTML maxlength |
| 可视化正文 | `iframe#e_iframe` 内的 body | 图文与尾注检查应在 iframe 内进行 |
| 纯文本开关 | `#e_switchercheck` | 不将 Markdown 直接当网站 BBCode |
| 一键排版 | `#dww11-format-oneclick` | 原生 prompt 输入来源,随后 alert 提示完成 |
| 发表 | `#postsubmit` | 仅用于识别状态和观察人工提交,禁止自动触发 |
| 导入面板 | 油猴脚本面板,包含 choose/import 等控件 | 面板可能位于 Shadow DOM;普通页面选择器未必能定位,优先按可见控件操作 |
本次实际遇到的兼容问题:
- 浏览器连接器直接设置目录文件被“允许访问文件网址”权限阻止。本次没有更改扩展权限,改用 Chrome 原生系统选择器完成。后续实现应优先复用本地文章包接口,减少对文件对话框的依赖。
- macOS 路径含中文,逐键输入曾丢失中文;通过文本框完整赋值成功定位。输入后必须核对完整路径,不能只看末级数字或英文。
- 导入器能完成 26 张图片上传,并临时禁用发表按钮;上传完成后恢复。上传过程中不允许换号。
- **来源重复:** 一键排版保留了导入正文中的原尾注,又追加银色尾注。本次在编辑器中删除原来的那一条,保留银色尾注,复查最终只出现一次。后续应在排版适配器中精确处理末尾标准尾注,不能全局删除正文中的“来源”。
- 页面“还可输入 80 个字符”在导入后仍显示 80,不能将这个显示值当作可靠的标题长度校验结果。
- 页面有“上次未提交成功的数据”恢复提示;本次没有点击恢复,避免把旧稿混入新稿。后续遇到已有正文或恢复冲突必须暂停处理。
## 5. 标题超过 80 字符
保留 `original_title`,派生 `submitted_title`。超过站点限制时截取前缀并追加字面量 `...`,总长不超过 80;即长度允许时保留前 77 个字符再加 3 个点。示例中的“标题文本...”表示实际标题前缀和省略号,不额外加入中文括号。
当前站点的“字符”计数方式尚未通过超长标题实测。实现时兼容中文和 emoji,不能切断代理对;先按保守规则校验,再根据站点明确错误调整。若站点按字节计数,则按其实际字节预算截取,不能反复盲目减少。
现有导入器在读取阶段对超过 80 个 Unicode 码点的标题直接报错。后续需把截断放在导入前,否则到不了人工审核阶段。截断不覆盖原 Markdown 标题,也不改变文章去重身份。
如果用户点击发表后才收到标题超限提示:确认网站明确未接受 → 修正标题 → 显示新旧标题 → 重新人工审核 → 用户再次点击。任何自动修正都不等于用户已批准发表。
## 6. 发布记录、去重与恢复
建议独立 SQLite 发布任务库,与下载去重库分开;下载成功不能视为发布成功。本次先保存演示任务 JSON,尚未实现自动数据库或网站历史帖子同步。
稳定文章身份优先采用下载器原始文章 ID 或规范化源 URL,同时保存正文与图片内容指纹用于发现重新下载/改名副本。禁止只按本地目录名、截断标题或当前账号去重。默认整个站点跨账号、跨版块不重复发表同一篇;如以后需要重发,必须由用户显式决定。
建议字段:article_key、source_url/source_id、content_hash、原始/最终标题、目录、来源、状态、账号 UID、fid、附件映射、排版版本、人工提交时间、提交尝试编号、帖子 ID/URL、网站受理/审核/公开状态、错误、创建和更新时间。日志不保存密码、Cookie 或上传凭证。
主状态:
```text
downloaded → queued → importing → formatting → awaiting_user_review
→ user_submitting → published / accepted_pending_moderation
```
分支:`stopped`、`needs_attention`、`submit_unknown`、`rejected`。未决提交不得重新上传或领取同一文章。单批次串行,跨标签领取加持久锁;刷新后先恢复状态,不自动启动。
去重记录需要覆盖用户已发表帖子:优先导入原有记录,或从“修改/删除信息”进入本人帖子列表进行核对。仅标题相同只能标记疑似重复,不能据此自动认定是同一正文。本次未扫描历史帖子,后续批量运行前必须完成历史对账;本次文章已记为“网站已受理、审核中”,已有帖子 ID 与 URL,必须阻止重发;不能误写为等待用户点击,也不能写为审核通过。
成功记录与计数使用同一个事务:帖子唯一键(站点+帖子 ID)防止页面刷新重复加一。先记录再返回首页。遇到网络超时、页面关闭或不明确提示,记录 `submit_unknown`,人工/页面核对后再决定,禁止自动重复发表。
网站明确受理待审核时,记 `accepted_pending_moderation` 并锁住文章。本规范建议把明确受理计入账号本轮提交数量一次,另存公开发表数量;后续审核通过只改变公开状态,不再加本轮数量。本次已观察到网站审核中状态,因此本地记录明确受理数为 1、已确认公开数为 0;批量自动记账尚未实现。驳回不自动补发或重投。
## 7. 每个账号随机篇数与换号
用户填写整数 `min`、`max`,要求 `1 ≤ min ≤ max`。首次为当前账号创建发布批次及每次确认换号成功后,从闭区间 `[min,max]` 均匀抽取整数 n,保存目标和当前计数。min=max 时固定该数量。不要按每篇重新抽 n,刷新、暂停或重启也不重抽。
- 本轮计数只含当前发布批次明确成功/明确受理的唯一文章,不含上传、排版、等待人工审核、失败和结果不明。
- 达到 n 后先保存记录与 `switch_pending`,回首页,核对没有待提交草稿,再点击“登陆下一帐号”。
- 观察并确认实际 UID/用户名变化且登录成功,再建立下一账号批次、重置批次计数并抽新 n。不可在不确定结果时重复点击换号。
- 验证码、账号异常、频率限制、登录失败或账号池无可用账号时暂停,保留当前文章与计数;不把受限文章换账号重投。
- 用户手动改变账号时立即暂停,重新关联批次与上传附件;不能沿用旧账号附件上下文。
- 队列已经处理完时直接结束,不为“凑满 n”重复文章,也不无意义换号。
本次没有给定 min/max,所以不随机设置目标,也不执行换号。账号扩展现有自己的抽号/登录持久记录,应复用其登录流程,不另存账号密码。
## 8. 常驻终止按钮的实现要求
按钮在首页、分区页、新帖页、结果页、换号页面保持可见,不依赖折叠的导入面板。跨标签共享同一批次停止状态,导航后先恢复按钮和停止状态再执行任务。
点击立即写入持久 `stopped` 并提升运行版本号,取消定时器、队列和可取消的上传/下载请求;每个异步步骤返回时检查停止标志和版本,过期回调不得再填写、跳转或换号。浏览器自带模态弹窗会阻挡网页按钮,因此自动流程应把来源/审核提示改成页面内面板,保留停止入口。
已被服务器接收的图片/帖子不能被停止按钮撤回。停止后允许被动记录已在途请求的最终结果,但不得继续业务动作;需要清楚显示“已停止,已发出的请求可能仍已完成”。人工终止后必须由用户明确重新启动,不能因刷新或服务重启自动恢复。
## 9. 后续实现与验收清单
1. 优先实现常驻终止按钮、持久队列、站点级去重和历史发布对账,再接批量导入。
2. 改造导入前标题截断、唯一来源尾注和可重复执行排版;保留原文与本地文件。
3. 建立本地任务服务与浏览器执行器之间的配对通信,只传当前文章所需数据,不传下载 API Key 或账号库。
4. 人工发布边界验收:没有用户点击时,等待任意时间都不会发表;标题修正后仍等待新的用户点击。
5. 验证缺图、上传部分失败、重复来源、长标题、emoji、多 Markdown、非空编辑器、人工修改、刷新/断网、多标签竞争。
6. 用户实际发布后,补录成功页或审核中页面证据、帖子 URL/ID,并验证重复打开不会增加计数。
7. 给定 min/max 后验证 n 范围、每账号仅抽一次、达到目标换号、核对新 UID、恢复不丢计数。
8. 在下载、上传、排版、等待审核、观察结果和换号各阶段点击终止,确认不再触发后续动作。
## 10. 当前交接
用户已亲手点击发表。原编辑器标签现为帖子详情页,标题与作者“示例用户”一致,面包屑为理财财经,显示“审核中”。已保存主题 ID、首帖 PID、URL、受理数量与去重记录,禁止再次发同一文章。登记后已点击网站首页入口,并核对 URL 为 `https://www.dww11.com/`,当前账号仍为示例用户(UID <已匿名>);没有设置 min/max,因此未换号。
发布结果检查发现正文内有 21 张图片,另外 5 张在附件区:image009.jpg、image014.jpg、image016.jpg、image025.jpg、image026.jpg,总数 26 张;来源尾注仅一条。发布后的正文与初次待审稿存在差异(例如原发布时间及“打开网易新闻 查看精彩图片”文字已不在结果正文中)。本次未记录用户审核期间的具体编辑动作,无法将差异归因于用户修改、编辑器同步或网站转换;后续需在用户点击的时刻保存最终待提交快照,再与结果对照。不得自动编辑或重发这篇已受理的帖子。
截图:`test/history/周星驰文章_待人工审核.jpg`(历史待审稿)、`test/history/周星驰文章_网站审核中.jpg`(网站受理结果)。演示任务:`test/history/演示任务记录.json`;站点级去重登记:`发布去重记录.json`。记录保存本次结果,不代表完整历史同步或批量程序已经实现。
## 11. 发布结果判断与本次补录
- 用户点击后,不按“回到首页”判断成功;先记录实际跳转 URL 和页面结果。
- 本次 URL 为 `/thread/23697411.html`,页面标题、理财财经面包屑、楼主示例用户及“审核中”共同确认网站已受理。DOM 首帖容器为 `#postmessage_238766`。
- 网站审核中并非失败,不能为追求公开状态而再次提交;也不能仅凭当前登录用户能看到详情,宣称所有访客可见。
- 刷新、重复读取或后来审核通过时,都用站点+主题 ID 保证受理数量只计一次。
- 本次没有出现标题超限,相关处理仍是待验证需求。
- 完整历史对账、常驻终止按钮、随机数量和自动换号仍属后续实现及验收范围。
## 12. 2026-10-31:实际提交与审核中页面观察
本节补录一次新的现场操作,与第 2、10、11 节的历史演示分别记录。用户本次明确要求由助手点击“发表帖子”并捕捉快速跳转提示;助手仅点击一次,未修改待发表标题或正文、未重新上传、未重复提交。本次授权仅适用于这一次现场操作,不改变工作台默认等待用户亲手发表的规则。
### 提交与结果
| 项目 | 观察结果 |
| --- | --- |
| 页面显示的发表时间 | 2026-10-31 17:02:54(北京时间,来自结果页时间节点) |
| 文章标题 | 湖人只有一个卢卡·开拓者的四大金刚 |
| 当前账号与作者 | 示例用户,UID <已匿名>;真实账号信息保存在本地观察记录中 |
| 目标版块 | 体育休闲,`fid=90` |
| 提交前页面 | `https://www.dww11.com/forum.php?mod=post&action=newthread&fid=90` |
| 提交后提示页 | `forum.php?mod=post&action=newthread&fid=90&extra=&topicsubmit=yes` |
| 网站原文提示 | 新主题需要审核,您的帖子通过审核后才能显示 |
| 提示页跳转链接 | `https://www.dww11.com/thread/23699911.html` |
| 实际跳转 | 提示页 → 帖子详情页;本次未观察到自动回首页 |
| 详情页状态 | 标题旁明确显示“(审核中)” |
| 实际主题参数 | 页面“复制链接”及相邻主题链接使用 `tid=236999` |
| 首帖标识 | PID `238791`;正文容器为 `#postmessage_238791` |
| 受理结论 | 本次已明确受理 1 篇;本次已确认公开 0 篇 |
| 后续动作 | 未再次发表、未换号;未据此补写运行队列、受理计数或发布去重库 |
### 页面适配依据
| 数据 | 现场依据 | 适配注意事项 |
| --- | --- | --- |
| 提交提示 | 可访问性树中的 `messagetext` 容器及其提示文字、跳转链接 | 已捕捉文字与链接,但跳转前未成功保存该容器 HTML;结果选择器仍需验证 |
| 帖子标题 | `#thread_subject`,位于 `h1.ts` 内 | 与最终提交标题核对,不能只用浏览器页签标题 |
| 审核状态 | 标题所在 `td.plc.mumucms_ftit.vwthd` 内的 `span.xg1` 包含“(审核中)” | 限定标题区域,避免把正文中出现的同名文字当作状态 |
| 主题标识 | 标题区域“复制链接”的 `mod=viewthread&tid=236999` | 地址路径为 `23699911.html`,不能直接将全部数字解析为实际主题 ID |
| 首帖与作者 | `#postmessage_238791`;现场作者链接含 `mod=space&uid=<已匿名>` | 动态提取 PID、UID,并限定首帖作者区域;页面顶部登录账号不能单独证明作者身份 |
| 目标版块 | 现场版块链接含 `mod=forumdisplay&fid=90` | 与任务版块核对,不只匹配“体育休闲”文字 |
网站已受理待审核,不能将该篇重新入队或为追求公开状态再次提交。本次没有验证审核通过后的访客可见性、失败提示、超长标题错误、自动记账和换号链路;看到登录态详情页不代表已公开。
本地资料保存在排除目录 `local-records/`:`publish-result-23699911.json` 保存观察摘要、标题区域 HTML 与作者/版块链接,`publish-result-23699911.png` 保存标题旁“审核中”的截图。文件名沿用访问地址的数字串,不代表实际 `tid`。本节是文档补录,不等于运行去重库已登记;后续对账需关联原文章身份,并统一主题标识的处理方式。
## 13. 0.2.0 实现与历史补核
已实现审核中详情适配:限定标题区域审核标志,结合真实 TID、首帖楼主标识、作者 UID、版块 fid 与最终提交标题核对。受理、去重和批次计数在同一事务登记;图文检查与受理状态分开,图片延迟占位、附件区或文字/顺序差异会保留受理去重并暂停。记账后仍运行时返回首页,再领取或换号;停止后仅允许被动记账。
现场只读核对了现有页面结构,没有点击发表、上传、改文或换号。当前模板面包屑容器为 `.mumucms_pt`,首帖作者位于 `#post_<PID>` 的 `.plc .pti .authi`,首帖楼主链接为 `#postnum<PID>`;图片同时可能具有 `id=aimg_<AID>` 与 `aid=<AID>`。`static/image/common/none.gif` 是占位图,不能凭 naturalWidth 大于零宣称原图已显示。
已将第 12 节现场记录关联队列既有人工提交快照:TID 236999、PID 238791,记为受理待审核,阻止重发;历史补核没有增加当前批次计数。图文完整性保留待核对标记,流程暂停。任务库和原去重记录均先备份再更新,不改写原文章。
公开成功页仍无样本,审核标记缺失不能作为已公开证据。标题超限拒绝分支已做模拟测试,尚无实机错误样本;其余未知提示进入待核对。完整线上连续发布与真实账号换号仍需由用户亲手发表的小批验收。