使用fiddler拦截数据包,把数据包发送到指定服务器,优点是不需要逆向,hook的代码都不用了,只需要抓包找到相应的数据链接即可,缺点是这是个半自动的爬取方案

想要实现fiddler数据转发,需要使用fiddler script,这是fiddler功能的扩展,用代码去控制fiddler

fiddlersite.py

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel

"""
FiddlerObject.log("xiaojianbang1");
//过滤无关请求,只关注特定请求
//这里填写目标返回包的url里的特定字符串
if (oSession.fullUrl.Contains("comment/productPageComments.action"))
{
FiddlerObject.log("xiaojianbang2");
var html = oSession.GetResponseBodyAsString()
FiddlerObject.log(html);
//这里填写返回包里的特定字符串
if(html.Contains("comments")){
//数据统计开始:把内容通过ajax http发送其它地方
var _xhr = new ActiveXObject('Microsoft.XMLHTTP');
var url = 'http://127.0.0.1:8000/sendData';
//发送的数据参数
var jsonString = oSession.GetResponseBodyAsString();
var requestHeaders = oSession.oRequest.headers.ToString();
var responseHeaders=oSession.oResponse.headers.ToString();

var str='{}';//构造自己的JSON http请求的信息及返回的结果
var data = Fiddler.WebFormats.JSON.JsonDecode(str);

data.JSONObject["requestHeaders"]=requestHeaders;
data.JSONObject["responseHeaders"]=responseHeaders;
data.JSONObject["responseBody"] = jsonString;
data.JSONObject["url"] = oSession.fullUrl;
data.JSONObject["response_code"] = oSession.responseCode;

if(oSession.oRequest.headers.Exists("Cookie")){
data.JSONObject["requestCookie"] = oSession.oRequest.headers['Cookie'];
}else{
data.JSONObject["requestCookie"] = 'request no Cookie';
};

if(oSession.oResponse.headers.Exists("Cookie")){
data.JSONObject["responseCookie"] = oSession.oResponse.headers['Cookie'];
}else{
data.JSONObject["responseCookie"] = 'response no Cookie';
};
jsonString = Fiddler.WebFormats.JSON.JsonEncode(data.JSONObject)

FiddlerObject.log(jsonString);

_xhr.onreadystatechange=function(){
if (_xhr.readyState==4){
FiddlerObject.log(_xhr.responseText);
}
};
_xhr.open('POST', url, true);
_xhr.send(jsonString);
//----数据统计结束-----
}else{
//弹窗报错
FiddlerObject.alert("抓取出错!");
} // if end
} // if controll end
"""


class Item(BaseModel):
url: str
response_code: str
responseBody: str
requestHeaders: str
responseHeaders: str
requestCookie: str
responseCookie: str


app = FastAPI()


@app.post("/sendData")
async def post_info1(request_data: Item):
print("url:", request_data.url)
print("response_code:", request_data.response_code)
print("responseBody:", request_data.responseBody)
print('requestHeaders:',request_data.requestHeaders)
print('responseHeaders:',request_data.responseHeaders)
print('requestCookie:',request_data.requestCookie)
print('responseCookie:',request_data.responseCookie)
return 'ok'

if __name__ == '__main__':
uvicorn.run(app=app, host='127.0.0.1', port=8000)

安装fiddler,打开options->https,把选项都勾上

简单来说就是把收到的返回包再给转发到本地服务器,然后本地服务器把返回包里的数据提取出来

fiddler script是一个扩展,可以在发送请求之前对请求包做出一些操作,比如修改header信息,也可以在收到返回包之后对返回包做出操作,比如直接转发给别的服务器,这里用到的就是onBeforeResponse(在fiddlerscript框里选择go to,再选择onBeforeResponse),把上面注释里的代码丢到onBeforeResponse代码里(直接加在已有的代码的后面,不需要删除代码)