【问题标题】:YouTube API v3 throws "No filter selected" error trying to list my subscriptionsYouTube API v3 在尝试列出我的订阅时抛出“未选择过滤器”错误
【发布时间】:2016-09-27 19:55:16
【问题描述】:

我正在尝试检索包含我所有 subscriptions 的列表,但是,在下面的源代码中调用 Await listRequest.ExecuteAsync() 时,我收到了一条异常消息:

Google.Apis.Requests.RequestError 未选择过滤器。预期之一: mySubscribers, id, mine, myRecentSubscribers, channelId [400] 错误 [ 消息[未选择过滤器。预期之一:mySubscribers, id, mine, myRecentSubscribers, channelId] 位置[-参数] 原因[missingRequiredParameter] 域[youtube.parameter] ]

我读了这个,但我完全不明白:

以及官方参考:


我正在使用 YouTubeService.Scope.Youtube 范围 (https://www.googleapis.com/auth/youtube)

我正在使用“snippet”列表选择器来尝试列出我的订阅,我也尝试加入了“id,snippet,contentDetails”。

我用来进行身份验证的自动生成的 client_secrets.json 文件包含以下内容:

{
   "installed":{
      "client_id":"xxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
      "project_id":"xxxxxxxxxxxxxxxxxxx",
      "auth_uri":"https://accounts.google.com/o/oauth2/auth",
      "token_uri":"https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
      "client_secret":"xxxxxxxxxxxxxxxxx",
      "redirect_uris":[
         "urn:ietf:wg:oauth:2.0:oob",
         "http://localhost"
      ]
   }
}

我对上面提供的信息做错了什么?以及,我该如何解决这个问题?

这里是相关的源代码:

请注意,如果我将属性 listRequest.Mine 设置为 True,则它不会引发异常,但会找到零订阅。

C#(在线翻译):

public Task<List<Subscription>> GetSubscriptions(SubscriptionsResource.ListRequest.OrderEnum resultSorting)
{

   if (!(this.isAuthorizedB)) {
      throw new InvalidOperationException(this.authExceptionMessage);

   } else {
      SubscriptionsResource.ListRequest listRequest = Await this.client.Subscriptions.List("snippet");
      // listRequest.MySubscribers = False
      // listRequest.Mine = False
      listRequest.MaxResults = 50;
      listRequest.Order = resultSorting;

      SubscriptionListResponse searchResponse = Await listRequest.ExecuteAsync();

      List<Subscription> subscriptions = new List<Subscription>();

      while (true) {
         foreach (Subscription searchResult in searchResponse.Items) {
            subscriptions.Add(searchResult);
         }

         if (!string.IsNullOrEmpty(searchResponse.NextPageToken)) {
            listRequest.PageToken = searchResponse.NextPageToken;
            searchResponse = listRequest.ExecuteAsync();
         } else {
            break; // TODO: might not be correct. Was : Exit Do
         }

      }

      return subscriptions;

   }

}

VB.NET(原创):

Public Async Function GetSubscriptions(ByVal resultSorting As SubscriptionsResource.ListRequest.OrderEnum) As Task(Of List(Of Subscription))

    If Not (Me.isAuthorizedB) Then
        Throw New InvalidOperationException(Me.authExceptionMessage)

    Else
        Dim listRequest As SubscriptionsResource.ListRequest = Me.client.Subscriptions.List("snippet")
        With listRequest
            ' .MySubscribers = False
            ' .Mine = False
            .MaxResults = 50
            .Order = resultSorting
        End With

        Dim searchResponse As SubscriptionListResponse = Await listRequest.ExecuteAsync()

        Dim subscriptions As New List(Of Subscription)
        Do While True

            For Each searchResult As Subscription In searchResponse.Items
                subscriptions.Add(searchResult)
            Next searchResult

            If Not String.IsNullOrEmpty(searchResponse.NextPageToken) Then
                listRequest.PageToken = searchResponse.NextPageToken
                searchResponse = Await listRequest.ExecuteAsync()
            Else
                Exit Do
            End If

        Loop

        Return subscriptions

    End If

End Function

【问题讨论】:

  • 您的代码看起来不错。您是否有多个 YouTube 帐户附加到您的 Google 帐户。当您进行身份验证时,它会弹出并要求您选择一个 YouTube 帐户。你选对了吗?
  • 您需要发送 channelId、id、mine 或 mySubscriptions 过滤器。如果没有其中之一,您将收到 No filter selected 错误。
  • @DaImTo 感谢您的评论。我不确定您是否理解,看,我有两个不同的 Google 帐户,Youtube 将这些帐户识别为两个不同的帐户(不是“附加”),它显示主要登录帐户和“其他帐户:... XXX”。实际上GoogleWebAuthorizationBroker.AuthorizeAsync() 方法没有显示任何身份验证弹出窗口,我将要检索订阅的帐户的电子邮件传递给该方法,它通过了一次身份验证并且不再显示弹出窗口。我在尝试列出我上传的视频时遇到了同样的问题。

标签: c# vb.net google-api youtube-api google-api-dotnet-client


【解决方案1】:

好的,期待评论。注意:YouTube API 与其他 Google API 不同,可能有点奇怪。

当您的代码运行身份验证部分时

  UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }
                                                                                             , scopes
                                                                                             , userName
                                                                                             , CancellationToken.None
                                                                                             , new FileDataStore("Daimto.YouTube.Auth.Store")).Result;

它将弹出并请求访问您的帐户。然后它会询问哪个 YouTube 帐户

当你运行你的列表时

SubscriptionsResource.ListRequest listRequest = Await this.client.Subscriptions.List("snippet");          
      listRequest.Mine = true
      listRequest.MaxResults = 50;
      listRequest.Order = resultSorting;

      SubscriptionListResponse searchResponse = Await listRequest.ExecuteAsync();

它只会显示您选择的 YouTube 帐户的结果。因此,您需要做的第一件事是确保您使用正确的 Google 帐户和正确的 YouTube 帐户进行身份验证。您当前选择的帐户没有订阅。

您需要对每个通过电子邮件进行身份验证的帐户进行身份验证。您尚未发布您的身份验证代码,但在我的代码中,我只是更改了“用户名”,它将请求其他用户的访问权限。它只是一个字符串,您可以发送任何您想要识别不同用户的内容。如果您不更改字符串,则 FileDatastore 已经有一个用户并且它知道这一点,因此它不会再次请求访问。我的文件数据存储教程Google .net FileDatastore Demystified。所以改变它,它会再次请求访问:)

我还有一个 YouTube 示例项目,我已经有一段时间没玩过了,但它可能会有所帮助。 Google-dotnet-samples YouTube github

【讨论】:

  • 似乎 Google 的服务器端或我的数据存储文件夹中出了点问题,我最终看到了这个 stackoverflow.com/questions/16970917/… 然后我撤销了我的应用程序权限,就像建议接受的答案一样,然后我验证了我的再次应用程序,一切正常,我使用相同的代码,没有任何变化。再次感谢!
猜你喜欢
  • 2015-08-03
  • 2013-05-20
  • 1970-01-01
  • 2014-12-02
  • 2018-05-27
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多