抓包工具之fiddler
一、HTTP代理
二、fiddler
2.1 安裝
2.2 認識fiddler
2.3 app抓包
三、綜合練習
利用fiddler抓包,編寫一個12306火車票查票程序
import requests
import json
import csv
# 注意cookie值會過期,報錯,請重新設置cookie
headers = {
'Cookie': 'BIGipServerpool_index=821035530.43286.0000; RAIL_EXPIRATION=1572017654075; RAIL_DEVICEID=AdfXWpWAdOcsfqpZcp69z03jVG2YmLBqQF2VenNG5feRJSf0QS7WxtLeTWxrilU3rQGv03d74zyJVwZRYLEFV_kr2_Hn1fVGPjGaWh3ehYI3eZsJ9xfGB9K21c9jMKf04A8NnCrVXCptD2U7u9U_bb-XwC52ptaJ; route=6f50b51faa11b987e576cdb301e545c4; BIGipServerotn=904921610.38945.0000',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36'
}
class CheckTicket:
def __init__(self, date, from_station, to_station, headers=None):
self.date = date
self.from_station = from_station
self.to_station = to_station
self.headers = headers
self.station_data = {}
# 獲取所有車站信息
station = requests.get(
"https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9114",
headers=self.headers)
# print(station.text)
station_str = station.text
station_list = station_str.split("@")[1:]
# 車站名與代號進行映射
for i in station_list:
station_name = i.split("|")[1:3]
self.station_data[station_name[0]] = station_name[1]
# print(station_name)
# print(station_list)
print(self.station_data)
def check_result(self):
url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(
self.date, self.station_data[self.from_station], self.station_data[self.to_station])
res = requests.get(url, headers=self.headers)
res.encoding = "utf-8"
# print(res.text)
data = json.loads(res.text)
# print(data, type(data))
results = data["data"]["result"]
print(results, len(results))
t_headers = ["車次", "上車站", "下車站", "出發時間", "到達時間", "耗時", "高級軟臥", "軟臥", "軟座", "無座", "硬臥", "硬座", "二等座", "一等座",
"商務座"]
result_list = [] # 用來存儲最終查詢的結果(列車的所有信息)
for result in results:
# 對每輛列車的信息進行切割,再與t_headers進行關係映射
res_msg = result.split("|")[3:]
for i in range(10):
del res_msg[8]
for i in range(6):
del res_msg[-1]
del res_msg[9]
del res_msg[12]
del res_msg[14]
for i in range(2):
del res_msg[1]
for i in range(1, 3):
# 通過字典的值,找到對應的鍵
key_list = list(self.station_data.keys())
value_index = list(self.station_data.values()).index(res_msg[i])
res_msg[i] = key_list[value_index]
# 更改數據類型,添加到列表,統一寫入
res_tuple = tuple(res_msg)
result_list.append(res_tuple)
print(res_msg)
with open("check_ticket.csv", "w", encoding="gbk")as f:
write = csv.writer(f)
write.writerow(t_headers)
write.writerows(result_list)
if __name__ == "__main__":
my_check = CheckTicket(date="2019-10-30", from_station="長沙", to_station="深圳", headers=headers)
my_check.check_result()
效果圖