Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Telegram Bot для получения последнего бюллетеня
#1
Lightbulb 
Всем привет!

Недавно в 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!:

- Сообщений не найдено.


Файлы вложений Эскизы(ов)
       

.zip   TelegramBotWinnum.zip (Размер: 514.97 KB / Загрузок: 6)
Ответ


Перейти к сообществу:


Пользователи, просматривающие эту тему: 1 Гость(ей)