Заставить телеграмм-бот на хостинге слушать постоянно

Какой вид (тип) проекта реализовать, чтобы в нём можно было бы запустить телеграмм-бота на хостинге, чтобы он слушал бота, получал сообщения и пересылал их на API уже существующего web-сервиса asp.net core 3.1?

Хотел сделать это с помощью проекта asp.net core web-api, но там работа идет когда есть запрос к контроллеру, а как заставить его работать все время не знаю. Подскажите, если есть пример, то можно пожалуйста ссылку. Это то что пытался сделать в asp.net core web-api:

[ApiController]
[Route("[controller]")]
public class MessageController : ControllerBase
{
    private readonly ILogger<MessageController> _logger;
    private readonly HttpClient httpClient;
    private TelegramBotClient telegramBotClient;
    private string _token { get; set; } = "1234567890:AABbcdefghijkkkkkkkkkkkkkkkkkkkkkkk";
    private string url = "xxxxxx";
    public MessageController(ILogger<MessageController> logger)
    {
        _logger = logger;
        telegramBotClient = new TelegramBotClient(_token);
        httpClient = new HttpClient();
    }       

    [HttpPost("sendMessage")]
    public async Task SendMessage([FromBody] MessageData message)
    {
        // Запуск бота для приема сообщений
        telegramBotClient.StartReceiving();
        // Получение сообщений от бота
        telegramBotClient.OnMessage += TelegramBotClient_OnMessage;

        // test your api configured correctly
        //var me = await telegramBotClient.GetMeAsync();
        //Console.WriteLine($"{me.Username} started");

    }

    // Сюда должны приходить сообщения с чат-бота
    private async void TelegramBotClient_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
    {
        var message = e.Message;
        if(message != null)
        {
            MessageData requestMessage = new MessageData { TextMessage = message.Text };

            // Отправка запроса на API др. сервиса
            string jsonRequest = JsonSerializer.Serialize(requestMessage);
            string jsonResponseData = await PostRequestHttpAsync(url, jsonRequest);
            ResponseMessageData responseData = JsonSerializer.Deserialize<ResponseMessageData>(jsonResponseData);

            // Ответ в чат-бот 
            await telegramBotClient.SendTextMessageAsync(message.Chat.Id,responseData.TextMessage, replyToMessageId: message.MessageId);
        }
    }

    // Функция отправки запроса на API др. сервиса 
    public async Task<string> PostRequestHttpAsync(string url, string json)
    {
        using HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
        using HttpResponseMessage response = await httpClient.PostAsync(url, content).ConfigureAwait(false);

        return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    }
}

Ответы (1 шт):

Автор решения: A K

Да не нужно вам два проекта asp.net core webapi, одного хватит.

Ключевое - выставить хук для бота в телеграм. Для вас хук - это обычный экшн контроллера. Сам телеграмм будет дёргать этот метод, когда будет поступать сообщение.

Почитайте документацию на создание ботов телеграм или погуглите, что-то типа такого сходу нашлось: https://tlgrm.ru/docs/bots/api#setwebhook

using System;
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Telegram.Bot.Types;
using BotMessage = MyCompany.Myproj.TelegramProcessor.BotMessage;

namespace MyCompany.Myproj.WebApplication.Controllers
{
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class TelegramListenerController : Controller
    {
        [HttpPost]
        public async Task<object> Update([FromBody] Update update, CancellationToken cancellationToken)
        {
        }
    }
}

Вебхук выставляется один раз, вот примерная инструкция (сам делал несколько лет назад, вероятно ничего не поменялось с тех пор):

назначаем webHook используя вот этот URL:

https://api.telegram.org/botВАШ_ТОКЕН/setwebhook?url=https://ВАШ_ДОМЕН/url

Вставляем его в адресную строку браузера и переходим, в случае если все прошло без ошибок, на экране у вас выведется вот такая информация:

{"ok":true,"result":true,"description":"Webhook was set"}

→ Ссылка