
驴Cu谩l es la diferencia entre Telegram y otros mensajeros populares? El esta abierto!
Otros mensajeros tambi茅n tienen una API, pero por alguna raz贸n, 驴se conoce a Telegram como el m谩s abierto de los m谩s populares?
Para empezar, Telegram tiene un cliente realmente totalmente abierto.
c贸digo Desafortunadamente, no vemos confirmaciones todos los d铆as directamente en GitHub, pero tenemos un c贸digo bajo una licencia abierta. La arquitectura de Telegram implica que tanto Bot como API tienen casi los mismos m茅todos: https://core.telegram.org/methods .
De hecho, Telegram no es solo un mensajero de chat, sino una plataforma social, cuyo acceso est谩 abierto para varios tipos de aplicaciones. Pueden proporcionar chips adicionales a los usuarios, en lugar de utilizar una red de usuarios y servidores listos para enviar mensajes. Suena tan atractivo que quer铆amos intentar escribir a nuestro "cliente" para Telegramas.
La esencia de la aplicaci贸n.
Principalmente nos ocupamos de los mapas y la navegaci贸n, por lo que inmediatamente analizamos algo relacionado con la geolocalizaci贸n. Realmente me gust贸 que en Telegram, antes de todas las dem谩s aplicaciones, hab铆a una manera conveniente de compartir su ubicaci贸n en tiempo real ( https://telegram.org/blog/live-locations ) y a menudo lo uso: ayudarme a orientarme, mostrar mi camino y Lo m谩s importante es responder la pregunta principal "驴Cu谩ndo estar谩s?". En principio, esto es suficiente para la mayor铆a de las personas, pero como siempre hay escenarios en los que las oportunidades simples no son suficientes. Por ejemplo, puede ser un grupo de m谩s de 10 personas, con diferentes dispositivos (algunos dispositivos pueden no ser tel茅fonos) y diferentes personas. Ser铆a conveniente para estas personas intercambiar mensajes en un grupo, as铆 como verse mutuamente movi茅ndose en un mapa.
Nos centramos en la tarea de crear valor adicional para Telegram y no tratar de usarlo para otros fines. No quer铆amos que las personas que no ten铆an un cliente especial de Telegram vieran un desorden de mensajes en el chat o algo ininteligible. Las personas con un cliente "mejorado" tienen oportunidades adicionales, por ejemplo:
- Gesti贸n de tiempo m谩s precisa al enviar ubicaciones en tiempo real para chatear.
- Ver la ubicaci贸n de los contactos en el mapa.
- Conexi贸n al chat de dispositivos beacon a trav茅s de una API externa (Bot).
Como lo hicimos
Afortunadamente, todo el c贸digo que escribimos es de c贸digo abierto, por lo que puedo dar inmediatamente un enlace a su implementaci贸n: Implementaci贸n de Bot e Implementaci贸n de cliente de Telegram en Kotlin .
Bot - lo b谩sico
Hay mucha documentaci贸n y ejemplos sobre la implementaci贸n de Bot, pero aun as铆 quiero hablar sobre algunas de las dificultades. Para empezar, escribimos el lado del servidor
en Java y eleg铆 la biblioteca org.telegram: telegrambots. Como nuestro servidor es un SpringBoot normal, la inicializaci贸n es extremadamente simple:
// Gradle implementation "org.telegram:telegrambots:3.6" TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); telegramBotsApi.registerBot(new TelegramLongPollingBot() {...});
La caracter铆stica principal de la transferencia de ubicaci贸n es que debe actualizarse con frecuencia y el bot debe editar los mensajes ya enviados. Si no hubiera tal oportunidad, Bot simplemente enviar铆a spam al chat y, por supuesto, ser铆a Epic Fail. Gracias a Dios Telegram le da al bot el derecho de editar mensajes durante 24 horas (m铆nimo, posiblemente m谩s).
Hay muchas formas de enviar un mensaje. Hay texto sin formato, lugar, ubicaci贸n, juego, contacto, factura, etc. Parec铆a que la ubicaci贸n era perfecta para nuestra tarea, pero se revel贸 una caracter铆stica desagradable. 隆La ubicaci贸n solo se puede transferir de un dispositivo a una cuenta o bot a la vez! Imagina que tienes 2 tel茅fonos y desde dos tel茅fonos enviaste tu ubicaci贸n en un chat. Por lo tanto, se producir谩 un error en el servidor y la primera ubicaci贸n compartida simplemente se detendr谩. Parece que este es claramente un caso neuronal, pero imagine que tiene muchas balizas chinas que pueden enviar Ubicaci贸n a una URL determinada, pero no pueden enviar directamente a Telegram. Escribes Bot, que recoge del servidor y empuja telegramas. Aqu铆 es donde se descubre que Bot no podr谩 enviar m谩s de un mensaje de baliza con el tipo de ubicaci贸n. Resulta que esto es ideal para el env铆o de una sola vez, pero no es adecuado para Live Location.
La soluci贸n es simple: env铆e mensajes de texto y el cliente analizar谩 el texto y mostrar谩 las ubicaciones en el mapa. Desafortunadamente, solo los mensajes de texto ser谩n visibles en el cliente est谩ndar de Telegram, pero puede insertar un enlace all铆 para abrir el mapa.
Bot - trampas
Desafortunadamente, Bot tuvo que reescribir hasta 2.5 veces. El principal problema es el dise帽o incorrecto de la comunicaci贸n.
- Por alguna raz贸n, al principio parec铆a una buena idea si el robot ser铆a un participante de pleno derecho en el chat y enviar铆a mensajes. Pero, esto es malo tanto en t茅rminos de privacidad de la correspondencia como en t茅rminos de interacci贸n con el bot. La decisi贸n correcta, usa bots en l铆nea . Por lo tanto, se garantiza que el bot no ve nada m谩s que su ubicaci贸n y se puede usar en cualquier chat. Hablando humanamente, no es cultural arrastrar tu bot a alg煤n tipo de chat general, pero debes hablar con el bot uno a uno y configurarlo, y luego podr谩 enviar los mensajes necesarios a cualquier chat seleccionado.
- Hist贸ricamente hay 2 tipos de interacci贸n en la API de mensajes de Telegram: botones debajo del texto ((botones en l铆nea) [ https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons ]) y respuestas al bot directamente texto En general, las respuestas con el bot est谩n irremediablemente desactualizadas. Los botones son un poco m谩s complicados desde el punto de vista de la implementaci贸n, pero esto se paga por la facilidad de uso y deben usarse para todas las entradas que no sean de texto.
- Como ejemplo de un bot, puedes ver el popular @vote_bot o nuestro @osmand_bot.
Telegram Client
No pudimos encontrar ejemplos de clientes de telegramas listos, excepto el principal, pero la estructura bastante simple de tdlib nos ayud贸 a crear un cliente b谩sico en solo un par de d铆as.
Configuraci贸n de Gradle: task downloadTdLibzip { doLast { ant.get(src: 'https://core.telegram.org/tdlib/tdlib.zip', dest: 'tdlib.zip', skipexisting: 'true') ant.unzip(src: 'tdlib.zip', dest: 'tdlib/') } } task copyNativeLibs(type: Copy) { dependsOn downloadTdLibzip from "tdlib/libtd/src/main/libs" into "libs" } task copyJavaSources(type: Copy) { dependsOn downloadTdLibzip from "tdlib/libtd/src/main/java/org/drinkless/td" into "src/org/drinkless/td" } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) }
Casi todas las partes internas del Telegram est谩n escritas en C ++ y desde el punto de vista de Android, solo la clase API es visible en los m茅todos proxy TdApi.java de 1.5 MB. Al comparar la documentaci贸n de los bots y el nombre de los m茅todos, simplemente puede averiguar d贸nde moverse.
Inicializaci贸n del cliente con manejador global: fun init(): Boolean { return if (libraryLoaded) {
Solicitud de foto de usuario: private fun requestUserPhoto(user: TdApi.User) { val remotePhoto = user.profilePhoto?.small?.remote if (remotePhoto != null && remotePhoto.id.isNotEmpty()) { downloadUserFilesMap[remotePhoto.id] = user client!!.send(TdApi.GetRemoteFile(remotePhoto.id, null)) { obj -> when (obj.constructor) { TdApi.Error.CONSTRUCTOR -> { val error = obj as TdApi.Error val code = error.code if (code != IGNORED_ERROR_CODE) { listener?.onTelegramError(code, error.message) } } TdApi.File.CONSTRUCTOR -> { val file = obj as TdApi.File client!!.send(TdApi.DownloadFile(file.id, 10), defaultHandler) } else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj") } } } }
Telegram Client - trampas
- Registro / inicio de sesi贸n y cierre de sesi贸n. Al registrarse, es necesario tener en cuenta diferentes escenarios: cuando el c贸digo de acceso se env铆a por SMS u otro cliente de telegramas, autorizaci贸n de dos factores, etc. El mayor desaf铆o es probar. Cualquier autorizaci贸n m谩s de 3 veces condujo al bloqueo de la cuenta durante 24 horas, por lo que probar Logout fue especialmente divertido. A pesar de que el registro se necesita solo una vez, esta es probablemente la parte m谩s dif铆cil de la integraci贸n.
- Determine c贸mo y en qu茅 orden leer los mensajes. Cualquier cliente tiene acceso a todos los mensajes en todos los chats, pero deben leerse secuencialmente. En nuestro caso, el 99% de los mensajes deben descartarse. Primero, por alguna raz贸n, le铆mos todos los mensajes de los 煤ltimos 3 d铆as con un inicio de sesi贸n, pero luego solo caus贸 problemas y cuando reiniciamos, los mensajes desaparecieron. Por lo tanto, ahora solo leemos mensajes nuevos y, para los mensajes que necesitamos, guardamos la identificaci贸n en la base de datos interna.
Que paso
Probablemente, conociendo todas las trampas, uno podr铆a hacer todo muchas veces m谩s r谩pido, pero result贸 para aproximadamente 1-2 meses para tres personas. La aplicaci贸n final se puede encontrar en Google Play .

La pregunta principal en esta historia es cu谩n correcta es esta interacci贸n desde el punto de vista de Telegram y si a los usuarios les gusta este tipo de integraci贸n. En cualquier caso, la idea en s铆 misma es un nicho y ya ha encontrado clientes individuales.
Estar茅 encantado de responder a sus preguntas.