Google.Apis.Requests.RequestError权限不足[403]

时间:2016-03-09 00:39:39

标签: c# youtube-data-api

我收到以下错误,我想在youtube视频上发布所有评论。

所以基本上我传递了视频ID,我希望获得与该视频相关的所有评论

  

Google.Apis.Requests.RequestError
  许可不足[403]

     

错误[消息[权限不足]位置[ - ]原因[不足权限]域[全局]]

这是我的代码:

protected void btnGetVideoDesc_Click(object sender, EventArgs e)
{
    string videoId = txtVideoID.Text;
    YoutubeVideo video = new YoutubeVideo(videoId);
    lblTitle.Text = video.title;
    lblPublishedDate.Text = video.publishdate.ToShortDateString();
}

public class YoutubeVideo
{
    public string id, title, description ;
    public DateTime publishdate;

    public YoutubeVideo(string id)
    {
        this.id = id;
        YoutubeAPI.GetVideoInfo(this);
    }
}

public class YoutubeAPI
{
    private static YouTubeService ytService = Auth();

    private static YouTubeService Auth()
    {
        UserCredential creds;
        var service = new YouTubeService();
        try
        {
            using (var stream = new FileStream(@"C:\v-mmarat\Project\EMEA_Development\YoutubeWebCrawling\YoutubeWebCrawling\youtube_client_secret.json", FileMode.Open, FileAccess.Read))
            {
                creds = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
                    new[] { YouTubeService.Scope.YoutubeReadonly }, "user", CancellationToken.None,
                    new FileDataStore("YoutubeAPI")
                    ).Result;
            }
           service = new YouTubeService(new BaseClientService.Initializer()
           {
               HttpClientInitializer = creds,
               ApplicationName = "YoutubeAPI",
               ApiKey = "My_API_Key"

           });
        }
        catch (Exception e)
        { }
        return service;
    }

    public static void GetVideoInfo(YoutubeVideo video)
    {
        try
        {
           //This code work perfectly 
            var videoRequest = ytService.Videos.List("snippet");

            videoRequest.Id = video.id;

            var response = videoRequest.Execute();
            if (response.Items.Count > 0)
            {
                video.title = response.Items[0].Snippet.Title;
                video.description = response.Items[0].Snippet.Description;
                video.publishdate = response.Items[0].Snippet.PublishedAt.Value;
            }              




        else
            {
                //error
            }

            var CommentRequest = ytService.Comments.List("snippet");

            videoRequest.Id = video.id;

            //Getting error at this line after CommentRequest.Execute();
            var Commentresponse = CommentRequest.Execute();
            if (Commentresponse.Items.Count > 0)
            {
                video.title = Commentresponse.Items[0].Snippet.ChannelId;
                video.description = Commentresponse.Items[0].Snippet.TextDisplay;
                video.publishdate = Commentresponse.Items[0].Snippet.PublishedAt.Value;
            }
            else
            {
                //error
            }
        }
        catch (Exception e)
        { }
    }

4 个答案:

答案 0 :(得分:3)

授权更改" 用户"到" 管理员"。

答案 1 :(得分:2)

这是 真的 迟到的回复,但我遇到了类似的问题。我的项目是使用YouTube API将视频上传到帐户,并在代码的单独部分再次使用它来按ID搜索视频以检查其状态。

我的问题是我使用相同的OAuth凭据上传,然后也用于搜索视频。

这是失败的,因为我在上传时已经设置了YouTube范围,这不是搜索视频的正确范围。

我的简单解决方案是通过Google Developer Console创建另一组OAuth凭据(类型为"其他"),下载json文件并使用这些详细信息获取不同的访问令牌搜索我的部分代码。

希望这可以帮助别人。

答案 2 :(得分:0)

我知道这个答案有点晚了,但这就是为我解决的问题。希望它可以帮助别人。

我收到了相同的权限被拒绝错误。将YouTubeService.Scope.YoutubeForceSsl项添加到范围列表后,我能够提取评论。

此外,您的代码看起来不太合适。您将需要基于VideoId拉出CommentThreads并包含回复(如果您需要)。

您将无法使用评论提取视频评论。

var threadsRequest = Client.CommentThreads.List("snippet,replies");

threadsRequest.VideoId = videoId;

var response = threadsRequest.Execute();

答案 3 :(得分:0)

这里也一样。
通过在“GoogleWebAuthorizationBroker.AuthorizeAsync”中指定“dataStore”参数解决了这个问题。
该服务将一个访问令牌 JSON 文件写入该文件夹。
似乎授权需要存储选项。
另外,当授权成功时,浏览器会跳转到一个 Google 授权 URL,我必须在那里登录并允许我从 API 请求的访问级别。

我之前一直使用 API,但仅用于只读操作。 似乎“操作”的东西(插入、更新、删除、上传)需要更多的资助。