您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows you to view Instagram stories anonymously
// ==UserScript== // @name IG Anon // @version 1.1 // @description Allows you to view Instagram stories anonymously // @author SilentArt // @match https://www.instagram.com/* // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsbGVkYnk9InRpdGxlIGRlc2MiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJpbnN0R3JhZCIgeDE9IjAiIHgyPSIxIiB5MT0iMCIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZWRhNzUiPjwvc3RvcD4KICAgICAgPHN0b3Agb2Zmc2V0PSIwLjI1IiBzdG9wLWNvbG9yPSIjZmE3ZTFlIj48L3N0b3A+CiAgICAgIDxzdG9wIG9mZnNldD0iMC41IiBzdG9wLWNvbG9yPSIjZDYyOTc2Ij48L3N0b3A+CiAgICAgIDxzdG9wIG9mZnNldD0iMC43NSIgc3RvcC1jb2xvcj0iIzk2MmZiZiI+PC9zdG9wPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM0ZjViZDUiPjwvc3RvcD4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImdsYXNzIiBjeD0iMzAlIiBjeT0iMjUlIiByPSI3NSUiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4xOCI+PC9zdG9wPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCI+PC9zdG9wPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxmaWx0ZXIgaWQ9InNoYWRvdyIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+CiAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjQiIHJlc3VsdD0ib2ZmIj48L2ZlT2Zmc2V0PgogICAgICA8ZmVHYXVzc2lhbkJsdXIgaW49Im9mZiIgc3RkRGV2aWF0aW9uPSI2IiByZXN1bHQ9ImJsdXIiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgIDxmZUNvbG9yTWF0cml4IGluPSJibHVyIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwICAwIDAgMCAwIDAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xOCAwIiByZXN1bHQ9InNoYWRvdyI+PC9mZUNvbG9yTWF0cml4PgogICAgICA8ZmVCbGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJzaGFkb3ciIG1vZGU9Im5vcm1hbCI+PC9mZUJsZW5kPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIDxnIGZpbHRlcj0idXJsKCNzaGFkb3cpIj4KICAgIDxyZWN0IHg9IjgiIHk9IjgiIHdpZHRoPSIxMTIiIGhlaWdodD0iMTEyIiByeD0iMjYiIHJ5PSIyNiIgZmlsbD0idXJsKCNpbnN0R3JhZCkiPjwvcmVjdD4KICAgIDxyZWN0IHg9IjgiIHk9IjgiIHdpZHRoPSIxMTIiIGhlaWdodD0iMTEyIiByeD0iMjYiIHJ5PSIyNiIgZmlsbD0idXJsKCNnbGFzcykiPjwvcmVjdD4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyKSI+CiAgICA8cGF0aCBkPSJNMzIgNjRjMTAtMTMgMjAtMTggMzItMThzMjIgNSAzMiAxOGMtMTAgMTMtMjAgMTgtMzIgMThTNDIgNzcgMzIgNjR6IiBmaWxsPSJub25lIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIwLjk1Ij48L3BhdGg+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9IjY0IiByPSIxMCIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iMC45NSI+PC9jaXJjbGU+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9IjY0IiByPSI0IiBmaWxsPSJyZ2JhKDAsMCwwLDAuOSkiPjwvY2lyY2xlPgogIDwvZz4KICA8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjExMiIgcng9IjI2IiByeT0iMjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDYiIHN0cm9rZS13aWR0aD0iMSI+PC9yZWN0Pgo8L3N2Zz4K // @grant none // @run-at document-start // @namespace https://greasyfork.org/users/1521018 // ==/UserScript== (function () { 'use strict'; const URL_BLOCK_PATTERNS = [ 'viewSeenAt', '/reel/seen', 'story_media_viewer', 'reel_media_viewer', 'story_seen', 'reel_media_seen' ]; function shouldBlockUrl(url) { if (!url) return false; try { const u = String(url); for (const p of URL_BLOCK_PATTERNS) { if (u.indexOf(p) !== -1) return true; } if (u.includes('story') && u.includes('seen')) return true; if (u.includes('reel') && u.includes('seen')) return true; } catch (e) {} return false; } function bodyContainsViewSeen(body) { if (!body) return false; try { if (typeof body === 'string') { return body.indexOf('viewSeenAt') !== -1; } if (body instanceof FormData) { for (const pair of body.entries()) { try { if (String(pair[1]).indexOf('viewSeenAt') !== -1) return true; } catch (e) {} } } return String(body).indexOf('viewSeenAt') !== -1; } catch (e) { return false; } } (function patchFetch() { if (!window.fetch) return; const origFetch = window.fetch.bind(window); window.fetch = async function (input, init) { try { let url = ''; let bodyText = ''; if (typeof input === 'string') { url = input; } else if (input instanceof Request) { url = input.url; try { bodyText = await input.clone().text().catch(() => ''); } catch (e) { bodyText = ''; } } if (init && init.body) { if (typeof init.body === 'string') bodyText = init.body; else if (init.body instanceof FormData) { for (const pair of init.body.entries()) { if (String(pair[1]).includes('viewSeenAt')) { bodyText = String(pair[1]); break; } } } else { try { bodyText = String(init.body); } catch (e) { bodyText = ''; } } } if (shouldBlockUrl(url) || (bodyText && bodyText.includes('viewSeenAt'))) { console.info('[IG anon] blocked fetch ->', url || '(Request object)', bodyText ? 'body contains viewSeenAt' : ''); return Promise.resolve(new Response(null, { status: 204, statusText: 'No Content (blocked by userscript)' })); } } catch (e) { } return origFetch(input, init); }; })(); (function patchXHR() { const OriginalXHR = window.XMLHttpRequest; if (!OriginalXHR) return; function PatchedXHR() { const xhr = new OriginalXHR(); const origOpen = xhr.open; const origSend = xhr.send; xhr.__user_url = null; xhr.__shouldBlockByUserscript = false; xhr.open = function (method, url) { try { xhr.__user_url = url; if (shouldBlockUrl(url)) { xhr.__shouldBlockByUserscript = true; } } catch (e) {} return origOpen.apply(this, arguments); }; xhr.send = function (body) { try { if (xhr.__shouldBlockByUserscript || bodyContainsViewSeen(body)) { console.info('[IG anon] blocked XHR ->', xhr.__user_url || '(unknown)', bodyContainsViewSeen(body) ? 'body contains viewSeenAt' : ''); setTimeout(() => { try { try { xhr.readyState = 4; } catch (e) {} try { Object.defineProperty(xhr, 'status', { value: 204, configurable: true }); } catch (e) {} try { Object.defineProperty(xhr, 'responseText', { value: '', configurable: true }); } catch (e) {} if (typeof xhr.onreadystatechange === 'function') { try { xhr.onreadystatechange(); } catch (e) {} } try { xhr.dispatchEvent(new Event('load')); } catch (e) {} } catch (e) {} }, 0); return; } } catch (e) { } return origSend.apply(this, arguments); }; return xhr; } PatchedXHR.prototype = OriginalXHR.prototype; window.XMLHttpRequest = PatchedXHR; })(); console.info('Script active - watching for viewSeenAt patterns'); })();