O Telegram oferece dois tipos de APIs. Uma é a Bot API, que permite criar programas que usam Bots e HTTPs como protocolo. A Telegram API e TDLib permitem que você construa clientes Telegram personalizados e é muito mais poderosa que a Bot API.
O sgcWebSockets suporta o TDLib através da biblioteca tdjson, o que significa que você pode construir seu próprio cliente Telegram. O TDLib cuida de todos os detalhes de implementação de rede, criptografia e armazenamento local de dados. O TDLib suporta todos os recursos do Telegram.
TDLib (Telegram Database Library) Advantages
Multiplataforma: pode ser usado em Windows, Android, iOS, MacOS, Linux...
Fácil de usar: usa mensagens json para se comunicar entre a aplicação e o telegram.
Alto desempenho: Na Telegram Bot API, cada instância TDLib trata mais de 24000 bots.
Consistent: o TDLib garante que todas as atualizações serão entregues na ordem correta.
Reliable: O TDLib permanece estável em conexões de internet lentas e não confiáveis.
Secure: Todos os dados locais são criptografados utilizando uma chave de criptografia fornecida pelo usuário.
Totalmente Assíncrono: As requisições ao TDLib não bloqueiam umas às outras. As respostas serão enviadas quando estiverem disponíveis.
Windows
O TDLib requer outras bibliotecas de terceiros: OpenSSL e ZLib. Essas bibliotecas devem ser implantadas com a biblioteca tdjson.
* As versões para Windows requerem o VCRuntime, que pode ser baixado da Microsoft: https://www.microsoft.com/en-us/download/details.aspx?id=52685, Se após a instalação o problema persistir, tente copiar as seguintes dll na mesma pasta onde sua aplicação está localizada: VCRUNTIME140.dll e VCRUNTIME140_1.dll.
Copie as seguintes bibliotecas para o mesmo diretório onde sua aplicação está localizada:
| 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
Implante a biblioteca libtdjson.dylib no seu dispositivo e você pode definir onde a biblioteca está utilizando SetTDJsonPath, exemplo:
se você implantar em "Contents\MacOS\", deve definir o caminho na pasta TPath.GetDirectoryName(ParamStr(0)).
OSXARM64
Implante a biblioteca libtdjson.dylib no seu dispositivo e você pode definir onde a biblioteca está utilizando SetTDJsonPath, exemplo:
se você implantar em "Contents\MacOS\", deve definir o caminho na pasta TPath.GetDirectoryName(ParamStr(0)).
Linux64
Implante a biblioteca libtdjson.so no seu dispositivo e defina o caminho da biblioteca chamando o método SetTDJsonPath.
Android
Implante a biblioteca libtdjsonandroid.so no seu dispositivo. Exemplo: se você implantar uma biblioteca Android64, defina RemotePath em Project/Deployment como "library\lib\arm64-v8a\". Se for Android32, defina RemotePath como "library\lib\armeabi-v7a\"
iOS64
Copie a biblioteca libtdjson.a para estes diretórios:
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\debug
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\release
Para obter um API id e desenvolver sua própria aplicação usando a Telegram API, você precisa fazer o seguinte:
Cadastre-se no Telegram utilizando qualquer aplicação.
Faça login no seu Telegram core: https://my.telegram.org.
Vá para API development tools e preencha o formulário.
Você obterá os endereços básicos, bem como os parâmetros api_id e api_hash necessários para a autorização do usuário.
Por enquanto, cada número só pode ter um api_id conectado a ele.
Esses valores devem ser definidos na propriedade Telegram.API do componente Telegram. Para autenticar, você pode autenticar como usuário ou como bot; há 2 propriedades que você pode definir para fazer login no Telegram:
PhoneNumber: se você fizer login como usuário, deverá definir seu número de telefone (com código internacional), exemplo: +34699123456
BotToken: se você fizer login como um bot, defina seu token nesta propriedade (conforme fornecido pelo telegram).
DatabaseDirectory: permite especificar onde está o banco de dados do tdlib. Deixe vazio e a configuração padrão será utilizada.
Os seguintes parâmetros podem ser configurados:
ApplicationVersion: versão da aplicação, exemplo: 1.0
DeviceModel: modelo do dispositivo, exemplo: desktop
LanguageCode: código de idioma do usuário, exemplo: en.
SystemVersion: versão do sistema operacional, exemplo: windows.
Opcionalmente, você pode configurar o caminho onde a biblioteca tdjson está localizada utilizando o método SetTDJsonPath. Basta passar o caminho antes de iniciar uma nova sessão telegram.
Uma vez que você tenha configurado o Componente Telegram, pode definir a propriedade Active como true e o programa tentará conectar ao Telegram.
Código de Exemplo
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;
Há dois eventos que podem ser chamados pela biblioteca para obter um Código de Autenticação (entregue no aplicativo do Telegram, não por SMS) ou para fornecer uma senha.
OnAuthenticationCode
Este evento é chamado quando o Telegram envia um Código de Autorização para a Aplicação Telegram e o usuário deve copiar esse código e definir no argumento Code deste evento.
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
No Android, o inputbox não bloqueia a thread, então, em vez de retornar o valor introduzido pelo usuário no parâmetro Code, use o método SetAuthenticationCode para definir o valor do código.
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
Este evento é chamado quando o Telegram exige que o usuário defina uma senha.
Uma vez iniciada a autorização, você pode verificar o status da autorização no evento OnAuthorizationStatus; este evento é chamado toda vez que há uma mudança no status da autorização. Alguns valores de Status são:
Uma vez que a conexão tenha começado, você pode verificar o status da conexão no evento OnConnectionStatus; este evento é chamado toda vez que há uma mudança no status da conexão. Alguns valores de Status são:
O Componente da API TsgcTDLib_Telegram suporta vários métodos do Telegram, encontre abaixo os mais usados.
| Method | Parâmetros | Descrição |
| SendTextMessage |
aChatId: Id do Chat para o qual a mensagem será enviada aText: Texto da Mensagem. InlineKeyboard: Botões opcionais (somente bots). |
Envia uma Mensagem de Texto para um Chat |
| SendRichTextMessage |
aChatId: Id do Chat para o qual a mensagem será enviada aText: Texto da Mensagem. InlineKeyboard: Botões opcionais (somente bots). |
Envia uma mensagem de Rich Text para um Chat. Sintaxe Markdown:
|
| SendDocumentMessage | aChatId: Id do Chat ao qual a mensagem será enviada aFilePath: caminho completo do arquivo do documento aInlineKeyboard: Botões opcionais (apenas bots). | Envia um Documento a um Chat. |
| SendPhotoMessage |
aChatId: Id do Chat para o qual a mensagem será enviada aFilePath: caminho completo do arquivo da foto Width: largura da foto. Height: largura da foto. InlineKeyboard: Botões opcionais (somente bots). |
Envia uma Foto para um Chat. |
| SendVideoMessage |
aChatId: Id do Chat para o qual a mensagem será enviada aFilePath: caminho completo do arquivo de vídeo aWidth: largura do vídeo. Height: largura do vídeo. aDuration: duração do vídeo em segundos. aInlineKeyboard: Botões opcionais (somente bots). |
Envia um Vídeo a um Chat. |
| SendInvoiceMessage |
aChatId: Id do Chat para o qual a mensagem será enviada aInvoice: Texto da Mensagem. aInlineKeyboard: Botões opcionais (somente bots). |
Envia uma Invoice (disponível apenas quando é um Bot e em Canais Privados). |
| EditTextMessage |
aChatId: Id do Chat ao qual a mensagem será enviada aMessageId: Id da Mensagem a modificar Text: Texto da Mensagem. InlineKeyboard: Botões opcionais (somente bots). ShowKeyboard: Botões opcionais (apenas bots). |
Edita o texto de uma mensagem (ou o texto de uma mensagem de jogo) |
| AddChatMember | aChatId: Id do Chat ao qual a mensagem será enviada aUserId: Identificador do usuário. aForwardLimit: O número de mensagens anteriores do chat a serem encaminhadas ao novo membro; até 100. Ignorado para supergrupos e canais. | Adiciona um novo membro a um chat. Membros não podem ser adicionados a chats privados ou secretos. Os membros não serão adicionados até que o estado do chat tenha sido sincronizado com o servidor. |
| AddChatMembers | aChatId: Id do Chat para o qual a mensagem será enviada aUserIds: Identificadores dos usuários a serem adicionados ao chat. | Adiciona múltiplos novos membros a um chat. Atualmente esta opção só está disponível para supergrupos e canais. Esta opção não pode ser utilizada para entrar em um chat. Os membros não podem ser adicionados a um canal se ele tiver mais de 200 membros. Os membros não serão adicionados até que o estado do chat tenha sido sincronizado com o servidor. |
| GetChatMember | aChatId: Identificador do Chat. aUserId: Identificador do Usuário. | Retorna informações sobre um único membro de um chat. |
| GetBasicGroupFullInfo | aGroupId: Basic Group Identifier | Retorna informações completas sobre um grupo básico pelo seu identificador. |
| GetSupergroupMembers |
aSuperGroupId: Identificador do supergrupo ou canal. aSupergroupMembersFilter: O tipo de usuários a serem retornados. Por padrão null aOffset: Número de usuários a serem ignorados. aLimit: O número máximo de usuários a serem retornados; até 200. |
Retorna informações sobre membros ou usuários banidos em um supergrupo ou canal. |
| JoinChatByInviteLink | aLink: Invite link a importar; | Usa um link de convite para adicionar o usuário atual ao chat, se possível. O novo membro não será adicionado até que o estado do chat tenha sido sincronizado com o servidor. |
| CreateNewSecretChat | aUserId: Identificador do usuário. | Cria um novo secret chat. |
| CreateNewBasicGroupChat | aUserIds: Identificadores dos usuários a serem adicionados ao chat. aTitle: Título do novo grupo básico | Cria um novo grupo básico |
| CreateNewSupergroupChat |
aTitle: Título do novo SuperGrupo aIsChannel: True, se um chat de canal deve ser criado. aDescription: Descrição do Chat. |
Cria um novo supergrupo ou canal. |
| CreatePrivateChat |
aUserId: Identificador do usuário. aForce: Se true, o chat será criado sem requisição de rede. Neste caso, todas as informações sobre o chat, exceto seu tipo, título e foto, podem estar incorretas |
Retorna um chat existente correspondente a um determinado usuário |
| GetChats | aOffsetOrder: Ordem dos chats a partir da qual retornar os chats aOffsetChatId: Identificador do chat a partir do qual retornar os chats aLimit: O número máximo de chats a serem retornados. | Retorna uma lista ordenada de chats. Os chats são ordenados pelo par (order, chat_id) em ordem decrescente (não pode ser utilizado quando logado como Bot) |
| GetChat | aChatId: Identificador do chat | Retorna informações sobre um chat pelo seu identificador |
| GetChatHistory |
aChatId: Identificador do Chat aFromMessageId: Identificador da mensagem a partir da qual o histórico deve ser buscado; use 0 para obter resultados a partir da última mensagem. aOffset: Especifique 0 para obter resultados a partir exatamente do from_message_id ou um offset negativo de até 99 para obter adicionalmente algumas mensagens mais recentes. aLimit:O número máximo de mensagens a serem retornadas |
Retorna as mensagens em um chat. As mensagens são retornadas em ordem cronológica inversa |
| GetUser | aUserId: Identificador do Usuário | Retorna informações sobre um usuário pelo seu identificador. |
| AddProxyHTTP |
aServer: Nome do servidor do proxy. aPort: Número da porta do proxy. aUserName: Nome de usuário para fazer login; pode estar vazio. aPassword: Senha para fazer login; pode ser vazia. aHTTPOnly: Passe true, se o proxy suportar apenas requisições HTTP e não suportar conexões TCP transparentes via método HTTP CONNECT. |
Adiciona um servidor proxy HTTP para requisições de rede. Pode ser chamado antes da autorização. |
| AddProxyMTProto |
aServer: Nome do servidor do proxy. aPort: Número da porta do proxy. aSecret: O segredo do proxy em codificação hexadecimal. |
Adiciona um servidor proxy MTProto para requisições de rede. Pode ser chamado antes da autorização. |
| AddProxySocks5 |
aServer: Nome do servidor do proxy. aPort: Número da porta do proxy. aUserName: Nome de usuário para fazer login; pode estar vazio. aPassword: Senha para login; pode estar vazia. |
Adiciona um proxy Socks5 para requisições de rede. Pode ser chamado antes da autorização. |
| EnableProxy | aId: ID do proxy | Habilita um proxy. Apenas um proxy pode estar habilitado por vez. Pode ser chamado antes da autorização. |
| DisableProxy | Desabilita o proxy atualmente habilitado. Pode ser chamado antes da autorização. | |
| RemoveProxy | aId: ID do proxy | Remove um servidor proxy. Pode ser chamado antes da autorização. |
| GetProxies | Retorna a lista de proxies que estão atualmente configurados. Pode ser chamado antes da autorização. | |
| getChatSponsoredMessage | aChatId: ID do chat | Retorna a mensagem patrocinada a ser exibida em um chat; apenas para chats de canal. Retorna um erro 404 se não houver mensagem patrocinada no chat. |
| ViewMessage |
aSponsorChatId: ID do Chat patrocinador aMessageId: ID da mensagem |
Informa ao TDLib que as mensagens estão sendo visualizadas pelo usuário. Muitas atividades úteis dependem de se as mensagens estão sendo visualizadas no momento ou não |
| Logout | Faz logout do Telegram. | |
| TDLibSend | aRequest: Requisição JSON. | Envia qualquer Requisição no protocolo JSON. |
Example How to send a Text Message
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');
Exemplo Como enviar um método não implementado
Você pode enviar qualquer mensagem JSON utilizando o método TDLibSend, exemplo: entrar em um chat do 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
Este evento é chamado quando uma mensagem JSON é recebida pelo componente da Telegram API e ainda não foi processada. Defina a propriedade Handled como True se você processar este evento manualmente ou não quiser que o evento seja processado pelo componente. Você também pode utilizar este evento para registrar todas as mensagens.
OnMessageText
Este evento é chamado quando um Novo Texto de Mensagem foi recebido, leia o parâmetro MessageText para acessar as propriedades do texto da mensagem.
OnMessageDocument
Este evento é chamado quando uma Nova Mensagem de Documento é recebida. Acesse MessageDocument para ter acesso às propriedades do Document.
OnMessagePhoto
Este evento é chamado quando uma Nova Mensagem com Foto é recebida. Acesse MessagePhoto para obter acesso às propriedades da Foto.
OnVideoPhoto
Este evento é chamado quando uma Nova Video Message é recebida. Acesse MessageVideo para obter acesso às propriedades do Video.
OnMessageSponsored
Este evento é chamado quando uma Nova Mensagem Patrocinada foi recebida (após chamar o método getChatSponsoredMessage)
OnNewChat
Este evento é chamado quando um novo chat é recebido.
OnNewCallbackQuery
Este evento é chamado quando uma nova callback query é recebida; somente para bots.
OnEvent
Este evento é chamado quando um novo Event é recebido pelo Componente API. Pode ser utilizado para processar alguns eventos não implementados pelo Componente API.
OnException
Este evento é chamado se houver alguma exceção ao processar os dados da Telegram API.
MyId: retorna o Identificador de Usuário do usuário atual.
Verifique o seguinte exemplo de código que mostra como conectar à API do Telegram, pedir ao usuário para introduzir um Code (se exigido pela API do Telegram), enviar uma mensagem quando a conexão estiver pronta e registrar as Mensagens de Texto recebidas.
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;