抽奖助手自动参与抽奖

无码科技开发了一个抽奖的小程序,里面有一些赞助商提供的抽奖,但是每次都要一个一个的点才能参与,很麻烦。参考了网上的一些教程,写了一个脚本,可以不用一个一个地点就可以参与抽奖。

过程的话主要是

  • 抓包,分析如何获取奖品列表,分析如何提交参与抽奖。
  • 模拟小程序发送的请求,参与抽奖。

抓包的话,这个就不详细讲,最近也是在摸索,等有空了出个图文教程。这里先说个结论吧。

获取每日抽奖的奖品

https://lucky.nocode.com/public_lottery?page=1&size=5

用的 GET 方法请求的,需要注意的是请求的 headers , 因为无码可见会 headers 里面的一些用户信息。headers 的话可以通过抓包工具分析。

这里贴下我的代码


import time
import requests
from requests import Request, Session
import urllib3
urllib3.disable_warnings()

class NoCode:
    headers = {
        'charset': 'utf-8',
        'Accept-Encoding': 'gzip',
        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...', # 这里注意替换为你自己的 authorization
        'version': '0.1.76',
        'content-type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 7.0; MI 5s Plus Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36 MicroMessenger/6.7.2.1340(0x26070233) NetType/WIFI Language/zh_CN',
        'Host': 'lucky.nocode.com',
        'Connection': 'Keep-Alive'
    }

    session = Session()

    def get_daily_products(self):
        print('get daliy prodeucts')
        daliy_url = 'https://lucky.nocode.com/public_lottery?page=1&size=5'
        req = Request('GET',daliy_url, headers=self.headers).prepare()
        response = self.session.send(req)
        if response.status_code == 200:
            for product in response.json()['data']:
                if not product['joined'] :
                    print('find:', product['id'],product['prizes']['data'][0]['name'])
                    # yield product['id'], product['prizes']['data'][0]['name']
                    self.jioned_product(product['prizes']['data'][0]['name'], product['id'])
        else:
            print(r'请求失败,状态码为%s' % response.status_code)

参与某个奖品的抽奖

通过抓包可以知道,参与抽奖的 url 是:

https://lucky.nocode.com/lottery/{product_id}/join

product_id 是这个奖品的 id , 可以通过获取抽奖奖品列表的时候获取。同样需要注意的是 headers ,因为里面保存了你的登录信息等。

特别说明的是,这个方法是用 POST 来请求的,需要注意一下。下面贴下我的代码

    def jioned_product(self, params):
        print('start jion the product', params[1])
        url = 'https://lucky.nocode.com/lottery/%s/join' % params[0]
        datas = {
            'form_id': "%s" % int(time.time()*1000)
        }
        print('url:', url, 'datas:', datas)
        req = Request('POST',url, data=datas, headers=self.headers).prepare()
        del req.headers['content-length']
        response = self.session.send(req)
        response = response.json()
        if response.get('data', False):
            print(r'抽奖成功')
        else:
            print(r'抽奖失败')

这里有个坑需要特别说明下,在参与抽奖的这个请求里面, headers 里面不能有 content-length ,否则会请求失败,原因未知,解决的办法就是删掉 content-length

获取自助福利并参与

老规矩,先上代码

    def get_square_products(self, url):
        if url == "": url = 'https://lucky.nocode.com/square'
        print(url)
        req = Request('GET', url, headers=self.headers).prepare()
        response = self.session.send(req)
        if response.status_code != 200: return
        response = response.json()
        for product in response['data']:
            if not product['joined'] :
                print('find square products:', product['id'], product['prizes']['data'][0]['name'])
                # yield product['id'], product['prizes']['data'][0]['name']
                self.jioned_product(product['prizes']['data'][0]['name'], product['id'])
        nextUrl = response['links']['next']
        if nextUrl != None :
            self.get_square_products( "https://lucky.nocode.com%s" % nextUrl)

自助福利是分页的,所有后面有个递归调用。然后最开始的 url 是 https://lucky.nocode.com/square,请求这个 api 以后,会返回自助福利列表,如果有下一页的话就请求下一页的 url ,解析出来奖品后参与抽奖。

预览图: https://s4.ax1x.com/2022/01/15/7YyPjx.jpg https://s4.ax1x.com/2022/01/15/7YyFu6.jpg https://s4.ax1x.com/2022/01/15/7YykDK.jpg https://s4.ax1x.com/2022/01/15/7YyVED.jpg https://s4.ax1x.com/2022/01/15/7Yye4H.jpg https://s4.ax1x.com/2022/01/15/7YyKgI.jpg - 本程序理论支持配置百万级别人数,超过 10 万以上时初始化会比较耗时,初始化后可以正常抽奖。 - 如果人数较多,不建议导入名单或照片,按号码抽奖即可。 (1)抽奖配置:- 设置抽奖总人数、奖项及每个奖项的人数,默认包含两个奖项,如果不想抽取默认的奖项,可以设置该奖项数量为 0 - 可以新增自定义的奖项,新增后必须将奖项人数设置大于 0 才会在抽奖奖项列表中显示 (2)抽奖结果:- 显示抽取的结果,点击号码允许从结果中删除该号码。删除后该号码可以参与剩余的抽奖,否则已经中的号码无法参与剩余奖项的抽奖(除非开启全员参与功能) (3)开始: - 开始抽奖,需要选取抽取的奖项、本次抽取的人数和是否开启全员抽奖功能。 - 本次抽取的人数可以选择 1 人、5 人、一次性抽取完或者自定义抽取数量,不能大于奖项剩余的数量 - 点击停止抽取完成 (4)重置 - 重置数据恢复到初始状态 - 可选的重置选项: 1.重置全部数据 2.重置抽奖配置 3.重置名单 4.重置照片 5.重置抽奖结果 (5)导入名单 - 按照格式导入名单,可以多次输入。若号码有对应的姓名,则在抽取过程及结果中会显示号码及姓名,若没有对应的姓名,则只显示号码。 (6)导入相册 - 按照 抽奖号-照片的一对一导入,(可在现场将号码发出签到后,每发一个号码,导入一个照片)。抽奖结果将以照片形式展示。 - 照片格式支持.jpg和.png,照片大小不能超过 150kb,建议 20-50kb,建议尺寸为 160*160px (7)温馨提示 - 本抽奖程序无暗箱操作,无后台,无后门。 - 名单和照片显示只需导入一种即可,无导入数据则使用抽奖号码。 - 建议使用最新的 Chrome 浏览器打开体验最佳。 - 由于背景音乐加载较慢,可以在抽奖前提前打开缓存好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值