Nama saya Vlad, berdasarkan profesi saya adalah orang militer, tetapi saya bekerja paruh waktu di perusahaan otomasi bisnis, tempat saya melakukan pemrograman di .net.
Latar Belakang Singkat
Pada saat ketidaksesuaian konvergensi berikutnya dengan mantan pengantin perempuan saya (biasa), dia mengatakan bahwa karena bosan dia mencari teman kencan melalui bot-telegram, yang bisa mengirim foto dan geolokasi dan menjemput orang-orang yang ada di dekat Anda. Saya berjanji akan menulis hal yang serupa jika kami melarikan diri lagi.
Yara untukmu.Saya aman melupakannya, tetapi pada saat kemalasan berikutnya, saya menggulir situs web
dengan cupcake di latar belakang hijau , di mana saya menemukan bagian di mana orang-orang hanya memposting sebuah posting dengan foto, menulis secara singkat tentang diri mereka sendiri dan menunjukkan kontak.
Jadi muncul ide untuk menulis bot Anda, yang akan membantu orang menemukan teman atau orang lain.
Tantangan
Buat bot di mana siapa pun yang ingin mengobrol dapat memposting informasi singkat tentang diri mereka dan hanya menunggu sampai mereka menulis kepadanya.

Persiapan untuk bekerja
Cara membuat bot melalui BotFather tidak tahu hanya orang yang tidak tertarik, jadi saya tidak akan mengisi artikel dengan informasi tambahan.Penyimpanan "profil"
Awalnya, saya membuat proyek ClassLibrary, yang akan saya gunakan untuk bekerja dengan data.
Pertama, Anda perlu memutuskan cara menyimpan data pengguna. Untuk melakukan ini, kita perlu "menggambarkan" pengguna.
public class user { [Key] public string tg_id { get; set; }
Untuk penyimpanan, database PostgreSQL dipilih, yang digunakan untuk server jarak jauh.
Pertama, atur EntityFramework, melalui NuGet. Secara tidak realistis menyederhanakan kehidupan dalam bekerja dengan database.
Untuk bekerja, Anda memerlukan paket:
NpgSQL.EntityFrameworkCore.PostgreSQL
Dan untuk migrasi diperlukan paket:
Microsoft.EntityFrameworkCore.Tools
Agar tidak berurusan dengan pembuatan tabel secara rutin, kami cukup membuat model data itu sendiri (kelas kami di atas) dan mengatur koneksi ke database.
public DbSet<user> user { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(connectionString); }
Selanjutnya kami melakukan migrasi.
Untuk melakukan ini, di Package Manager Console, jalankan perintah:
enable-migrations
Nyalakan mekanisme migrasi
Add-migration * *
Buat migrasi
update-database
Memperbarui basis data
Sekarang di basis data kami dua tabel akan muncul: sejarah migrasi dan tabel pengguna itu sendiri.

Setelah menyelesaikan masalah menyimpan data dan menghubungkan ke database, Anda dapat melanjutkan untuk menulis bot handler itu sendiri.
Bot penanganan
Telegram sendiri menawarkan dua opsi untuk menerima pembaruan: webhook atau terus-menerus menarik server, memeriksa pembaruan. Webhook memiliki banyak kesulitan, jadi lebih mudah untuk hanya memeriksa pembaruan.
Terima pembaruan, proseskan
Agar tidak membuat sepeda (kadang-kadang berguna), lebih mudah untuk menggunakan solusi yang sudah jadi:
Telegram. Bot oleh MrRoundRobin adalah
perpustakaan yang sangat baik dan sangat nyaman untuk bekerja dengan Telegram.
Kami membuat proyek ConsoleApp baru dalam solusi, tempat kami menginstal paket ini.
private static readonly TelegramBotClient Bot = new TelegramBotClient(token);
Jadi, kami mulai memeriksa pembaruan dan menginstal penangan kesalahan kami.
BotOnMessageReceived
- handler untuk menerima pesan "biasa"
BotOnCallbackQueryReceived
- pawang untuk menekan tombol yang muncul di bawah pesan.
Kasusnya kecil, kemampuan untuk meninggalkan kuesioner dan kemampuan untuk menelusuri sisanya. Jadi, Anda perlu mengirim dua tombol kepada pengguna: Registrasi dan Berikutnya. Sebuah tombol mewakili objek
InlineKeyboardButton
, dan semua tombol harus dikemas
IEnumerable<IEnumerable<InlineKeyboardButton>>
Ketika bot dibuka, pesan dengan teks "/ mulai" segera dikirim ke sana, jadi kami perlu memproses pesan ini di
BotOnMessageReceived
dan mengirim tombol kami sebagai tanggapan.
if (message.Text == "/start") { var inlineKeyboard = new InlineKeyboardMarkup(new[] { new []
Pendaftaran
Untuk mendaftar, Anda harus mengingat apa yang dimasukkan pengguna sebelumnya. Artinya, kita perlu membuat penyimpanan bot. Saya baru saja membuat kelas di mana saya menggambarkan logika mengisi data.
RegForm.cs public class RegForm { public string tg_id { get; set; } public string name { get; set; } public string age { get; set; } public string country { get; set; } public string city { get; set; } public string gender { get; set; } public string photo { get; set; } public string tg_username { get; set; } public string tg_chat_id { get; set; } public int stage; public RegForm(string id, string chat_id, string username) { stage = 1; tg_id = id; tg_username = username; } public (string, int) StageText(string id) { if (stage == 1) return (" :", stage); if (stage == 2) return (" :", stage); if (stage == 3) return (" :", stage); if (stage == 4) return (" :", stage); if (stage == 5) return (" :", stage); else return (" :", stage); } public bool SetParam(string param) { if (stage == 1) name = param; if (stage == 2) age = param; if (stage == 3) country = param; if (stage == 4) city = param; if (stage == 5) gender = param; if (stage == 6) photo = param; stage++; return true; } }
Di kelas ini, Anda dapat menerapkan validasi data, misalnya, jangan lewatkan usia dalam bentuk teks, dll.
Dan memori itu sendiri adalah
static Dictionary<string, RegForm> registrations = new Dictionary<string, RegForm>();
di mana kita menambahkan KeyValuePair baru, di klik tombol.
Agar bot tahu bagaimana merespons klik, Anda perlu menambahkan
BotOnCallbackQueryReceived
var message = e.CallbackQuery; if (message.Data == "Registration") { RegForm form = new RegForm(message.From.Id.ToString(), message.Message.Chat.Id.ToString(), message.From.Username);
Dan dengan cara yang sama, memproses data yang diterima, Anda dapat mengisi formulir dan menyimpan data.
using (Context db = new Context()) { IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<RegForm, User>()).CreateMapper(); if (db.user.Where(x => x.tg_id == message.From.Id.ToString()).Count() != 0) db.user.Update(mapper.Map<RegForm, tgbot_base.classes.user>(u)); else { db.user.Add(mapper.Map<RegForm, tgbot_base.classes.user>(u)); } db.SaveChanges(); }
Jika pengguna sudah memiliki profil, maka cukup perbarui datanya.
Menyimpan foto pengguna if (message.Type == MessageType.Photo) { string file = Bot.GetFileAsync(message.Photo[message.Photo.Count() - 1].FileId).Result.FilePath; string filepath = message.From.Id + "." + file.Split('.').Last(); using (FileStream fileStream = new FileStream("C:\\images\\" + filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { var st = Bot.DownloadFileAsync(file).Result; st.Position = 0; st.CopyTo(fileStream); } u.SetParam("C:\\images\\" + filepath); }
Tampilkan profil lain
Untuk melakukan ini, Anda hanya perlu mengambil data dari database dan mengirimkannya ke pengguna.
Untuk melakukan ini, kami menulis metode sederhana yang akan mengambil data dari database dan mengembalikannya dalam format yang nyaman:
public static User GetRandom() { Stopwatch s = new Stopwatch(); s.Start(); User u; using (Context db = new Context()) { Random r = new Random(); int count = db.user.Count(); if (count > 1) count = count - 1; List<User> users = mapper.Map<List<tgbot_base.classes.user>, List<User>>(db.user.ToList()); u = users.ElementAt(r.Next(0, count)); } Console.WriteLine("[" + DateTime.Now + "] For finding " + s.ElapsedMilliseconds + " ms"); s = null; return u; }
Tombol handler klik berikutnya:
if (message.Data == "Next") { if (searchForms.Count != 0) { searchForms.Remove(message.From.Id.ToString()); } IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<RegForm, User>()).CreateMapper(); User user = BaseWorker.GetRandom(); SendAnket(user, message.Message.Chat.Id.ToString());
Kesimpulan
Untuk semua kesederhanaannya, publik menyukai bot.
Dalam waktu kurang dari sehari, 134 pengguna meninggalkan profil mereka, ada umpan balik positif. Dan tanpa iklan khusus - hanya ada satu posting di situs, yang tidak mendapat nilai tambah khususnya.
Bot sudah lama terlupakan yang telah menemukan kehidupan baru. Mereka membantu untuk benar-benar mengotomatiskan banyak proses dan bahkan mencari jodoh di Internet. Melewati situs kencan yang dimonetisasi.
Terima kasih sudah membaca sampai akhir.
Semoga berhasil, bersenang-senanglah, jangan makan salju kuning.