前言
最近微信给我派发了 10000
个微信红包封面,但是由于我的操作失误,派发方式选择了唯一链接,所以微信直接给我生成了 10000
个红包封面链接,对,就是 10000
个。
给我 10000
个红包封面没有问题,问题是我怎么把这些发给别人呢?
最初的想法
因为我有一台 1C1G
的云服务器,我就想着是不是可以写个分发服务,将链接存到一个列表中,在用户请求链接的时候从中拿出一个返回,同时将其从列表中删除,但是这样会存在很多问题,比如单个用户多次调用就有可能将列表清空,而且无法让每个用户只获取一次,而且 10000
个数据存到列表中也是太 low
。
灵光一现
因为我曾很多次尝试想对公众号做二次开发,想着做一个自己的服务端来接管公众号的用户消息。但是由于工作太忙(自己太懒),一直没能开始。接着这次 10000
个红包封面的问题,我又蠢蠢欲动,可惜做这样一个服务端没有几天半个月是不可能做完的(我是菜鸡,做的慢)。无意间,我在公众号的开发者工具页找到了微信云托管
这个产品,声称和微信用户体系天然打通,这岂不是正如了我的意。
我计划选择使用微信云托管来实现一个红包链接分发服务,而且微信云托管自带数据库,支持多种后端框架,支持公网域名访问,因为我的公众号是未经认证的,所以无法使用微信用户体系,只能选择公网域名这种方式。
几个难点
如何保存封面链接
通过上面的介绍,我们知道微信云托管为我们提供数据库服务,我们可以直接使用自带的数据库来保存我们的封面链接。
在导入数据之前,我们要创建表和初始化表结构。本次我们直接使用主键 ID,封面链接,封面状态三个字段即可。
我们选择使用 csv
文件进行导入。
如何让被领取的封面不再被领
上面初始化表的时候,我们已经设置了封面链接的状态,做法就是当链接被领取后直接在视图中调用 dao
方法将封面链接的状态改为已领取即可。(PS:用户请求的时候,dao
只会去处查询未被领取的封面链接)
如何让每个用户都只能领一次
这个问题算是这其中耗费我时间最多的一个问题了,从起初的计划用 Remote_Ip
(只能拿到云托管内网 IP
),源 IP
(headers
的属性 X-Real-Ip
,X-Forwarded-For
)来唯一确定领取者身份,但是同一个人的多次访问可能存在出口 IP
变化的情况,所以用这个办法也是不行的。
最后,我还是选择了最简单的 cookie
来做唯一检查,原理就是当用户来获取封面链接的时候,我会给客户端下发一个 cookie
,然后在收到请求的最开始去判断客户端是否携带了 cookie
,如果携带则直接返回“请勿重复领取!”
用户第一次来请求的时候是不带
cookie
的,第二次就会自动携带。
如何让用户一步领到封面
这个问题相对比较简单,公众号支持 html
内嵌,所以直接将我服务器的域名内嵌到一个 a
标签中,然后根据关键词返回这个 a
标签(可点击的文字)即可。
这个方案存在的问题
当然对于大多数的用户都是没问题的,怕就怕个别同学好奇心泛滥。简单的对比第一和第二次的请求头就能发现问题,通过删除客户端的 cookie
就能够实现多次获取封面链接,从而起到破解的目的。但是同一个封面一个人只能领取一次,多了也没意义。
谨以此文记录我的 10000
封红包分发过程。
评论区