您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Logs XHR, Fetch, WebSocket, and Service Worker requests
- // ==UserScript==
- // @name Network Sniffer 🌐
- // @namespace http://tampermonkey.net/
- // @version 2.2
- // @description Logs XHR, Fetch, WebSocket, and Service Worker requests
- // @author Manu OVG
- // @match *://*/*
- // @grant GM_setClipboard
- // ==/UserScript==
- (function() {
- 'use strict';
- // 🌍 UI Creation
- let panel = document.createElement('div');
- panel.innerHTML = `
- <style>
- .sniffer-ui {
- position: fixed;
- top: 20px;
- right: 20px;
- width: 400px;
- max-height: 500px;
- background: rgba(30, 30, 30, 0.95);
- color: white;
- font-family: Arial, sans-serif;
- font-size: 12px;
- border-radius: 8px;
- padding: 10px;
- box-shadow: 0 4px 10px rgba(0,0,0,0.3);
- overflow: hidden;
- z-index: 9999;
- }
- .sniffer-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding-bottom: 5px;
- border-bottom: 1px solid #555;
- }
- .sniffer-title { font-weight: bold; }
- .sniffer-close { cursor: pointer; color: red; font-weight: bold; }
- .sniffer-body {
- max-height: 400px;
- overflow-y: auto;
- padding-top: 5px;
- }
- .sniffer-item {
- padding: 5px;
- border-bottom: 1px solid #444;
- word-wrap: break-word;
- }
- .sniffer-get { color: #4CAF50; } /* Green */
- .sniffer-post { color: #FFC107; } /* Yellow */
- .sniffer-fetch { color: #03A9F4; } /* Blue */
- .sniffer-websocket { color: #FF5722; } /* Red */
- .sniffer-copy {
- background: #008CBA;
- color: white;
- padding: 4px;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 10px;
- margin-top: 5px;
- }
- .sniffer-counter {
- font-size: 14px;
- font-weight: bold;
- color: #FFD700;
- }
- </style>
- <div class="sniffer-ui">
- <div class="sniffer-header">
- <span class="sniffer-title">🌐 Network Sniffer (<span class="sniffer-counter">0</span>)</span>
- <span class="sniffer-close">✖</span>
- </div>
- <div class="sniffer-body"></div>
- </div>
- `;
- document.body.appendChild(panel);
- let snifferBody = panel.querySelector('.sniffer-body');
- let closeBtn = panel.querySelector('.sniffer-close');
- let counter = panel.querySelector('.sniffer-counter');
- let requestCount = 0;
- // ✖ Close UI on click
- closeBtn.onclick = () => panel.style.display = 'none';
- // 🔥 Function to log requests in UI
- function logRequest(type, method, url) {
- requestCount++;
- counter.innerText = requestCount; // Update request counter
- let colorClass = type === 'GET' ? 'sniffer-get' : type === 'POST' ? 'sniffer-post' : type === 'WebSocket' ? 'sniffer-websocket' : 'sniffer-fetch';
- let requestItem = document.createElement('div');
- requestItem.classList.add('sniffer-item', colorClass);
- requestItem.innerHTML = `
- <b>${type} | ${method}</b> → ${url}
- <button class="sniffer-copy">📋 Copy</button>
- `;
- snifferBody.prepend(requestItem);
- // 📋 Copy URL on click
- requestItem.querySelector('.sniffer-copy').onclick = () => {
- GM_setClipboard(url);
- alert("URL copied!");
- };
- }
- // 🕵️ Intercept XHR requests
- (function(open) {
- XMLHttpRequest.prototype.open = function(method, url) {
- this.addEventListener("load", function() {
- logRequest("XHR", method, url);
- });
- open.apply(this, arguments);
- };
- })(XMLHttpRequest.prototype.open);
- // 🕵️ Intercept Fetch requests
- (function(fetch) {
- window.fetch = function() {
- let url = arguments[0];
- let method = arguments[1] && arguments[1].method ? arguments[1].method.toUpperCase() : 'GET';
- logRequest("Fetch", method, url);
- return fetch.apply(this, arguments);
- };
- })(window.fetch);
- // 🕵️ Capture WebSocket requests
- let originalWebSocket = window.WebSocket;
- window.WebSocket = function(url, protocols) {
- let ws = new originalWebSocket(url, protocols);
- logRequest("WebSocket", "CONNECT", url);
- ws.addEventListener('message', function(event) {
- console.log("WebSocket Message: ", event.data);
- });
- return ws;
- };
- // 🕵️ Capture Service Worker requests
- if ('serviceWorker' in navigator) {
- navigator.serviceWorker.addEventListener('message', function(event) {
- logRequest("ServiceWorker", event.data.method, event.data.url);
- });
- }
- })();