اسمي فلاد ، بحكم عملي أنا رجل عسكري ، لكني أعمل بدوام جزئي في شركة أتمتة الأعمال ، حيث أقوم بالبرمجة على .net.
خلفية موجزة
في وقت التناقض التالي بين التقارب مع عروسي السابقة (العادية) ، قالت إنها بدافع الملل كانت تبحث عن رجال للتواريخ من خلال برقية روبوت ، والتي يمكن أن ترسل الصور وتحديد الموقع الجغرافي وتقطب الأشخاص القريبين منك. لقد وعدت أنني سأكتب شيئًا مشابهًا إذا هربنا مرة أخرى.
يارا لك.لقد نسيت ذلك بأمان ، ولكن في وقت الكسل التالي ، قمت بتمرير الموقع
مع كب كيك على خلفية خضراء ، حيث صادفت قسمًا حيث نشر الأشخاص للتو منشورًا مع صورة ، وكتبوا لفترة وجيزة عن أنفسهم وأشاروا إلى جهات الاتصال.
لذا جاءت الفكرة لكتابة برنامج الروبوت الخاص بك ، والذي سيساعد الناس في العثور على الأصدقاء أو أي شخص آخر.
التحدي
قم بإنشاء روبوت حيث يمكن لأي شخص يريد الدردشة نشر معلومات قصيرة عن نفسه ومجرد الانتظار حتى يكتبون له.

التحضير للعمل
لا تعرف كيفية إنشاء روبوت من خلال BotFather الشخص غير المهتم فقط ، لذلك لن أكمل المقالة بمعلومات إضافية.تخزين "ملامح"
في البداية ، أنشأت مشروع ClassLibrary ، والذي كنت سأستخدمه للعمل مع البيانات.
تحتاج أولاً إلى تحديد كيفية تخزين بيانات المستخدم. للقيام بذلك ، نحتاج إلى "وصف" المستخدم.
public class user { [Key] public string tg_id { get; set; }
للتخزين ، تم اختيار قاعدة بيانات PostgreSQL ، والتي تم نشرها على خادم بعيد.
أولاً ، قم بتعيين EntityFramework من خلال NuGet. يبسط الحياة بشكل غير واقعي في العمل مع قاعدة البيانات.
للعمل ، تحتاج إلى الحزمة:
NpgSQL.EntityFrameworkCore.PostgreSQL
وبالنسبة للترحيل ، يلزم وجود حزمة:
Microsoft.EntityFrameworkCore.Tools
لكي لا نتعامل مع الإنشاء الروتيني للجدول ، نقوم ببساطة بإنشاء نموذج البيانات نفسه (فصلنا أعلاه) وتعيين الاتصال بقاعدة البيانات.
public DbSet<user> user { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(connectionString); }
علاوة على ذلك نقوم بتنفيذ الهجرة.
للقيام بذلك ، في Package Manager Console ، قم بتنفيذ الأوامر:
enable-migrations
قم بتشغيل آلية الترحيل
Add-migration * *
إنشاء ترحيل
update-database
تحديث قاعدة البيانات
يظهر الآن في قاعدة البيانات جدولان: تاريخ عمليات الترحيل وجدول المستخدم نفسه.

بعد حل مشكلة تخزين البيانات والاتصال بقاعدة البيانات ، يمكنك المتابعة لكتابة معالج الروبوت نفسه.
روبوت معالج
تقدم Telegram نفسها خيارين لاستلام التحديثات: الرد التلقائي على الويب أو سحب الخادم باستمرار ، والبحث عن التحديثات. يواجه Webhook الكثير من الصعوبات ، لذا من السهل التحقق من وجود تحديثات.
تلقي التحديثات ومعالجتها
من أجل عدم إنشاء دراجة (في بعض الأحيان تكون مفيدة) ، من الأسهل استخدام حل جاهز:
Telegram. Bot by MrRoundRobin هي مكتبة ممتازة ومريحة للغاية للعمل مع Telegram.
نقوم بإنشاء مشروع ConsoleApp جديد في الحل ، حيث نقوم بتثبيت هذه الحزمة.
private static readonly TelegramBotClient Bot = new TelegramBotClient(token);
وبالتالي ، بدأنا في البحث عن التحديثات وتثبيت معالجات الأخطاء الخاصة بنا.
BotOnMessageReceived
- معالج لتلقي الرسائل "العادية"
BotOnCallbackQueryReceived
- معالج الضغط على الأزرار التي تظهر أسفل الرسالة.
القضية صغيرة ، والقدرة على ترك الاستبيان والقدرة على التمرير من خلال الباقي. لذلك تحتاج إلى إرسال المستخدم زرين: التسجيل والتالي. يمثل الزر كائن
InlineKeyboardButton
، ويجب
InlineKeyboardButton
جميع الأزرار
IEnumerable<IEnumerable<InlineKeyboardButton>>
عندما يتم فتح برنامج التتبُّع ، يتم إرسال رسالة تحتوي على النص "/ start" على الفور ، لذا نحتاج إلى معالجة هذه الرسالة في
BotOnMessageReceived
وإرسال الأزرار استجابة.
if (message.Text == "/start") { var inlineKeyboard = new InlineKeyboardMarkup(new[] { new []
تسجيل
للتسجيل ، تحتاج إلى تذكر ما أدخله المستخدم في وقت سابق. أي أننا بحاجة إلى إنشاء تخزين بوت. لقد أنشأت للتو صفًا حيث وصفت منطق تعبئة البيانات.
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; } }
في هذا الفصل ، يمكنك تنفيذ التحقق من صحة البيانات ، على سبيل المثال ، لا تفوت العمر في شكل نص ، وما إلى ذلك.
والذاكرة نفسها هي
static Dictionary<string, RegForm> registrations = new Dictionary<string, RegForm>();
نضيف فيه KeyValuePair جديدًا ، بنقرة زر واحدة.
من أجل أن يعرف البوت كيفية الرد على النقرة ، تحتاج إلى إضافة
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);
وبنفس الطريقة ، ومعالجة البيانات المستلمة ، يمكنك ملء النموذج وحفظ البيانات.
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(); }
إذا كان المستخدم لديه ملف شخصي بالفعل ، فما عليك سوى تحديث البيانات.
حفظ صورة المستخدم 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); }
إظهار ملفات تعريف أخرى
للقيام بذلك ، تحتاج فقط إلى أخذ البيانات من قاعدة البيانات وإرسالها إلى المستخدم.
للقيام بذلك ، نكتب طريقة بسيطة تأخذ البيانات من قاعدة البيانات وتعيدها بتنسيق مناسب:
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; }
معالج النقر فوق الزر التالي:
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());
الخلاصة
على الرغم من بساطته ، أحب الجمهور البوت.
في أقل من يوم ، غادر 134 مستخدمًا ملفاتهم الشخصية ، وكانت هناك ردود فعل إيجابية. وبدون إعلانات خاصة - هناك مشاركة واحدة فقط على الموقع ، والتي لم تحرز إيجابيات بشكل خاص.
البوتات قديمة المنسية منذ فترة طويلة وقد وجدت حياة جديدة. فهي تساعد على أتمتة العديد من العمليات وحتى البحث عن رفيق على الإنترنت. تجاوز مواقع المواعدة التي تحقق الدخل.
شكرا للقراءة حتى النهاية.
حظا سعيدا ، إستمتع ، لا تأكل الثلج الأصفر.