前言
系統: Windows
Fiddler版本: Fiddler 5
fiddler script
簡單講,fiddler script提供了請求/響應過程中的事件接口,通過這些接口,我們可以編寫代碼,註冊自定義邏輯。
如:OnBeforeRequest
、OnBeforeResponse
定義了請求發送前及響應前的事件接口,在此函數中添加的邏輯,可以在每個http請求前和響應前執行,十分靈活。
進入編輯頁面
fiddler script基於JScript.NET編寫,如果不熟悉API可能會在使用時造成困惑,爲此 fiddler 是帶有fiddler script的編輯器:FiddlerScript Editor的
此編輯器提供了語法高亮、智能感知等功能,幫助開發者編寫代碼。
下載安裝後,FiddlerScript Editor可以通過獨立窗口打開,
方式1: 直接點擊右邊的FiddlerScript
選項卡
方式2: 通過菜單 規則
-> 自定義規則
(英文: Rules
-> Customize Rules
) 來打開 Fiddler ScriptEditor
方式3: 使用自己喜歡的編輯器進行編輯 CustomRules.js
文件
win10 存放路徑是: C:\Users\用戶名\Documents\Fiddler2\Scripts
(用戶名
要替換爲用戶名)
自定義規則文件中方法介紹和使用演示
1. 自定義規則文件中方法介紹
方法名 | 說明 |
---|---|
OnBoot (默認是註釋的) | fiddler 啓動時調用 |
OnBeforeShutdown (默認是註釋的) | fiddler關閉前調用 |
OnShutdown (默認是註釋的) | fiddler關閉時調用 |
OnAttach (默認是註釋的) | fiddler註冊成系統代理時調用 |
OnDetach (默認是註釋的) | fiddler 取消註冊系統代理時調用 |
Main | 在每次fiddler啓動時和編譯CustomRules.js 腳本時調用。 |
OnExecAction | 在fiddler窗口的快速處理或者ExecAction.exe 命令行工具時調用 |
OnBeforeResponse | http請求的響應之前,可在這個方法中修改Response的內容(對應爬蟲來說該方法最常用) |
OnBeforeRequest | 發送http請求之前,可在這個方法中修改或獲取Request的內容 |
2. 使用演示
演示的內容有:
- 給請求的url 添加底色
- 獲取POST請求body的請求參數
- 將響應結果寫入到本地和發送到一個接收數據的地方
static function OnBeforeRequest(oSession: Session) {
// Sample Rule: Color ASPX requests in RED
// if (oSession.uriContains(".aspx")) { oSession["ui-color"] = "red"; }
// Sample Rule: Flag POSTs to fiddler2.com in italics
// if (oSession.HostnameIs("www.fiddler2.com") && oSession.HTTPMethodIs("POST")) { oSession["ui-italic"] = "yup"; }
// Sample Rule: Break requests for URLs containing "/sandbox/"
// if (oSession.uriContains("/sandbox/")) {
// oSession.oFlags["x-breakrequest"] = "yup"; // Existence of the x-breakrequest flag creates a breakpoint; the "yup" value is unimportant.
// }
// ... 省略 OnBeforeRequest 方法內默認的代碼塊
// 方法內追加的演示代碼
var ci_host = "http://localhost/test/index.php";
//判斷鏈接的地址包含的鏈接內容部分,如果匹配到,就進入if 代碼塊內
if (oSession.uriContains("/rest/products")) {
//標記匹配到的uri顯示的顏色
oSession["ui-color"] = "maroon";
//消除保存的請求可能存在亂碼的情況
oSession.utilDecodeRequest();
//獲取post請求的請求內容塊(request body)
var requestString = oSession.GetRequestBodyAsString();
//因爲post請求頭的 Content-type : application/x-www-form-urlencoded
//所以 請求內容塊中的格式是: app_id=100&app_key=200&product_id=1
//待獲取的請求參數名稱
var variable1 = 'product_id';
//聲明存放產品id參數值的變量
var product_id = "";
//根據 & 分割請求內容的參數
var vars = requestString.split('&');
for (var i = 0; i < vars.length; i++) {
//根據 = 分割單個鍵值對,
var pair = vars[i].split('=');
//匹配參數名稱(鍵)
if (decodeURIComponent(pair[0]) == variable1) {
//如匹配到,將匹配到的參數值賦值到預先定義的變量:product_id
product_id = decodeURIComponent(pair[1]);
}
}
if(product_id != ""){
//寫日誌,可在 fiddler軟件右邊的窗口的 "日誌"選項卡中看到日誌輸出
FiddlerObject.log('product_id:' + product_id);
//請求本地的一個連接來記錄監聽到的產品id,做相應的處理
var _xhr2 = new ActiveXObject("Microsoft.XMLHTTP");
var singleshare_url = ci_host + '/welcome/products/' + encodeURIComponent(product_id);
_xhr2.onreadystatechange = function() {};
_xhr2.open("POST", singleshare_url, false);
_xhr2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
_xhr2.send(null);
}
}
}
static function OnBeforeResponse(oSession: Session) {
// ... 省略 OnBeforeResponse 方法內默認的代碼塊
var ci_host = "http://localhost/test/index.php";
//監聽一個獲取購物車資料的api
if (oSession.uriContains("/rest/carts")) {
//消除保存的請求可能存在亂碼的情況
oSession.utilDecodeResponse();
var jsonString = oSession.GetResponseBodyAsString();
var myjsonString = jsonString; //傳送的json數據
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(jsonString);
if((responseJSON.JSONObject=='System.Collections.ArrayList' || responseJSON.JSONObject=='System.Collections.Hashtable')&&jsonString!='[]'&&jsonString!='{}'){\
//寫入本地一個文件開始
//構造自己的JSON http請求的信息及返回的結果,
var str='{}';
var data = Fiddler.WebFormats.JSON.JsonDecode(str);
data.JSONObject["request_method"] = oSession.RequestMethod;
var requestString = oSession.GetRequestBodyAsString();
data.JSONObject["request_body"]= requestString;
data.JSONObject["response_data"] = responseJSON.JSONObject;
data.JSONObject["url"] = oSession.fullUrl;
data.JSONObject["response_code"] = oSession.responseCode;
jsonString = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
// 保存文件到本地
var fso;
var file;
fso = new ActiveXObject("Scripting.FileSystemObject");
file = fso.OpenTextFile("E:\\fiddler_debug\\test.txt",8 ,true, true);
file.writeLine(jsonString);
file.writeLine("\n");
file.close();
//寫入本地一個文件結束
//把響應的json內容通過http發送其它地方
var _xhr = new ActiveXObject('Microsoft.XMLHTTP');
var url = ci_host + '/welcome/carts';
//不需要返回值所以寫啦個空回調
_xhr.onreadystatechange = function() {}
_xhr.open('POST', url, true);
_xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
//_xhr.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
_xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
_xhr.send(myjsonString);
}
}
}
說明: php端接收請求頭爲 application/json
的 post請求,可用 $data = file_get_contents("php://input");
的方式進行接收,如:
$data = file_get_contents("php://input");
if($data != null){
$json_array = json_decode($data,true);
var_dump($json_array);
}
後記
fiddler scriptEditor 右側面板可查詢API接口含義及使用方法編寫時有點幫助;
通過 fiddler 官網比較難找到關於 fiddler script 方面的Api接口部分。
JScript.NET 我不熟悉,沒有系統學過;
當 邊編寫 fiddler script時,邊用fiddler 進行監聽請求時,在保存編寫的文件時,會發出有保存成功或失敗的提示音;
如果有語法不正確的時候,在fiddler中會彈出錯誤的提示框和發出錯誤的提示聲音,應及時參看錯誤的提示內容和關閉錯誤的提示框;如果已經彈出並未關閉錯誤的提示框,我試到的情況是保存編寫的 fiddler script時,無論語法是否正確,不會再發出保存成功的提示音了。