无需YouTube API,如何用ytdl/ytpl获取YouTube频道视频ID或播放列表ID?
不用YouTube API,通过频道ID获取视频ID或上传播放列表ID的方案
当然可以!完全不用依赖YouTube API就能实现你的需求,毕竟只是一次性获取频道视频,折腾API密钥和配额确实有点小题大做。下面给你两种实用的方案,都是基于Node.js生态里的工具,完美匹配你的需求:
方案一:直接构造上传播放列表ID + 使用ytpl获取视频ID
YouTube有个通用规则:频道ID以UC开头,对应的上传视频播放列表ID就是把开头的UC换成UU。利用这个规律,你可以直接生成播放列表ID,再用ytpl批量获取所有视频ID:
const ytpl = require('ytpl'); // 定义获取频道所有视频ID的异步函数 async function fetchChannelVideoIds(channelId) { // 转换频道ID为上传播放列表ID const uploadsPlaylistId = channelId.replace('UC', 'UU'); try { // 获取整个播放列表的所有视频(limit: Infinity表示不限数量) const playlistData = await ytpl(uploadsPlaylistId, { limit: Infinity }); // 提取所有视频ID到数组 const videoIds = playlistData.items.map(item => item.videoId); return videoIds; } catch (error) { console.error('获取播放列表数据失败:', error); return []; } } // 使用示例 const targetChannelId = 'UCuAXFkgsw1L7xaCfnd5JJOw'; fetchChannelVideoIds(targetChannelId).then(videoIds => { console.log('频道所有视频ID:', videoIds); // 这里就可以根据需求筛选视频ID,再用ytdl下载 videoIds.forEach(id => { // ytdl(`https://www.youtube.com/watch?v=${id}`) 进行下载操作 }); });
这个方法简单高效,几乎适用于所有公开频道,不需要额外的频道信息请求。
方案二:用ytdl-core获取频道上传列表ID,再用ytpl拿视频ID
如果你担心替换前缀的规则有例外(虽然极少出现),可以用ytdl-core直接获取频道的官方上传列表ID,再结合ytpl获取视频:
const ytdl = require('ytdl-core'); const ytpl = require('ytpl'); async function getChannelVideos(channelId) { const channelUrl = `https://www.youtube.com/channel/${channelId}`; try { // 获取频道基础信息,包含关联播放列表 const channelInfo = await ytdl.getChannelInfo(channelUrl); // 提取上传播放列表ID const uploadsPlaylistId = channelInfo.relatedPlaylists.uploads; // 获取播放列表所有视频 const playlistData = await ytpl(uploadsPlaylistId, { limit: Infinity }); const videoIds = playlistData.items.map(item => item.videoId); return videoIds; } catch (error) { console.error('获取频道或播放列表失败:', error); return []; } } // 使用示例 getChannelVideos('UCuAXFkgsw1L7xaCfnd5JJOw').then(videoIds => { console.log('视频ID列表:', videoIds); // 筛选并下载视频的逻辑放在这里 });
关键注意事项
- 这两个方案都不需要YouTube API密钥,完全依赖模块对YouTube公开页面的解析,不会消耗API配额。
- 由于YouTube可能会调整页面结构,建议定期更新
ytpl和ytdl-core模块(执行npm update ytpl ytdl-core),避免解析失败。 - 如果你只需要上传播放列表ID,方案一的
uploadsPlaylistId或者方案二的channelInfo.relatedPlaylists.uploads就是你要的结果,后续可以单独用ytpl处理。
内容的提问来源于stack exchange,提问作者Santiago M.
相关产品推荐
相关产品推荐

