twitter auth tweaks

This commit is contained in:
Vincent Cloutier 2023-03-30 19:19:16 -04:00
parent 2a15a3cae6
commit 348c46eb8f
5 changed files with 50 additions and 6 deletions

View file

@ -16,6 +16,8 @@
public int UserCacheCapacity { get; set; } = 40_000; public int UserCacheCapacity { get; set; } = 40_000;
public int TweetCacheCapacity { get; set; } = 20_000; public int TweetCacheCapacity { get; set; } = 20_000;
// "AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw"
public string TwitterBearerToken { get; set; } = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA";
public int ParallelTwitterRequests { get; set; } = 10; public int ParallelTwitterRequests { get; set; } = 10;
public int ParallelFediversePosts { get; set; } = 10; public int ParallelFediversePosts { get; set; } = 10;
} }

View file

@ -7,6 +7,8 @@ using BirdsiteLive.Common.Settings;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Net.Http; using System.Net.Http;
using System.Net; using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Threading.RateLimiting; using System.Threading.RateLimiting;
@ -30,18 +32,51 @@ namespace BirdsiteLive.Twitter.Tools
private RateLimiter _rateLimiter; private RateLimiter _rateLimiter;
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1); static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
private const int _targetClients = 3; private const int _targetClients = 3;
private InstanceSettings _instanceSettings;
private readonly (string, string)[] _apiKeys = new[]
{
("IQKbtAYlXLripLGPWd0HUA", "GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU"), // iPhone
("3nVuSoBZnx6U4vzUxf5w", "Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys"), // Android
("CjulERsDeqhhjSme66ECg", "IQWdVyqFxghAtURHGeGiWAsmCAGmdW3WmbEx6Hck"), // iPad
("3rJOl1ODzm9yZy63FACdg", "5jPoQ5kQvMJFDYRNE8bQ4rHuds4xJqhvgNJM4awaE8"), // Mac
};
public String BearerToken { public String BearerToken {
get { return "AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw"; } //get { return "AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw"; }
get
{
return _instanceSettings.TwitterBearerToken;
}
} }
#region Ctor #region Ctor
public TwitterAuthenticationInitializer(IHttpClientFactory httpClientFactory, ILogger<TwitterAuthenticationInitializer> logger) public TwitterAuthenticationInitializer(IHttpClientFactory httpClientFactory, InstanceSettings settings, ILogger<TwitterAuthenticationInitializer> logger)
{ {
_logger = logger; _logger = logger;
_instanceSettings = settings;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
} }
#endregion #endregion
private async Task GenerateBearerToken()
{
var httpClient = _httpClientFactory.CreateClient();
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/oauth2/token?grant_type=client_credentials"))
{
int r = rnd.Next(_apiKeys.Length);
var (login, password) = _apiKeys[r];
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}:{password}")));
request.Headers.TryAddWithoutValidation("Basic", $"Bearer " + authValue);
var httpResponse = await httpClient.SendAsync(request);
var c = await httpResponse.Content.ReadAsStringAsync();
httpResponse.EnsureSuccessStatusCode();
var doc = JsonDocument.Parse(c);
var token = doc.RootElement.GetProperty("access_token").GetString();
}
}
public async Task RefreshClient(HttpRequestMessage req) public async Task RefreshClient(HttpRequestMessage req)
{ {
@ -49,7 +84,7 @@ namespace BirdsiteLive.Twitter.Tools
var i = _tokens.IndexOf(token); var i = _tokens.IndexOf(token);
// this is prabably not thread save but yolo // this is prabably not thread safe but yolo
try try
{ {
_twitterClients.RemoveAt(i); _twitterClients.RemoveAt(i);
@ -143,6 +178,8 @@ namespace BirdsiteLive.Twitter.Tools
var request = new HttpRequestMessage(m, endpoint); var request = new HttpRequestMessage(m, endpoint);
int r = rnd.Next(_twitterClients.Count); int r = rnd.Next(_twitterClients.Count);
request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + BearerToken); request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + BearerToken);
request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");
request.Headers.TryAddWithoutValidation("x-twitter-active-user", "yes");
if (addToken) if (addToken)
request.Headers.TryAddWithoutValidation("x-guest-token", _tokens[r]); request.Headers.TryAddWithoutValidation("x-guest-token", _tokens[r]);
//request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/"); //request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");

View file

@ -37,7 +37,7 @@ namespace BirdsiteLive.ActivityPub.Tests
)) ))
.ReturnsAsync(new SyncTwitterUser { TwitterUserId = default }); .ReturnsAsync(new SyncTwitterUser { TwitterUserId = default });
ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, settings, logger1.Object);
ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object);
ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings);
_tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object);

View file

@ -32,7 +32,7 @@ namespace BirdsiteLive.ActivityPub.Tests
{ {
Domain = "domain.name" Domain = "domain.name"
}; };
ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, settings, logger1.Object);
ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object); ITwitterUserService user = new TwitterUserService(auth, stats.Object, logger2.Object);
ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings); ICachedTwitterUserService user2 = new CachedTwitterUserService(user, settings);
_tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object); _tweetService = new TwitterTweetsService(auth, stats.Object, user2, twitterDal.Object, settings, logger3.Object);

View file

@ -6,6 +6,7 @@ using BirdsiteLive.Twitter.Tools;
using BirdsiteLive.Statistics.Domain; using BirdsiteLive.Statistics.Domain;
using Moq; using Moq;
using System.Net.Http; using System.Net.Http;
using BirdsiteLive.Common.Settings;
namespace BirdsiteLive.ActivityPub.Tests namespace BirdsiteLive.ActivityPub.Tests
{ {
@ -21,8 +22,12 @@ namespace BirdsiteLive.ActivityPub.Tests
var logger3 = new Mock<ILogger<TwitterUserService>>(); var logger3 = new Mock<ILogger<TwitterUserService>>();
var stats = new Mock<ITwitterStatisticsHandler>(); var stats = new Mock<ITwitterStatisticsHandler>();
var httpFactory = new Mock<IHttpClientFactory>(); var httpFactory = new Mock<IHttpClientFactory>();
var settings = new InstanceSettings
{
Domain = "domain.name"
};
httpFactory.Setup(_ => _.CreateClient(string.Empty)).Returns(new HttpClient()); httpFactory.Setup(_ => _.CreateClient(string.Empty)).Returns(new HttpClient());
ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, logger1.Object); ITwitterAuthenticationInitializer auth = new TwitterAuthenticationInitializer(httpFactory.Object, settings, logger1.Object);
_tweetService = new TwitterUserService(auth, stats.Object, logger3.Object); _tweetService = new TwitterUserService(auth, stats.Object, logger3.Object);
} }