1

Ich versuche, eine Liste abzurufen, das alle meine subscriptions, aber ich bin immer eine Ausnahme mit dieser Fehlermeldung, wenn Await listRequest.ExecuteAsync() in der anruf Quellcode unten:YouTube API v3 wirft „keinen Filter ausgewählt“ Fehler versucht, meine Abonnements zur Liste

Google.Apis.Requests.RequestError Kein Filter ausgewählt. Erwarteter Wert von: mySubscribers, id, meins, myRecentSubscribers, channelId [400] Fehler [ Nachricht [Kein Filter ausgewählt. Erwartet man von: mySubscribers, id, mine, myRecentSubscribers, channelId] Standort [- Parameter] Reason [missingRequiredParameter] Domain [youtube.parameter]]

ich diese Zeilen lesen, aber ich verstehe es überhaupt nicht alle:

Und die offizielle Referenz:


Ich bin mit dem YouTubeService.Scope.Youtube Umfang (https://www.googleapis.com/auth/youtube)

Ich bin mit der "snippet" -Liste Selektor Meine Abonnements versuchen Liste, ich habe auch versucht, mit "id,snippet,contentDetails" beigetreten.

Und die automatisch generierte client_secrets.json Datei, die ich zu authentifizieren bin mit, hat folgenden Inhalt:

{ 
    "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" 
     ] 
    } 
} 

ich etwas falsch mit den Informationen tun oben ?, zur Verfügung gestellt und, Wie könnte ich dieses Problem beheben?

Hier ist die relevante Quelle-Code:

Beachten Sie, dass, wenn ich die Eigenschaft listRequest.Mine auf True gesetzt, dann ist es nicht die Ausnahme auslöst, aber dann findet es Null-Abonnements.

C# (Online-Übersetzung):

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 (original):

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 
+0

Ihr Code sieht gut aus. Hast du zufällig mehr als ein YouTube-Konto mit deinem Google-Konto verknüpft? Wenn du dich authentifizierst, wird es erscheinen und dich auffordern, ein YouTube-Konto auszuwählen. Hast du den richtigen ausgewählt? – DaImTo

+0

Sie müssen entweder channelId, id, mine oder mySubscriptions senden, das sind die Filter. Ohne eine dieser Optionen erhalten Sie den Fehler Kein Filter ausgewählt. – DaImTo

+0

@DaImTo Danke für den Kommentar. Ich bin mir nicht sicher, ob Sie das verstanden haben, ich habe zwei verschiedene Google-Konten, Youtube erkennt diese Konten als zwei verschiedene Konten (nicht "angefügt"), es zeigt das Hauptkonto und "Andere Konten: ... XXX" an. Tatsächlich zeigt die 'GoogleWebAuthorizationBroker.AuthorizeAsync()' Methode kein Authentifizierungs-Popup an, ich übergebe diese Methode die E-Mail des Accounts, auf dem ich Abonnements abholen möchte, sie authentifiziert einmal und zeigt das Popup nicht mehr an. Ich habe das gleiche Problem, wenn ich versuche, meine hochgeladenen Videos aufzulisten. – ElektroStudios

Antwort

2

Ok für einen Kommentar zu lang wird. Hinweis: Die YouTube API unterscheidet sich von anderen Google APIs und es kann etwas merkwürdig sein, das herauszufinden.

Wenn Ihr Code läuft der Authentifizierungsteil

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

Es wird Pop-up und Anforderung Zugriff auf Ihr Konto.Dann wird es fragen, welche YouTube-Konto

enter image description here

Wenn Sie Ihre Liste laufen

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

     SubscriptionListResponse searchResponse = Await listRequest.ExecuteAsync(); 

Es wird nur die Ergebnisse für das YouTube-Konto, das Sie ausgewählt zeigen gehen. Als Erstes musst du sicherstellen, dass du dich mit dem richtigen Google-Konto und dem richtigen YouTube-Konto authentifizierst. Das Konto, das Sie ausgewählt haben, hat keine Abonnements.

Sie müssen sich mit jedem der Konten authentifizieren, wenn eine E-Mail nicht authentifiziert wird. Sie haben Ihren Authentifizierungscode nicht veröffentlicht, aber in meinem Code ändere ich einfach "userName" und er wird den Zugriff für einen anderen Benutzer anfordern. Es ist nur eine Zeichenfolge, die Sie senden können, was immer Sie verschiedene Benutzer identifizieren möchten. Wenn Sie die Zeichenkette nicht ändern, hat FileDatastore bereits einen Benutzer und weiß, dass er den Zugriff nicht erneut anfordern wird. Mein Tutorial über die Datei Google .net FileDatastore Demystified. Also ändere das und es wird wieder Zugriff anfordern :)

Ich habe auch ein YouTube-Beispiel-Projekt Ich habe nicht mit einer Weile gespielt, aber es könnte helfen. Google-dotnet-samples YouTube github

+1

Scheint, dass etwas auf der Server-Seite von Google oder vielleicht in meinem Datenspeicher-Ordner falsch war, beendete ich das Sehen dieser http://stackoverflow.com/questions/16970917/why-is-google-calendar-api-oauth2-responding-with- Unzureichende-Berechtigung Ich habe dann meine Apps-Berechtigung wie vorgeschlagen die akzeptierte Antwort widerrufen, und dann habe ich meine App erneut authentifiziert, und alles funktioniert perfekt, ich verwende den gleichen Code ohne Änderungen. Danke noch einmal! – ElektroStudios