Mendaftarkan pengguna untuk acara, secara otomatis mencari jawaban dalam database, berkomunikasi dengan dukungan teknis, bertukar kontak - ini semua adalah bagian dari fungsi bot Leader-ID kami. Dia "hidup" di tiga platform: VK, Facebook Messenger dan Telegram, sementara logika karyanya ditulis sekali untuk semua menggunakan abstraksi platform-independen. Pendekatan ini memungkinkan Anda untuk dengan cepat menambahkan fitur baru dan menggiling yang lama.

Struktur sistem membuat pengembangan fungsi untuk platform yang berbeda seragam dan menyederhanakan proses dengan urutan besarnya dibandingkan dengan opsi penulisan ulang secara manual di setiap API yang bergantung pada platform. Pada saat yang sama, untuk memulai bot pada platform baru, Anda hanya perlu menulis adaptor (
konektor ) yang sesuai.
Saya ingin berbicara singkat tentang struktur ini. Mungkin ini akan bermanfaat bagi mereka yang ingin menulis bot lintas-platform mereka, tetapi belum masuk jauh ke dalam topik dan saat mempelajari pengalaman orang lain.
Mari berkenalan dengan bot kami. Dia dapat ditemukan di
Telegram ,
VK ,
FB , di mana dia melayani hingga beberapa ribu orang pada saat yang sama (seperti yang terjadi di acara-acara besar). Ngomong-ngomong, kita bisa belajar tentang siapa kita dan apa yang kita lakukan dari
artikel pertama kita. Singkatnya, kami mengoperasikan jaringan besar ruang kerja dan presentasi gratis di seluruh Rusia dan pada saat yang sama mendukung platform komunikasi
Leader-ID , yang merupakan inti dari keseluruhan sistem. Dan bot memainkan peran penting dalam keseluruhan cerita.
Pistol ganda - kesenangan ganda
Faktanya, kami memiliki dua bot. Yang pertama adalah yang utama, yang bertanggung jawab untuk berinteraksi dengan pengguna. Ini adalah cara yang mudah untuk pendaftaran pengguna ponsel untuk acara, interaksi dengan dukungan dan memperoleh informasi tambahan dari ceramah dan seminar, serta bertukar kontak dalam ekosistem yang sama.

Bot kedua pada dasarnya adalah antarmuka untuk operator pendukung. Bot bekerja secara bersamaan, tetapi basis dan antarmuka mereka terpisah.
Dengan menggunakan contoh mereka, kami akan menunjukkan bagaimana struktur sistem seperti itu terlihat. Namun, kami akan mulai mengurai bola ini secara bertahap, dengan kasus sederhana.
Struktur bot paling sederhana
Pada versi dasar, bot hanya akan terdiri dari satu layanan yang mengirim dan menerima pesan melalui API messenger (platform) yang kita butuhkan, misalnya Telegram.

Jika kami memiliki beberapa messenger yang ingin kami komunikasikan dengan pengguna, akan masuk akal untuk menulis logika dalam gaya platform-independen dengan penambahan konektor ke struktur yang menerjemahkan perintah dan data dari format internal ke format platform yang sesuai (messenger).

Ini akan memungkinkan untuk menambahkan fitur baru di satu tempat, dan tidak menduplikasi mereka untuk setiap platform secara terpisah.
Konektor adalah layanan yang menerima pesan dari platform untuk meneruskan ke kernel dan sebaliknya. Secara umum, ini adalah komponen yang relatif independen dari sistem, yang, jika perlu, dapat ditempatkan di server yang terpisah, memiliki beberapa replika, dan sebagainya.
Kami mengatur komunikasi konektor dan kernel (polling database, atau bagaimana tidak melakukannya)
Jadi, kita dihadapkan dengan tugas mengatur pertukaran data antara konektor dan inti. Opsi pertama adalah mengirim pesan baru melalui database. Kami mulai dari ini. Dengan demikian, basis data itu sendiri muncul dalam skema kami, dan strukturnya menjadi seperti ini: kernel yang ditulis dengan Python, ditambah basis pada MongoDB (alasan untuk pilihan ini secara historis), ditambah konektor.

Skema ini tidak bekerja untuk kita relatif lama. Ketika jumlah pesan melebihi 700 ribu, dan frekuensi dalam puncak mencapai 120 hit per detik, indeks menjadi lebih berat, polling database menjadi jauh lebih mahal. Saya harus menghubungkan broker RabbitMQ di sini. Peran utamanya adalah untuk menghasilkan pemberitahuan bahwa komponen (inti / konektor) harus memproses pesan dengan pengidentifikasi tertentu. ID-ID ini dikirimkan melalui itu. RabbitMQ telah membongkar kami basis dan komponen, yang sekarang tidak perlu terus-menerus memeriksa database untuk informasi baru untuk diproses.
Akibatnya, struktur dasar kami mulai terlihat seperti ini:

Pekerjaan konektor melalui database memiliki minus - ini mengurangi independensi mereka dan meningkatkan konektivitas sistem. Namun, jika data ditransfer langsung menggunakan manajer antrian, maka semua tanggung jawab untuk keamanan dan ketersediaannya berada di pialang ini. Bagaimana ini memenuhi tuntutan keandalan dan transparansi adalah pertanyaan terbuka. Bagi kami sendiri, kami memutuskan bahwa kami akan bereksperimen dengan ini dalam proses pengembangan sistem lebih lanjut.
Menambahkan Admin
Untuk mengelola seluruh dapur Anda memerlukan antarmuka administrator. Dengan bantuannya, kami menemukan informasi yang diperlukan dalam korespondensi, mengedit data, melakukan survei, dan buletin. Oleh karena itu, komponen web muncul di diagram kami. Selain hal di atas, ia menyediakan antarmuka web untuk mengautentikasi pengguna dan API bot.

Web berkomunikasi dengan database dan kernel melalui pesan sistem khusus. Mereka dirutekan sebagai teks, mereka hanya berisi informasi bukan tentang pesan baru dari pengguna, tetapi tentang beberapa peristiwa lain dalam sistem secara keseluruhan, yang harus ditanggapi oleh kernel. Misalnya, mendapatkan kode otorisasi.
Antarmuka itu sendiri untuk administrator terlihat seperti ini:

Kami menghubungkan operator melalui bot kedua
Untuk menerapkan dukungan pengguna penuh, kami menghubungkan operator ke sistem. Untuk mempertahankan kecepatan komunikasi dengan mereka, tanpa adanya alternatif yang sesuai, Telegram dipilih sebagai antarmuka dialog utama. Operator menerima pertanyaan pengguna melalui itu dan segera mengirim jawaban.
Seperti inilah tampilan dialog pengguna dengan bot utama saat mengirim pertanyaan dukungan:
Frasa "Pertanyaan Tes" di tangkapan layar adalah teks pertanyaan untuk dukungan teknisAkibatnya, bot kedua (Support Bot) muncul di sirkuit kami dengan intinya dan konektor Telegram. Ia berkomunikasi dengan inti utama dan mengatur transfer pertanyaan dan jawaban antara obrolan dengan pengguna dan obrolan tempat agen pendukung duduk.

Ini juga memiliki database sendiri. Tetapi komunikasi dengan pengguna akhir melewati inti dari bot utama, yang mengontrol keseluruhan aliran pesan.
Inilah yang tampak seperti dialog operator dengan bot dukungan yang mengarahkan ulang pesan pengguna:

Dalam kasus kami, operator dibagi menjadi dua kategori: mereka yang terlibat dalam dukungan pengguna umum, dan mereka yang bertanggung jawab untuk mendukung masing-masing titik didih atau peristiwa. Namun, ini tidak berpengaruh pada struktur.
Apa lagi yang bisa dilakukan bot kami?
Informasi ini hanya menyangkut praktik kami, tetapi mungkin akan menarik sebagai pilihan ide sederhana yang dapat Anda perhatikan.
Kontak pertukaranIni dilakukan melalui pemindaian dan pengenalan kode QR pribadi dari bot. Untuk melakukan ini, prosesor gambar default ditambahkan ke kernel. Gambar dikirim oleh konektor, yang menyimpannya ke database bersama dengan pesan.

Pengenalan kode QR juga digunakan untuk memberi pengguna informasi tambahan atau file dari seminar. Ini terlihat seperti ini:
Surat pemberitahuan
Melalui panel kontrol di modul web, kami dapat mengirim pemberitahuan kepada peserta dari berbagai acara.
Melakukan surveiDemikian pula, survei dilakukan selama kuliah. Namun bagi mereka, kami masih secara manual menghasilkan file JSON dengan logika, yang kami unggah ke web.


Pertanyaan bisa berupa jawaban, dan terbuka. Dan struktur survei dapat bervariasi tergantung pada jawabannya.

Balasan OtomatisBot dapat secara independen memilih jawaban untuk pertanyaan yang sering diajukan.

Untuk melakukan ini, kami memiliki basis khusus, diisi ulang secara manual. Jika tidak ada yang cocok ditemukan di sana atau pengguna tidak puas dengan jawaban yang dipilih, permohonannya melalui bot dukungan dialihkan ke operator.
Secara umum, sementara ini adalah seluruh sejarah kita. Saat ini, kami sedang berupaya mengembangkan fungsi-fungsi jaringan dan berharap bahwa dalam waktu dekat bot kami akan mendapatkan sedikit lebih "gemuk", sementara strukturnya akan tetap sama.