Как прочитать файл accessToken, который находится в папке App_Data? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть функция Azure, в которой есть код для загрузки видео на мой канал YouTube, когда в контейнере "video" есть видеофайл. Код, который я использую, взят из примера кода YouTube API: https://developers.google.com/youtube/v3/docs/videos/insert.

Я взял этот код и поместил его в функцию Azure (код ниже). Когда я компилирую и запускаю функцию локально, она работает нормально, и я могу загрузить видео, используя Azure Storage Explorer, и вижу, что видео отлично загружается на моем канале YouTube.

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

Итак, чтобы преодолеть это, я хочу использовать тот же файл токена доступа, который был создан, когда я запускал свой код локально, и снова загрузить функцию с этим файлом токена в Azure, чтобы Избегайте запроса аутентификации пользователя. Но файл токена доступа находится в моей папке %appdata%, поэтому я хочу переместить этот файл в тот же каталог, что и мой код, а затем прочитать этот файл, чтобы получить токен доступа.

У меня есть файл, который находится в моем

C:\Users\Peter\AppData\Roaming\Google.Apis.Auth\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user

Я хочу переместить файл Google.Apis.Auth.OAuth2.Responses.TokenResponse-user (который содержит мой токен доступа) в тот же каталог, что и мой код, и прочитать этот файл .

Вопрос : как изменить код, чтобы он считывал файл из той же директории, что и мой код, а не из %appdata%?

Я думаю, что я должен был бы использовать этот блок кода (https://www.daimto.com/google-net-filedatastore-demystified/) для этого, но я не уверен, как он соответствует остальной части моей существующей функции:

Блок кода с сайта:

UserCredential credential;

using (var stream = new FileStream(clientSecretsJsonFilePath, FileMode.Open, FileAccess.Read))
{   
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
         GoogleClientSecrets.Load(stream).Secrets,
         new[] { DriveService.Scope.Drive,  DriveService.Scope.DriveFile },
         "LookIAmAUniqueUser",
         CancellationToken.None,
         new FileDataStore("credfolder", true)).Result;
}

Вот моя полная действующая функция:

    using System
    using System.IO;
    using System.Reflection;
    using System.Threading;
    using System.Threading.Tasks;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Services;
    using Google.Apis.YouTube.v3;
    using Google.Apis.YouTube.v3.Data;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Logging;

    namespace AzureFunctionToUploadToYoutube
    {
        public static class Function1
        {
            [FunctionName("Function1")]

            public static async Task Run([BlobTrigger("video/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, Microsoft.Azure.WebJobs.ExecutionContext context, ILogger log)
            {
                log.LogInformation("Function triggered by blob." + name);
                UserCredential credential;
                log.LogInformation("Getting client secrets.");

                using (var stream = new FileStream(System.IO.Path.Combine(context.FunctionAppDirectory, "client_secrets.json"), FileMode.Open, FileAccess.Read))
                {
                    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    new[] { YouTubeService.Scope.YoutubeUpload },
                    "user",
                    CancellationToken.None
                    );
                }

                log.LogInformation("Done getting secrets.");
                log.LogInformation("Creating youtube service");

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

                log.LogInformation("Done creating service.");
                var video = new Video();
                video.Snippet = new VideoSnippet();
                video.Snippet.Title = name;
                video.Snippet.Description = "Seattle Channel";
                video.Snippet.Tags = new string[] { "tag1", "tag2" };
                video.Snippet.CategoryId = "22";
                video.Status = new VideoStatus();
                video.Status.PrivacyStatus = "unlisted";
                var VideoInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", myBlob, "video/*");

                log.LogInformation("Trying to upload video");

                try
                {
                    await VideoInsertRequest.UploadAsync();
                    log.LogInformation("Done uploading video.");
                }
                catch (Exception ex)
                {
                    log.LogInformation("Error uploading video: " + ex.Message);
                }
            }
        }
    }

1 Ответ

0 голосов
/ 01 апреля 2020

Что вы можете сделать, это использовать Azure Blob для сохранения файла, и каждый раз при запуске функции проверять, существует ли файл в BLOB-объекте. Если файл не существует в BLOB, создайте его. Вы можете прочитать о сохранении файла в blob из функции здесь: https://www.cyotek.com/blog/upload-data-to-blob-storage-with-azure-functions

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