西南航空 F5 Shape 如何生成?
这几天西南航空的风控大幅度增强,我们优化后的6.0.0版本并没有收到这次风控等级升级的影响。
Shape风控会在请求头中加入ee30zvqlwf-a、ee30zvqlwf-b、ee30zvqlwf-c、ee30zvqlwf-d、ee30zvqlwf-f、ee30zvqlwf-z 参数,通过这些参数对环境进行检测,并判断出是否是真实用户的流量。
接入Demo
# -*- coding: utf-8 -*-
# @Time : 2023/3/28 6:50 AM
# @Author : TiggerRun
# 接入案例
# :TGRUN000
# :TGRUN001
import requests
import threading
import random
import json
url = api + '/search_flight'
airport = ["ALB", "ABQ", "AMA", "AUA", "ATL", "AUS"]
def get_flight_data():
while(True):
try:
# 发送搜索请求体,和wn接口的请求方式一致
payload = '{"body": {"adultPassengersCount":"1","adultsCount":"1","departureDate":"2023-04-05","departureTimeOfDay":"ALL_DAY","destinationAirportCode":"' + random.choice(airport) + '","fareType":"USD","int":"HOMEQBOMAIR","originationAirportCode":"' + random.choice(airport) + '","passengerType":"ADULT","reset":"true","returnDate":"2023-04-06","returnTimeOfDay":"ALL_DAY","tripType":"roundtrip","application":"air-booking","site":"southwest"}}'
res = requests.post(url=url, headers={
"content-type": "application/json",
"connection": "close"
}, data=payload, timeout=10)
if res.status_code == 500:
print("请求频繁.")
elif res.status_code == 403:
print("返回错误的状态码 403")
elif res.status_code == 400 or res.status_code == 200:
wn_data = json.loads(res.text)['data']['body']
print("返回数据", wn_data)
except Exception as ex:
pass
# create 10 thread
for i in range(10):
t = threading.Thread(target=get_flight_data)
t.start()
风控的特点
- 蜜罐:在风控不高的时候,往往会让错误的headers通过请求,看似已经绕过了Shape,实际上并有,Shape往往会误导你的想法。
- 检测动态变化:Shape中包含一个有自定义解析器的虚拟环境,称之为虚拟化保护(VMP),这使得测试非常困难。
- 风控等级动态变化:在没有风控时,成功率几乎为100%,当网站风控等级提升时,真人的搜索都可能被拒绝。
- 底层检测:在我们的测试中,发现存在一些底层的检测,而不仅仅停留在TLS。
优点
- 不需要短效IP,获取数据的代理开销小(月均¥1000代理)
- 我们曾在1条IP中进行测试,我们的headers可以获取上万条数据(!!!!仅1条代理!!!)
- 目前支持每家/10线程获取数据(每小时大概1w条有效数据),数据返回时间平均在1-2秒,如需扩增线程可以另外进行购买。
- 可7*24小时获取实时数据
- 接口进行了封装,请求航司更加便捷
- 在我们最新的框架中,绕过Shape的代码仅有200行,易于维护。
后台展示
# -*- coding: utf-8 -*-
# @Time : 2023/3/28 6:50 AM
# @Author : TiggerRun
# 接入案例
# :TGRUN000
# :TGRUN001