微信小程序抢场地

一、前言

学习笔记,仅供学习交流!

目标:sz奥体中心羽毛球场地,争取实现打球自由。

二、工具

(1)PC端微信(windows系统)

(2)fiddler抓包工具

(3)python

(4)mysql数据库

三、流程

(1)fiddler抓包

打开fiddler抓包工具,PC端微信打开奥体中心小程序,选择羽毛球场地,提交订单。然后在fiddler中找到对应的请求链接,分析参数。

(2)分析请求参数

(2.1)请求一:获取场地信息请求(见上图)

        headers中重点参数是Authorization,这个参数是登录小程序时后台返回的,每次抢场地前都要手动更新。headers中其他参数都是固定值。

        请求体中重点参数是time_date和request_id,time_date是场地日期,request_id是md5加密值(如下:p.token就是Authorization值),其他参数是固定值。

request_id:d("".concat((new Date).getTime()).concat(Math.random()).concat(p.token))

(2.2)请求二:提交订单请求(见上图)

        headers中重点参数是Authorization(同请求一)。

        请求体中重点参数是sku_slice和request_id。sku_slice是所抢场地的具体编号,从场地信息请求返回值中获取;request_id(同请求一)。

四、代码

(1)获取场地信息并存数据库(数据库得用自己的),存数据库的目的是获取所要抢场地的sku值,在提交订单的请求中会用到

#md5加密返回request_id
def get_request_id(token):
    # 创建 MD5 哈希对象
    md5_hash = hashlib.md5()
    # 更新哈希对象以包括字符串的字节
    md5_str = str(time.time()*1000)+str(random.random())+token
    md5_hash.update(md5_str.encode('utf-8'))
    # 获取十六进制表示的加密结果
    request_id = md5_hash.hexdigest()
    return request_id


#获取场地信息
def get_data(rq, ground_id, token, request_id):
    url = 'https://api.wesais.com/field/wxFieldBuyPlan/getList'
    headers = {
        "Host": "api.wesais.com",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/json, text/plain, */*",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c11)XWEB/11275",
        "Authorization": token,
        "AuthRouter": "",
        "Origin": "https://xcx.wesais.com",
        "Sec-Fetch-Site": "same-site",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Dest": "empty",
        "Referer": "https://xcx.wesais.com/",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9"
    }
    data = {
    'business_id': '10000935',
    'stadium_id': '11733',
    'ground_id': ground_id,
    'time_date': rq,
    'request_id': request_id
    }
    res = requests.post(url=url,headers=headers,data=data)
    return res.json()

#数据库存数据
def save_data(conn,cursor,result):
    main_info = result['data']
    stadium_id = main_info['stadium_id']
    ground_id = main_info['ground_id']
    date_str = main_info['date_str']
    skuList = result['data']['skuList']
    data_list = []
    #场地cd_list
    for cd_list in skuList:
        #时间段sjd_list
        for sjd_list in cd_list:
            for r in sjd_list:
                tx_date = datetime.datetime.now().strftime('%Y-%m-%d  %H:%M:%S')
                data_list.append((0,stadium_id,ground_id,date_str,r['sku'],r['product_id'], r['field_id'], r['time_id'], r['sku_name'],r['sport_tag_id'],r['time_str'],r['price'],str(r['is_lock']),r['lock_status'],str(r['is_overdue']),r['item_no'],str(r['is_group']),r['group_id'],tx_date))
    insert_sql = 'INSERT INTO t(id,stadium_id,ground_id,date_str,sku,product_id,field_id,time_id,sku_name,sport_tag_id,time_str,price,is_lock,lock_status,is_overdue,item_no,is_group,group_id,crawl_time) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    cursor.executemany(insert_sql, data_list)
    conn.commit()

(2)提交订单请求(sku_slice和token要替换成自己的

#md5加密返回request_id
def get_request_id(token):
    # 创建 MD5 哈希对象
    md5_hash = hashlib.md5()
    # 更新哈希对象以包括字符串的字节
    md5_str = str(time.time()*1000)+str(random.random())+token
    md5_hash.update(md5_str.encode('utf-8'))
    # 获取十六进制表示的加密结果
    request_id = md5_hash.hexdigest()
    return request_id


#提交订单请求
def get_sku(sku_slice,token, request_id):
    url = 'https://api.wesais.com/shop/order/create'
    headers = {
        "Host": "api.wesais.com",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/json, text/plain, */*",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c11)XWEB/11275",
        "Authorization": token,
        "AuthRouter": "",
        "Origin": "https://xcx.wesais.com",
        "Sec-Fetch-Site": "same-site",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Dest": "empty",
        "Referer": "https://xcx.wesais.com/",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9"
    }
    data = {
    'business_id': '10000935',
    'stadium_id': '11733',
    'sys_id': '13',
    'sku_slice': sku_slice,
    'business_type': '1301',
    'order_from': '2',
    'handle_info': {"date_str":""},
    'sales_id': '0',
    'request_id': request_id
}
    res = requests.post(url=url,headers=headers,data=data)
    return res.json()

(3)提交订单请求成功后,需要手动付款,付款超时订单会自动取消。

声明:本文只用作学习交流。 请务必谨慎学习,稍有不慎就会被小程序拉黑,然后永远抢不了场地,打不了球。 一切责任自负!!!!!!      

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值