Fiddler script 獲取http響應和post的請求body數據

前言

系統: Windows
Fiddler版本: Fiddler 5

fiddler script

簡單講,fiddler script提供了請求/響應過程中的事件接口,通過這些接口,我們可以編寫代碼,註冊自定義邏輯。
如:OnBeforeRequestOnBeforeResponse定義了請求發送前及響應前的事件接口,在此函數中添加的邏輯,可以在每個http請求前和響應前執行,十分靈活。

進入編輯頁面

fiddler script基於JScript.NET編寫,如果不熟悉API可能會在使用時造成困惑,爲此 fiddler 是帶有fiddler script的編輯器:FiddlerScript Editor
此編輯器提供了語法高亮、智能感知等功能,幫助開發者編寫代碼。
下載安裝後,FiddlerScript Editor可以通過獨立窗口打開,

方式1: 直接點擊右邊的FiddlerScript選項卡

uploads/200212/20200212112857.png

方式2: 通過菜單 規則 -> 自定義規則 (英文: Rules -> Customize Rules) 來打開 Fiddler ScriptEditor

uploads/200212/20200212113242.png

方式3: 使用自己喜歡的編輯器進行編輯 CustomRules.js 文件

win10 存放路徑是: C:\Users\用戶名\Documents\Fiddler2\Scripts(用戶名要替換爲用戶名)

uploads/200212/20200212114125.png

自定義規則文件中方法介紹和使用演示

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. 使用演示

演示的內容有:

  1. 給請求的url 添加底色
  2. 獲取POST請求body的請求參數
  3. 將響應結果寫入到本地和發送到一個接收數據的地方
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時,無論語法是否正確,不會再發出保存成功的提示音了。

References

  1. Fiddler高級用法—Fiddler Script抓取app網頁json數據並保存
  2. Fiddler抓包【6】_Fiddler Script
  3. [fiddler] 使用fiddler script自定義代理規則
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章