背景

​ 最近某游戏的万宝楼上线了外观交易的功能, 但是外观交易由于时间性的问题,就会产生差价,一些忘记改价格的外观就变得很多人抢。抢外观和抢号的逻辑差不多,所以就想整个脚本试试能不能快速完成交易。抢外观有点像倒计时秒杀的功能, 但是没有秒杀的竞争力度,不过多了一层验证码的校验。所以有时候遇到一些不好选择的验证就会比别人慢一步。期望「万宝楼助手」能够选择商品后,等待倒计时结束自动下订单显示付款的二维码。

需求分析

正常交互流程

1、选择商品,打开商品详情页

2、点击「购买」按钮

3、弹窗验证码,完成验证码校验

4、显示付款二维码、扫码完成付款

交互层接口层的流程分析

接口流程

可以得到以下几个信息

商品信息获取

  • 需要商品编码

创建一个订单需要3类参数

  • 验证码参数
  • 商品详情参数
  • 用户账号信息

创建完订单后返回order_id(订单ID)获取支付二维码

整体上来看,这个订单创建流程还是比较简单的

功能设计

想要实现一个自动下单的「万宝楼助手」,那么需要以下几点功能

  • 商品信息获取
  • 倒计时功能
  • 验证码模块
第一点:商品信息获取

这个非常简单,看下network就可以了,爬下接口 /api/buyer/goods/detail,入参商品编码即可

第二点:倒计时功能实现

这个也比较简单,利用最近很火的chatGpt,马上实现一段倒计时的代码

chatGpt倒计时

function countdown(targetDate, callback) {
  var x = setInterval(function() {
    var now = new Date().getTime();
    var distance = targetDate - now;
    var days = Math.floor(distance / (1000 * 60 * 60 * 24));
    var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    var seconds = Math.floor((distance % (1000 * 60)) / 1000);
    var timeLeft = { 
      days: days,
      hours: hours,
      minutes: minutes,
      seconds: seconds
    };
    if (distance < 0) {
      clearInterval(x);
      timeLeft = {
        days: 0,
        hours: 0,
        minutes: 0,
        seconds: 0
      };
    }
    callback(timeLeft);
  }, 1000);
}

修改一下适配下就好,有chatGPT 编码效率提升太多了

第三点:验证码

验证码的验证有比较多的实现逻辑,发token到第三方接口验证,或者自己实现破解验证也可以,这里采用了最简单的实现思路,提前验证。目前这个平台的验证码验证都没有对时间性有特别高的要求,所以可以提前几分钟产生出几个有用的token存储起来,最后在创建订单的时候把验证参数一起发过去就好

有了这一套基础核心代码逻辑,功能已实现7788了。接下来是思考前端交互层面的实现

交互设计

思考过几种交互方式

1、前端页面添加cookie + 商品编码 + 验证码、后端服务发起创建订单请求,返回支付二维码

优势:

  • 可提供多用户使用
  • 核心代码在后端server中

劣势

  • 需要代理,不然同IP 访问容易触发女巫攻击检测
  • 网络IO时延导致比较慢一些

2、油猴脚本实现 商品编码录入 + 验证,前端代码创建

优势

  • 代码简单,无需后端服务器省去部署
  • 网络时延快,和正常访问网页速度一致

劣势

  • 用户需要拷贝代码,安装油猴脚本插件使用

最终考虑到自用问题,选择油猴脚本

功能实现

技术方案确定后,马上到github上找找看,油猴脚本脚手架。之前写脚本都是纯js + 黑魔法编写UI 非常不方便,看看有没有高效率的方式。果不其然找到了一个 vite-plugin-monkey 仓库,非常方便。

它支持

  • Typescript 编码
  • 支持热更新
  • 支持 Vue、React等主流UI框架

已经和写前端页面没有区别了

使用也非常的简单,请看README。

咔咔咔咔猛猛打了几小时代码后最终实现了。

效果图

后记

虽然只是记录一个简单的助手插件功能实现过程,但是告诉自己以后做每一件事情,都尽量让每一件事情产生意义,产生出价值。比如这个脚本的实现,我希望能够既实现了功能的同时,复盘下过程管理,形成一篇文章,让以后自己回顾自己对需求的实现思考过程,看看还有没有提升空间,设计思路是不是还有更优的地方。我也希望自己的文字能够帮助到大家。

感谢阅读完!