关于Minecraft论坛举办的周年庆抽奖活动的幕后故事

修改于2021/05/1998 浏览日常碎片
这里是 我的世界论坛 的版主,我们策划了一个抽奖活动,这个帖子将讲述这次抽奖活动的幕后故事。
不知道应该发在什么地方,所以发这里了。
Part 1 - 策划活动
很久之前就想在MC12周年庆的时候举办抽奖活动了,在一个月前才正式开始策划相关内容
一开始我们想了很久,权衡了各种方面因素,最终确定了送给 Taper 的礼物是一份正版游戏
在确定奖品后,我们开始确定抽奖的方式等,考虑到在 TapTap 站内盖楼抽奖极易作弊且大量回帖会给站方和统计带来一定的困扰,所以最终选择了在站外搭建网站进行抽奖
开始吧!
Part 2 - 建设网站
我们选择了 PHP 搭建网站、MySql 存储数据
为了保证抽奖的公平性,我们规定每个 TapTap id 和 ip 只能提交一次表单,提交表单后将得到用于领奖的、仅显示一次的随机码
且为了防止使用大量 TapTap 账号干扰抽奖结果,我们设置了验证机制(Taper 在提交表单后将得到一个随机验证码用于验证身份)
Taper 们必须将随机验证码回复到指定的帖子进行身份验证,这样就杜绝了一定的作弊行为
TapTap
一开始由于表述不够清楚,很多 Taper 不知道在何处进行身份校验,以至于没有保留随机验证码无法在正确位置回复。
我们在发现这一现象后紧急上线了找回验证码功能:未通过验证的 Taper 使用同 IP 提交相同 ID 将再次显示验证码
TapTap
TapTap
尽管使用了单 ID + 单 IP 的方式尽可能避免作弊,但我们还是太菜了 ——我们在巡查数据库时发现一个 IP 提交了两个不同的 ID —— 过滤器出 bug 了
在修改了一大堆判断语句后不知道怎么就解决了这个不知道怎么产生的 bug
TapTap
Part 3 - Taper 的身份校验
TapTap
(上图为 TapTap API 返回的 json)
最开始我们想使用程序进行全自动校验,
但我们发现 TapTap 开启了防跨站 —— 我们不能在远程服务器上调用 TapTap 的 API 获取我们想要的内容
多次尝试均失败后我们选择了人工校验,
我们编写了一个运行于浏览器的用户脚本(user.js)进行高效率的操作
TapTap
(图中略去了部分代码与 API 地址)
TapTap
\ JavaScript 是世界上最棒的语言 /
Part 4 - 进行抽奖 (原帖)
TapTap
将使用通过 PHP 进行 SQL 查询符合参加条件的数据 ID,组合为数组 items(图中略去);调用函数 getRandomArrayElements 在 items 数组中随机取出 10 个元素,存入数组 lottery;
最后再调用函数 getRandomArrayElements 在 lottery 数组中随机取出 1 个元素,作为获奖者。
在开奖过程中将全程录屏
Part 5 - 最后
非常感谢由 Miri Technology 旗下的麦云™提供了云服务器(我们的 Minecraft 创作者团队 UncodeStudio 其实也是 Miri Technology 家的)
感谢 Akaza Akari [s]无私[/s]提供了网站 CSS
最后,非常感谢一直活跃在 TapTap 我的世界游戏论坛 的各位 Taper !
\ PHP 是世界上最棒的语言 /
By. Miri Technology - UncodeStudio
3
4