2014-09-02 2 views
4

Я попытался загрузить видео на youtube с помощью youtube api v3 и .NET, но он вечно вел вызов AuthorizeAsync. Вы можете увидеть код также по адресу: https://developers.google.com/youtube/v3/code_samples/dotnetgoogleWebAuthorizationBroker.AuthorizeAsync вешает навсегда

static void Main(string[] args) 
    { 
    Console.WriteLine("YouTube Data API: Upload Video"); 
    Console.WriteLine("=============================="); 

    try 
    { 
    new UploadVideo().Run().Wait(); 
    } 
    catch (AggregateException ex) 
    { 
    foreach (var e in ex.InnerExceptions) 
    { 
     Console.WriteLine("Error: " + e.Message); 
    } 
    } 

    Console.WriteLine("Press any key to continue..."); 
    Console.ReadKey(); 
} 

private async Task Run() 
{ 
    UserCredential credential; 
    using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
    { 
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
     GoogleClientSecrets.Load(stream).Secrets, 
     // This OAuth 2.0 access scope allows an application to upload files to the 
     // authenticated user's YouTube channel, but doesn't allow other types of access. 
     new[] { YouTubeService.Scope.YoutubeUpload }, 
     "user", 
     CancellationToken.None 
    ); 
    } 

    var youtubeService = new YouTubeService(new BaseClientService.Initializer() 
    { 
    HttpClientInitializer = credential, 
    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name 
    }); 

ответ

1

я найти решение. Код не работал, потому что приложение было размещено в IIS. Возможно, возникла проблема с доступом IIS к папке внутри папки% appdata%. Файл токена по умолчанию сохраняется в папке% appdata%. Я попробовал изменить разрешение на эту папку. Я добавил Everyone, DefaultAppPool, I_USER, ... но без успеха. Существует также более новая версия Google.Apis (1.8.2), которая позволяет полный путь (новый FileDataStore (fullPath, true)) true означает полный путь, но там есть ошибка. Пользователь не смог создать этот конструктор, потому что всегда получаю ошибку. Поэтому я решил, что мое приложение должно использовать IIS Express (на самом деле я создал новый проект с кодом авторизации внутри). Перейдите к свойствам решения и настройте приложение на использование IIS Express.

Получить файл cliendId (json file) от https://console.developers.google.com (выберите веб-приложение) и установить http: // localhost: 48372 (или любой другой порт приложения) для генерации javascript и http: // localhost: 48372/authorize.aspx для перенаправить URL-адрес. Вы также должны найти в Интернете, как сделать свой порт статическим). Сохраните файл clientId. (Этот шаг, который вы, вероятно, уже сделали) Поскольку вы используете IIS express, не должно быть проблем с методом AuthorizeAsync. Вам будет предложено ввести ваши учетные данные и выбрать свою учетную запись youtube (или просто выбрать учетную запись, если вы уже вошли в систему). Когда вы дадите свое разрешение на приложение, вы будете перенаправлены на authorize.aspx. На вашей странице aspx authorize вы должны создать новый объект потока IAuthorization с предоставлением свойства Client Secret и DataStore. Прочитайте код из URL с помощью кода = Request.Params ["code"] и создайте объект UserCredential.HttpClientInitializer для youtubeService имеет тип UserCredential. Метод, который вы должны использовать, - это что-то вроде var usercredential = flow.SomeMethodWhichReceives («пользователь», код, CancelletionToken.None). После этого файл, содержащий токен обновления, создается внутри указанной вами папки FileDataStore. Когда у вас есть токен обновления, вы можете делать все, что хотите, потому что токен обновления должен длиться вечно (если не отменено вручную). Существует метод, который позволяет получать usercredential из refreshtoken, например flow.getAccessTokenfromRefreshToken («user», «your_refresh_token_string») Итак, когда у вас есть токен обновления и с помощью метода последнего метода, вы сможете получить доступ к google youtube api. Вы также получаете возможность, чтобы другие пользователи загружали вашу учетную запись youtube, используя этот подход. Если вы настроены на контент, который ваши пользователи добавили в вашу учетную запись, вы всегда можете сделать видео, которое они загрузили, и изменить их на публике, когда вы их проверите.

Некоторые методы внутри google youtube api требуют аутентификации OAUTH2 (получить токен обновления из секретности клиента -> получить токен доступа из токена обновления ...), например, загружать видео, но некоторые вроде getvideos не требуют. Вы можете предоставить API-ключ для вашего коннектора youtubeService вместо UserCredential

EDIT: Есть еще один улов, о котором я забыл упомянуть (для тех, кто думал, что это все). Когда вы даете своему приложению разрешение на доступ к google api (как раз перед тем, как вы будете перенаправлены на authorize.aspx), вы получите ошибку redirect_url mismatch, потому что есть где-то в параметре url redirect_url, который не соответствует URL-адресу перенаправления, указанному в вашем ClientId json, (порт по-разному по крайней мере, по какой-то причине). Измените этот параметр, чтобы он соответствовал URL-адресу перенаправления, предоставленному в clientId json.

0

Я запускаю VS с правами администратора, и это помогло.

+0

Я всегда работал, но для меня проблема заключалась в том, что, когда я использовал IIS, метод был просто повешен. Затем я переключился на IIS, чтобы получить этот токен и использовать его позже в моем приложении, размещенном в IIS. –

Смежные вопросы