[FE] 使用Chrome extension獲取頁面中所有的http請求

背景

Chrome瀏覽器提供了擴展功能,
我們可以寫自定義的腳本,來制作Chrome extension。

除此之外,Chrome開發(fā)者工具也是可以擴展的,
我們可以制作自己的devtool,還可以在Elements工具中添加自定義的側邊欄。

本文只介紹Chrome extension。

文件結構

下面我們來新建一個精簡的Chrome extension,
用來獲取頁面中所有發(fā)起的http請求,然后打印在控制臺上。

目錄如下:

chrome-extension-example
├── manifest.json
├── index.html
├── index.js
└── background.js

(1)manifest.json

{
  "name": "chrome-extension-example",
  "version": "1.0",
  "minimum_chrome_version": "10.0",
  "description": "chrome extension example",
  "devtools_page": "index.html",
  "background": { "scripts": ["background.js"] },
  "permissions": [
    "http://*/*",
    "https://*/*"
  ],
  "manifest_version": 2
}

(2)index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>

  <script src="./index.js"></script>
  <script src="./background.js"></script>
</head>
<body>
  
</body>
</html>

(3)index.js

// chrome extension中不能使用console.log
// 所以,需要通過發(fā)送請求給后臺腳本的方式來打印日志
const log = (...args) => chrome.extension.sendRequest({
  tabId: chrome.devtools.tabId,
  args,
});

// 注冊回調,每一個http請求響應后,都觸發(fā)該回調
chrome.devtools.network.onRequestFinished.addListener(async (...args) => {
  try {
    const [{
      // 請求的類型,查詢參數(shù),以及url
      request: { method, queryString, url },

      // 該方法可用于獲取響應體
      getContent,
    }] = args;

    log(method, queryString, url);

    // 將callback轉為await promise
    // warn: content在getContent回調函數(shù)中,而不是getContent的返回值
    const content = await new Promise((res, rej) => getContent(res));
    log(content);
  } catch (err) {
    log(err.stack || err.toString());
  }
});

注:
本例中這樣注冊http請求的回調是有問題的。
我們知道async函數(shù)將返回一個promise,那么,在后一個請求觸發(fā)回調的時候,
前一個請求的async回調函數(shù)可能還沒有resolved。

為了演示方便,本例特意忽略了這個問題,
但這會導致log(content);比較亂,并不一定是按順序打印的,
而且,還有可能前一個請求的log(content);,
會在后一個請求的log(method, queryString, url);之后打印出來。

類似場景串行化的處理方式,可以參考:
promise-executor

(4)background.js

// 注冊回調,當收到請求的時候觸發(fā)
chrome.extension.onRequest.addListener(({ tabId, args }) => {

  // 在給定tabId的tab頁中執(zhí)行腳本
  chrome.tabs.executeScript(tabId, {
    code: `console.log(...${JSON.stringify(args)});`,
  });
});

安裝

在Chrome瀏覽器中,打開以下url,

chrome://extensions/

勾選第一行的“開發(fā)者模式”,然后點擊“加載已解壓的擴展程序...”,
選中我們上文中創(chuàng)建的目錄chrome-extension-example,確定,安裝成功。

參考

Getting Started: Building a Chrome Extension
Extending DevTools
Sample Extensions: devtools.network
Github: andrewn/firephp-chrome

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容