BitBear StudioINDEPENDENT SOFTWARE
6 PRODUCTSEN博客
返回博客

Telegram 机器人导出 CSV:乱码、字段错位与公式注入怎么验收

把“导出 CSV”写成可核对的需求:限定记录与列、保留中文和编号、正确处理逗号引号换行,并区分机器交换文件与表格查看副本的公式风险。

机器人发来一个能下载的 CSV,不等于数据已经正确交付。备注中的逗号可能把一列拆成两列,编号可能被表格软件改写,用户填写的文字还可能被当成公式。验收应检查“谁能导出哪些记录、怎样表示、交给什么软件读取”,而不只检查文件是否出现。

FL.ru 的俄语历史委托 Tg бот на Django明确提出 Telegram 机器人、Django 管理后台与 CSV 导出。页面标注发布于 2025 年 11 月 4 日,2026 年 11 月 8 日核查为已关闭、归档。它只证明有客户提出过导出需求;未打开的 Figma 规格不作为证据。本文的个人记录场景、字段政策和安全验收均为补充设计,不是该客户的完整规格或已交付案例。

先固定导出范围,再谈文件格式

以个人笔记机器人为例,首版可以只允许用户在私聊导出自己的有效记录。明确列出编号、创建时间、标题、备注等必要列;不要默认附带手机号、内部日志、Token 或其他人的数据。

一次导出应显示筛选条件、记录数和生成时间。日期范围采用创建时间还是业务日期,也要说清楚。导出过程中仍有人修改记录时,约定使用一致快照,或明确记录截点与限制;不能把分批查询拼成一个看似精确、实际前后不一致的结果。

请求发起和文件交付前都要检查授权。文件只发给获授权的接收者,不因为命令来自群里就把附件发回群里。无记录时返回明确说明或只有列名的文件;超出容量时说明范围,不静默截掉后半段却声称完整。导出文件是副本,不是持续同步,也不是已经验证可恢复的数据备份。

逗号、引号和换行需要真正的 CSV 序列化

RFC 4180记录了一种常见 CSV 格式:带逗号、引号或换行的字段要按引用规则处理,字段内的双引号通过两个双引号表示。它是 Informational 文档,不是“所有软件都会同样解释”的保证。

因此,不能简单把每个字段用逗号拼接。测试备注包含“周一, 周二”、一个双引号和一段两行文本,解析回来后仍应是原来的一格。数据行的列数应与列名一致;行数应由 CSV 解析结果核对,不能按文本换行数计算,因为一个字段本身可能跨行。

选定 UTF-8、分隔符、列顺序、时间格式和空值政策,并附简短说明。中文、英语、俄语和表情都用虚构样本验证。若下游需要区分“没有填写”和“填写了空文本”,就增加明确标记或选用能表达该区别的交换格式,不假装空单元格天然保留全部语义。

格式正确,也可能被表格软件改写

CSV 本身没有给每列声明强类型。编号 00123 与一个很长的数字字符串都可能是标识,不是用来计算的数值。仅给字段加 CSV 双引号,不能当作“强制文本列”的契约。

Microsoft 的 前导零与大数字说明介绍了自动转换风险,并给出导入时把相关列设为 Text 的办法。交付时应附导入步骤,在指定表格软件中将编号等列按文本读取;一旦原值被转换丢失,再改显示格式无法凭空恢复原内容。

不要为了保住编号,把数据变成一个公式。若业务要求无需配置即可打开且必须保留列类型,可以另行评估明确设置文本单元格的工作簿格式;这需要实际库、运行环境和兼容性支持,不能把 .csv 改名成 .xlsx。

引号转义不等于公式防护

OWASP CSV Injection说明,表格软件可能将不可信单元格内容解释为公式;常见防护在保存并重新打开后也可能失效,而且没有适合所有读取程序的通用净化方式。

例如用户备注就是无害的测试文本 =1+1。业务上它应保留为备注,而不是在查看导出时变成计算结果。姓名、标题、备注和自定义字段都要按不可信输入处理,不能只检查第一列,也不能认为“没有真实姓名就没有风险”。

为此先区分两种交付:

  • 供程序交换的原始数据:保留约定的值与结构,通过受控解析器读取;明确不作为可直接双击的表格查看文件。
  • 供人查看的表格副本:针对已经选定的软件与版本确定文本处理策略,用无害样本测试首次打开、保存、关闭后重开;若为安全改变了文本,要明确标注,不能覆盖原始业务记录。

不要无条件删除开头字符,也不要宣传给所有字段加一个前缀就能永远安全。先确定消费者,再测试具体方案。若无法证明查看路径不会把文本当公式,就暂缓一键表格下载,保留受控预览或另行实现并验证有类型的文件。

BotFatherV2 能从哪里开始

截至 2026 年 11 月 8 日,BotFatherV2支持 AI 对话创建和修改 Telegram 机器人。公开 AI 开发文档包含按用户隔离的持久化工具方向;可以先描述个人记录与导出政策,再核验当前 SDK 的查询、编码、文件生成和附件发送能力。

这不证明产品已有 CSV、Excel 或 Django 后台模块。固定 SDK 不支持任意 npm 模块或 Node/Bun API,首版不新增依赖付费 AI 的运行能力。如果不能完成文件交付,先做获授权的记录预览并明确缺口,不回复“导出成功”。原客户的 Django、PostgreSQL、Celery 等技术栈需独立开发;导入支持限于已有 Telegram Serverless 机器人。

BotFatherV2 与 Telegram 官方 BotFather 无隶属关系。下载与存储方法应分别实测,不能用 Telegram 能传附件推断任何生成文件的代码都能运行。

可直接修改的需求片段

设计私聊个人笔记机器人。导出只包含当前用户获授权的有效记录,固定编号、创建时间、标题和备注列,并显示筛选条件、截点、记录数和完整性状态。先核验 SDK 对一致查询、UTF-8 编码、CSV 序列化、文件生成及私聊发送的支持,不支持就只做记录预览。请区分程序交换与表格查看用途,不能把双引号当成公式防护;表格查看方案需在指定软件中验证。不要改写源记录,不导出其他用户、Token 或日志,不静默截断,不接 Django 后台或自动同步。

验收至少包括:

  • 逗号、双引号、换行、中文与表情能够按约定读回,字段不串列。
  • 00123 与长编号在约定的导入流程中逐字符保持一致。
  • 无害的 =1+1 在表格查看路径中显示为文本;保存重开后仍符合该政策。
  • 导出条数、稳定编号与相同截点的查询结果一致;中途编辑按公布的快照规则处理。
  • 用户 B 不能通过修改参数取得 A 的数据;授权失效或附件发送失败时没有虚假的成功提示。
  • 空结果、超限和部分失败均能区分,不把部分文件标成完整导出。

这些是设计验收条件,不是本文已经生成或验证过的机器人功能。金额本身的解析与汇总另见记账需求指南;本文关注从业务记录到文件,再到读取软件这一段是否保持含义。

来源与核验日期

  • FL.ru,Tg бот на Django,俄语买家委托,2025-11-04 发布;2026-11-08 核查已关闭归档,仅采用公开正文的 CSV 需求。
  • Y. Shafranovich,RFC 4180,2005 年 10 月,英文 Informational 文档;访问入口重定向至 RFC 信息页,2026-11-08 核验。
  • Timo Goosen、Albinowax / OWASP,CSV Injection,英文持续维护资料,无单一发布日期;旧入口重定向至该页,2026-11-08 核验。
  • Microsoft,Keeping leading zeros and large numbers,英文官方支持文档,无单一发布日期;2026-11-08 核验。
BITBEAR / TELEGRAM-BOT-CSV-EXPORT-CHECKLIST2026年11月8日