Skip to content

Instantly share code, notes, and snippets.

@s3rgeym
Created June 17, 2019 01:09
Show Gist options
  • Save s3rgeym/a8484b84d7c89ea5bdfeae973c0b964d to your computer and use it in GitHub Desktop.
Save s3rgeym/a8484b84d7c89ea5bdfeae973c0b964d to your computer and use it in GitHub Desktop.
Chrome Extension: Intercept Requests
// https://chromedevtools.github.io/devtools-protocol/1-3/Network
chrome.browserAction.onClicked.addListener(async tab => {
const target = { tabId: tab.id }
// Ждем пока подключимся к debugger
await new Promise((resolve, reject) => {
chrome.debugger.attach(target, '1.3', result => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError)
} else {
resolve(result)
}
})
})
const sendCommand = (method, params) =>
new Promise((resolve, reject) => {
chrome.debugger.sendCommand(target, method, params, result => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError)
} else {
resolve(result)
}
})
})
chrome.debugger.onEvent.addListener(async (source, method, params) => {
switch (method) {
case 'Network.requestWillBeSent': {
const { request } = params
// request.url
// request.method
// request.headers
// request.postData
// request.hasPostData
break
}
case 'Network.responseReceived': {
const { requestId, response } = params
// response.status
// response.protocol
// response.headers
// response.mimeType
// response.encodedDataLength
console.log(response)
// body string
// base64Encoded true/false
const result = await sendCommand('Network.getResponseBody', { requestId })
// console.log(result.body)
break
}
}
})
await sendCommand('Network.enable')
})
{
"background": {
"persistent": false,
"scripts": [
"background.js"
]
},
"browser_action": {},
"manifest_version": 2,
"name": "Interceptor",
"permissions": [
"debugger"
],
"version": "0.1.0"
}
@s3rgeym
Copy link
Author

s3rgeym commented Jun 17, 2019

// https://chromedevtools.github.io/devtools-protocol/1-3/Network
// https://stackoverflow.com/questions/8894461/updating-an-extension-button-dynamically-inspiration-required
const tabs = new Map()

chrome.browserAction.onClicked.addListener(async tab => {
  const status = tabs.get(tab.id)
  const target = { tabId: tab.id }
  if ('activated' === status) {
    // Надо значок как-то изменить
    chrome.debugger.detach(target, () => {
      if (chrome.runtime.lastError) {
        console.error(chrome.runtime.lastError)
      } else {
        tabs.set(tab.id, 'deactivated')
      }
    })
  } else {
    // Ждем пока подключимся к debugger
    await new Promise((resolve, reject) => {
      chrome.debugger.attach(target, '1.3', result => {
        if (chrome.runtime.lastError) {
          reject(chrome.runtime.lastError)
        } else {
          resolve(result)
        }
      })
    })
    const sendCommand = (method, params) => new Promise((resolve, reject) => {
      chrome.debugger.sendCommand(target, method, params, result => {
        if (chrome.runtime.lastError) {
          reject(chrome.runtime.lastError)
        } else {
          resolve(result)
        }
      })
    })
    chrome.debugger.onEvent.addListener(async (source, method, params) => {
      switch (method) {
        case 'Network.requestWillBeSent': {
          const { request } = params
          // request.url
          // request.method
          // request.headers
          // request.postData
          // request.hasPostData
          break
        }
        case 'Network.responseReceived': {
          const { requestId, response } = params
          // response.status
          // response.protocol
          // response.headers
          // response.mimeType
          // response.encodedDataLength
          // console.log(response)
          // body string
          // base64Encoded true/false
          // const result = await sendCommand('Network.getResponseBody', { requestId })
          // console.log(result.body)
          break
        }
      }
    })
    await sendCommand('Network.enable')
    tabs.set(tab.id, 'activated')
  }
})

chrome.browser.tabs.onRemoved.addListener(({ tabId }) => tabs.delete(tabId))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment