From 210b820e90e2fd53198420a13d8542d05b46ec08 Mon Sep 17 00:00:00 2001 From: Vincent Cloutier Date: Fri, 10 Feb 2023 16:26:24 -0500 Subject: [PATCH] work on HttpClientFactory in twitter client --- .../BirdsiteLive.Twitter.csproj | 1 + .../Tools/TwitterAuthenticationInitializer.cs | 15 +++++++++++---- src/BirdsiteLive.Twitter/TwitterTweetsService.cs | 1 - src/BirdsiteLive.Twitter/TwitterUserService.cs | 2 -- .../BirdsiteLive.Twitter.Tests.csproj | 2 +- .../BirdsiteLive.Twitter.Tests/TimelineTests.cs | 6 ++++-- .../BirdsiteLive.Twitter.Tests/TweetTests.cs | 5 ++++- src/Tests/BirdsiteLive.Twitter.Tests/UsersTest.cs | 7 +++++-- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj b/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj index a8cdea2..caf7b52 100644 --- a/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj +++ b/src/BirdsiteLive.Twitter/BirdsiteLive.Twitter.csproj @@ -6,6 +6,7 @@ + diff --git a/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs b/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs index 1fcb07b..854cb2c 100644 --- a/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs +++ b/src/BirdsiteLive.Twitter/Tools/TwitterAuthenticationInitializer.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using BirdsiteLive.Common.Settings; using Microsoft.Extensions.Logging; using System.Net.Http; -using System.Net.Http.Headers; +using System.Net; using System.Text.Json; namespace BirdsiteLive.Twitter.Tools @@ -21,7 +21,7 @@ namespace BirdsiteLive.Twitter.Tools private readonly ILogger _logger; private static bool _initialized; private static System.Timers.Timer aTimer; - private readonly HttpClient _httpClient = new HttpClient(); + private readonly IHttpClientFactory _httpClientFactory; private List _twitterClients = new List(); private List _tokens = new List(); static Random rnd = new Random(); @@ -30,9 +30,10 @@ namespace BirdsiteLive.Twitter.Tools } #region Ctor - public TwitterAuthenticationInitializer(ILogger logger) + public TwitterAuthenticationInitializer(IHttpClientFactory httpClientFactory, ILogger logger) { _logger = logger; + _httpClientFactory = httpClientFactory; aTimer = new System.Timers.Timer(); aTimer.Interval = 20 * 1000; @@ -53,6 +54,7 @@ namespace BirdsiteLive.Twitter.Tools { (string bearer, string guest) = await GetCred(); +// HttpClient client = _httpClientFactory.CreateClient(); HttpClient client = new HttpClient(); client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer " + bearer); client.DefaultRequestHeaders.TryAddWithoutValidation("x-guest-token", guest); @@ -60,19 +62,24 @@ namespace BirdsiteLive.Twitter.Tools client.DefaultRequestHeaders.TryAddWithoutValidation("x-twitter-active-user", "yes"); _twitterClients.Add(client); + _tokens.Add(guest); if (_twitterClients.Count > 10) + { _twitterClients.RemoveAt(0); + _tokens.RemoveAt(0); + } } private async Task<(string, string)> GetCred() { string token; + var httpClient = _httpClientFactory.CreateClient(); using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/1.1/guest/activate.json")) { request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + BearerToken); - var httpResponse = await _httpClient.SendAsync(request); + var httpResponse = await httpClient.SendAsync(request); var c = await httpResponse.Content.ReadAsStringAsync(); httpResponse.EnsureSuccessStatusCode(); diff --git a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs index 6877649..bf4a05c 100644 --- a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs +++ b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs @@ -31,7 +31,6 @@ namespace BirdsiteLive.Twitter private readonly ITwitterUserDal _twitterUserDal; private readonly ILogger _logger; private readonly InstanceSettings _instanceSettings; - private HttpClient _httpClient = new HttpClient(); #region Ctor public TwitterTweetsService(ITwitterAuthenticationInitializer twitterAuthenticationInitializer, ITwitterStatisticsHandler statisticsHandler, ICachedTwitterUserService twitterUserService, ITwitterUserDal twitterUserDal, InstanceSettings instanceSettings, ILogger logger) diff --git a/src/BirdsiteLive.Twitter/TwitterUserService.cs b/src/BirdsiteLive.Twitter/TwitterUserService.cs index e8e42ea..b3ed560 100644 --- a/src/BirdsiteLive.Twitter/TwitterUserService.cs +++ b/src/BirdsiteLive.Twitter/TwitterUserService.cs @@ -23,7 +23,6 @@ namespace BirdsiteLive.Twitter private readonly ITwitterAuthenticationInitializer _twitterAuthenticationInitializer; private readonly ITwitterStatisticsHandler _statisticsHandler; private readonly ILogger _logger; - private HttpClient _httpClient = new HttpClient(); private readonly string endpoint = "https://twitter.com/i/api/graphql/4LB4fkCe3RDLDmOEEYtueg/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withSafetyModeUserFields%22%3Atrue%2C%22withSuperFollowsUserFields%22%3Atrue%7D&features=%7B%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_twitter_blue_new_verification_copy_is_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D"; @@ -38,7 +37,6 @@ namespace BirdsiteLive.Twitter public async Task GetUserAsync(string username) { - await _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); JsonDocument res; try diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/BirdsiteLive.Twitter.Tests.csproj b/src/Tests/BirdsiteLive.Twitter.Tests/BirdsiteLive.Twitter.Tests.csproj index 1463362..3185e3d 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/BirdsiteLive.Twitter.Tests.csproj +++ b/src/Tests/BirdsiteLive.Twitter.Tests/BirdsiteLive.Twitter.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs b/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs index 5e72859..13a44cb 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs +++ b/src/Tests/BirdsiteLive.Twitter.Tests/TimelineTests.cs @@ -8,6 +8,7 @@ using BirdsiteLive.Common.Settings; using Moq; using BirdsiteLive.DAL.Contracts; using BirdsiteLive.DAL.Models; +using System.Net.Http; namespace BirdsiteLive.ActivityPub.Tests { @@ -23,7 +24,8 @@ namespace BirdsiteLive.ActivityPub.Tests var logger3 = new Mock>(); var stats = new Mock(); var twitterDal = new Mock(); - + var httpFactory = new Mock(); + httpFactory.Setup(_ => _.CreateClient(string.Empty)).Returns(new HttpClient()); var settings = new InstanceSettings { Domain = "domain.name" @@ -35,7 +37,7 @@ namespace BirdsiteLive.ActivityPub.Tests )) .ReturnsAsync(new SyncTwitterUser { TwitterUserId = default }); - ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(logger1.Object); + ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs b/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs index d80c8dc..e2e5a00 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs +++ b/src/Tests/BirdsiteLive.Twitter.Tests/TweetTests.cs @@ -7,6 +7,7 @@ using BirdsiteLive.Statistics.Domain; using Moq; using BirdsiteLive.DAL.Contracts; using BirdsiteLive.Common.Settings; +using System.Net.Http; namespace BirdsiteLive.ActivityPub.Tests { @@ -22,11 +23,13 @@ namespace BirdsiteLive.ActivityPub.Tests var logger3 = new Mock>(); var stats = new Mock(); var twitterDal = new Mock(); + var httpFactory = new Mock(); + httpFactory.Setup(_ => _.CreateClient(string.Empty)).Returns(new HttpClient()); var settings = new InstanceSettings { Domain = "domain.name" }; - ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(logger1.Object); + ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); diff --git a/src/Tests/BirdsiteLive.Twitter.Tests/UsersTest.cs b/src/Tests/BirdsiteLive.Twitter.Tests/UsersTest.cs index 56c5e73..a3ec0e6 100644 --- a/src/Tests/BirdsiteLive.Twitter.Tests/UsersTest.cs +++ b/src/Tests/BirdsiteLive.Twitter.Tests/UsersTest.cs @@ -5,6 +5,7 @@ using BirdsiteLive.Twitter; using BirdsiteLive.Twitter.Tools; using BirdsiteLive.Statistics.Domain; using Moq; +using System.Net.Http; namespace BirdsiteLive.ActivityPub.Tests { @@ -19,12 +20,14 @@ namespace BirdsiteLive.ActivityPub.Tests var logger2 = new Mock>(MockBehavior.Strict); var logger3 = new Mock>(); var stats = new Mock(); - ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(logger1.Object); + var httpFactory = new Mock(); + httpFactory.Setup(_ => _.CreateClient(string.Empty)).Returns(new HttpClient()); + ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); _tweetService = new TwitterUserService(auth, stats.Object, logger3.Object); } [TestMethod] - public async Task TimelineKobe() + public async Task UserKobe() { var user = await _tweetService.GetUserAsync("kobebryant"); Assert.AreEqual(user.Name, "Kobe Bryant");