2023/04/22(土)[Tampermonkey] fetch responseの割り込み取得
[Tampermonkey] fetch responseの横取り取得
Webページがfetchで動的に取得したJSONデータを観測する手段は無いかなと思って見つけた方法。
ソースコード
// ==UserScript==
// @name        Test intercept fetch
// @description Test intercept fetch
// @namespace   Test
// @version     1.0
// @match       https://example.com/*
// @run-at      document-start
// @grant       unsafeWindow
// ==/UserScript==
const proc_fetch_resp = (data, url) => {
    console.log("proc_fetch_resp:" + url, data);
}
//=====================================================
// Intercept fetch
//=====================================================
const origFetch = unsafeWindow.fetch;
//元のfetchを差し替え
unsafeWindow.fetch = async (...args) => {
    console.log("fetch called with args:", args);
    const response = await origFetch(...args);
    //レスポンスをクローンして使う
    response
        .clone()
        .json()
        .then(body => {
            proc_fetch_resp(body, response.url);
        })
        .catch(err => console.error(err))
        ;
    //元のレスポンスを返す
    return response;
}
- @match は対象サイトのURLを指定
- @run-at は割り込みたいfetchよりに先にfetch差し替えができるように指定
- unsafeWindow を使わないとfetch差し替えができない
- サンプルなのでレスポンスをJSONとして読み取ってconsole.logに出すだけ。