
Apa perbedaan antara Telegram dan utusan populer lainnya? Dia terbuka!
Utusan lain juga memiliki API, tetapi untuk beberapa alasan, apakah telegram dikenal sebagai yang paling terbuka dan paling populer?
Untuk mulai dengan, Telegram memiliki klien yang benar-benar sepenuhnya terbuka
kode . Sayangnya, kami tidak melihat komitmen setiap hari secara langsung di GitHub, tetapi kami memiliki kode di bawah lisensi terbuka. Arsitektur Telegram menyiratkan bahwa Bot dan API memiliki metode yang hampir sama - https://core.telegram.org/methods .
Bahkan, Telegram bukan hanya messenger chat, tetapi platform sosial, akses yang terbuka untuk berbagai jenis aplikasi. Mereka dapat memberikan chip tambahan kepada pengguna, alih-alih menggunakan jaringan pengguna dan server yang sudah jadi untuk pengiriman pesan. Kedengarannya sangat menarik sehingga kami ingin mencoba menulis "klien" kami untuk Telegrams.
Inti dari aplikasi
Kami terutama berurusan dengan peta dan navigasi, jadi kami segera melihat sesuatu yang berkaitan dengan geolokasi. Saya sangat suka itu di Telegram, sebelum semua aplikasi lain, ada cara mudah untuk berbagi lokasi Anda secara real time ( https://telegram.org/blog/live-locations ) dan saya sering menggunakannya: bantu saya mengorientasikan diri, menunjukkan jalan dan yang paling penting adalah menjawab pertanyaan utama "Kapan Anda akan menjadi?". Pada prinsipnya, ini sudah cukup bagi kebanyakan orang, tetapi seperti biasa ada skenario ketika peluang sederhana tidak cukup. Misalnya, dapat berupa grup lebih dari 10 orang, dengan perangkat yang berbeda (beberapa perangkat mungkin bukan ponsel) dan orang yang berbeda. Akan lebih mudah bagi orang-orang ini untuk bertukar pesan dalam sebuah grup, serta melihat satu sama lain bergerak di peta.
Kami fokus pada tugas menciptakan nilai tambahan untuk Telegram, dan tidak mencoba menggunakannya untuk tujuan lain. Kami tidak ingin orang yang tidak memiliki klien Telegram khusus untuk melihat kekacauan pesan dalam obrolan atau sesuatu yang tidak dapat dipahami. Orang-orang dengan klien yang "ditingkatkan" memiliki peluang tambahan, misalnya:
- Manajemen waktu yang lebih baik saat mengirim lokasi dalam waktu nyata untuk mengobrol.
- Lihat lokasi kontak di peta.
- Menghubungkan ke obrolan perangkat suar melalui API eksternal (Bot).
Bagaimana kami melakukannya?
Untungnya, semua kode yang kita tulis adalah Open-Source, jadi saya bisa langsung memberikan tautan ke implementasinya - Implementasi Bot dan Implementasi Telegram Client di Kotlin .
Bot - dasar-dasarnya
Ada banyak dokumentasi dan contoh tentang implementasi Bot, tetapi saya masih ingin membahas tentang beberapa jebakan. Untuk memulainya, kami menulis sisi server
di Jawa dan memilih perpustakaan org.telegram: telegrambots. Karena server kami adalah SpringBoot biasa, inisialisasi sangat sederhana:
// Gradle implementation "org.telegram:telegrambots:3.6" TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); telegramBotsApi.registerBot(new TelegramLongPollingBot() {...});
Fitur utama dari transfer lokasi adalah bahwa itu perlu sering diperbarui, dan bot perlu mengedit pesan yang sudah dikirim. Jika tidak ada kesempatan seperti itu, Bot hanya akan melakukan spam pada obrolan dan tentu saja itu adalah Kegagalan Epik. Alhamdulillah Telegram memberi bot hak untuk mengedit pesan selama 24 jam (minimum, mungkin lebih lama).
Ada banyak cara untuk mengirim pesan. Ada jenis Teks Biasa, Tempat, Lokasi, Permainan, Kontak, Faktur, dll. Tampaknya Lokasi sempurna untuk tugas kami, tetapi fitur yang tidak menyenangkan terungkap. Lokasi hanya dapat ditransfer dari satu perangkat ke satu akun atau bot sekaligus! Bayangkan Anda memiliki 2 ponsel dan dari dua ponsel Anda mengirim Lokasi Anda dalam satu obrolan. Jadi, kesalahan akan terjadi di server dan Berbagi Lokasi pertama hanya akan berhenti. Tampaknya ini jelas kasus neural, tetapi bayangkan Anda memiliki banyak suar China yang dapat mengirim Lokasi ke URL yang diberikan, tetapi mereka tidak dapat mengirim langsung ke Telegram. Anda menulis Bot, yang mengambil dari server dan mendorong telegram. Di sinilah keluar bahwa Bot tidak akan dapat mengirim lebih dari satu pesan suar dengan tipe Lokasi. Ternyata ini bagus untuk pengiriman satu kali, tetapi tidak cocok untuk Lokasi Langsung.
Solusinya sederhana - mengirim pesan teks, dan klien akan menguraikan teks dan menunjukkan lokasi di peta. Sayangnya, hanya pesan teks yang akan terlihat di klien Telegram standar, tetapi Anda dapat memasukkan tautan di sana untuk membuka peta.
Bot - Perangkap
Sayangnya, Bot harus menulis ulang sebanyak 2,5 kali. Masalah utama adalah desain komunikasi yang salah.
- Untuk beberapa alasan, pada awalnya sepertinya ide yang baik jika bot akan menjadi peserta penuh dalam obrolan dan mengirim pesan. Tapi, ini buruk baik dalam hal privasi korespondensi dan dalam hal interaksi dengan bot. Keputusan yang tepat, gunakan bot Inline . Dengan demikian, dijamin bahwa bot tidak melihat apa pun selain Lokasinya dan dapat digunakan dalam obrolan apa pun. Berbicara secara manusiawi, tidak sopan untuk menyeret bot Anda ke beberapa jenis obrolan umum, tetapi Anda perlu berbicara dengan bot satu per satu dan mengonfigurasinya, dan kemudian ia akan dapat mengirim pesan yang diperlukan ke obrolan terpilih mana pun.
- Secara historis ada 2 jenis interaksi di API Pesan Telegram: tombol di bawah teks ((tombol sebaris) [ https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons ]) dan menjawab bot secara langsung teks. Secara umum, jawaban dengan bot sudah usang. Tombol sedikit lebih rumit dari sudut pandang implementasi, tetapi ini sepenuhnya dibayar oleh kemudahan penggunaan dan mereka harus digunakan untuk semua input non-teks.
- Sebagai contoh bot, Anda dapat melihat @vote_bot populer atau @osmand_bot kami.
Klien Telegram
Kami tidak dapat menemukan contoh klien telegram siap pakai, kecuali yang utama, tetapi struktur tdlib yang agak sederhana membantu kami membuat klien dasar hanya dalam beberapa hari.
Penyiapan 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']) }
Hampir semua internal Telegram ditulis dalam C ++ dan dari sudut pandang Android, hanya kelas API yang terlihat pada metode proksi 1,5 MB TdApi.java . Dengan membandingkan dokumentasi bot dan nama metode, Anda bisa mencari tahu ke mana harus pindah.
Inisialisasi pelanggan dengan penangan global: fun init(): Boolean { return if (libraryLoaded) {
Permintaan foto pengguna: 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") } } } }
Klien Telegram - jebakan
- Registrasi / Masuk dan Keluar. Saat mendaftar, perlu mempertimbangkan berbagai skenario akun: ketika kode akses dikirim melalui SMS atau ke klien telegram lain, otorisasi dua faktor, dll. Tantangan terbesar adalah pengujian. Otorisasi apa pun lebih dari 3 kali menyebabkan pemblokiran akun selama 24 jam, jadi pengujian Keluar sangat menyenangkan. Terlepas dari kenyataan bahwa pendaftaran hanya diperlukan sekali, ini mungkin merupakan bagian paling sulit dari integrasi.
- Tentukan bagaimana dan bagaimana cara membaca pesan. Setiap klien memiliki akses ke semua pesan di semua obrolan, tetapi mereka harus dibaca secara berurutan. Dalam kasus kami, 99% dari pesan harus dibuang. Pertama, karena suatu alasan, kami membaca semua pesan selama 3 hari terakhir dengan login, tetapi kemudian hanya menyebabkan masalah dan ketika kami memulai kembali, pesan-pesan itu hilang. Karenanya, sekarang kami hanya membaca pesan baru, dan untuk pesan yang kami butuhkan, kami menyimpan id di basis data internal.
Apa yang terjadi
Mungkin, mengetahui semua jebakan, seseorang bisa melakukan segalanya berkali-kali lebih cepat, tetapi ternyata sekitar 1-2 bulan untuk tiga orang. Aplikasi terakhir dapat ditemukan di Google Play .

Pertanyaan utama dalam cerita ini adalah seberapa tepat interaksi ini dari sudut pandang Telegram dan apakah pengguna menyukai jenis integrasi ini. Bagaimanapun, ide itu sendiri adalah ceruk dan telah menemukan pelanggan individu.
Saya akan dengan senang hati menjawab pertanyaan Anda.