Код: Выделить всё
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;
using System.Net.Http.Headers;
// Start
private static async Task Check()
{
Log.Info("accessToken Take Token");
string clientId = "ID";
string clientSecret = "SECRET";
string accessToken = await GetAccessToken(clientId, clientSecret);
Log.Info("Token: "+accessToken);
if (!string.IsNullOrEmpty(accessToken))
{
Log.Info("accessToken Work");
await GetDonations(accessToken);
}
else
{
Log.Info("accessToken BAD");
}
}
// Take access token
private static async Task GetAccessToken(string clientId, string clientSecret)
{
using (var client = new HttpClient())
{
var values = new Dictionary
{
{ "client_id", clientId },
{ "client_secret", clientSecret },
{ "grant_type", "client_credentials" }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync("https://www.donationalerts.com/oauth/token", content);
var responseString = await response.Content.ReadAsStringAsync();
// Debug
Log.Info("accessToken API: " + responseString.ToString());
// JSON
try
{
using (JsonDocument doc = JsonDocument.Parse(responseString))
{
JsonElement root = doc.RootElement;
if (root.TryGetProperty("access_token", out JsonElement tokenElement))
{
return tokenElement.GetString() ?? string.Empty;
}
}
}
catch (JsonException ex)
{
Log.Error($"accessToken Ошибка разбора JSON: {ex.Message}");
}
return string.Empty;
}
}
// Donats
private static async Task GetDonations(string accessToken)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.GetAsync("https://www.donationalerts.com/api/v1/alerts/donations");
// Проверка на успешный ответ
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Error : {response.StatusCode}");
return;
}
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine("Last Donats: ");
Console.WriteLine(responseString);
try
{
// JSON
using (JsonDocument doc = JsonDocument.Parse(responseString))
{
JsonElement root = doc.RootElement;
foreach (JsonElement donation in root.GetProperty("data").EnumerateArray())
{
string? username = donation.GetProperty("username").GetString();
decimal? amount = donation.GetProperty("amount").GetDecimal();
string? currency = donation.GetProperty("currency").GetString();
string? message = donation.GetProperty("message").GetString();
Console.WriteLine($"User {username}: {amount} {currency}, Message: {message}");
}
}
}
catch (JsonException ex)
{
Log.Error($"accessToken Error JSON: {ex.Message}");
}
}
}
Я решил попробовать использовать Python для отслеживания пожертвований напрямую, через Интернет. Это примерно то же самое, что открыть окно, где показаны все пожертвования.
Это работает, но... часто отключается где-то раз в минуту. За то время, пока бот выключен, он может пропустить пожертвование и ничего не зафиксировать. Это касается и времени, пока он был отключен, получить данные о пожертвованиях за определенный период просто невозможно. Например, веб-страница пожертвований каким-то образом сама определяет, какие пожертвования на ней не показаны.
Код: Выделить всё
import json
import socketio
da_alert_widget_token = 'TOKEN'
sio = socketio.Client(reconnection=True, reconnection_delay=5)
@sio.on('disconnect')
def on_disconnect():
print('Disconnect')
@sio.on('reconnect')
def on_reconnect():
print('Reconnect')
@sio.on('connect')
def on_connect():
sio.emit('add-user', {'token': da_alert_widget_token, "type": "alert_widget"})
print('Start')
@sio.on('donation')
def on_donation(data):
event = json.loads(data)
print(f'Donat: {event["username"]} - {event["amount"]} {event["currency"]}\nMessage: {event["message"]}')
sio.connect('wss://socket.donationalerts.ru:443', transports='websocket')
# Wait
sio.wait()
Подробнее здесь: https://stackoverflow.com/questions/791 ... tionalerts