Telegram ofrece dos tipos de API: una es Bot API, que permite crear programas que usen bots y HTTPS como protocolo. Telegram API y TDLib permiten crear clientes Telegram personalizados y son mucho más potentes que la Bot API.
sgcWebSockets es compatible con TDLib a través de la biblioteca tdjson, lo que significa que puede crear su propio cliente de Telegram. TDLib se encarga de todos los detalles de implementación de red, cifrado y almacenamiento local de datos. TDLib admite todas las funciones de Telegram.
Ventajas de TDLib (Telegram Database Library)
Multiplataforma: puede usarse en Windows, Android, iOS, MacOS, Linux...
Fácil de usar: utiliza mensajes JSON para comunicarse entre la aplicación y Telegram.
Alto rendimiento: En la API de bots de Telegram, cada instancia de TDLib gestiona más de 24 000 bots.
Consistente: TDLib garantiza que todas las actualizaciones se entregarán en el orden correcto.
Reliable: TDLib permanece estable en conexiones a internet lentas e inestables.
Secure: Todos los datos locales se cifran utilizando una clave de cifrado proporcionada por el usuario.
Totalmente asíncrono: Las solicitudes a TDLib no se bloquean entre sí. Las respuestas se enviarán cuando estén disponibles.
Windows
TDLib requiere otras bibliotecas de terceros: OpenSSL y ZLib. Estas bibliotecas deben desplegarse junto con la biblioteca tdjson.
* Las versiones de Windows requieren VCRuntime, que puede descargarse desde Microsoft: https://www.microsoft.com/en-us/download/details.aspx?id=52685. Si tras la instalación el problema persiste, intente copiar las siguientes DLL en la misma carpeta donde se encuentra su aplicación: VCRUNTIME140.dll y VCRUNTIME140_1.dll.
Copie las siguientes bibliotecas en el mismo directorio donde se encuentra su aplicación:
| 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
Despliegue la biblioteca libtdjson.dylib en su dispositivo y puede establecer dónde se encuentra la biblioteca usando SetTDJsonPath, por ejemplo:
si despliega en «Contents\MacOS\», debe establecer la ruta en la carpeta TPath.GetDirectoryName(ParamStr(0)).
OSXARM64
Despliegue la biblioteca libtdjson.dylib en su dispositivo y puede establecer dónde se encuentra la biblioteca usando SetTDJsonPath, por ejemplo:
si despliega en «Contents\MacOS\», debe establecer la ruta en la carpeta TPath.GetDirectoryName(ParamStr(0)).
Linux64
Implemente la biblioteca libtdjson.so en su dispositivo y establezca la ruta de la biblioteca llamando al método SetTDJsonPath.
Android
Despliegue la biblioteca libtdjsonandroid.so en su dispositivo. Ejemplo: si despliega una biblioteca Android64, establezca RemotePath en Project/Deployment como "library\lib\arm64-v8a\". Si es Android32, establezca RemotePath como "library\lib\armeabi-v7a\"
iOS64
Copie la biblioteca libtdjson.a en estos directorios:
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\debug
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\release
Para obtener un ID de API y desarrollar su propia aplicación usando la API de Telegram, debe hacer lo siguiente:
Regístrese en Telegram usando cualquier aplicación.
Inicie sesión en su núcleo de Telegram: https://my.telegram.org.
Vaya a herramientas de desarrollo de API y rellene el formulario.
Obtendrá direcciones básicas así como los parámetros api_id y api_hash necesarios para la autorización del usuario.
Por el momento, cada número solo puede tener un api_id conectado a él.
Estos valores deben establecerse en la propiedad Telegram.API del componente Telegram. Para autenticarse, puede hacerlo como usuario o como bot; hay 2 propiedades que puede configurar para iniciar sesión en Telegram:
PhoneNumber: si inicia sesión como usuario, debe introducir su número de teléfono (con código internacional), por ejemplo: +34699123456
BotToken: si inicia sesión como bot, configure su token en esta propiedad (tal como lo proporciona Telegram).
DatabaseDirectory: permite especificar dónde se encuentra la base de datos de tdlib. Déjelo vacío para utilizar la configuración predeterminada.
Se pueden configurar los siguientes parámetros:
ApplicationVersion: versión de la aplicación, ejemplo: 1.0
DeviceModel: modelo del dispositivo, ejemplo: desktop
LanguageCode: código de idioma del usuario, ejemplo: en.
SystemVersion: versión del sistema operativo, ejemplo: windows.
Opcionalmente, puede configurar la ruta donde se encuentra la biblioteca tdjson usando el método SetTDJsonPath. Solo pase la ruta antes de iniciar una nueva sesión de Telegram.
Una vez que haya configurado el componente de Telegram, puede establecer la propiedad Active en true y el programa intentará conectarse a Telegram.
Código de ejemplo
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;
Hay dos eventos que puede invocar la biblioteca para obtener un código de autenticación (entregado en la aplicación Telegram, no por SMS) o para proporcionar una contraseña.
OnAuthenticationCode
Este evento se llama cuando Telegram envía un Código de Autorización a la aplicación de Telegram y el usuario debe copiar dicho código y establecerlo en el argumento Code de este evento.
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
En Android, el cuadro de diálogo de entrada no bloquea el hilo, por lo que en lugar de devolver el valor introducido por el usuario en el parámetro Code, use el método SetAuthenticationCode para establecer el valor del 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 se invoca cuando Telegram requiere que el usuario establezca una contraseña.
Una vez que la autorización ha comenzado, puede comprobar el estado de la autorización con el evento OnAuthorizationStatus; este evento se llama cada vez que hay un cambio en el estado de la autorización. Algunos valores de Status son:
Una vez que la conexión se ha iniciado, puede comprobar el estado de la conexión mediante el evento OnConnectionStatus; este evento se llama cada vez que hay un cambio en el estado de la conexión. Algunos valores de Status son:
TsgcTDLib_Telegram API Component soporta varios métodos de Telegram; a continuación encontrará los más utilizados.
| Método | Parámetros | Descripción |
| SendTextMessage |
aChatId: Id del Chat al que se enviará el mensaje aText: Texto del Mensaje. InlineKeyboard: botones opcionales (solo bots). |
Envía un mensaje de texto a un chat |
| SendRichTextMessage |
aChatId: Id del chat al que se enviará el mensaje aText: Texto del mensaje. InlineKeyboard: botones opcionales (solo bots). |
Envía un mensaje de texto enriquecido a un chat. Sintaxis Markdown:
|
| SendDocumentMessage | aChatId: Id del Chat al que se enviará el mensaje aFilePath: ruta completa del archivo del documento aInlineKeyboard: Botones opcionales (solo bots). | Envía un documento a un chat. |
| SendPhotoMessage |
aChatId: Id del chat al que se enviará el mensaje aFilePath: ruta completa del archivo de foto Width: ancho de la foto. Height: anchura de la foto. InlineKeyboard: botones opcionales (solo bots). |
Envía una foto a un chat. |
| SendVideoMessage |
aChatId: Id del chat al que se enviará el mensaje aFilePath: ruta completa del archivo de vídeo aWidth: ancho del vídeo. Height: anchura del vídeo. aDuration: duración del vídeo en segundos. aInlineKeyboard: Botones opcionales (solo bots). |
Envía un vídeo a un chat. |
| SendInvoiceMessage |
aChatId: Id del chat al que se enviará el mensaje aInvoice: Texto del mensaje. aInlineKeyboard: Botones opcionales (solo bots). |
Envía una factura (solo disponible cuando es un bot y en canales privados). |
| EditTextMessage |
aChatId: ID del chat al que se enviará el mensaje aMessageId: Id del mensaje a modificar Text: Texto del Mensaje. InlineKeyboard: botones opcionales (solo bots). ShowKeyboard: Botones opcionales (solo bots). |
Edita el texto de un mensaje (o el texto de un mensaje de juego) |
| AddChatMember | aChatId: Id del Chat al que se enviará el mensaje aUserId: Identificador del usuario. aForwardLimit: El número de mensajes anteriores del chat que se reenviarán al nuevo miembro; hasta 100. Se ignora para supergrupos y canales. | Añade un nuevo miembro a un chat. No se pueden añadir miembros a chats privados o secretos. Los miembros no se añadirán hasta que el estado del chat se haya sincronizado con el servidor. |
| AddChatMembers | aChatId: Id del chat al que se enviará el mensaje aUserIds: Identificadores de los usuarios que se añadirán al chat. | Agrega varios miembros nuevos a un chat. Actualmente esta opción solo está disponible para supergrupos y canales. Esta opción no puede usarse para unirse a un chat. No se pueden agregar miembros a un canal si tiene más de 200 miembros. Los miembros no serán agregados hasta que el estado del chat se haya sincronizado con el servidor. |
| GetChatMember | aChatId: Identificador de chat. aUserId: Identificador de usuario. | Devuelve información sobre un único miembro de un chat. |
| GetBasicGroupFullInfo | aGroupId: Identificador de Grupo Básico | Devuelve información completa sobre un grupo básico por su identificador. |
| GetSupergroupMembers |
aSuperGroupId: Identificador del supergrupo o canal. aSupergroupMembersFilter: El tipo de usuarios a devolver. Por defecto null aOffset: Número de usuarios a omitir. aLimit: El número máximo de usuarios que se devolverán; hasta 200. |
Devuelve información sobre los miembros o los usuarios bloqueados en un supergrupo o canal. |
| JoinChatByInviteLink | aLink: Enlace de invitación a importar; | Usa un enlace de invitación para añadir al usuario actual al chat si es posible. El nuevo miembro no se añadirá hasta que el estado del chat se haya sincronizado con el servidor. |
| CreateNewSecretChat | aUserId: Identificador del usuario. | Crea un nuevo chat secreto. |
| CreateNewBasicGroupChat | aUserIds: Identificadores de los usuarios que se añadirán al chat. aTitle: Título del nuevo grupo básico | Crea un nuevo grupo básico |
| CreateNewSupergroupChat |
aTitle: Título del nuevo SuperGrupo aIsChannel: True, si se debe crear un chat de canal. aDescription: Descripción del chat. |
Crea un nuevo supergrupo o canal. |
| CreatePrivateChat |
aUserId: Identificador del usuario. aForce: Si es true, el chat se creará sin solicitud de red. En este caso, toda la información sobre el chat excepto su tipo, título y foto puede ser incorrecta |
Devuelve un chat existente correspondiente a un usuario dado |
| GetChats | aOffsetOrder: Orden de chat desde el que devolver chats aOffsetChatId: Identificador de chat desde el que devolver chats aLimit: El número máximo de chats que se van a devolver. | Devuelve una lista ordenada de chats. Los chats se ordenan por el par (order, chat_id) en orden decreciente (no puede usarse si está registrado como Bot) |
| GetChat | aChatId: Identificador del chat | Devuelve información sobre un chat mediante su identificador |
| GetChatHistory |
aChatId: Identificador de chat aFromMessageId: Identificador del mensaje a partir del cual se debe obtener el historial; use 0 para obtener resultados desde el último mensaje. aOffset: Especifique 0 para obtener resultados exactamente desde from_message_id o un desplazamiento negativo de hasta 99 para obtener además algunos mensajes más recientes. aLimit:El número máximo de mensajes que se devolverán |
Devuelve los mensajes de un chat. Los mensajes se devuelven en orden cronológico inverso |
| GetUser | aUserId: Identificador de usuario | Devuelve información sobre un usuario a partir de su identificador. |
| AddProxyHTTP |
aServer: Nombre del servidor proxy. aPort: Número del puerto del proxy. aUserName: Nombre de usuario para iniciar sesión; puede estar vacío. aPassword: Contraseña para iniciar sesión; puede estar vacía. aHTTPOnly: Pase true si el proxy solo admite solicitudes HTTP y no admite conexiones TCP transparentes mediante el método HTTP CONNECT. |
Añade un servidor proxy HTTP para las solicitudes de red. Puede llamarse antes de la autorización. |
| AddProxyMTProto |
aServer: Nombre del servidor proxy. aPort: Número de puerto del proxy. aSecret: El secreto del proxy en codificación hexadecimal. |
Agrega un servidor proxy MTProto para solicitudes de red. Se puede llamar antes de la autorización. |
| AddProxySocks5 |
aServer: Nombre del servidor proxy. aPort: Número del puerto del proxy. aUserName: Nombre de usuario para iniciar sesión; puede estar vacío. aPassword: Contraseña para iniciar sesión; puede estar vacía. |
Agrega un servidor proxy Socks5 para las solicitudes de red. Puede llamarse antes de la autorización. |
| EnableProxy | aId: ID del proxy | Habilita un proxy. Solo se puede habilitar un proxy a la vez. Puede llamarse antes de la autorización. |
| DisableProxy | Deshabilita el proxy habilitado actualmente. Se puede llamar antes de la autorización. | |
| RemoveProxy | aId: ID del proxy | Elimina un servidor proxy. Puede llamarse antes de la autorización. |
| GetProxies | Devuelve la lista de proxies configurados actualmente. Se puede llamar antes de la autorización. | |
| getChatSponsoredMessage | aChatId: ID del chat | Devuelve el mensaje patrocinado que se mostrará en un chat; solo para chats de canales. Devuelve un error 404 si no hay ningún mensaje patrocinado en el chat. |
| ViewMessage |
aSponsorChatId: ID del Chat del patrocinador aMessageId: ID del mensaje |
Informa a TDLib que el usuario está viendo los mensajes. Muchas actividades útiles dependen de si los mensajes se están viendo en ese momento o no |
| Cerrar sesión | Cierra la sesión de Telegram. | |
| TDLibSend | aRequest: Solicitud JSON. | Envía cualquier solicitud en protocolo JSON. |
Ejemplo de cómo enviar un mensaje de texto
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');
Ejemplo de cómo enviar un método no implementado
Puede enviar cualquier mensaje JSON usando el método TDLibSend, por ejemplo: unirse a un chat de 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 se llama cuando el componente Telegram API recibe un mensaje JSON que aún no ha sido procesado. Establezca la propiedad Handled en True si procesa este evento manualmente o si no desea que el componente lo procese. También puede usar este evento para registrar todos los mensajes.
OnMessageText
Este evento se invoca cuando se ha recibido un nuevo mensaje de texto; lea el parámetro MessageText para acceder a las propiedades del texto del mensaje.
OnMessageDocument
Este evento se llama cuando se recibe un nuevo mensaje de documento. Acceda a MessageDocument para obtener acceso a las propiedades del documento.
OnMessagePhoto
Este evento se activa cuando se recibe un nuevo mensaje con foto. Acceda a MessagePhoto para obtener las propiedades de la foto.
OnVideoPhoto
Este evento se llama cuando se recibe un nuevo mensaje de vídeo. Acceda a MessageVideo para acceder a las propiedades del vídeo.
OnMessageSponsored
Este evento se activa cuando se recibe un Nuevo Mensaje Patrocinado (después de llamar al método getChatSponsoredMessage)
OnNewChat
Este evento se llama cuando se recibe un nuevo chat.
OnNewCallbackQuery
Este evento se llama cuando se recibe una nueva consulta de retrollamada entrante; solo para bots.
OnEvent
Este evento se llama cuando el componente de API recibe un nuevo Evento. Puede usarse para procesar algunos eventos no implementados por el componente de API.
OnException
Este evento se activa si se produce alguna excepción al procesar datos de la API de Telegram.
MyId: devuelve el identificador de usuario del usuario actual.
Consulte el siguiente ejemplo de código que muestra cómo conectarse a la API de Telegram, solicitar al usuario que introduzca un código (si la API de Telegram lo requiere), enviar un mensaje cuando la conexión esté lista y registrar los mensajes de texto recibidos.
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;