您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Inserts each YouTube video ID into your Supabase table exactly once—only on the homepage feed
// ==UserScript== // @name YouTube → Supabase Logger (Homepage Only) // @description Inserts each YouTube video ID into your Supabase table exactly once—only on the homepage feed // @match https://www.youtube.com/* // @run-at document-end // @version 0.0.1.20250508203757 // @namespace https://greasyfork.org/users/1435046 // ==/UserScript== (function() { 'use strict'; // 0. Bail out if not on the homepage feed const p = location.pathname; // skip video watch pages, search/results, and any channel pages if ( p.startsWith('/watch') || // individual video page p.startsWith('/results') || // search results p.startsWith('/@') || // “@channel” handle p.startsWith('/channel') || // standard channel URL p.startsWith('/c') // custom channel URL ) { return; } // 1. Supabase configuration const SUPABASE_URL = 'https://haughsijawbsqwumuryg.supabase.co'; const SUPABASE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhhdWdoc2lqYXdic3F3dW11cnlnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzM0ODE3MjYsImV4cCI6MjA0OTA1NzcyNn0.stESUMuJEs4CNBWGtxZr1XNp2XpnQeXmKkq3fNaVE-c'; const TABLE = 'youtube_recommended_videos_table'; // 2. Track which IDs have been sent const seen = new Set(); // 3. Extract the “v” parameter from any YouTube URL function getVideoId(href) { try { const u = new URL(href); return u.searchParams.get('v'); } catch { return null; } } // 4. POST one new video ID to Supabase function insertVideoId(id) { fetch(`${SUPABASE_URL}/rest/v1/${TABLE}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': SUPABASE_KEY, 'Authorization': `Bearer ${SUPABASE_KEY}` }, body: JSON.stringify([{ video_id_column: id }]) }); } // 5. Find every “/watch” link on the homepage feed, // skip ones in `seen`, send the rest function logAndSend() { document.querySelectorAll('a[href*="/watch"]').forEach(link => { const id = getVideoId(link.href); if (id && !seen.has(id)) { seen.add(id); insertVideoId(id); } }); } // 6. Initial scan logAndSend(); // 7. Re-scan whenever YouTube injects more items (infinite scroll) new MutationObserver(logAndSend) .observe(document.body, { childList: true, subtree: true }); })();