Contenuti

Telegram.Bot: Inviare "Image by URL" e testo associato

Premessa & Situazione

In questo ultimi giorni stavo riprendendo in mano un vecchio progetto sviluppato da me lo scorso anno con lo scopo di automatizzare qualche notifica su Telegram. Il perche’ di questo ritorno di fiamma? Partendo da quel progetto ho la necessita’ di evolverlo per adattarlo (spero) alle necessita’ di un nuovo cliente. Nel caso specifico dovro’ dargli la possibilita’ di caricare una foto e mettere il testo descrittivo. Una volta compilati i due campi vi sara’ l’invio al canale. Il tutorial di questa settimana e’ molto breve e molto orientato al codice, non mi dilunghero’ in parole.

Importante: il tutorial presuppone che abbiate gia’ un canale Telegram e sappiate usarlo.

MessageItemDTO

Il DTO conterra’ solamente due campi in questo esempio. Nel mio codice reale ho molte piu’ informazioni, ma in questo contesto sono del tutto superflue.

1
2
3
4
5
public class MessageItemDTO
{
    public string Text { get; set; }
    public string ImageURL { get; set; }
}

Come potete notare, non mi sono dilungato in proprieta’ extra. Sono stato di parola

Telegram.Bot

Prima di cominciare, vi invito ad installare .NET Client for Telegram Bot API tramite nuget per potere utilizzarlo come nel seguente codice.

Una volta installato dobbiamo come prima cosa inserirlo nei nostri using

1
using Telegram.Bot;

per poi procedere col codice vero e proprio.

Ora - come prima cosa- abbiamo la necessita’ di istanziare il nostro bot fornendo il Token ottenuto da telegram (nel mio caso lo passo tramite dependency injection alla Azure Function)

1
var bot = new TelegramBotClient(_telegram.Token);

Per vostra informazione il token assomiglia a :

valore1:valore2

Nel seguente codice MessageItemDTO arriva in formato json e come prima operazione dobbiamo ricorrere a DeserializeObject per poterlo utilizzare

1
MessageItemDTO m = Newtonsoft.Json.JsonConvert.DeserializeObject<MessageItemDTO>(json);

Una volta tipizzato, dobbiamo verificare che non sia null e che ImageURL e Text siano valorizzati

1
2
3
4
5
6
if (m == null || 
    string.IsNullOrEmpty(m.ImageURL) ||
    string.IsNullOrEmpty(m.Text))
{
    return;
}

Se tutto e’ validato (vi lascio a voi la verifica/certezza dell’immagine esistente) e’ giunto il momento di inviare il messaggio.

1
2
3
4
5
6
7
8
9
Uri uri = new Uri(m.ImageURL);
var photo = await bot.SendPhotoAsync(
	_chatID, 
	new Telegram.Bot.Types.InputFiles.InputOnlineFile(uri),
	m.Text,
	Telegram.Bot.Types.Enums.ParseMode.Markdown
);

var result = Newtonsoft.Json.JsonConvert.SerializeObject(photo);

Come avrete visto le righe di codice sono davvero poche ed il risultato e’ ottimo.