“成员提交链接和说明,机器人拒绝重复链接,管理员可以填写原因移除,最后按成员统计投稿。”这是一份可以理解的需求,但还不能直接验收:换一个参数算不算新链接?两个人同时提交,谁获得归属?移除后还能不能重新提交?
一份 Freelancer 历史客户委托同时提出了链接登记、防重复、管理员移除、Google Sheets 存储和每月汇总。2026 年 11 月 2 日核查时页面显示 Closed,仅提供相对发布时间,绝对日期未知。它是本文的问题参考,不是当前接单机会,也不是 BitBear 的交付案例。以下规则和测试均为本文设计的需求示例。
先决定“在哪里只能出现一次”
判重需要一个业务范围。个人收藏可以允许每个人保存同一链接;群组投稿库则可能要求全体成员合计只有一条有效记录。不同活动是否共享记录,也要单独决定。
以“每个活动有独立链接库”为例,可以把判重条件写成:同一活动中,同一个比较键只能占用一个登记位置。用户 ID 用来记录贡献者,不加入这个唯一性条件,否则 A 和 B 提交同一链接仍会分别成功。
这与 Webhook 重复投递处理解决的问题不同。两个成员发出的不同消息,可能指向同一业务对象;消息层没有重复,也仍需执行业务判重。
URL 比较要保守,原始链接要保留
RFC 3986 第 6 节说明 URI 比较与规范化的不同层级。其中协议名和主机名不区分大小写,不能据此把整个地址都转成小写;其他部分的比较需要遵守相应语义。
对第一版投稿库,可以选择下面这组保守规则。这是业务策略,不是“所有网站内容相同”的判断算法:
| 输入差异 | 示例约定 |
|---|---|
| HTTPS 协议名或主机名的大小写 | 统一后生成比较键;原始链接不被覆盖 |
| 路径大小写、末尾斜杠不同 | 保留差异,不自动合并 |
| 查询参数不同或顺序不同 | 保留差异,不统一删除或排序 |
片段不同,例如 #section-a 与 #section-b | 默认保留;确需按整篇文章合并时,为特定站点另设规则 |
| 短链接、跳转链接与长链接 | 不自动认定相同,交给管理员检查 |
例如,https://EXAMPLE.com/Guide 与 https://example.com/Guide 可以得到同一个比较键;/Guide 与 /guide 则不要擅自合并。仅凭链接外观相似,不能证明它们代表相同内容。
建议只接收完整的 HTTPS 地址,拒绝带账号信息的地址,并提醒用户不要提交含访问凭据的私人链接。首版只做登记,不为判重自动访问链接或追踪跳转。若以后增加“移除推广参数”,先明确适用域名和参数名单,再重新验收;不要为了提高合并率改变原始访问地址。
区分登记记录、提交尝试和移除状态
一条登记记录至少应能回答:属于哪个活动、原始 URL 是什么、使用哪个比较键和规则版本、由谁首次成功提交、何时提交、当前是否有效,以及移除原因是什么。
重复提交时,返回“已收录”和现有记录编号,不覆盖首次提交者,也不增加有效投稿数。若希望感谢后续推荐者,可以单独记录提交尝试;不要把它们混入“成功收录数”。公开重复提示也不必显示他人的私人信息。
管理员移除时,建议保留编号、原始归属和原因,将记录标为已移除。第一版可以约定:移除后仍占用登记位置,普通成员不能靠重新发送绕过审核;只有管理员可以恢复。若业务希望允许重新投稿,就要另定审核和归属规则。
两个人同时提交时,也必须只有一条登记成功。不能只凭一次顺序演示就认定实现可靠。生成或定制时,应要求说明当前存储是否能提供适用的唯一性约束或原子写入;无法保证时,先改为待审核提交,不承诺并发下自动判重正确。
月报先定义口径,再决定是否自动发送
“每人本月提交多少条”至少有三种含义:尝试发送数、成功登记数、目前仍有效的成功登记数。它们不是同一个指标。
示例口径可以是:按指定时区的自然月筛选首次成功提交时间,只统计查询时仍有效的记录,并归属首次成功提交者。报告显示统计时区、起止时间、生成时间和计数口径。之后移除记录会改变重新查询的结果;若必须保留当时的结果,需要另存报告快照。
先用管理员命令按需查询月报,可以验证计数是否正确。原始委托要求每月自动发送,但调度能力、执行可靠性和失败通知需要另行核验,不能由“能保存数据”推导出“已支持自动月报”。
无代码创建、自建与外包分别要确认什么
| 选择 | 适用范围与下一步 |
|---|---|
| 用 BotFatherV2 尝试简单登记工具 | 先描述输入、持久化记录、隔离范围和查询命令,检查当前 SDK 能否满足判重规则,再生成并实测 |
| 自建或外包完整集成 | 当 Google Sheets 必须成为正式数据源、需要自动调度或复杂管理时,单独核验授权、同步方向、冲突处理和维护责任 |
| 暂缓自动化 | 无法确认链接比较、并发写入或移除后的规则时,先保留人工审核,不把不确定结果计为成功 |
截至 2026 年 11 月 2 日,BotFatherV2的公开说明支持通过 AI 对话创建和修改 Telegram 机器人、导入已有 Telegram Serverless 机器人、发布版本及保留当前业务数据的代码回滚。这些是已确认的开发与维护能力,不代表已有开箱即用的链接库或 Google Sheets 连接器。
AI 开发文档将首版范围限定在菜单、简单社群助手、投票及按用户隔离的持久化工具;固定 SDK 不支持任意 npm 模块或 Node/Bun API,首版不新增依赖付费 AI 的运行能力。因此,本文方案只部分匹配产品范围:简单登记可以作为需求尝试,共享活动权限、存储唯一性、Google Sheets 同步及自动调度都需分别验证。BotFatherV2 与 Telegram 官方 BotFather 无隶属关系。
可以交给 AI 或外包方的需求片段
设计一个活动链接登记机器人。每次提交包含完整 HTTPS URL 和说明。同一活动使用一套保守的 URL 比较规则,保存原始 URL、比较键及规则版本;不要自动访问链接、删除参数或追踪跳转。重复提交返回已有编号,不覆盖首次成功提交者,不增加有效投稿数。管理员可填写原因移除,记录保留且阻止普通成员重新登记;管理员可恢复。月报先通过管理员命令查询,按指定时区、首次成功提交时间及当前有效状态统计。请在实现前说明当前 SDK 对共享活动访问控制、唯一性写入和所需命令的支持;不支持的部分明确列出。第一版不接 Google Sheets、不做定时发送、不需要运行时 AI。
若必须保留原委托的表格集成和自动月报,请将这两项单列交付,不要默认为上述首版已经覆盖,也不要在未验证前约定完成时间或报价。
上线前用这些输入验收
- A 成功提交后得到稳定编号;B 在同一活动提交相同链接时不产生第二条登记,也不改变归属。
- 只改变主机名大小写仍判重;改变路径大小写或查询参数时按约定保留差异。
- 同一链接在不同活动中的行为符合选定的隔离范围。
- A、B 同时提交,结果仍只有一条成功登记;若存储无法保证,进入约定的人工审核流程。
- 移除记录保留原因和编号,普通成员重新提交不能绕过;恢复后仍是原记录。
- 月报不把重复尝试计入有效数,并正确处理月界、时区和移除状态。
- 发布新版本后,旧记录的比较键不会被悄悄重算;改变比较策略前先检查可能的合并冲突。
这份验收表检查的是链接库的业务约定。表格同步、定时发送和链接内容识别属于额外范围,需要各自的证据与测试。
来源与核验说明
- Freelancer 客户项目:Telegram Notification Bot Development,英文,项目 ID 39734983。2026-11-02 核查为 Closed,绝对发布日期未知;仅概括委托正文,没有采用投标者的能力或报价宣传。
- T. Berners-Lee、R. Fielding、L. Masinter:RFC 3986 — Uniform Resource Identifier (URI): Generic Syntax,2005 年 1 月,英文规范;2026-11-02 核验第 6 节。它验证地址比较的基础语义,不替业务定义投稿归属或统计方式。
- BitBear Studio:使用 AI 开发与产品主页,未标注独立发布日期;2026-11-02 核验能力边界。指定英文入口
/en-US本次无法读取,使用可访问的英文主页补充核验。