BitBear StudioINDEPENDENT SOFTWARE
6 PRODUCTSEN博客
返回博客

Telegram 链接收集机器人:重复 URL、提交归属与有效投稿统计

从一份真实历史委托出发,设计 Telegram 链接登记的判重范围、保守 URL 比较、并发提交与月度计数,并区分简单机器人和 Google Sheets 集成的交付边界。

“成员提交链接和说明,机器人拒绝重复链接,管理员可以填写原因移除,最后按成员统计投稿。”这是一份可以理解的需求,但还不能直接验收:换一个参数算不算新链接?两个人同时提交,谁获得归属?移除后还能不能重新提交?

一份 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 同时提交,结果仍只有一条成功登记;若存储无法保证,进入约定的人工审核流程。
  • 移除记录保留原因和编号,普通成员重新提交不能绕过;恢复后仍是原记录。
  • 月报不把重复尝试计入有效数,并正确处理月界、时区和移除状态。
  • 发布新版本后,旧记录的比较键不会被悄悄重算;改变比较策略前先检查可能的合并冲突。

这份验收表检查的是链接库的业务约定。表格同步、定时发送和链接内容识别属于额外范围,需要各自的证据与测试。

来源与核验说明

BITBEAR / TELEGRAM-LINK-COLLECTION-BOT-URL-DEDUPLICATION2026年11月2日