whistle 功能一覽

本文主要是讓你們對 whistle 功能有個總體認識,詳細用法參考幫助文檔:wproxy.org/whistle/javascript

若是你還不知道 whistle 是什麼,能夠訪問 GitHub 瞭解:github.com/avwo/whistl…html

目錄

  1. 操做方式
  2. 命令行操做
  3. 插件擴展
  4. 集成whistle
  5. 總結

操做方式

whistle 的基本上全部操做均可以經過形以下面的配置方式實現(標準模式):java

pattern operation1 operation2 ... [filter1 filter2 ...]
複製代碼

其中:node

  1. pattern: 表示匹配請求 URL 的表達式,能夠爲域名、路徑、通配符、正則等(後面會詳細說明)
  2. operation: 表示對應的操做,由 protocol://opValue 組成,protocol 表示操做類型,opValue 表示具體操做,如:reqCookies://(x-env=dev)
  3. filter(可選): pattern 只能匹配請求的 URL,若是須要根據請求(響應)url、方法、IP、狀態碼、頭、內容等進行更精確的匹配,能夠採用 filter,filter 包含 excludeFilter 和 includeFilter 兩種過濾方式

如:git

ke.qq.com 127.0.0.1:6001 reqCookies://(x-env=test) includeFilter://reqH:user-agent=chrome excludeFilter://m:post
複製代碼

上述表示全部 ke.qq.com 的請求,若是請求頭 user-agent 包含 chrome (不區分大小寫)字符串且不是 post 請求,則設置host(127.0.0.1:6001),並添加請求Cookie(x-env=test)。es6

匹配效果 匹配效果

因爲本地沒有開啓 6001 端口的服務,因此請求被拒絕了github

若是規則的前兩個不一樣時爲 URL,還能夠用以下配置方式:web

operation pattern1 pattern2 … [filter1 filter2 …]
複製代碼

operation 和 pattern1 不一樣時爲 URL正則表達式

也能夠支持兼容模式:chrome

operation1 operation2 …  pattern1 pattern2 … [filter1 filter2 …]
複製代碼

operation1 ... operationN 不能爲 URL

如:

127.0.0.1:6001 ke.qq.com fudao.qq.com includeFilter://reqH:user-agent=chrome excludeFilter://m:post

resCors://* *.url.cn *.alicdn.com 

127.0.0.1:6001 reqCookies://(x-env=test) ke.qq.com fudao.qq.com includeFilter://reqH:user-agent=chrome excludeFilter://m:post
複製代碼

pattern

pattern 能夠爲域名,路徑,正則,通配符等:

域名匹配

  1. 匹配指定域名的請求
    ke.qq.com 127.0.0.1:6001
    10.1.1.1:8080 *.url.cn *.alicdn.com
    複製代碼
  2. 匹配指定域名及端口
    # 只能匹配域名 ke.qq.com 且端口 5566 的請求
    ke.qq.com:5566 127.0.0.1:6001
    
    # 匹配 http 的 80 端口或 https 的 443 端口
    ke.qq.com/ 127.0.0.1:6001
    複製代碼
  3. 匹配指定協議和域名
    https://ke.qq.com 127.0.0.1:6001
    
    http://ke.qq.com 127.0.0.1:7001
    複製代碼

路徑匹配

路徑匹配跟域名匹配差很少,只是多了須要匹配路徑片斷:

  1. 匹配指定路徑的請求
    ke.qq.com/statics file:///User/xxx/test
    
    ke.qq.com/cgi-bin 10.1.1.1:8080
    複製代碼
  2. 匹配指定路徑及端口
    file:///User/xxx/test ke.qq.com:8080/page fudao.qq.com/page/
    
    ke.qq.com:8080/cgi-bin 10.1.1.1
    複製代碼
  3. 匹配指定協議和域名
    file:///User/xxx/test https://ke.qq.com:8080/page fudao.qq.com/page/
    
    https://ke.qq.com:8080/cgi-bin 10.1.1.1
    複製代碼

正則匹配

跟普通 js 的正則表達式一致,支持 /regexp//regexp/i 兩種模式,且支持子匹配,能夠在 opValue 獲取子匹配的值:

  1. 全部 ke.qq.com/cgi-bin/ 及其子路徑 ke.qq.com/cgi-bin/path/to?xxx 的請求忽略全部規則(至關於直接請求現網)
    /^\w+://ke\.qq\.com/cgi-bin\// ignore://*
    複製代碼
  2. 包含 imweb-test (且忽略大小寫)的 URL 請求忽略全部規則
    /imweb-test/i ignore://*
    複製代碼
  3. 去掉 URL 裏面的 md5 後作本替換
    /^\w+://\d\.url\.cn/path/to/(\w+)\.\w+\.\w+/ file:///User/test/xxx/dev/$1.$2
    複製代碼

通配符匹配

正則表達式涉及轉義符及精確匹配,有時寫起比較繁瑣,爲解決這類問題,whistle 提供了通配符匹配解決經常使用匹配問題:

  1. 精確匹配

    # 只匹配 protocol://ke.qq.com 請求,能夠帶端口及請求參數,但不包含子路徑
    $ke.qq.com file:///User/test/index.html
    
    # 只匹配 http://ke.qq.com/test.html 請求,能夠包含請求參數,但不包含子路徑
    $http://ke.qq.com file:///User/test/index.html
    
    複製代碼
  2. 通配路徑匹配

    # 匹配全部域名下的 /cgi-bin 及其子路徑 /cgi-bin/path/to 請求(本地替換會自動補齊後續路徑)
    */cgi-bin file:///User/test/
    複製代碼
  3. 普統統配符匹配(1個或連續幾個 * 表示通配符,且能夠做爲一個子匹配)

    ^*.url.cn/path/to/*.*.* file:///User/test/xxx/dev/$2.$3
    複製代碼

域名匹配、路徑匹配、通配路徑匹配有一個好處是會自動補齊路徑,即:

*/cgi-bin file:///User/test/
複製代碼

請求 https://ke.qq.com/cgi-bin/test.json 會自動匹配本地文件 /User/test/test.json,而其它匹配方式須要經過子匹配把路徑本身補齊,詳細匹配規則參見文檔:wproxy.org/whistle/pat…

operation

whistle 將每類操做抽象成一個協議,每一個具體操做對應一個值,即:operation=protocol://opValue,protocol 表示操做類型,opValue 表示具體操做。

protocol

whistle 把每類操做抽象成一個 protocol,若是修改請求方法(method://post),修改請求頭(reqHeaders://x-client=test&x-id=123),修改響應 cors(resCors://*) 等等,大體可分紅這幾類:

  1. @ 功能
  2. 設置UI樣式
  3. 設置hosts
  4. 設代理
  5. 延遲請求
  6. 修改請求URL
  7. 修改請求方法
  8. 修改請求頭
  9. 延遲響應
  10. 修改請求內容
  11. 修改響應狀態碼
  12. 修改響應頭
  13. 修改響應內容
  14. 請求替換
  15. 過濾配置
  16. 獲取抓包數據
  17. 動態設置規則
  18. 開發調試工具

詳細文檔參見:wproxy.org/whistle/rul…

opValue

每一個具體操做對應一個 opValue,即爲一個字符串或對像,opValue 有一下幾種寫法:

  1. 內聯值:

    • 直接內聯(不能用空格、換行符等空白字符)
      # 一些支持字符串等規則,能夠不用小括號
      ke.qq.com proxy://127.0.0.1:8888
      
      # 通常須要設置小括號
      fudao.qq.com file://(hello) reqCookies://(x-env=test&x-id=abc)
      複製代碼
    • 內嵌方式(支持任意字符)
      ``` keyName1
      Hello world!
      -- 2020-1-1
      ```
      ``` keyName2
      x-env: test
      x-id: abc
      ```
      fudao.qq.com file://{keyName1} reqCookies://{keyName2}
      複製代碼

      用三個及以上等反引號 ` 對 + 鍵名做爲內嵌值的邊界

  2. Values

    對一些比較大對值,不適宜直接內嵌到規則裏面,能夠放在跟 Rules 同級到 Values 裏面,用法跟內嵌方式一致。

    image
    image

  3. 文件或目錄

    有些內容太大不適合放在 WebUI 裏面,或者要本地替換,能夠採用文件或目錄到方式:

    ke.qq.com/test file:///User/statics resCookies:///User/json/cookies.json
    複製代碼

    ke.qq.com/test 及其子路徑請求會自動到 /Users/statics 經過補齊路徑找到對應文件,並會設置 /User/json/cookies.json 裏面的 cookies

  4. 模板字符串 方便你們在規則裏面獲取請求 URL、方法、請求參數、請求頭、請求Cookie 以及響應等相關內容,whistle 提供了相似 es6 等模板字符串功能,該功能只支持 內聯值 或 Values 裏面設置的值,不支持文件及目錄:

    ke.qq.com file://`(${query.test})`
    複製代碼

    訪問 https://ke.qq.com?test=hello 返回 hello

    ``` test.html
    url: ${url}
    ```
    ke.qq.com file://`{test.html}`
    複製代碼

    訪問 https://ke.qq.com?test=hello 返回 url: https://ke.qq.com?test=hello,也能夠放 Values 裏面

詳細內容參見:wproxy.org/whistle/dat…

filter

pattern 只能匹配請求的 URL,若是根據請求方法、客戶端IP、請求頭、請求內容,響應狀態碼,響應頭等進行跟靈活精確的匹配,能夠採用 filterfilter 包含 includeFilterexcludeFilter 分別用於實現包含及排除匹配規則,一行規則能夠用任意多個 filter

ke.qq.com/cgi-bin resCors://enable resMerge://retcode=10000 includeFilter://resH:content-type=javascript includeFilter://resH:content-type=json excludeFilter://resH:content-type=gbk
複製代碼

上述配置表示因此 ke.qq.com/cgi-bin 及其子路徑 ke.qq.com/cgi-bin/path/to 的請求,若是響應的 content-type 包含(不區分大小寫) javascriptjson,且不能包含 gbk,則會執行 resCors://enableresMerge://retcode=10000 操做。

若是你覺這一行太長了,也能夠寫成:

line`
ke.qq.com/cgi-bin resCors://enable resMerge://retcode=10000
includeFilter://resH:content-type=javascript
includeFilter://resH:content-type=json
excludeFilter://resH:content-type=gbk
`
複製代碼

多個 includeFilterexcludeFilter 混合時,includeFilter 表示 的關係,excludeFilter 表示 的關係,即:

pattern operation1 ... excludeFilter://p1 includeFilter://p2 excludeFilter://p3 includeFilter://p4 includeFilter://p5
複製代碼

上述表示 URL 匹配 pattern 的請求,還要匹配 p2 或 p4 或 p5 中的一個,且不能匹配 p1 及 p3。

filter 還支持正則表達式,詳細文檔參見:wproxy.org/whistle/rul…

其它過濾方式

上面提到的 filter 只能針對單行進行過濾,有時須要在其它行或配置文件裏面過濾可能存在的規則,這時能夠用 pattern ignore://protocol1|protocol2|... 的方式來過濾指定協議:

^**/cgi-* ignore://*
^**/cgi-proxy ignore://!host
ke.qq.com/index.html ignore://file|host
www.baidu.com ignore://proxy|jsAppend
複製代碼

上述表示全部形如 protocol://xxx/cgi-yyy 及其子路徑的請求都忽略全部配置規則,至關於不配任何規則(但 protocol://xxx/cgi-proxy 及其子路徑保留 host 規則);ke.qq.com/index.html 的請求忽略本地替換及host規則;www.baidu.com 的全部請求忽略代理及追加jsAppend的規則。

有關 ignore 的內容參見:wproxy.org/whistle/rul…

除了 filterignore,還能夠結合腳本或插件實現更復雜的匹配方式,具體參見:

  1. reqScript:wproxy.org/whistle/rul…
  2. resScript:wproxy.org/whistle/rul…
  3. 插件:wproxy.org/whistle/plu…

命令行操做

  1. w2 add:執行當前目錄的 .whistle.js 文件設置項目規則,詳細文檔參見:wproxy.org/whistle/cli…
  2. w2 i whistle.xxx:安裝 whislte 插件(插件也能夠用 npm 全局安裝)

    也能夠指定 registy 安裝插件:w2 i whistle.xxx --registry=http://xxx,或直接用內部命令安裝如 tnpmw2 ti whistle.xxx

  3. w2 uninstall whistle.xxx:這種卸載方式只支持經過 w2 [x]i whistle.xxx 安裝的插件
  4. w2 run xxx:執行經過 w2 i 安裝的插件自帶命令(不是全局安裝,因此不能直接執行)
  5. whistle 還針對一些特殊場景提供了啓動參數或命令行參數支持,具體參見:w2 help

插件擴展

whistle 提供了強大且較爲完善的操做協議,並支持經過插件定製本身的操做協議,每一個插件就是一個 npm 包,不只擁有 whistle 提供的擴展能力,且具有 node 的全部能力,插件至少能夠作如下事情:

  1. 提供UI界面
  2. 做爲請求server
  3. 統計請求信息(查看上報/打點數據等)
  4. 設置規則(動態,靜態,全局及私有規則)
  5. 獲取抓包數據
  6. 編解碼請求響應數據流(pipe stream 功能)
  7. 擴展 Network 右鍵菜單
  8. 同步 Rules 和 Values 的數據

如何開發、調試、發佈、使用插件,這裏不贅述,參見文檔便可:wproxy.org/whistle/plu…

集成whistle

whistle 不只支持插件擴展,也能夠做爲普通 npm 包和插件一塊兒打包到第三方應用,具體實現參考: github.com/nohosts/noh…

總結

本文簡單說明了 whistle 的操做方式(pattern operation filter,其中 operation=protocol://opValue)、命令行操做、插件擴展、以及如何在應用裏面集成 whistle,除此以外 whistle 還有不少功能,很難在一篇文章裏面詳細羅列清楚,你們結合自身業務不斷挖掘其功能,期間有什麼問題或建議能夠經過 GitHub 的 issue 反饋:github.com/avwo/whistl…

相關文章
相關標籤/搜索