Загрузка видео с YouTube в Интернете с помощью API Google и области действия youtube.upload - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь загрузить видео на Youtube, разработанное в MVC, но оно терпит неудачу с приведенной ниже ошибкой для веб-приложения, в то время как оно отлично работает для локальной системы.Сервер, размещенный на AWS.

Не удалось запустить браузер с авторизацией "https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&client_id=abcd&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.upload%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive"". Подробности см. Во внутреннем исключении.

Ищу помощь

1 Ответ

0 голосов
/ 05 октября 2018

Я предполагаю, что вы используете клиентскую библиотеку .net API Google.Существует несколько типов клиентов с веб-клиентом входа в систему Google и клиентом собственных приложений.

Код, используемый для аутентификации двух приложений, различается.Когда вы авторизуетесь с помощью собственного клиента, вы запускаете веб-браузер на локальном компьютере.Если веб-приложение размещено на веб-сайте, браузер должен быть открыт на клиентском компьютере пользователя.

Ошибка, которую вы видите здесь, обычно происходит потому, что вы ее размещаете и пытаетесь открыть веб-браузер на самом сервере, а не в клинике пользователей.Вы должны следовать этому руководству web-application-aspnet-mvc

Добавить собственную реализацию FlowMetadata.

using System;
using System.Web.Mvc;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;

namespace Google.Apis.Sample.MVC4
{
    public class AppFlowMetadata : FlowMetadata
    {
        private static readonly IAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
                {
                    ClientSecrets = new ClientSecrets
                    {
                        ClientId = "PUT_CLIENT_ID_HERE",
                        ClientSecret = "PUT_CLIENT_SECRET_HERE"
                    },
                    Scopes = new[] { DriveService.Scope.Drive },
                    DataStore = new FileDataStore("Drive.Api.Auth.Store")
                });

        public override string GetUserId(Controller controller)
        {
            // In this sample we use the session to store the user identifiers.
            // That's not the best practice, because you should have a logic to identify
            // a user. You might want to use "OpenID Connect".
            // You can read more about the protocol in the following link:
            // https://developers.google.com/accounts/docs/OAuth2Login.
            var user = controller.Session["user"];
            if (user == null)
            {
                user = Guid.NewGuid();
                controller.Session["user"] = user;
            }
            return user.ToString();

        }

        public override IAuthorizationCodeFlow Flow
        {
            get { return flow; }
        }
    }
}

FlowMetadata - абстрактный класс, содержащий вашу собственную логикудля получения идентификатора пользователя и используемого вами IAuthorizationCodeFlow.

В приведенном выше примере кода создается новый GoogleAuthorizationCodeFlow с нужными областями, секретами клиента и хранилищем данных.Попробуйте добавить собственную реализацию IDataStore, например, вы можете написать такую, которая использует EntityFramework.

Реализуйте свой собственный контроллер, который использует службу API Google.В следующем примере используется DriveService:

using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Mvc;

using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Services;

using Google.Apis.Sample.MVC4;

namespace Google.Apis.Sample.MVC4.Controllers
{
    public class HomeController : Controller
    {
        public async Task IndexAsync(CancellationToken cancellationToken)
        {
            var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
                AuthorizeAsync(cancellationToken);

            if (result.Credential != null)
            {
                var service = new DriveService(new BaseClientService.Initializer
                    {
                        HttpClientInitializer = result.Credential,
                        ApplicationName = "ASP.NET MVC Sample"
                    });

                // YOUR CODE SHOULD BE HERE..
                // SAMPLE CODE:
                var list = await service.Files.List().ExecuteAsync();
                ViewBag.Message = "FILE COUNT IS: " + list.Items.Count();
                return View();
            }
            else
            {
                return new RedirectResult(result.RedirectUri);
            }
        }
    }
}

Реализация собственного контроллера обратного вызова.Реализация должна выглядеть примерно так:

using Google.Apis.Sample.MVC4;

namespace Google.Apis.Sample.MVC4.Controllers
{
    public class AuthCallbackController : Google.Apis.Auth.OAuth2.Mvc.Controllers.AuthCallbackController
    {
        protected override Google.Apis.Auth.OAuth2.Mvc.FlowMetadata FlowData
        {
            get { return new AppFlowMetadata(); }
        }
    }
}

Вам нужно будет изменить пример с google drive на Youtube.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...