Всем привет!
Недавно в WINNUM Platform появился новый функционал - бюллетени, в следствии чего захотелось его дополнить.
Ниже представлен код на C# с использованием .NET 6 и библиотекой Telegram.Bot 18.0.0, который позволяет на любой сгенерированный бот в telegram отправлять последнюю бюллетень полученную от publisher:
На данный момент сделан bild под windows (скриншот во вложении) и протестирована работа бота(скриншот во вложении).
Код можно улучшать и дорабатывать, я пытался реализовать подачу на вход параметра bot_token через консоль, но столкнулся с проблемой асинхронности, решить пока не удалось.
Во вложении .zip архив проекта без bild под Windows, так как с ним он просто слишком большой и не отправляется.
Для тех кто будет продолжать работать с проектом подмечу, важно использовать .NET 6 и выше, так как библиотека поддерживает работу от 6 версии и очень важно использовать версию библиотеки 18.0.0 , так как при работе с 19 версией будут проблемы с пространством имен Telegram.Bot.Types.ImputFiles в следствии чего будет невозможна работа с ImputOnlineFile.
Hello World!:
- Сообщений не найдено.
Недавно в WINNUM Platform появился новый функционал - бюллетени, в следствии чего захотелось его дополнить.
Ниже представлен код на C# с использованием .NET 6 и библиотекой Telegram.Bot 18.0.0, который позволяет на любой сгенерированный бот в telegram отправлять последнюю бюллетень полученную от publisher:
Код:
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.InputFiles;
using Telegram.Bot.Types.ReplyMarkups;
class PublisherBot
{
private static ITelegramBotClient botClient;
static async Task Main(string[] args)
{
botClient = new TelegramBotClient("5687077362:AAExWWUSdtVLmjYsKqnND7o6CoqFx****"); //bot_token
var cts = new CancellationTokenSource();
var receiverOptions = new ReceiverOptions
{
AllowedUpdates = Array.Empty<UpdateType>() // получение всех типов обновлений
};
botClient.StartReceiving(
HandleUpdateAsync,
HandleErrorAsync,
receiverOptions,
cancellationToken: cts.Token
);
Console.WriteLine("Бот запущен и работает. Нажмите Enter, чтобы выйти.");
Console.ReadLine();
cts.Cancel();
}
static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
if (update == null) return;
if (update.Message != null)
{
var message = update.Message;
if (message.Text != null)
{
if (message.Text.Equals("/start"))
{
await SendWelcomeMessageAsync(message.Chat.Id);
}
}
}
else if (update.CallbackQuery != null)
{
var callbackQuery = update.CallbackQuery;
if (callbackQuery.Data != null && callbackQuery.Data.Equals("get_file"))
{
await SendLatestPdfFileAsync(callbackQuery.Message.Chat.Id);
}
}
}
static async Task SendWelcomeMessageAsync(long chatId)
{
var button = InlineKeyboardButton.WithCallbackData("Получить файл", "get_file");
var keyboard = new InlineKeyboardMarkup(new[] { new[] { button } });
await botClient.SendTextMessageAsync(chatId, "Нажмите кнопку ниже, чтобы получить последний бюллетень:", replyMarkup: keyboard);
}
static async Task SendLatestPdfFileAsync(long chatId)
{
string directoryPath = @"C:\\Winnum\\WinnumPlatform\\publisher\\cache\\temp"; // Путь до temp у publisher
var latestPdfFile = GetLatestPdfFile(directoryPath);
if (latestPdfFile != null)
{
try
{
using var stream = new FileStream(latestPdfFile.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
var inputOnlineFile = new InputOnlineFile(stream, latestPdfFile.Name);
await botClient.SendDocumentAsync(chatId, inputOnlineFile);
}
catch (Exception e)
{
Console.WriteLine($"Ошибка при отправке файла: {e.Message}");
await botClient.SendTextMessageAsync(chatId, "Ошибка при отправке файла.");
}
}
else
{
await botClient.SendTextMessageAsync(chatId, "Нет доступных бюллетеней.");
}
}
static FileInfo GetLatestPdfFile(string directoryPath)
{
var directory = new DirectoryInfo(directoryPath);
if (!directory.Exists) return null;
return directory.GetFiles("*.pdf")
.OrderByDescending(f => f.LastWriteTime)
.FirstOrDefault();
}
static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
var errorMessage = exception switch
{
ApiRequestException apiRequestException
=> $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
_ => exception.ToString()
};
Console.WriteLine(errorMessage);
return Task.CompletedTask;
}
}На данный момент сделан bild под windows (скриншот во вложении) и протестирована работа бота(скриншот во вложении).
Код можно улучшать и дорабатывать, я пытался реализовать подачу на вход параметра bot_token через консоль, но столкнулся с проблемой асинхронности, решить пока не удалось.
Во вложении .zip архив проекта без bild под Windows, так как с ним он просто слишком большой и не отправляется.
Для тех кто будет продолжать работать с проектом подмечу, важно использовать .NET 6 и выше, так как библиотека поддерживает работу от 6 версии и очень важно использовать версию библиотеки 18.0.0 , так как при работе с 19 версией будут проблемы с пространством имен Telegram.Bot.Types.ImputFiles в следствии чего будет невозможна работа с ImputOnlineFile.
Hello World!:
- Сообщений не найдено.

