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");