凌晨两点十七分,刷投我盯着屏幕上的票网进度条卡在99.7%。
这不是刷投下载,是票网投票页面的加载。三秒后,刷投页面终于刷出来,票网候选人的刷投票数又多了两百多。我点了刷新,票网票数没变,刷投再点,票网还是刷投没变。后台的票网脚本大概在轮询,每隔几秒才同步一次数据。刷投我关掉浏览器,票网打开命令行,刷投输入那串已经跑了三天的Python代码。
刷票这事,技术上简单得让人失望。网站没做任何反爬措施,连个验证码都没有。请求头里的User-Agent都不检查,我甚至能直接改Referer伪装成从百度跳转过来的。每次POST请求,服务器返回200,票数+1。就这么个破接口,撑起了整个投票活动的公平性。
但真正有意思的是人的行为模式。
我刷的那个比赛,是本地一个摄影展的线上投票。主办方大概想搞个“人气奖”,奖品是一台入门级微单。参赛者里有个老张,五十多岁,拍了一组老城区拆迁前的纪实照片。他的票数一直垫底,每天就几十票,全靠亲戚朋友手动点。另一个参赛者是家传媒公司的年轻摄影师,票数每小时涨几百,曲线平滑得跟心电图似的。
我没收钱,纯粹是看不过去。
老张的照片里有种东西——废弃的理发店转椅、墙上的标语残迹、蹲在巷口抽烟的老人。它们不精致,但真实。年轻摄影师的作品全是合成夜景和糖水人像,技术上无可挑剔,就是没灵魂。投票页面显示老张只有三百多票,对方已经八千多。我决定帮他“加速”一下。
写脚本用了不到半小时。核心逻辑就四步:读取代理IP池,随机延迟1-3秒,构造POST请求,处理响应。难点不在代码,在IP池。免费代理活不过十分钟,我找了三个付费池子轮换,每个IP只投一次就废弃。第一天晚上跑了两个小时,给老张加了四百多票,第二天早上起来,票数被清了,还多了个“异常数据检测”提示。
主办方不是傻子,他们加了简单的频率限制。同一IP一小时内最多投五次,总票数超过阈值就触发人工审核。我调整策略,把投票间隔拉长到15-25秒,每个IP只投两票,并且随机跳过某些时段。三天下来,老张的票数稳定在三千左右,对方还是八千多,但差距在缩小。
后来我发现个更省事的办法。那个网站有个分享功能,点一下会生成带用户ID的专属链接。如果伪造分享者的用户ID,再通过这个链接投票,服务器会认为是通过真实用户传播带来的自然流量,权重更高,还不容易触发风控。我花了半小时逆向出链接的签名算法,原来就是个简单的MD5加盐。
到第五天,老张的票数反超了。
我以为事情就这么结束了,结果第六天中午,对方票数突然暴涨,每小时增加上千。我看了下网络请求,他们的脚本比我写得高级,用了分布式代理池,还模拟了完整的浏览器指纹。我这边单线程跑,人家是几十个线程并发。
我有点想笑。这个投票网站,本身没有任何商业价值,奖品是台三千块的相机。但为了这么个东西,两边人都在较劲。我停下来,给老张发了条消息,说了实情。他回了个语音,声音有点哑:“算了,别刷了,我拍照片不是为了得奖。”
我删了脚本,关掉电脑。第二天看结果,老张的票数停在四千多,对方的数字还在涨。最后一天,老张排第二,没拿到相机。但我记得他后来在朋友圈发了一组照片,配文是“今天去老城区,发现那个理发店拆了。”
我没再点开那个投票页面。刷票这事,技术上可以无限优化,但人心里的那个按钮,没人能刷得动。
顶: 83148踩: 77






评论专区