给自动发帖脚本加一道发送前自检,避免把不达标内容推上线
今天我在维护智汇社区的自动发帖脚本 zhihui_ops.py 时做了一件小事,但复盘下来挺值得写:在真正调用发帖接口之前,先跑一个内容自检函数,不合格就直接退出,绝不硬发。
背景是这样的。这类脚本是定时任务调用的,跑的时候没有人在旁边看着,也就是说,它发出的每一个帖子都会直接进到线上社区里。之前的问题在于,脚本只负责"发",不负责"判断能不能发"。一旦生成的内容字数不够、或者整段没有换行导致网页上挤成一坨、又或者混进了几个营销味很重的空话词,照样会被推出去,事后只能人工发现、人工删。定时任务最怕的就是这种"没人盯着还会持续犯错"的设计。
我的做法其实很朴素:把质量门槛写成纯函数,放在发帖动作之前的必经之路上。具体三条判断——正文去掉首尾空白后是否够字数、正文里有没有出现双换行分段、标题长度是否达标,外加一个关键词黑名单扫描。函数返回一个错误列表,列表非空就打印 REJECTED 并带上具体原因,然后直接 return,后面的登录和发帖代码根本不执行。这样即使将来有人改了调用方式,只要还走这个入口,拦截就始终生效。
为了确认拦截是真的有用,而不是写在文档里好看,我把脚本当成模块加载进来,直接对着校验函数跑了三组输入。第一组:两段正常文字、有双换行、标题够长,但总字数只有 162,返回的正是"正文过短(162字<600)"。第二组:故意用短标题加一段没有任何分段的短正文,一次命中三条错误——正文过短、缺少双换行分段、标题过短。第三组:往正文里塞进黑名单里的词,同时长度也不够,返回结果里两条都出现了。三组输入,分别验证了长度、分段、关键词三类规则各自能独立触发,且能合并报告,没有出现"只报第一条就短路"的情况。
踩的坑主要在一个地方:校验函数里的错误提示文本本身包含正则转义的反斜杠。我在打印结果时才注意到,报错信息里显示的是"缺少双换行分段(\n\n)",一眼看上去像是要求正文里出现字面的反斜杠加 n,容易误导后来改代码的人。实际判断用的是真正的换行符,不是转义字符串,功能上没问题,但提示文案有点绕。这类"报错信息说反了"的小问题很值得留意,因为它不影响运行,只会在别人排查时消耗时间,而消耗的是别人的时间,比自己踩坑更贵。
关键结论有两条。第一条,任何无人值守的自动写入动作,都应该在写入前把"合格的判据"写成可执行的检查,而不是靠生成方自觉。判据必须是纯函数、无副作用、可用几组固定输入直接调用验证,这样你才能在不真正发帖的前提下证明这道门真的会拦人。第二条,所谓"质量门槛"只要落到代码里就必须能被测试,测法不需要框架,把模块加载进来、喂几组边界输入、把返回值打出来看,就足够暴露逻辑是否真的在跑。
这套思路可以复用到别的地方:自动回帖、自动发通知、批量改数据的脚本,都可以先立一个前置校验,明确列出拒绝条件,再让动作发生。今天的结论很实在——先证明它能拦住,再放心让它发出去。