Vai al contenuto

Telegram, manages Telegram messenger through web APIs

Vai all indice del manuale di programmazione
Tipo: Blocco funzione
Libreria LogicLab: eLLabHTTPLib
Libreria Codesys: Non disponibile

Questo blocco funzione da eseguire in task Back, gestisce ricezione e trasmissione di messaggi Telegram tramite le web APIs, la massima lunghezza gestita è 1Kb (1024 caratteri). Il blocco funzione è protetto per utilizzarlo occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarlo liberamente in modo test per 30 Min.

Ricezione messaggio:  Viene ciclicamente eseguita con il tempo definito in TUpdate una richiesta al metodo “getUpdates” per verificare la presenza di messaggi nel proprio chatbot, i messaggi ricevuti se non letti vengono automaticamente cancellati dopo 24 ore. Se messaggi presenti viene attivato RxDone, il messaggio viene ritornato nel buffer RxMessage e cancellato dal chatbot, in RxMLength è ritornata la lunghezza del messaggio. In SChatID è ritornato il “chat id” dell’utente che ha inviato il messaggio e in RChatID è ritornato il proprio “chat id“. Eseguita la lettura del messaggio occorre attivare per un loop di programma RxAck.

Trasmissione messaggio: Attivando Send viene inviato il messaggio puntato da TxMessage alla “chat id” indicata in TxChatID tramite il metodo “sendMessage”. Terminato l’invio viene attivata l’uscita TxDone. In SChatID è ritornato il proprio “chat id” in RChatID è ritornato il “chat id” a cui è stato inviato il messaggio (Valore di TxChatID).

In caso di errore esecuzione viene attivata per un loop di programma l’uscita Fault.

Upgrade list

Telegram_v1

Utilizza la nuova versione FB HTTPClient_v5.

Creazione Bot su Telegram

Per utilizzare il FB per la ricezione e l’invio di messaggi Telegram, occorre appoggiarsi ad un bot. Un Telegram bot è paragonabile ad un utente umano, la grossa differenza è che non ha alcun bisogno di un numero di telefono mentre è obbligatorio per un utente. Vediamo ora in semplici passi come creare il nostro bot.

  • Dall’app di Telegram premi sull’icona della lente di ingrandimento cerca BotFather ed avvialo.
  • Cliccare su AVVIA.
  • Digitare il comando “/newbot” e dare invio.
  • Adesso invia il nome del bot che vuoi creare (es. testerbot).
  • Ora devi scegliere username che deve terminare per forza in bot (es. tester_bot).
  • Adesso botfather ti invierà un messaggio con il codice token del bot.

Il codice token ricevuto (Stringa tipo 270***zSjiQ7_y4TMA**kHm9T0) rappresenta il sistema di autenticazione ed è il valore da passare nel campo Token del FB. Digitando in un browser l’URL https://api.telegram.org/bot<TOKEN>/getMe verrà ritornato un oggetto JSON con tutte le informazioni del bot.

Ora occorre eseguire il bot, da Telegram sullo smartphone cercare il nome del bot creato (es. tester_bot). I messaggi inviati al bot saranno letti dal FB ed i messaggi inviati dal FB al bot saranno inoltrati all’utente indirizzato.

Screenshot nuovo Bot su Telegram
Come inviare messaggi ad un bot

Naturalmente i bot non hanno un numero di telefono abbinato, per inviare un messaggio ad un bot o ad un utente di cui non conosci il numero ti basta conoscere il loro username, in modo da cercarlo nel motore di ricerca dell’app.

Avvia l’app di Telegram e premi sul campo di testo Cerca situato in corrispondenza dell’icona della lente di ingrandimento, poi digita il nome utente della persona od il nome del bot a cui vuoi inviare il messaggio e selezionalo nei risultati della ricerca. Ora puoi digitare il testo del messaggio nel campo di testo ed inviarlo, premendo sull’icona della freccia situata in basso.

Come conoscere la chat ID di un utente

Per inviare un messaggio ad un utente Telegram occorre conoscere il chat id. Per conoscere il proprio chat id avvia l’app di Telegram e premi sul campo di testo Cerca situato in corrispondenza dell’icona della lente di ingrandimento, poi digita userinfobot, e selezionalo nei risultati della ricerca. Ora basta inviare un qualsiasi messaggio per ricevere il proprio “chat id“.

Descrizione

Enable (BOOL) Attivazione esecuzione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).
RxAck (BOOL) Acnowledge risposta ricevuta, settare dopo avere acquisito la risposta.
HTTPClient (@HTTPClient_v5) Indirizzo allocazione FB HTTPClient di supporto.
Token (@STRING) Indirizzo stringa definizione token fornito con la registrazione a Telegram.
TxChatID (ULINT) “chat id” a cui inviare il messaggio.
TxMessage (@STRING) Indirizzo stringa definizione messaggio.
TPolling (TIME) Definizione tempo di polling verifica ricezione mesaggi.
Fault (BOOL) Attivo per un loop di programma se errore gestione.
RxDone (BOOL) Attivo alla ricezione di un messaggio. Il messaggio è presente nel buffer puntato da RxMessage e rimane attivo sino alla attivazione di RxAck.
TxDone (BOOL) Attivo per un loop al termine della trasmissione messaggio.
SChatID (ULINT) Su ricezione/trasmissione messaggio, ritorna la “chat id” di chi ha inviato il messaggio.
RChatID (ULINT) Su ricezione/trasmissione messaggio, ritorna la “chat id” di chi ha ricevuto il messaggio.
RxMessage (@STRING) Su ricezione messaggio, ritorna indirizzo allocazione messaggio ricevuto. Rimane valido fino all’acknowledge della risposta (Attivazione RxAck) da parte del programma.
RxMLength (UDINT) Su ricezione messaggio, ritorna lunghezza messaggio ricevuto.
RxTxMDate (UDINT) Valorizzato su ricezione messaggio, ritorna l’Epoch time del messaggio.
PCounter (UDINT) Contatore polling messaggi, incrementato ad ogni verifica ricezione messaggio.
RxCounter (UDINT) Contatore messaggi ricevuti.
TxCounter (UDINT) Contatore messaggi trasmessi.
Errors (UDINT) Contatore errori esecuzine.

Immagine FB Telegram_v1

Spionaggio funzionamento

Se SpyOn attivo è possibile utilizzare di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.

Trigger di spionaggio
16#00000001‘Rx’ Ricezione messaggio
16#00000002‘Tx’ Trasmissione mesaggio
16#40000000‘Er’ Errori di esecuzione

Esempi

Come utilizzare gli esempi.
Ogni 30 secondi viene eseguita la verifica vi sono messaggi ricevuti, se ricevuto messaggio il messaggio viene reinviato al mittente. Attivando da debug la variabile MSend viene inviato un messaggio al destinatario definito in TxChatID. Per utilizzare l’esempio bisogna definire correttamente il token del proprio Bot e la “chat id” del destinatario.

LogicLab (Ptp156, ST_Telegram)
PROGRAM ST_Telegram
VAR
    MSend : BOOL; (* Message send command *)
    CaseNr : USINT; (* Program case *)
    RxMessage : STRING[ 32 ]; (* Received message buffer *)
    TxMessage : STRING[ 32 ]; (* Transmission message buffer *)
    TCPClient : SysTCPClient; (* TCP client management *)
    TLSClient : SysTLSClient; (* TLS client *)
    HTTPRq : HTTPClient_v5; (* HTTP client *)
    TGClient : Telegram_v1; (* Telegram client *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_Telegram"
// *****************************************************************************
// The program manages the Telegram messenger. On a command it sends a message
// to a user. On a message reception the message is echoed back to the sender.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATIONS
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN

        // Set TCPClient parameters.

        TCPClient.PeerAdd:=ADR('api.telegram.org'); //Peer address
        TCPClient.PeerPort:=443; //Peer port
        TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPClient.LocalPort:=0; //Local port
        TCPClient.FlushTm:=50; //Flush time (mS)
        TCPClient.LifeTm:=60; //Life time (S)
        TCPClient.RxSize:=512; //Rx buffer size
        TCPClient.TxSize:=512; //Tx buffer size

        // Set TLSClient parameters.

        TLSClient.SpyOn:=FALSE; //Spy active
        TLSClient.Mode:=TLS_MODE_TCP; //TLS mode
        TLSClient.Server:=TCPClient.PeerAdd; //Server name
        TLSClient.CAFile:=eNULL; //CA file
        TLSClient.CAVerify:=TLS_CA_NONE; //Certificate verify type

        // Set HTTPClient parameters.

        HTTPRq.SpyOn:=FALSE; //Activate the spy
        HTTPRq.KeepAlive:=TRUE; //HTTP keep-alive
        HTTPRq.RMethod:=HTTP_REQUEST#HTTP_POST; //Request method
        HTTPRq.HostName:=TCPClient.PeerAdd; // Hostname
        HTTPRq.Page:=eNULL; //Web page
        HTTPRq.Request:=eNULL; //Request string
        HTTPRq.Header:=eNULL; //HTTP header
        HTTPRq.DBSize:=512; //Data buffer size
        HTTPRq.Timeout:=T#10s; //Execution timeout (S)

        // Set Telegram client parameters.

        TGClient.SpyOn:=TRUE; //Spy On
        TGClient.HTTPClient:=ADR(HTTPRq); //HTTP client
        TGClient.Token:=ADR('8*08***27:AA**++++++++++++++3muqw'); //BOT token
        TGClient.TPolling:=T#30s; //Polling time
    END_IF;

    // -------------------------------------------------------------------------
    // FBs MANAGEMENT
    // -------------------------------------------------------------------------
    // All the needed FBs are managed.

    TCPClient(Connect:=HTTPRq.Connect); //TCP client management
    IF (TCPClient.Fault) THEN CaseNr:=0; END_IF;

    TLSClient(IFile:=TCPClient.File); //TLS client management
    IF (TLSClient.Fault) THEN CaseNr:=0; END_IF;

    HTTPRq(File:=TLSClient.OFile); //HTTP client management
    IF (HTTPRq.Fault) THEN CaseNr:=0; END_IF;

    TGClient(Enable:=TRUE); //Telegram client management
    IF (TGClient.Fault) THEN CaseNr:=0; END_IF;
    TGClient.RxAck:=FALSE; //Rx message acknowledge

    // -------------------------------------------------------------------------
    // PROGRAM SEQUENCIES
    // -------------------------------------------------------------------------
    // Program sequencies.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Reset any active commands. 
        // Check if a Telegram send message command has been set.
        // Check if a Telegram message has been received.

        0:
        TGClient.Send:=FALSE; //Send message
        IF (MSend) THEN CaseNr:=10; RETURN; END_IF;
        IF (TGClient.RxDone) THEN CaseNr:=20; RETURN; END_IF;

        // ---------------------------------------------------------------------
        // SEND A TELEGRAM MESSAGE
        // ---------------------------------------------------------------------
        // Define the chat ID to send the message. To know the own chat ID send
        // a message to @userinfobot by your phone app.

        10:
        MSend:=FALSE; //Message send command
        eTO_JUNK(SysVsnprintf(ADR(TxMessage), SIZEOF(TxMessage), ADR('Message Nr:%d'), UDINT_TYPE, ADR(TGClient.TxCounter)));

        TGClient.TxChatID:=12345678; //Tx chat id
        TGClient.TxMessage:=ADR(TxMessage); //Tx message
        TGClient.Send:=TRUE; //Send message
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Message sending wait.

        11:
        IF NOT(TGClient.TxDone) THEN RETURN; END_IF;
        TGClient.Send:=FALSE; //Send message
        CaseNr:=0; //Program case

        // ---------------------------------------------------------------------
        // RECEIVE A TELEGRAM MESSAGE
        // ---------------------------------------------------------------------
        // The received message is transfert in the received buffer.

        20:
        eTO_JUNK(Sysmemmove(ADR(RxMessage), TGClient.RxMessage, TGClient.RxMLength));
        TGClient.RxAck:=TRUE; //Rx message acknowledge

        // The received message is send back to the sender.

        TGClient.TxChatID:=TGClient.SChatID; //Tx chat id
        TGClient.TxMessage:=ADR(RxMessage); //Tx message
        TGClient.Send:=TRUE; //Send message
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Message sending wait.

        21:
        IF NOT(TGClient.TxDone) THEN RETURN; END_IF;
        TGClient.Send:=FALSE; //Send message
        CaseNr:=0; //Program case
    END_CASE;

// [End of file]
Was this article helpful?