auth changes
This commit is contained in:
parent
348c46eb8f
commit
c21f0bac5b
3 changed files with 29 additions and 55 deletions
|
@ -27,7 +27,7 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
private static bool _initialized;
|
private static bool _initialized;
|
||||||
private readonly IHttpClientFactory _httpClientFactory;
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private List<HttpClient> _twitterClients = new List<HttpClient>();
|
private List<HttpClient> _twitterClients = new List<HttpClient>();
|
||||||
private List<String> _tokens = new List<string>();
|
private List<(String, String)> _tokens = new List<(string,string)>();
|
||||||
static Random rnd = new Random();
|
static Random rnd = new Random();
|
||||||
private RateLimiter _rateLimiter;
|
private RateLimiter _rateLimiter;
|
||||||
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
|
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
|
||||||
|
@ -57,7 +57,7 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private async Task GenerateBearerToken()
|
private async Task<string> GenerateBearerToken()
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/oauth2/token?grant_type=client_credentials"))
|
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/oauth2/token?grant_type=client_credentials"))
|
||||||
|
@ -65,7 +65,7 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
int r = rnd.Next(_apiKeys.Length);
|
int r = rnd.Next(_apiKeys.Length);
|
||||||
var (login, password) = _apiKeys[r];
|
var (login, password) = _apiKeys[r];
|
||||||
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}:{password}")));
|
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}:{password}")));
|
||||||
request.Headers.TryAddWithoutValidation("Basic", $"Bearer " + authValue);
|
request.Headers.Authorization = authValue;
|
||||||
|
|
||||||
var httpResponse = await httpClient.SendAsync(request);
|
var httpResponse = await httpClient.SendAsync(request);
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
httpResponse.EnsureSuccessStatusCode();
|
httpResponse.EnsureSuccessStatusCode();
|
||||||
var doc = JsonDocument.Parse(c);
|
var doc = JsonDocument.Parse(c);
|
||||||
var token = doc.RootElement.GetProperty("access_token").GetString();
|
var token = doc.RootElement.GetProperty("access_token").GetString();
|
||||||
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -81,8 +82,9 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
public async Task RefreshClient(HttpRequestMessage req)
|
public async Task RefreshClient(HttpRequestMessage req)
|
||||||
{
|
{
|
||||||
string token = req.Headers.GetValues("x-guest-token").First();
|
string token = req.Headers.GetValues("x-guest-token").First();
|
||||||
|
string bearer = req.Headers.GetValues("Authorization").First().Replace("Bearer ", "");
|
||||||
|
|
||||||
var i = _tokens.IndexOf(token);
|
var i = _tokens.IndexOf((bearer, token));
|
||||||
|
|
||||||
// this is prabably not thread safe but yolo
|
// this is prabably not thread safe but yolo
|
||||||
try
|
try
|
||||||
|
@ -96,25 +98,20 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
}
|
}
|
||||||
|
|
||||||
await RefreshCred();
|
await RefreshCred();
|
||||||
|
await Task.Delay(1000);
|
||||||
|
await RefreshCred();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshCred()
|
private async Task RefreshCred()
|
||||||
{
|
{
|
||||||
|
|
||||||
await semaphoreSlim.WaitAsync();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
(string bearer, string guest) = await GetCred();
|
(string bearer, string guest) = await GetCred();
|
||||||
|
|
||||||
HttpClient client = _httpClientFactory.CreateClient();
|
HttpClient client = _httpClientFactory.CreateClient();
|
||||||
//HttpClient client = new HttpClient();
|
//HttpClient client = new HttpClient();
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer " + bearer);
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation("x-guest-token", guest);
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation("Referer", "https://twitter.com/");
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation("x-twitter-active-user", "yes");
|
|
||||||
|
|
||||||
_twitterClients.Add(client);
|
_twitterClients.Add(client);
|
||||||
_tokens.Add(guest);
|
_tokens.Add((bearer,guest));
|
||||||
|
|
||||||
if (_twitterClients.Count > _targetClients)
|
if (_twitterClients.Count > _targetClients)
|
||||||
{
|
{
|
||||||
|
@ -123,19 +120,15 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
semaphoreSlim.Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<(string, string)> GetCred()
|
private async Task<(string, string)> GetCred()
|
||||||
{
|
{
|
||||||
string token;
|
string token;
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
|
string bearer = await GenerateBearerToken();
|
||||||
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/1.1/guest/activate.json"))
|
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.twitter.com/1.1/guest/activate.json"))
|
||||||
{
|
{
|
||||||
request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + BearerToken);
|
request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + bearer);
|
||||||
|
|
||||||
var httpResponse = await httpClient.SendAsync(request);
|
var httpResponse = await httpClient.SendAsync(request);
|
||||||
|
|
||||||
|
@ -145,30 +138,13 @@ namespace BirdsiteLive.Twitter.Tools
|
||||||
token = doc.RootElement.GetProperty("guest_token").GetString();
|
token = doc.RootElement.GetProperty("guest_token").GetString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (BearerToken, token);
|
return (bearer, token);
|
||||||
|
|
||||||
}
|
}
|
||||||
private async Task InitTwitterCredentials()
|
|
||||||
{
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await RefreshCred();
|
|
||||||
_initialized = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogError(e, "Twitter Authentication Failed");
|
|
||||||
await Task.Delay(3600*1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<HttpClient> MakeHttpClient()
|
public async Task<HttpClient> MakeHttpClient()
|
||||||
{
|
{
|
||||||
if (_twitterClients.Count < _targetClients)
|
if (_twitterClients.Count < 2)
|
||||||
await RefreshCred();
|
await RefreshCred();
|
||||||
int r = rnd.Next(_twitterClients.Count);
|
int r = rnd.Next(_twitterClients.Count);
|
||||||
return _twitterClients[r];
|
return _twitterClients[r];
|
||||||
|
@ -177,11 +153,12 @@ 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);
|
(string bearer, string token) = _tokens[r];
|
||||||
|
request.Headers.TryAddWithoutValidation("Authorization", $"Bearer " + bearer);
|
||||||
request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");
|
request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");
|
||||||
request.Headers.TryAddWithoutValidation("x-twitter-active-user", "yes");
|
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", token);
|
||||||
//request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");
|
//request.Headers.TryAddWithoutValidation("Referer", "https://twitter.com/");
|
||||||
//request.Headers.TryAddWithoutValidation("x-twitter-active-user", "yes");
|
//request.Headers.TryAddWithoutValidation("x-twitter-active-user", "yes");
|
||||||
return request;
|
return request;
|
||||||
|
|
|
@ -42,10 +42,6 @@ namespace BirdsiteLive.ActivityPub.Tests
|
||||||
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);
|
||||||
|
|
||||||
await Task.Delay(1000);
|
|
||||||
await auth.MakeHttpClient();
|
|
||||||
await Task.Delay(1000);
|
|
||||||
await auth.MakeHttpClient();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|
|
@ -78,6 +78,7 @@ namespace BirdsiteLive.ActivityPub.Tests
|
||||||
Assert.IsTrue(tweet.Media[0].Url.StartsWith("https://video.twimg.com/"));
|
Assert.IsTrue(tweet.Media[0].Url.StartsWith("https://video.twimg.com/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Ignore]
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task GifAndQT()
|
public async Task GifAndQT()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue