/zmyy-seckill

知苗易约抢购

Primary LanguageGo

知苗易约抢购小程序

目前开发完成,暂未测试,因而暂不给(以后可能也不给)使用说明。本项目是作者本人写的第一个Go程序。只作学习交流使用。之初遇到不少的问题,多亏一些大佬点拨,不胜感激。【如有帮助,请点个star

【2021-04-14】v1.2.0 增加IP轮询机制,说明如下:

  • ip代理需要自行添加,文件在ip/ip.txt,ip需要支持https
  • 限速器以IP为单位,每个IP都将拥有一个线程进行预约
  • 验证码的获取、识别、订单提交仍以串行方式(加锁)运行,这是本项目最大的性能瓶颈

【2021-04-09】v1.1.0 增加IP代理

【2021-03-21】v1.0.1 删除用于获取zftsl参数的js文件

【2021-03-20】v1.0.0 验证码exe识别模块改为直接调用py脚本,以支持非windows用户使用

建了个群,感兴趣的可以加一下:788512807 【如有帮助,请点个star

  • 问题进度
    • 【已解决】增加IP代理,详细说明如下
      • IP使用的是免费的IP,所以速度不会很快,甚至有的IP会不可用
      • 默认已开启IP代理功能,默认使用本机IP,当本地IP发生error时切换代理IP
    • 【已解决】2021/2/22 -运行时出现403错误,经调试后发现小程序做出了相当大的更新导致的。原来请求的url都添加了一些动态的变化参数如key302和expire302
      • 【问题详细说明】当程序请求原来的URL时,会返回403错误,但实际是由于302重定向引起的。即当第一次请求URL时,实际请求的资源是不存在的,小程序后端会重定向到一个新的URL,并赋予key302和expire302两个参数,而在zmyy程序中是无法被重定向的。
      • 【解决方案】若想拿到重定向的url,可以通过请求原url,并在响应报文resp的header中得到Location参数,即为重定向的url
    • 【已解决】获取验证码时,并未得到验证码图片,而是一大串文字
      • 该大串响应报文是图片的Base64编码,可转换成图片
    • 【已解决】滑块验证码的x轴坐标可通过opencv来解决。附一个大佬的Python代码,亲测可用https://github.com/crazyxw/SlideCrack
      • 在golang调用Python程序时,若该*.py文件中没有导入第三方依赖,可顺利被go调用。当导入三方依赖时,会报错,这种情况目前本人无法解决【已解决,见版本v1.0.0】。
      • 由于本人是Windows系统,故将python代码打包成了*.exe可执行程序进行调用,测试后可行
    • 【已解决】滑块验证码获取需要一个zftsl的参数,猜测与时间戳和sessionid有关,目前无法得到该值,故无法拿到滑块验证码文本。
      • 逆向小程序后,拿到相关的js文件,找到了zftsl参数的来源。
      • 在使用golang调用js时,出现了与调用Python一样的情况,即不能有三方依赖。作者通过将几个js文件函数拼接到了一个文件中-app.js。go调用该js后可得到zftsl参数。测试通过。
    • 【已解决】在拿到滑块验证码的Base64编码时,发现该编码太长导致[]byte接收不完全,因而无法复原验证码图片。
      • 通过将resp.body写入到本地文件中,再用json解析本地文件得到两个图片的base64编码
      • 需要注意的是,在多协程环境下,会有大量的文件读写操作,可能会造成文件的覆盖。未来需要对文件名(如 file+协程ID)进行区分,在验证码识别完成后可不对文件进行删除操作,直接覆盖对应文件名
    • 【已解决】在代码运行过程中出现503异常,Degug时程序却运行正常,猜测是请求过快导致被服务禁止
      • 通过在关键请求前后增加sleep时间,降低访问频率
      • 增加LimitRate限流,在实际测试中发现,当请求速率设置有1次/s时,有小概率被限流的风险。当频率为1次/2s时,不会被限流。因此暂时设置速率为1次/2s
    • 【已解决】增加多线程以提高运行效率
      • 增加多线程访问时,出现验证码识别失败的问题。猜测使用同一session并发请求获取验证码图片时,会导致小程序服务端前一次请求的验证码结果失效,即多线程并发请求和验证验证码会出现混乱状况。
      • 为解决上述问题,作者采用加锁的方式。从验证码获取到识别完成这一流程整合成一个步骤对其加锁,当流程中有任一操作失败时就释放锁,把请求资源让给其他线程执行。测试可行。
  • 开发进度
    • 开完发成。
  • 项目结构说明:
    • 用户信息在config/conf.yaml中手动配置
    • 项目build后会生成可执行文件zmyy_seckill.exe,使用时勿修改文件名。(因路径使用了正则匹配。)
    • 本人已尽可能减少使用难度,但conf.yaml中的Cookie因技术原因无法解决,故需要使用者本人获取
      • 推荐在电脑上打开小程序,并使用fiddler抓包即可