You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Tampermonkey/Greasemonkey可靠提取YouTube频道ID?

可靠提取YouTube频道ID的方案

问题分析

  1. 第一个脚本依赖页面<link>标签提取信息,但YouTube页面结构会动态变化,部分频道页面的标签格式或存在状态不符合预期,导致提取失败。
  2. 第二个API脚本的核心问题:forUsername参数对应YouTube旧版的自定义用户名(如youtube.com/user/oldusername),而当前的@handle(如youtube.com/@newhandle)是独立的标识体系,用forUsername无法查询到对应频道,因此API返回空结果。

方案一:从页面内嵌JSON提取(最稳定,无需API)

YouTube频道/视频页面会在源码中嵌入包含核心数据的ytInitialData或ytInitialPlayerResponse变量,直接解析这些数据能拿到准确的频道ID,完全不依赖易变的DOM结构。

Tampermonkey脚本实现

// ==UserScript==
// @name YouTube Channel ID Extractor (Reliable)
// @namespace https://example.com/
// @version 0.2
// @description Extracts YouTube channel ID reliably from page internal data
// @author sharmanhall
// @match https://www.youtube.com/*
// @grant none
// ==/UserScript==

(function() {
    'use strict';

    // 延迟执行确保页面初始化数据加载完成
    setTimeout(() => {
        let channelId = null;
        let handle = null;

        // 从频道主页的初始化数据提取
        if (window.ytInitialData?.metadata?.channelMetadataRenderer) {
            const channelMeta = window.ytInitialData.metadata.channelMetadataRenderer;
            channelId = channelMeta.externalId;
            handle = channelMeta.username;
        }
        // 从视频页面提取上传者频道ID
        else if (window.ytInitialData?.videoDetails?.channelId) {
            channelId = window.ytInitialData.videoDetails.channelId;
        }
        // 备用:从播放器初始化数据提取
        else if (window.ytInitialPlayerResponse?.videoDetails?.channelId) {
            channelId = window.ytInitialPlayerResponse.videoDetails.channelId;
        }

        if (channelId) {
            console.log('%c提取到的频道ID:', 'font-size:14px; font-weight:bold;', channelId);
            if (handle) {
                console.log('%c频道@标识:', 'font-size:14px; font-weight:bold;', `@${handle}`);
            }
        } else {
            console.error('%c无法提取频道ID:当前页面非频道主页或视频页面', 'font-size:14px; font-weight:bold; color:red;');
        }
    }, 1000);
})();

方案二:正确使用YouTube Data API(支持@handle)

若必须通过API提取,需改用search接口,通过q=@handle搜索并筛选频道类型结果,而非使用forUsername参数。

修正后的API脚本

// ==UserScript==
// @name YouTube Channel ID Extractor (API Fixed)
// @namespace https://example.com/
// @version 0.1
// @description Extracts YouTube channel ID via Data API (supports @handle)
// @author sharmanhall
// @match https://www.youtube.com/*
// @grant GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';

    const url = window.location.href;
    const match = url.match(/youtube\.com\/@([^/?]+)/i);
    if (match) {
        const handle = match[1];
        console.log('%c频道@标识:', 'font-size:16px; font-weight:bold;', `@${handle}`);

        // 替换为你的YouTube Data API密钥
        const apiKey = 'YOUR_API_KEY_HERE';
        const apiUrl = `https://www.googleapis.com/youtube/v3/search?part=snippet&q=@${handle}&type=channel&key=${apiKey}`;

        GM_xmlhttpRequest({
            method: 'GET',
            url: apiUrl,
            onload: function(response) {
                const data = JSON.parse(response.responseText);
                if (data.items?.length > 0) {
                    const channelId = data.items[0].id.channelId;
                    console.log('%c提取到的频道ID:', 'font-size:16px; font-weight:bold;', channelId);
                } else {
                    console.error('%cAPI未找到匹配频道', 'font-size:16px; font-weight:bold; color:red;');
                }
            },
            onerror: function() {
                console.error('%cAPI请求失败', 'font-size:16px; font-weight:bold; color:red;');
            }
        });
    } else {
        console.error('%c当前URL不是@handle格式的频道页面', 'font-size:16px; font-weight:bold; color:red;');
    }
})();

关键注意事项

  • 方案一无需API密钥,完全依赖页面初始化数据,是最稳定的方案,因为YouTube页面加载时必然生成这些核心数据。
  • 方案二需要API密钥,且有请求配额限制,适合必须用API的场景,但search接口的配额消耗高于channels接口。
  • 避免依赖页面DOM元素(如<link>标签),YouTube会频繁更新页面结构,这类依赖极易失效。

内容的提问来源于stack exchange,提问作者sharmanhall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:15:14