Telegram offre due tipi di API: la Bot API, che consente di creare programmi che utilizzano bot e HTTPS come protocollo, e la Telegram API e TDLib, che permettono di creare client Telegram personalizzati ed è molto più potente della Bot API.
sgcWebSockets supporta TDLib tramite la libreria tdjson, il che significa che è possibile costruire il proprio client Telegram. TDLib si occupa di tutti i dettagli di implementazione di rete, crittografia e archiviazione dati locale. TDLib supporta tutte le funzionalità di Telegram.
Vantaggi di TDLib (Telegram Database Library)
Multipiattaforma: può essere utilizzato su Windows, Android, iOS, MacOS, Linux...
Facile da usare: usa messaggi json per comunicare tra l'applicazione e telegram.
High-performance: Nell'API Telegram Bot, ogni istanza TDLib gestisce più di 24000 bot.
Consistent: TDLib garantisce che tutti gli aggiornamenti verranno consegnati nell'ordine corretto.
Reliable: TDLib rimane stabile su connessioni internet lente e inaffidabili.
Secure: Tutti i dati locali vengono crittografati utilizzando una chiave di crittografia fornita dall'utente.
Completamente asincrono: Le richieste a TDLib non si bloccano a vicenda. Le risposte verranno inviate quando sono disponibili.
Windows
TDLib richiede altre librerie di terze parti: OpenSSL e ZLib. Queste librerie devono essere distribuite insieme alla libreria tdjson.
* Le versioni Windows richiedono VCRuntime, scaricabile da Microsoft: https://www.microsoft.com/en-us/download/details.aspx?id=52685. Se il problema persiste dopo l'installazione, provare a copiare le seguenti dll nella stessa cartella dell'applicazione: VCRUNTIME140.dll e VCRUNTIME140_1.dll.
Copiare le seguenti librerie nella stessa directory in cui si trova l'applicazione:
| Windows 32 | Windows 64 |
| tdjson.dll | tdjson.dll |
| libcrypto-1_1.dll | libcrypto-1_1-x64.dll |
| libssl-1_1.dll | libssl-1_1-x64.dll |
| zlib1.dll | zlib1.dll |
OSX64
Distribuire la libreria libtdjson.dylib sul dispositivo e impostare il percorso della libreria tramite SetTDJsonPath, ad esempio:
Se si esegue il deploy in "Contents\MacOS\", è necessario impostare il percorso nella cartella TPath.GetDirectoryName(ParamStr(0)).
OSXARM64
Distribuire la libreria libtdjson.dylib sul dispositivo e impostare il percorso della libreria tramite SetTDJsonPath, ad esempio:
Se si esegue il deploy in "Contents\MacOS\", è necessario impostare il percorso nella cartella TPath.GetDirectoryName(ParamStr(0)).
Linux64
Distribuire la libreria libtdjson.so sul dispositivo e impostare il percorso della libreria chiamando il metodo SetTDJsonPath.
Android
Distribuire la libreria libtdjsonandroid.so sul dispositivo. Esempio: se si distribuisce una libreria Android64, impostare RemotePath in Project/Deployment su "library\lib\arm64-v8a\". Se è Android32, impostare RemotePath su "library\lib\armeabi-v7a\"
iOS64
Copiare la libreria libtdjson.a nelle seguenti directory:
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\debug
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\release
Per ottenere un ID API e sviluppare la propria applicazione utilizzando l'API Telegram, è necessario seguire questi passaggi:
Registrarsi su Telegram usando qualsiasi applicazione.
Acceda al suo Telegram core: https://my.telegram.org.
Andare su Strumenti di sviluppo API e compilare il modulo.
Si otterranno gli indirizzi di base nonché i parametri api_id e api_hash necessari per l'autorizzazione dell'utente.
Al momento ogni numero può avere un solo api_id collegato.
Questi valori devono essere impostati nella proprietà Telegram.API del componente Telegram. Per autenticarsi, è possibile farlo come utente o come bot; ci sono 2 proprietà che è possibile impostare per accedere a Telegram:
PhoneNumber: se si effettua il login come utente, è necessario impostare il proprio numero di telefono (con prefisso internazionale), esempio: +34699123456
BotToken: se si effettua il login come bot, impostare il proprio token in questa proprietà (come fornito da telegram).
DatabaseDirectory: consente di specificare dove si trova il database tdlib. Lasci vuoto per utilizzare la configurazione predefinita.
È possibile configurare i seguenti parametri:
ApplicationVersion: versione dell'applicazione, esempio: 1.0
DeviceModel: modello del dispositivo, esempio: desktop
LanguageCode: codice lingua dell'utente, esempio: en.
SystemVersion: versione del sistema operativo, esempio: windows.
Facoltativamente, è possibile configurare il percorso in cui si trova la libreria tdjson utilizzando il metodo SetTDJsonPath. Basta passare il percorso prima di avviare una nuova sessione Telegram.
Una volta configurato il componente Telegram, è possibile impostare la proprietà Active su true e il programma tenterà di connettersi a Telegram.
Codice di esempio
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.ApplicationVersion := '1.0';
oTelegram.DeviceModel := 'Desktop';
oTelegram.LanguageCode := 'en';
oTelegram.SystemVersion := 'Windows';
oTelegram.Active := true;
Ci sono due eventi che possono essere chiamati dalla libreria per ottenere un Codice di Autenticazione (consegnato nell'applicazione Telegram, non via SMS) o per fornire una password.
OnAuthenticationCode
Questo evento viene chiamato quando Telegram invia un Codice di Autorizzazione all'applicazione Telegram e l'utente deve copiare questo codice e impostarlo nell'argomento Code di questo evento.
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
In Android, inputbox non blocca il thread, quindi invece di restituire il valore immesso dall'utente nel parametro Code, utilizzare il metodo SetAuthenticationCode per impostare il valore del codice.
procedure OnAuthenticationCode(Sender: TObject; var Code:string);
begin
InputBox('Telegram', 'Introduce Telegram Code', '',
procedure(const AResult: TModalResult; const AValue: string)
begin
sgcTelegram.SetAuthenticationCode(AValue);
end
);
end;
OnAuthenticationPassword
Questo evento viene chiamato quando Telegram richiede all'utente di impostare una password.
Una volta avviata l'autorizzazione, è possibile verificare lo stato tramite l'evento OnAuthorizationStatus; questo evento viene chiamato ogni volta che si verifica un cambiamento di stato nell'autorizzazione. Alcuni valori di Status sono:
Una volta avviata la connessione, è possibile verificare lo stato della connessione tramite l'evento OnConnectionStatus; questo evento viene chiamato ogni volta che cambia lo stato della connessione. Alcuni valori di Status sono:
Il componente API TsgcTDLib_Telegram supporta diversi metodi Telegram; di seguito sono elencati i più utilizzati.
| Method | Parametri | Descrizione |
| SendTextMessage |
aChatId: Id della Chat a cui verrà inviato il messaggio aText: Testo del messaggio. InlineKeyboard: Pulsanti facoltativi (solo bot). |
Invia un messaggio di testo a una chat |
| SendRichTextMessage |
aChatId: Id della chat a cui verrà inviato il messaggio aText: Testo del messaggio. InlineKeyboard: Pulsanti facoltativi (solo bot). |
Invia un messaggio in formato Rich Text a una Chat. Sintassi Markdown:
|
| SendDocumentMessage | aChatId: Id della chat a cui verrà inviato il messaggio aFilePath: percorso completo del file del documento aInlineKeyboard: Pulsanti opzionali (solo bot). | Invia un documento a una chat. |
| SendPhotoMessage |
aChatId: Id della chat a cui verrà inviato il messaggio aFilePath: percorso completo del file della foto Width: larghezza della foto. Height: larghezza della foto. InlineKeyboard: Pulsanti facoltativi (solo bot). |
Invia una foto a una chat. |
| SendVideoMessage |
aChatId: Id della Chat a cui verrà inviato il messaggio aFilePath: percorso completo del file del video aWidth: larghezza del video. Height: larghezza del video. aDuration: durata del video in secondi. aInlineKeyboard: Pulsanti opzionali (solo bot). |
Invia un video a una chat. |
| SendInvoiceMessage |
aChatId: Id della chat a cui verrà inviato il messaggio aInvoice: Testo del messaggio. aInlineKeyboard: Pulsanti opzionali (solo bot). |
Invia una Fattura (disponibile solo quando si è un Bot e nei Canali Privati). |
| EditTextMessage |
aChatId: ID della chat a cui verrà inviato il messaggio aMessageId: Id del messaggio da modificare Text: Testo del messaggio. InlineKeyboard: Pulsanti facoltativi (solo bot). ShowKeyboard: pulsanti opzionali (solo bot). |
Modifica il testo di un messaggio (o il testo di un messaggio di gioco) |
| AddChatMember | aChatId: Id della chat a cui verrà inviato il messaggio aUserId: Identificatore dell'utente. aForwardLimit: Il numero di messaggi precedenti della chat da inoltrare al nuovo membro; fino a 100. Ignorato per supergruppi e canali. | Aggiunge un nuovo membro a una chat. I membri non possono essere aggiunti a chat private o segrete. I membri non verranno aggiunti fino a quando lo stato della chat non sarà sincronizzato con il server. |
| AddChatMembers | aChatId: Id della chat a cui verrà inviato il messaggio aUserIds: Identificatori degli utenti da aggiungere alla chat. | Aggiunge più nuovi membri a una chat. Attualmente questa opzione è disponibile solo per supergruppi e canali. Questa opzione non può essere utilizzata per partecipare a una chat. I membri non possono essere aggiunti a un canale se ha più di 200 membri. I membri non verranno aggiunti fino a quando lo stato della chat non sarà sincronizzato con il server. |
| GetChatMember | aChatId: Identificatore Chat. aUserId: Identificatore Utente. | Restituisce informazioni su un singolo membro di una chat. |
| GetBasicGroupFullInfo | aGroupId: Identificatore del gruppo di base | Restituisce le informazioni complete su un gruppo di base tramite il suo identificatore. |
| GetSupergroupMembers |
aSuperGroupId: Identificatore del supergruppo o del canale. aSupergroupMembersFilter: Il tipo di utenti da restituire. Per impostazione predefinita null aOffset: Numero di utenti da saltare. aLimit: Il numero massimo di utenti da restituire; fino a 200. |
Restituisce informazioni sui membri o sugli utenti bannati in un supergruppo o canale. |
| JoinChatByInviteLink | aLink: Link di invito da importare; | Utilizza un invite link per aggiungere l'utente corrente alla chat se possibile. Il nuovo membro non verrà aggiunto finché lo stato della chat non sarà stato sincronizzato con il server. |
| CreateNewSecretChat | aUserId: Identificatore dell'utente. | Crea una nuova chat segreta. |
| CreateNewBasicGroupChat | aUserIds: Identificatori degli utenti da aggiungere alla chat. aTitle: Titolo del nuovo gruppo di base | Crea un nuovo gruppo base |
| CreateNewSupergroupChat |
aTitle: Titolo del nuovo SuperGroup aIsChannel: True, se deve essere creata una chat di canale. aDescription: Descrizione della chat. |
Crea un nuovo supergruppo o canale. |
| CreatePrivateChat |
aUserId: Identificatore dell'utente. aForce: Se true, la chat verrà creata senza richiesta di rete. In questo caso tutte le informazioni sulla chat ad eccezione del tipo, del titolo e della foto potrebbero non essere corrette |
Restituisce una chat esistente corrispondente a un determinato utente |
| GetChats | aOffsetOrder: Ordine della chat da cui restituire le chat aOffsetChatId: Identificatore della chat da cui restituire le chat aLimit: Il numero massimo di chat da restituire. | Restituisce un elenco ordinato di chat. Le chat sono ordinate per la coppia (order, chat_id) in ordine decrescente (non può essere utilizzato se registrato come Bot) |
| GetChat | aChatId: Identificatore della chat | Restituisce informazioni su una chat tramite il suo identificatore |
| GetChatHistory |
aChatId: Identificatore della chat aFromMessageId: Identificatore del messaggio a partire dal quale deve essere recuperata la cronologia; utilizzare 0 per ottenere i risultati dall'ultimo messaggio. aOffset: Specificare 0 per ottenere risultati esattamente dal from_message_id oppure un offset negativo fino a 99 per ottenere anche alcuni messaggi più recenti. aLimit:Il numero massimo di messaggi da restituire |
Restituisce i messaggi di una chat. I messaggi vengono restituiti in ordine cronologico inverso |
| GetUser | aUserId: Identificatore utente | Restituisce informazioni su un utente tramite il suo identificatore. |
| AddProxyHTTP |
aServer: Nome del server proxy. aPort: Numero della porta proxy. aUserName: Nome utente per l'accesso; può essere vuoto. aPassword: Password per l'accesso; può essere vuota. aHTTPOnly: Passare true se il proxy supporta solo richieste HTTP e non supporta connessioni TCP trasparenti tramite il metodo HTTP CONNECT. |
Aggiunge un server proxy HTTP per le richieste di rete. Può essere chiamato prima dell'autorizzazione. |
| AddProxyMTProto |
aServer: Nome del server proxy. aPort: Numero della porta proxy. aSecret: Il segreto del proxy in codifica esadecimale. |
Aggiunge un server proxy MTProto per le richieste di rete. Può essere chiamato prima dell'autorizzazione. |
| AddProxySocks5 |
aServer: Nome del server proxy. aPort: Numero della porta proxy. aUserName: Nome utente per l'accesso; può essere vuoto. aPassword: Password per l'accesso; può essere vuota. |
Aggiunge un server proxy Socks5 per le richieste di rete. Può essere chiamato prima dell'autorizzazione. |
| EnableProxy | aId: ID del proxy | Abilita un proxy. È possibile abilitare un solo proxy alla volta. Può essere chiamato prima dell'autorizzazione. |
| DisableProxy | Disabilita il proxy attualmente abilitato. Può essere chiamato prima dell'autorizzazione. | |
| RemoveProxy | aId: ID del proxy | Rimuove un server proxy. Può essere chiamato prima dell'autorizzazione. |
| GetProxies | Restituisce l'elenco dei proxy attualmente configurati. Può essere chiamato prima dell'autorizzazione. | |
| getChatSponsoredMessage | aChatId: ID della chat | Restituisce il messaggio sponsorizzato da mostrare in una chat; solo per le chat di canale. Restituisce un errore 404 se non è presente alcun messaggio sponsorizzato nella chat. |
| ViewMessage |
aSponsorChatId: ID della Chat sponsor aMessageId: ID del messaggio |
Informa TDLib che i messaggi vengono visualizzati dall'utente. Molte attività utili dipendono dal fatto che i messaggi vengano attualmente visualizzati o meno |
| Logout | Disconnessione da Telegram. | |
| TDLibSend | aRequest: Richiesta JSON. | Invia qualsiasi richiesta nel protocollo JSON. |
Esempio di come inviare un messaggio di testo
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.Active := true;
...
oTelegram.SendTextMessage('1234', 'My First Message from sgcWebSockets');
Esempio: come inviare un metodo non implementato
È possibile inviare qualsiasi messaggio JSON utilizzando il metodo TDLibSend, ad esempio: unirsi a una chat di Telegram.
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.Active := true;
...
oTelegram.TDLibSend('{"@type": "joinChat", "chat_id": "1234"}');
OnBeforeReadEvent
Questo evento viene chiamato quando un messaggio JSON viene ricevuto dal componente API Telegram e non è ancora stato elaborato. Impostare la proprietà Handled su True se si elabora questo evento manualmente o se non si desidera che l'evento venga elaborato dal componente. È possibile utilizzare questo evento anche per registrare tutti i messaggi.
OnMessageText
Questo evento viene chiamato quando è stato ricevuto un nuovo testo di messaggio; legga il parametro MessageText per accedere alle proprietà del testo del messaggio.
OnMessageDocument
Questo evento viene chiamato quando viene ricevuto un nuovo messaggio documento. Accedere a MessageDocument per ottenere accesso alle proprietà del documento.
OnMessagePhoto
Questo evento viene generato quando viene ricevuto un nuovo messaggio fotografico. Accedere a MessagePhoto per ottenere le proprietà della foto.
OnVideoPhoto
Questo evento viene chiamato quando viene ricevuto un nuovo messaggio video. Accedere a MessageVideo per ottenere accesso alle proprietà del video.
OnMessageSponsored
Questo evento viene chiamato quando viene ricevuto un nuovo messaggio sponsorizzato (dopo aver chiamato il metodo getChatSponsoredMessage)
OnNewChat
Questo evento viene chiamato quando viene ricevuta una nuova chat.
OnNewCallbackQuery
Questo evento viene chiamato quando viene ricevuta una nuova callback query in entrata; solo per i bot.
OnEvent
Questo evento viene chiamato quando un nuovo Evento viene ricevuto dal componente API. Può essere utilizzato per elaborare alcuni eventi non implementati dal componente API.
OnException
Questo evento viene chiamato se si verifica un'eccezione durante l'elaborazione dei dati dell'API Telegram.
MyId: restituisce l'identificatore dell'utente corrente.
Verificare il seguente esempio di codice che mostra come connettersi alla API di Telegram, chiedere all'utente di inserire un Codice (se richiesto dalla API di Telegram), inviare un messaggio quando la connessione è pronta e registrare i messaggi di testo ricevuti.
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.ApplicationVersion := '1.0';
oTelegram.DeviceModel := 'Desktop';
oTelegram.LanguageCode := 'en';
oTelegram.SystemVersion := 'Windows';
oTelegram.Active := true;
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
procedure OnMessageText(Sender: TObject; MessageText: TsgcTelegramMessageText);
begin
Log('Message Received: ' + MessageText.Text);
end;
procedure OnConnectionStatus(Sender: TObject; const Status: string);
begin
if Status = 'connectionStateReady' then
oTelegram.SendTextMessage('1234', 'Hello Telegram!');
end;