コード例 #1
0
        private static bool RefreshAccess(IList <IYoutubeAccountAccess> access)
        {
            var firstOutdatedAccess = access.FirstOrDefault(ac => !ac.Client.LimitReached && ac.IsExpired && ac.RefreshAllowed);

            bool result = false;

            if (firstOutdatedAccess != null)
            {
                LOGGER.Info($"Found an outdated access, refreshing it");

                // Content zusammenbauen
                string content = $"client_id={YoutubeClientData.Client.Id}&client_secret={YoutubeClientData.Client.Secret}&refresh_token={firstOutdatedAccess.RefreshToken}&grant_type=refresh_token";
                var    bytes   = Encoding.UTF8.GetBytes(content);

                // Request erstellen
                WebRequest request = WebRequest.Create($"https://www.googleapis.com/oauth2/v4/token");
                request.Method      = "POST";
                request.ContentType = "application/x-www-form-urlencoded";

                var response = WebService.Communicate(request, bytes);

                if (response != null && !response.Contains("revoked"))
                {
                    LOGGER.Info($"Refresh was successful");

                    result = true;

                    // Account
                    var authResponse = JsonConvert.DeserializeObject <YoutubeAuthResponse>(response);

                    if (!string.IsNullOrWhiteSpace(authResponse.access_token))
                    {
                        var newAccess = new YoutubeAccountAccess();
                        newAccess.Client                = firstOutdatedAccess.Client;
                        newAccess.AccessToken           = authResponse.access_token;
                        newAccess.TokenType             = authResponse.token_type;
                        newAccess.ExpirationDate        = DateTime.Now.AddSeconds(authResponse.expires_in);
                        newAccess.RefreshToken          = firstOutdatedAccess.RefreshToken;
                        newAccess.ClientId              = firstOutdatedAccess.ClientId;
                        newAccess.HasSendMailPrivilegue = firstOutdatedAccess.HasSendMailPrivilegue;

                        access.Remove(firstOutdatedAccess);
                        access.Add(newAccess);
                    }
                    else
                    {
                        firstOutdatedAccess.NextRefreshAllowed = DateTime.Now.Add(new TimeSpan(1, 0, 0));
                    }
                }
                else
                {
                    LOGGER.Info($"Access has been revoked and cannot be refreshed anymore");
                }
            }

            return(result);
        }
コード例 #2
0
        public IYoutubeAccount ConnectToAccount(string code, bool mailsAllowed, IYoutubeClient client, YoutubeRedirectUri redirectUri)
        {
            LOGGER.Info($"Connecting to account, mails allowed: {mailsAllowed}, redirect uri: {redirectUri}");

            var    uri     = redirectUri.GetAttribute <EnumMemberAttribute>().Value;
            string content = $"code={code}&client_id={client.Id}&client_secret={client.Secret}&redirect_uri={uri}&grant_type=authorization_code";
            var    bytes   = Encoding.UTF8.GetBytes(content);

            // Request erstellen
            WebRequest request = WebRequest.Create("https://www.googleapis.com/oauth2/v4/token");

            request.Method      = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            string result = WebService.Communicate(request, bytes);

            QuotaProblemHandler.ThrowOnQuotaLimitReached(result);

            IYoutubeAccount account      = null;
            var             authResponse = JsonConvert.DeserializeObject <YoutubeAuthResponse>(result);

            IYoutubeAccountAccess access = new YoutubeAccountAccess();

            access.Client = client;
            access.HasSendMailPrivilegue = mailsAllowed;

            if (authResponse != null && !string.IsNullOrWhiteSpace(authResponse.access_token))
            {
                access.AccessToken    = authResponse.access_token;
                access.RefreshToken   = authResponse.refresh_token;
                access.TokenType      = authResponse.token_type;
                access.ExpirationDate = DateTime.Now.AddSeconds(authResponse.expires_in);
                access.ClientId       = client.Id;

                LOGGER.Info($"Connection successful, loading account details");

                var accountDetails = GetAccountDetails(access);
                var acc            = accountDetails.items.First();
                account = YoutubeAccount.Create(acc.id, acc.snippet.country, acc.snippet.title);

                account.Access.Add(access);
            }

            LOGGER.Info($"Connected to account with id: {account.Id} and title: '{account.Title}'");

            return(account);
        }