如何使用C#通过视频Key查询YouTube视频的时长、作者等元数据
如何用C#查询YouTube视频的元数据(时长、作者等)
嘿,我之前刚好做过类似的需求,主要有两种靠谱的方式来实现这个功能——使用官方的YouTube Data API(推荐,稳定合规),或者如果只是小规模临时查询的话,也可以尝试解析页面元数据(但这个方法不适合生产环境,原因后面说)。下面我详细拆解两种方法:
一、使用官方YouTube Data API v3(推荐方案)
这是Google官方提供的接口,能稳定获取视频的各种元数据,而且支持批量查询,完全合规。
步骤1:准备API密钥
首先你得去Google Cloud Console创建一个项目,找到「YouTube Data API v3」并启用它,然后生成一个API密钥——这个密钥是调用接口的凭证,记得别随便泄露给别人。
步骤2:安装NuGet包
在你的C#项目里安装官方的客户端库:
Install-Package Google.Apis.YouTube.v3
或者在Visual Studio的NuGet包管理器里搜索「Google.Apis.YouTube.v3」安装。
步骤3:编写查询代码
下面是一个获取单个视频元数据的示例,包含作者、标题、时长这些核心信息:
using Google.Apis.Services; using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3.Data; using System.Xml; // 用于转换ISO时长格式 public async Task FetchVideoMetadata(string apiKey, string videoId) { // 初始化YouTube服务 var youtubeService = new YouTubeService(new BaseClientService.Initializer() { ApiKey = apiKey, ApplicationName = "你的应用名称" // 随便填个标识就行 }); // 创建请求,指定要获取的资源片段:snippet(含作者、标题)、contentDetails(含时长) var request = youtubeService.Videos.List("snippet,contentDetails"); request.Id = videoId; // 传入你的视频Key,比如"2GnN3xLa0Js" // 发送请求并获取响应 var response = await request.ExecuteAsync(); if (response.Items.Any()) { var video = response.Items.First(); // 提取作者(频道名称) string author = video.Snippet.ChannelTitle; // 提取视频标题 string title = video.Snippet.Title; // 提取时长(原始是ISO 8601格式,比如PT15M30S) string durationIso = video.ContentDetails.Duration; // 转换为易读的TimeSpan格式 TimeSpan duration = XmlConvert.ToTimeSpan(durationIso); string formattedDuration = $"{duration.Hours:D2}:{duration.Minutes:D2}:{duration.Seconds:D2}"; // 输出结果 Console.WriteLine($"视频标题:{title}"); Console.WriteLine($"作者频道:{author}"); Console.WriteLine($"视频时长:{formattedDuration}"); } else { Console.WriteLine("未找到该视频的元数据,可能视频已删除或ID有误"); } }
批量查询技巧
如果要查多个视频,只需要把多个视频ID用逗号分隔传给request.Id就行,比如:
request.Id = "2GnN3xLa0Js,abc123def456,xyz789";
这样一次请求就能获取多个视频的元数据,比逐个请求高效得多。
二、解析YouTube页面元数据(临时方案)
这种方法不需要API密钥,但非常不稳定——YouTube的页面结构、JS变量随时可能变化,而且频繁请求容易被反爬机制拦截,只适合临时测试用。
步骤1:安装HTML解析库
我们用HtmlAgilityPack来解析页面:
Install-Package HtmlAgilityPack
步骤2:编写解析代码
using HtmlAgilityPack; using System.Net.Http; using System.Text.RegularExpressions; using System.Xml; public async Task ScrapeVideoMetadata(string videoId) { var videoUrl = $"https://www.youtube.com/watch?v={videoId}"; using var httpClient = new HttpClient(); // 模拟浏览器请求头,避免被直接拦截 httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); try { var htmlContent = await httpClient.GetStringAsync(videoUrl); var doc = new HtmlDocument(); doc.LoadHtml(htmlContent); // 提取标题(从OG标签) var titleNode = doc.DocumentNode.SelectSingleNode("//meta[@property='og:title']"); string title = titleNode?.GetAttributeValue("content", "未知标题"); // 提取作者(从OG标签) var authorNode = doc.DocumentNode.SelectSingleNode("//meta[@property='og:video:actor']"); string author = authorNode?.GetAttributeValue("content", "未知作者"); // 提取时长(从页面的JS变量里匹配) var durationMatch = new Regex(@"""duration"":""([^""]+)""").Match(htmlContent); if (durationMatch.Success) { string durationIso = durationMatch.Groups[1].Value; TimeSpan duration = XmlConvert.ToTimeSpan(durationIso); string formattedDuration = $"{duration.Hours:D2}:{duration.Minutes:D2}:{duration.Seconds:D2}"; Console.WriteLine($"视频标题:{title}"); Console.WriteLine($"作者频道:{author}"); Console.WriteLine($"视频时长:{formattedDuration}"); } else { Console.WriteLine("未能解析出视频时长"); } } catch (HttpRequestException ex) { Console.WriteLine($"请求出错:{ex.Message}"); } }
最后提醒
- 生产环境一定要用官方API,解析页面的方法随时可能失效,还可能触发YouTube的反爬限制。
- API有调用配额限制,免费额度足够小规模使用,如果需要更高配额可以付费升级。
- 除了时长、作者,API还能获取观看量、点赞数、发布时间等更多元数据,只需要在请求时添加对应的资源片段(比如
statistics)。
内容的提问来源于stack exchange,提问作者Jonathan Allen
相关产品推荐
相关产品推荐

