一、前言
学习笔记,仅供学习交流!
目标: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)提交订单请求成功后,需要手动付款,付款超时订单会自动取消。
声明:本文只用作学习交流。 请务必谨慎学习,稍有不慎就会被小程序拉黑,然后永远抢不了场地,打不了球。 一切责任自负!!!!!!
1176





