YouTube 拥有海量的优质内容创作者,但其封闭的生态系统和强干预的推荐算法,往往让我们难以按照自己的意愿获取信息。更令人困扰的是,平台并没有提供简单直接的方式,让用户将辛苦积累的订阅列表迁移到其他开放的 RSS 阅读器中。

事实上,每个 YouTube 频道背后都隐藏着一个公开的 RSS 订阅源。只要掌握了正确的方法,你就可以轻松打破围墙,将所有订阅内容导入到 Feedly、Inoreader 或任何你喜欢的 RSS 阅读器中,彻底摆脱算法的束缚,重获信息流的主动权。
本指南将带你通过一个纯前端书签脚本,在不安装任何浏览器扩展、无需申请 API 密钥、也不用等待漫长的 Google Takeout 数据导出的情况下,瞬间生成标准的 OPML 文件。
核心优势
- 完全本地运行:所有数据处理均在浏览器内存中完成,无任何数据上传至第三方服务器,隐私绝对安全。
- 零依赖:无需安装 Chrome/Edge 扩展程序,无需配置复杂的 API 权限。
- 通用格式:生成的 OPML 文件兼容几乎所有主流 RSS 阅读器。
- 即时生效:无需等待 Google 打包数据,几秒钟即可完成数百个频道的提取。
操作步骤
第一步:访问订阅管理页面
首先,打开浏览器,访问 YouTube 的频道订阅管理页面:https://www.youtube.com/feed/channels
注意:必须是
/feed/channels页面,而不是普通的首页或订阅流页面,因为这里列出了你订阅的所有频道列表。
第二步:创建“魔法”书签
我们需要创建一个特殊的书签,它包含一段 JavaScript 代码,用于自动提取频道信息并生成文件。
- 在浏览器的书签栏右键点击,选择**“添加页面”或“新建书签”**。
- 名称:随意填写,例如
Export YouTube OPML。 - 网址 (URL):完整复制并粘贴以下代码(请确保复制了全部内容,包括开头的
javascript:):
javascript:(async function(){function sleep(ms){return new Promise(function(r){setTimeout(r,ms);});}
if(location.pathname==="/feed/subscriptions"){alert("Open https://www.youtube.com/feed/channels and run again.");return;}
function esc(s){return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");}
function pickText(t){if(!t)return"";if(typeof t==="string")return t;if(t.simpleText)return t.simpleText;if(t.runs&&t.runs.length){var out="";for(var i=0;i<t.runs.length;i++)out+=t.runs[i].text||"";return out.trim();}return"";}
function walk(node,fn){if(!node||typeof node!=="object")return;fn(node);if(Array.isArray(node)){for(var i=0;i<node.length;i++)walk(node[i],fn);}else{for(var k in node)if(Object.prototype.hasOwnProperty.call(node,k))walk(node[k],fn);}}
function fromInitialData(){var m={};try{walk(window.ytInitialData||{},function(o){if(!o||typeof o!=="object")return;var id=o.channelId;if(typeof id==="string"&&/^UC[0-9A-Za-z_-]{20,}$/.test(id)){var title=pickText(o.title)||pickText(o.channelTitle)||pickText(o.name);if(title){m[id]=title;}else if(!(id in m)){m[id]="";}}});}catch(e){}return m;}
function fromDOM(){var m={};var links=document.querySelectorAll('a[href*="/channel/"]');for(var i=0;i<links.length;i++){var a=links[i];var h=a.getAttribute("href")||"";var mm=h.match(/\/channel\/(UC[0-9A-Za-z_-]{20,})/);if(!mm)continue;var id=mm[1];var title=(a.getAttribute("title")||"").trim();if(!(id in m))m[id]=title;}return m;}
function merge(a,b){for(var id in b)if(Object.prototype.hasOwnProperty.call(b,id)){if(!(id in a)||(!a[id]&&b[id]))a[id]=b[id];}return a;}
var chans=merge(fromInitialData(),fromDOM());
var stable=0;
for(var iter=0;iter<60;iter++){
window.scrollTo(0,document.documentElement.scrollHeight);
await sleep(650);
var before=Object.keys(chans).length;
chans=merge(chans,merge(fromInitialData(),fromDOM()));
var after=Object.keys(chans).length;
if(after===before)stable++;else stable=0;
if(stable>=6)break;
}
var ids=Object.keys(chans);
ids.sort(function(a,b){
var ta=(chans[a]||a).toLowerCase(), tb=(chans[b]||b).toLowerCase();
if(ta<tb)return -1; if(ta>tb)return 1; return 0;
});
var outlines=[];
for(var j=0;j<ids.length;j++){
var id=ids[j];
var title=(chans[id]||"").trim()||id;
var feed="https://www.youtube.com/feeds/videos.xml?channel_id="+id;
var html="https://www.youtube.com/channel/"+id;
outlines.push(' <outline type="rss" text="'+esc(title)+'" title="'+esc(title)+'" xmlUrl="'+feed+'" htmlUrl="'+html+'" />');
}
var opml='<?xml version="1.0" encoding="UTF-8"?>\n<opml version="2.0">\n <head>\n <title>YouTube Subscriptions</title>\n </head>\n <body>\n <outline text="YouTube Subscriptions" title="YouTube Subscriptions">\n'+outlines.join("\n")+'\n </outline>\n </body>\n</opml>\n';
var blob=new Blob([opml],{type:"text/xml;charset=utf-8;"});
var url=URL.createObjectURL(blob);
var a=document.createElement("a");
a.href=url;
a.download="youtube-subscriptions.opml";
document.body.appendChild(a);
a.click();
setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},1000);
alert("Downloaded youtube-subscriptions.opml ("+ids.length+" channels).");
})();
保存该书签。
第三步:执行导出
- 确保你当前停留在
https://www.youtube.com/feed/channels页面。 - 点击你刚刚创建的
Export YouTube OPML书签。 - 见证自动化过程:脚本会自动触发页面滚动,模拟人工操作以加载所有订阅频道。你会看到页面向下滚动,持续约几十秒(具体取决于你订阅的频道数量)。
- 下载完成:当脚本检测到没有更多新频道加载时,会自动停止滚动,并触发浏览器下载一个名为
youtube-subscriptions.opml的文件。屏幕会弹出提示框,显示成功导出的频道数量。
第四步:导入 RSS 阅读器
现在,你手中已经拥有了通往自由信息流的钥匙。打开你常用的 RSS 阅读器,寻找“导入”功能(通常位于 设置 → 导入/导出 → 导入 OPML)。
支持的阅读器包括但不限于:
- 云端服务:Feedly, Inoreader, The Old Reader
- 自托管方案:FreshRSS, Tiny Tiny RSS, Miniflux
- 桌面/移动端:Reeder (macOS/iOS), NetNewsWire (macOS/iOS), ReadKit
导入成功后,你将发现所有 YouTube 频道已整齐排列。从此,你可以按时间顺序查看最新视频,不再受“推荐算法”的干扰,也不再错过任何更新。
技术原理与安全说明
这个脚本之所以强大且安全,是因为它利用了 YouTube 页面的内部数据结构:
- 双重提取机制:脚本同时从页面的初始数据对象 (
ytInitialData) 和 DOM 元素中提取频道 ID 和名称,确保数据的完整性。 - 自动滚动加载:YouTube 采用无限滚动加载机制。脚本通过模拟滚动 (
window.scrollTo) 并检测内容稳定性,确保遍历所有订阅项,无一遗漏。 - 构建标准源地址:每个 YouTube 频道都有一个固定的 RSS 地址格式:
https://www.youtube.com/feeds/videos.xml?channel_id=[频道ID]
脚本自动将提取到的 ID 填入此模板,生成有效的 RSS 链接。 - 本地生成文件:利用浏览器的
Blob和URL.createObjectURLAPI,直接在客户端内存中构建 XML 文件并触发下载。
隐私承诺:整个过程中,没有任何数据被发送到脚本作者或任何第三方服务器。一切都在你的浏览器本地沙箱中运行,安全可控。
结语
将 YouTube 订阅迁移到 RSS 阅读器,不仅仅是更换了一个阅读工具,更是一种生活态度的转变。它意味着你选择主动筛选信息,而非被动接受投喂;意味着你重视时间的价值,不愿在无休止的算法推荐中迷失。
拿起这个简单的工具,花几分钟时间,为你的数字生活做一次彻底的“断舍离”。(来源)















