Заставить телеграмм-бот на хостинге слушать постоянно
Какой вид (тип) проекта реализовать, чтобы в нём можно было бы запустить телеграмм-бота на хостинге, чтобы он слушал бота, получал сообщения и пересылал их на 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 шт):
Да не нужно вам два проекта 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"}