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

如何使用C#结合YouTube Data API获取个人YouTube频道视频状态

问题修复方案

你代码无法获取视频状态是两个配置问题导致的,按以下步骤修改即可:

核心问题原因

  • 调用PlaylistItems.List接口时,part参数仅传入了snippet,未添加status字段,接口不会返回状态相关数据
  • 若需要获取视频本身的原生状态(而非视频在播放列表中的状态),需要额外调用Videos.List接口查询对应视频ID的详情

修改后代码

private async Task Editvideo()
{
    UserCredential credential;
    using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
    {
        credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            new[] { YouTubeService.Scope.YoutubeReadonly },
            "user",
            CancellationToken.None,
            new FileDataStore(this.GetType().ToString())
        );
    }

    var youtubeService = new YouTubeService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = this.GetType().ToString()
    });

    var channelsListRequest = youtubeService.Channels.List("contentDetails");
    channelsListRequest.Mine = true;
    var channelsListResponse = await channelsListRequest.ExecuteAsync();

    foreach (var channel in channelsListResponse.Items)
    {
        var uploadsListId = channel.ContentDetails.RelatedPlaylists.Uploads;
        Console.WriteLine("Videos in list {0}", uploadsListId);

        var nextPageToken = "";
        while (nextPageToken != null)
        {
            // 修改1:part参数添加status,获取播放列表项的状态
            var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet,status");
            playlistItemsListRequest.PlaylistId = uploadsListId;
            playlistItemsListRequest.MaxResults = 50;
            playlistItemsListRequest.PageToken = nextPageToken;

            var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync();
            
            // 如果需要获取视频本身的状态,批量收集视频ID调用Videos接口
            var videoIdList = playlistItemsListResponse.Items.Select(x => x.Snippet.ResourceId.VideoId).ToList();
            var videosListRequest = youtubeService.Videos.List("status");
            videosListRequest.Id = string.Join(",", videoIdList);
            var videosListResponse = await videosListRequest.ExecuteAsync();
            var videoStatusDict = videosListResponse.Items.ToDictionary(x => x.Id, x => x.Status);

            foreach (var playlistItem in playlistItemsListResponse.Items)
            {
                // 播放列表项的状态
                string playlistItemStatus = playlistItem.Status.PrivacyStatus;
                // 视频本身的状态
                videoStatusDict.TryGetValue(playlistItem.Snippet.ResourceId.VideoId, out var videoStatus);
                string videoPrivacyStatus = videoStatus?.PrivacyStatus;
                string videoUploadStatus = videoStatus?.UploadStatus;

                Console.WriteLine("标题:{0} 视频ID:{1} 播放列表状态:{2} 视频原生状态:{3} 上传状态:{4}", 
                    playlistItem.Snippet.Title, 
                    playlistItem.Snippet.ResourceId.VideoId,
                    playlistItemStatus,
                    videoPrivacyStatus,
                    videoUploadStatus);
            }

            nextPageToken = playlistItemsListResponse.NextPageToken;
        }
    }
}

修改说明

  • 无需调整授权范围,原有YoutubeReadonly权限已经满足查询需求
  • 仅需要视频在上传播放列表中的状态,直接使用playlistItem.Status即可,不需要额外调用Videos.List接口
  • 要获取视频的审核状态、上传失败原因、版权状态等信息,必须通过Videos.List接口查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:00