from urllib.parse import urljoin import requests import json import execjs # from curl_cffi import requests import retrying # import pyhttpx # # ja3 = "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-45-43-5-23-35-13-65281-16-65037-18-51-10-11-17513-27,29-23-24,0" # 自定义指纹字符串 # sess = pyhttpx.HttpSession( # # ja3=ja3, # http2=True # ) import tls_client headers = { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "no-cache", "pragma": "no-cache", "priority": "u=0, i", "referer": "https://booking.jetstar.com/", "sec-ch-ua": "\"Google Chrome\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "same-origin", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" } def get_cookie(): with open('akm/逆向.js', encoding='utf-8') as f: js = f.read() ctx = execjs.compile(js) session = requests.Session() # akm js file url akm_url = "https://booking.jetstar.com/Yxz-/5uZW/r/LS/v0HpqZQ/cY1w2bLGSLDp/UEtAAzo/SgIr/ED9jfEw" data = { 'sensor_data': ctx.call('encrypt1') } response = session.post(akm_url, headers=headers, verify=False, data=data, # proxies=self.proxies ) # print(response.text) bmsz = response.cookies.get_dict()['bm_sz'] data2 = { "sensor_data": ctx.call('encrypt2', bmsz) } data2 = json.dumps(data2) response2 = session.post(akm_url, headers=headers, data=data2, verify=False, # proxies=self.proxies ) print('bmsz => ', bmsz) print(response2.text) print(response2.status_code) @retrying.retry(stop_max_attempt_number=2) def req(bmsz_cookie): params = { "s": "true", "adults": "1", "children": "0", "infants": "0", "selectedclass1": "economy", "currency": "CNY", "mon": "true", "channel": "DESKTOP", "origin1": "CTS", "destination1": "KOJ", "departuredate1": f"2025-05-27" } cookie = { 'bm_sz': bmsz_cookie } response = requests.get("https://booking.jetstar.com/hk/zh/booking/search-flights", headers=headers, cookies=bmsz_cookie, params=params, timeout=15, verify=False, # impersonate='chrome99', # http_version=2 proxies=proxies # allow_redirects=False ) print(response.text) print(response) from lxml import etree import json html = etree.HTML(response.text) data = html.xpath("//script[@id='bundle-data-v2']/text()")[0] if html.xpath( "//script[@id='bundle-data-v2']/text()") else '{}' json_data = json.loads(data) print(json_data) @retrying.retry(stop_max_attempt_number=3, wait_fixed=4000) def get_ja3_str( ): url = "http://8.218.51.130:9003/api/v1/ja3" payload = {} headers = { 'cid': '750B5141EDBF7FA6F73A99C768130099' } response = requests.get(url, headers=headers, data=payload) if response.status_code == 200: res_json = response.json() if res_json.get("code") == 0: ja3 = res_json.get("data").get("ja3_str") ua = res_json.get("data").get("ua") if "--" not in ja3 and ",," not in ja3: end_data = ( ua, ja3 ) return end_data def tls_req(bmsz_cookie): ua, ja3_string = get_ja3_str() # current_cookie = cookies # browser = random.choice(self.BROWSER) req_session = tls_client.Session( ja3_string=ja3_string, # 直接注入自定义指纹 ) headers = { 'user-agent': ua, 'Accept-Encoding': 'gzip, deflate, br', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'priority': 'u=0, i', 'referer': 'https://booking.jetstar.com/', 'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1' } params = { "s": "true", "adults": "1", "children": "0", "infants": "0", "selectedclass1": "economy", "currency": "CNY", "mon": "true", "channel": "DESKTOP", "origin1": "PVG", "destination1": "SYD", "departuredate1": f"2025-05-31" } redirect_count = 0 max_redirects = 2 cookie = { 'bm_sz': bmsz_cookie } proxies_url = 'http://B_3351_HK___5_ss-{}:ev2pjj@proxy.renlaer.com:7778' ip = 100000000000 proxies = { 'http': proxies_url.format(ip), 'https': proxies_url.format(ip) } current_url = "https://booking.jetstar.com/hk/zh/booking/search-flights" while redirect_count < max_redirects: response = req_session.get(current_url, headers=headers, cookies=cookie, params=params, proxy=proxies ) print(response.status_code) # print(response.text) # 检查是否为重定向状态码 if response.status_code in (301, 302, 303, 307, 308): # 获取 Location 头(需处理相对路径) location = response.headers.get("Location") # if not location: # break current_url = urljoin(current_url, location) redirect_count += 1 # print(f"Redirecting to: {current_url}") # 可选:继承原始请求的特定 Headers(如 Referer) # headers["Referer"] = response.url else: from lxml import etree import json html = etree.HTML(response.text) data = html.xpath("//script[@id='bundle-data-v2']/text()")[0] if html.xpath( "//script[@id='bundle-data-v2']/text()") else '{}' json_data = json.loads(data) print(json_data) return raise Exception(f" ({max_redirects})") # cookies = { # # "bm_sz": "C0B44D1663A1D1DF531263C2737158CA~YAAQuqzbF+g+wsyWAQAAXYayzRvvCtO5B+WPIETQGca8PO//hOzF1VgQ8UWaX5jQZqjBtJddRoQiBEhF8Kt/yAAy1PYYdaau8jE40Cfj3UxUpLerF6Bx7lMVhelxsPpebDhexd9epZ869ZHXU7vr1aD5waP/ryM62ifQhwkZhoZYCUTM+l4o3i6heEfjohv20aoENno39gXuJ62b7Pw/fWIV1iZsg9ZXz6cytoOozhB86c7SYg8S4F2uHmdRJCQwAle44prjdlu+Dr4InbJIQNhYP+vlzTTuJjMBQWidZncw+5SeoYGHGVhzONc4K8ojnfu1RdhhFfv1vWbT6jLa7pKh3sxzSOHYh7c3zXJsEp7bKFRcqWNO0dqt5NvlLXmOgdiQuOk=~4604742~4342593", # "bm_sz": "D0FDE91D248039D3BCB85401C9E89EBC~YAAQEmrRF7aHJueWAQAA7oY75xu9AR2ykLW/ST7t+Z/9dlMdB5y12d+59GyysxUFJhQNz3GORFkJm0LXmIRyzA3UQ1toCGCp7oib9mXRbovqxMUbdHe3FzPkg6P+Qkz523VsaKzS40mf4sPhh33AU7BTBLYYoTeOii1NKDjkX7xXK0UQQTmi3DLjkLHTXNYuvzNpRZLjMXsMqDOp0e7mm8altPSk8GMJPnA0mMcokJ348UHk9vL92QLq9FmvD0Oi6PQwgPlec/qRjN2rQBH/hYe0KETY6RwKtaVbti5MVbR84d2VWVkKZyQwmmcibWMSrwdxp+oZjCJ3kguEctLgrQlOUfFiQwXprYugwZM=~3159352~4407875", # } # url = "https://booking.jetstar.com/hk/zh/booking/search-flights" # # # get_cookie() # req(30) bmsz = cookies = { "bm_sz": "92BF676C3DD979E01C44FB2085A5EB17~YAAQHWrRFzRVgemWAQAAVomREBt8eEC//siHZ6ZbSARsn9I5LSlX4gu9JMhr+mKMUqle7mBkR+FaMJRD6bqONlFEMRiSPt47mEXkvqd2XdhB42MWCDbDyBL4Kq5AQAUstK/W5QCqigla+wVukC/J8BCF4uUXQeC8RLQFt7nELruQ95bcwOZ0dcK+DLBJqhl7tbFUBXwJzTg59ijCrpx/3KIPbsVb8fOnX5+3HE1bgrwurqAVOB7ZLwDy2rz0MR4TZegpmu1LroCHjdbOC97Sr8Bm0vwycXsd3P67jSVGKtsjMkBWFXPYAnnZEfVYFWkCvq33qY4VAMwP0+liJr7oV/OtUSxJNKOXMARY6g==~3683381~3421233", } try: proxies = { "http": "http://127.0.0.1:7897", "https": "http://127.0.0.1:7897" } req(bmsz) tls_req(bmsz_cookie=bmsz) except Exception as e: # print(e)