景区抢票平台爬虫以及对美团的破解思路

Posted by Futari on 2022-12-17
Estimated Reading Time 5 Minutes
Words 1.1k In Total
Viewed Times

严禁用于非法用途,本教程仅供交流使用

为了维护商家权益,关键信息会进行打码处理,严禁用于非法用途

PS:文中接口再2022年7月已失效

1.寻找景区链接

首先打开微信公众号中的我们的订单页面,url为

https://wap.lotsmall.cn/vue/order/list?type=finished&m_id=1954

进入到页面我们自动跳转会发现是商铺的登录界面,需要重新进行登录,所以可以推断出景区的用户凭证以及权限校验均是基于微信的,进入https://wap.lotsmall.cn通过其他景区的入口,如青海旅游[店铺主页 (lotsmall.cn)](https://wap.lotsmall.cn/vue/custompage?id=907&m_id=404)

我们通过对比景区url很容易的判断m_id=1954代表的意义是景区id

2.进入票务系统兵找到最终下单请求

对于抢购等即时任务,一般不会采用多请求同步的方式来确定一个tps,所以我们寻找最终请求的过程也不是很繁琐,一般只需要抓最后点击抢购按钮之后的请求分析就可以了。

提交页面如上图所示,点击后分析请求,得到请求列表。

抓住两个点分析就可以了:

第一个是寻找自己填写的购票信息所在请求体位置

第二个是寻找抢购完的信息所在响应体的位置

有上面两条线索任一条即可确定最终请求。

3.分析RequestBody和ResponseBody

请求体和响应体分别如下。

请求

分析请求体的关键是发送两条不同请求,观察所需要的字段有何不同,如果只是自己post的数据不同那就最好了。具体十小

Headers由于服务端对用户的要求不同,所以一般不修改即可。

Cookie有的话一定要带着,具体失效时间自己摸索。

响应

分析响应体只需要判断一下状态码是否和响应体有对应关系,反映出何种状态即可。

4.自己写代码实现post逻辑就可以了

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import requests
import re
import json
import time
url = "https://wap.lotsmall.cn/dubboApi/trade-core/tradeCreateService/create"
requests.packages.urllib3.disable_warnings()
name = "姓名"
date = "2022-07-08"
idCard = "你的身份证号"
startTime = "09:30"
endTime = "10:30"
proxy = {
'http': 'http://183.236.232.160:8090',
}
Cookie = 'HWWAFSESID=fa8f5947c30f9b3756; HWWAFSESTIME=1657447816616; m_id=1954; connect.sid=s%3A6af-mMC_YvCyrWLO16c9KB9uKPPh41v0.IaalHimKDws0oFU%2FwFZyZXenCCE75POiCiKc2nJ614U; tr_se_id=c2UtTEJMS0ZETUpJV01Z%0A; tr_de_id=ZHYtVkhHWEVUV09MT0NQ%0A; tr_wb_id=d2ItUVhEQ0FRTk5XSVpD%0A; SESSIONID=df36d945-83b1-4729-b4f6-738019db4269; token_1954=eyJhbGciOiJIUzUxMiJ9.eyJ1IjoiNDkxNjkxOTYwMjAyMzAxNDQwIiwidCI6IjAiLCJleHAiOjE2NTc0NTUwMjd9.B7rYa_gm9-xZQRVZvGVonbEKCujftSe4Q3bVlRPO0syC6Ha166voFCIGOB2jk9l7k7z5i3BX8cBXmmgyGVACAA; leaguerInfoId=491691960202301440; leaguerInfoId_1954=491691960202301440; token=eyJhbGciOiJIUzUxMiJ9.eyJ1IjoiNDkxNjkxOTYwMjAyMzAxNDQwIiwidCI6IjAiLCJleHAiOjE2NTc0NTUwMjd9.B7rYa_gm9-xZQRVZvGVonbEKCujftSe4Q3bVlRPO0syC6Ha166voFCIGOB2jk9l7k7z5i3BX8cBXmmgyGVACAA'
accessToken = 'eyJhbGciOiJIUzUxMiJ9.eyJ1IjoiNDkxNjkxOTYwMjAyMzAxNDQwIiwidCI6IjAiLCJleHAiOjE2NTc0NTUwMjd9.B7rYa_gm9-xZQRVZvGVonbEKCujftSe4Q3bVlRPO0syC6Ha166voFCIGOB2jk9l7k7z5i3BX8cBXmmgyGVACAA'


headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x6307001d)','Cookie':Cookie,'Referer':'https://wap.lotsmall.cn/vue/order/ticket?m_id=1954&parkCode=park2021052616283106969&playDate=2022-06-23&scenicId=8301&ticketId=69889','access-token':accessToken,'Origin':'https://wap.lotsmall.cn','m-id':'1954','Connection':'keep-alive','Host':'wap.lotsmall.cn','Sec-Fetch-Dest':'empty','Sec-Fetch-Mode':'cors','Sec-Fetch-Site':'same-origin','Content-Type': 'application/json'

}
data = {
"saveOrders": [{
"wayType": "1",
"startTime": "",
"amount": "1",
"modelCode": "MP2022060212545210257",
"orderCertAuthList": [{
"realName": name,
"certType": 0,
"certNo": idCard,
"riskFlag": "",
"idCardAddr": "",
"travelCardImgUrl": "",
"certImgUrl": ""
}],
"spiltStartTime": startTime,
"spiltEndTime": endTime,
"activityIds": [],
"needConfirm": "F",
#"marketingType": null #识别不了null就注释掉

}],
"buyer": {
"name": name,
"faceUrl": "",
"mobile": "17710223676",
"credentialNo": idCard,
"credentialType": "0"
},
"amount": 1,
"merchantInfoId": "1954",
"orderType": "park",
"couponCode": "",
"tips": "[]",
"startDate": date,
"endDate": date,
"wayType": "2"
}
for i in range(100000):
response = requests.post(url = url,headers = headers,data=json.dumps(data),verify=False,proxies = proxy)
response.encoding = "utf-8"
r = response.text
print(r)
time.sleep(1)

订单

以上为订单成功截图。

PS:数据出现如下图都是很正常的,原因是浏览器的编码不同,所以不管是何种不认识的字符,自己去转换一下就可以了

转换前

转换后

未完待更。。。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !