
Quelle est la différence entre Telegram et d'autres messagers populaires? Il est ouvert!
D'autres messagers ont également une API, mais pour une raison quelconque, le télégramme est-il connu comme le plus ouvert des plus populaires?
Pour commencer, Telegram a un client vraiment totalement ouvert
code . Malheureusement, nous ne voyons pas de commit tous les jours directement sur GitHub, mais nous avons un code sous une licence ouverte. L'architecture Telegram implique que Bot et API ont presque les mêmes méthodes - https://core.telegram.org/methods .
En fait, Telegram n'est pas seulement un messager de chat, mais une plate-forme sociale, dont l'accès est ouvert à toutes sortes d'applications. Ils peuvent fournir des puces supplémentaires aux utilisateurs, au lieu d'utiliser un réseau prêt à l'emploi d'utilisateurs et de serveurs pour la livraison des messages. Cela semble si attrayant que nous voulions essayer d'écrire notre «client» pour Telegrams.
L'essence de l'application
Nous traitons principalement des cartes et de la navigation, nous avons donc immédiatement examiné quelque chose lié à la géolocalisation. J'ai vraiment aimé que dans Telegram, avant toutes les autres applications, il y avait un moyen pratique de partager votre position en temps réel ( https://telegram.org/blog/live-locations ) et je l'utilise souvent: aidez-moi à m'orienter, montrer mon chemin et la chose la plus importante est de répondre à la question principale "Quand serez-vous?". En principe, cela suffit pour la plupart des gens, mais comme toujours, il existe des scénarios où de simples opportunités ne suffisent pas. Par exemple, il peut s'agir d'un groupe de plus de 10 personnes, avec différents appareils (certains appareils peuvent ne pas être des téléphones) et des personnes différentes. Il serait commode pour ces personnes d'échanger des messages en groupe, ainsi que de se voir se déplacer sur une carte.
Nous nous sommes concentrés sur la tâche de créer de la valeur supplémentaire pour Telegram, et de ne pas essayer de l'utiliser à d'autres fins. Nous ne voulions pas que les gens qui n'avaient pas de client Telegram spécial voient un désordre de messages dans le chat ou quelque chose d'inintelligible. Les personnes avec un client "amélioré" ont des opportunités supplémentaires, par exemple:
- Gestion du temps plus fine lors de l'envoi de sites en temps réel pour discuter.
- Affichez l'emplacement des contacts sur la carte.
- Connexion au chat des appareils balises via une API externe (Bot).
Comment l'avons-nous fait
Heureusement, tout le code que nous écrivons est Open-Source, donc je peux immédiatement donner un lien vers son implémentation - Bot Implementation et Telegram Client Implementation sur Kotlin .
Bot - les bases
Il y a beaucoup de documentation et d'exemples sur l'implémentation de Bot, mais je veux quand même passer en revue certains des pièges. Pour commencer, nous avons écrit côté serveur
à Java et a choisi la bibliothèque org.telegram: telegrambots. Comme notre serveur est un SpringBoot régulier, l'initialisation est extrêmement simple:
// Gradle implementation "org.telegram:telegrambots:3.6" TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); telegramBotsApi.registerBot(new TelegramLongPollingBot() {...});
La principale caractéristique du transfert de position est qu'il doit être mis à jour fréquemment et que le bot doit modifier les messages déjà envoyés. S'il n'y avait pas une telle opportunité, Bot ne ferait que spammer le chat et bien sûr, ce serait Epic Fail. Dieu merci, Telegram donne au bot le droit de modifier les messages pendant 24 heures (minimum, éventuellement plus).
Il existe plusieurs façons d'envoyer un message. Il existe des types Texte brut, Lieu, Emplacement, Jeu, Contact, Facture, etc. Il semblait que l'emplacement était parfait pour notre tâche, mais une caractéristique désagréable a été révélée. La position ne peut être transférée que d'un appareil à un seul compte ou bot à la fois! Imaginez que vous avez 2 téléphones et à partir de deux téléphones, vous avez envoyé votre position dans un chat. Ainsi, une erreur se produira sur le serveur et le premier partage de position s'arrêtera simplement. Il semblerait que ce soit clairement un cas neuronal, mais imaginez que vous avez beaucoup de balises chinoises qui peuvent envoyer Location à une URL donnée, mais elles ne peuvent pas envoyer directement à Telegram. Vous écrivez Bot, qui décroche sur le serveur et envoie des télégrammes. C'est là où il ressort que Bot ne sera pas en mesure d'envoyer plus d'un message de balise avec le type d'emplacement. Il s'avère que cela est idéal pour l'envoi unique, mais ne convient pas pour Live Location.
La solution est simple: envoyez des messages texte et le client analysera le texte et affichera les emplacements sur la carte. Malheureusement, seuls les messages texte seront visibles dans le client Telegram standard, mais vous pouvez y insérer un lien pour ouvrir la carte.
Bot - Pièges
Malheureusement, Bot a dû réécrire jusqu'à 2,5 fois. Le principal problème est la mauvaise conception de la communication.
- Pour une raison quelconque, au début, cela semblait être une bonne idée si le bot serait un participant à part entière au chat et enverrait des messages. Mais, c'est mauvais à la fois en termes de confidentialité de la correspondance et en termes d'interaction avec le bot. La bonne décision, utilisez les robots en ligne . Ainsi, il est garanti que le bot ne voit rien d'autre que son emplacement et qu'il peut être utilisé dans n'importe quel chat. Humainement parlant, il n'est pas culturel de faire glisser votre bot dans une sorte de chat général, mais vous devez parler au bot un à un et le configurer, puis il pourra envoyer les messages nécessaires à n'importe quel chat sélectionné.
- Il existe historiquement 2 types d'interaction dans l'API Telegram Message: les boutons sous le texte ((boutons en ligne) [ https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons ]) et les réponses au bot directement texte. En général, les réponses avec le bot sont désespérément dépassées. Les boutons sont un peu plus compliqués du point de vue de la mise en œuvre, mais cela est entièrement payé par la facilité d'utilisation et ils devraient être utilisés pour toutes les entrées non textuelles.
- Comme exemple de bot, vous pouvez voir le populaire @vote_bot ou notre @osmand_bot.
Client Telegram
Nous n'avons pas pu trouver d'exemples de client de télégramme prêt à l'emploi, à l'exception du client principal, mais la structure tdlib assez simple nous a aidés à créer un client de base en quelques jours seulement.
Configuration 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']) }
Presque tous les éléments internes du Telegram sont écrits en C ++ et du point de vue d'Android, seule la classe API est visible sur les méthodes proxy de 1,5 Mo TdApi.java . En comparant la documentation des bots et le nom des méthodes, vous pouvez simplement déterminer où vous déplacer.
Initialisation client avec gestionnaire global: fun init(): Boolean { return if (libraryLoaded) {
Demande de photo d'utilisateur: 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 - pièges
- Inscription / Connexion et Déconnexion. Lors de l'inscription, il est nécessaire de prendre en compte différents scénarios: lorsque le code d'accès est envoyé par SMS ou à un autre client télégramme, autorisation à deux facteurs, etc. Le plus grand défi est le test. Toute autorisation plus de 3 fois a conduit au blocage du compte pendant 24 heures, donc tester la déconnexion était particulièrement amusant. Bien que l'enregistrement ne soit nécessaire qu'une seule fois, c'est probablement la partie la plus difficile de l'intégration.
- Déterminez comment et dans quel ordre lire les messages. Tout client a accès à tous les messages de toutes les discussions, mais ils doivent être lus de manière séquentielle. Dans notre cas, 99% des messages doivent être éliminés. Tout d'abord, pour une raison quelconque, nous avons lu tous les messages des 3 derniers jours avec une connexion, mais plus tard, cela n'a causé que des problèmes et lorsque nous avons redémarré, les messages ont disparu. Par conséquent, maintenant nous lisons uniquement les nouveaux messages, et pour les messages dont nous avons besoin, nous enregistrons l'identifiant dans la base de données interne.
Qu'est-il arrivé?
Probablement, connaissant tous les pièges, on pourrait tout faire plusieurs fois plus vite, mais cela s'est avéré environ 1-2 mois pour trois personnes. L'application finale se trouve sur Google Play .

La principale question dans cette histoire est de savoir comment cette interaction est correcte du point de vue du télégramme et si les utilisateurs aiment ce type d'intégration. En tout cas, l'idée elle-même est une niche et elle a déjà trouvé des clients individuels.
Je me ferai un plaisir de répondre à vos questions.