
لقد حدث لك أنك أتيت إلى السينما وشاهدت المقطورات قبل بدء الفيلم ، في حين أن بعضًا منهم يتشبث بك بشدة وأنت تعطي نفسك وعدًا بمشاهدة هذا الفيلم إن لم يكن في السينما ، ثم بعد ذلك على الأقل ، عندما يصبح متاحًا للتنزيل ؟ أجرؤ على اقتراح أن نعم. ولكن غالبًا ما ينتهي الأمر بحقيقة أنك قد نسيت هذا الأمر بنجاح ، وفي أفضل الأحوال ، يمكنك العثور على هذا الفيلم عن طريق الخطأ عن طريق التمرير عبر قائمة الأفلام التي تم إصدارها بالفعل.
لقد واجهت هذه المشكلة غالبًا وقررت إنشائها باستخدام Eve - Telegram-bot ، مما يساعدني على عدم نسيان إصدارات أفلامي المفضلة. ما هو ، وكيف يعمل وكيف تم تطويره ، يمكنك أن تقرأ تحت خفض!
مقدمة
هذه المقالة ليست دليلًا تفصيليًا حول إنشاء برامج Telegram. وعلى الرغم من أنني سأشير في غالب المقال إلى مشروعي ، فإن الغرض من هذه المادة هو قصة عن التطوير بشكل عام ، أي اختيار التقنيات والنقاط الرئيسية والمخاطر التي واجهتها.
لماذا؟
هكذا ، كما كتبت أعلاه ، كثيراً ما أنسى مشاهدة تلك الأفلام التي أعجبتني مقطورة. فكرت لفترة طويلة حول حل هذه المشكلة. أول ما حدث لي هو إنشاء تطبيق أصلي للهواتف الذكية ، ولكن منذ ذلك الحين لم أقم بذلك من قبل ، سيستغرق الأمر الكثير من الوقت وليس حقيقة أن النتيجة النهائية ستلبي احتياجاتي ، وكذلك احتياجات المستخدمين المحتملين.
كانت الفكرة التالية هي إنشاء PWA. إنه خيار مثير للاهتمام للتعرف على التكنولوجيا ، لكنني قررت تركها للمستقبل. في نفس الوقت ، كنت أستخدم Telegram منذ فترة طويلة وخلال كل هذا الوقت قمت بتجميع عدد كاف من برامج الروبوت التي تجعل حياتي أسهل بشكل دوري. في النهاية ، بعد تقييم جميع إيجابيات وسلبيات ، قررت أن هذه المنصة مثالية لهذه الفكرة.
اختيار التكنولوجيا
إذا ذهبت إلى Github لبوتات Telegram ، يمكنك أن ترى أن معظمها مكتوب في بيثون. Python هي حقًا لغة رائعة وهي رائعة لهذه الفكرة ، لكنني أردت تنفيذ هذا المشروع على وجه التحديد على NodeJS + TypeScript. بتطبيق المرشحات المناسبة ، صادفت أداتين
رائعتين :
العقدة-التلغرام-بوت-api و
Telegraf.js .
قبل هذه التجربة في تطوير برامج الروبوت ، لم يكن لدي ، لذلك عند الاختيار من هاتين الأمرين ، لم يكن من الواضح المعلمات التي ينبغي النظر فيها. كنتيجة لذلك ، بعد الاطلاع على الوثائق والبحث في القضايا الخاصة بكل من المكتبات ، استقرت على Telegraf.js. كان العامل الحاسم هو توافر برامج الوسيطة التي تم تصميمها بنفس طريقة تصميم إطار Express.js الشهير. لدى Telegraf.js أيضًا محفوظات تحديث أكثر تكرارًا ووثائق جيدة التنظيم ، مما يشير إلى أن المطورين يبذلون ما يكفي من الجهد لتحسين الأداة. علاوة على ذلك ، فإنه يحتوي على نصائح لـ TypeScript ، والتي تعد بالتأكيد ميزة إضافية للمكدس المحدد.
Telegraf.js
Telegraf.js هي المكتبة الرئيسية التي كُتب عليها المشروع. ويستخدم العديد من الأساليب المثيرة للاهتمام التي تسمح لك بإنشاء روبوتات معقدة مع الحفاظ على بساطة الكود. فيما يلي أكثر الآليات إثارة للاهتمام:
هيكل المشروع
هناك شك في أن المقالة سوف تكون ضخمة للغاية ، وبالتالي ، حتى لا تمددها أكثر ، سأحذف بعض النقاط. على سبيل المثال ، لكي يبدأ الروبوت في العمل ، يجب أن تبدأ من خلال الحصول على الرمز المميز لـ Telegram Bot API. يمكنك قراءة كيفية القيام بذلك في
وثائق Telegram الرسمية أو في
وثائق Telegraf.js.
هيكل ملف المشروع على النحو التالي:
يعمل على النحو التالي:
- src / controllers - هذه هي المشاهد التي كتب عنها أعلاه. في هذا المشروع ، كل مشهد هو وحدة تحكم منفصلة تعالج الطلبات المقابلة.
- src / locales - ترجمات للغات مختلفة. يجعل Telegraf.js من السهل نسبياً إضافة الترجمة إلى الروبوت باستخدام البرامج الوسيطة.
- src / نماذج - نماذج ل MongoDB.
- src / types - tippings for TypeScript. لسوء الحظ ، ليست كل المكتبات المستخدمة في المشروع لها توقيت افتراضي.
- src / util - وظائف المساعد المختلفة التي يتم استخدامها في أجزاء مختلفة من المشروع. يمكنك هنا معرفة كيفية توفر الفيلم للتنزيل وإدارة الجلسة وإنشاء لوحات المفاتيح ومعالجات الأخطاء والمزيد من الأعمال.
- src / bot.ts - الملف الرئيسي حيث يتم كل تحضير وإطلاق الروبوت .
- src / telegram.ts - في هذه الحالة ، نقوم بإنشاء كائن من فئة Telegram من مكتبة Telegraf.js. باستخدام هذا الكائن ، يمكننا إرسال رسائل إلى المستخدمين أولاً ، باستخدام هويتهم ، وعدم الانتظار حتى يكتبوا شيئًا ما. على سبيل المثال ، في هذا المشروع ، نرسل إلى المستخدم رسالة تفيد بأنه يمكن بالفعل تنزيل الفيلم الذي كان يتبعه. بالطبع ، يوفر هذا الكائن المزيد من الميزات.
- كل شيء آخر هو تكوينات لأجزاء مختلفة من المشروع والتي لن يتم مناقشتها في هذه المقالة.
التهيئة والإطلاق
عندما اكتشفنا بنية المشروع ، دعونا نرى كيف يبدأ الروبوت بالفعل. مرة أخرى ، من أجل تقصير المقال ، لن أدرج الكود بأكمله هنا ، لكن سأتحدث فقط عن لحظات الرئيسية ، في رأيي. يمكنك رؤية الرمز الكامل في المستودع ، وهو رابط متاح في نهاية المقالة.
كل شيء يبدأ بالاتصال بقاعدة البيانات ، والذي يخزن معلومات حول المستخدمين والأفلام التي يتعقبونها. بعد اتصال ناجح ، نسجل جميع المشاهد المستخدمة في المشروع ، ونضع معايير للتوطين ونضيف العديد من البرامج الوسيطة - جلسات المعالجة ، والتعريب ، وإعداد المشاهد ، بالإضافة إلى العديد من المشاهد الخاصة بنا. أحدهم ، على سبيل المثال ، يتلقى جميع المعلومات حول المستخدم وفقًا لهويته ويضيفها إلى السياق المستخدم في وحدات التحكم. أخيرًا ، بعد كل الاستعدادات الأساسية ، نطلق الروبوت في وضع التطوير (الاقتراع الطويل) أو وضع الإنتاج (Webhooks).
هام: إذا كنت تستخدم طرقًا مختلفة لتلقي التحديثات (الاقتراع الطويل و Webhooks) ، فعند بدء تشغيل الروبوت في وضع الاستقصاء الطويل ، قم أولاً بحذف Webhook الاستماع باستخدام طلب GET على
api.telegram.org/botYOUR_TOKEN/deleteWebhook . خلاف ذلك ، فإن الروبوت قد لا يعمل بشكل صحيح.
التعامل مع إدخال المستخدم
الصيحة! يعمل الروبوت ، متصلاً بقاعدة البيانات وهو جاهز لاستقبال الرسائل من المستخدمين. ولكن كيف نفعل ذلك بشكل صحيح؟
بادئ ذي بدء ، سيكون من المناسب للمستخدمين استخدام لوحة المفاتيح Telegram المدمجة. في الواقع ، عند النقر فوق الأزرار الموجودة على لوحة المفاتيح هذه ، يتم إرسال الرسائل مع محتويات هذه الأزرار. بعد ذلك ، نضيف ببساطة معالجات لهذا النص وننفذ إجراءات معينة.
يحتوي ملف
bot.ts على معالجات من هذا القبيل. نظرًا لأن الروبوت يدعم لغتين ، فقد تحتوي الأزرار أيضًا على نص مختلف - بالروسية والإنجليزية. يحتوي Telegraf-i18n على وظيفة مطابقة يمكنها التعامل مع النقر فوق الزر نفسه بلغات مختلفة.
تؤدي معظم المعالجات في bot.ts وظيفة واحدة - حيث يقومون بتشغيل المستخدم في المشهد المقابل. لذلك ، لدينا عدة أقسام - البحث عن الأفلام ، مجموعتي ، الإعدادات وجهات الاتصال. كل قسم له مشهده الخاص وزرته الخاصة ، عند النقر عليه ، ينتقل المستخدم إلى المشهد المناظر.
هام: تأكد من إضافة معالج سيحرر المستخدم من مكان الحادث ، وإلا فإنهم يخاطرون بالبقاء هناك إلى الأبد! سيكون من المفيد أيضًا إنشاء أمر عام واحد (يتم استخدام / saveme في برنامج الروبوت) ، والتي ستتم إضافتها إلى كل مشهد وإلى الملف الرئيسي. سيكون هذا الأمر بمثابة خروج من أي مشهد ، وكذلك إعادة تعيين إعدادات المستخدم.
والآن ، يريد المستخدم الذهاب إلى البحث عن الأفلام. من خلال النقر على الزر المناسب ، نقوم بنقله إلى مكان البحث. للراحة ، يحتوي كل مشهد على مجلد خاص به يحتوي على ملفات ، يؤدي كل منها وظيفة محددة.
داخل المشهد ، يمكنك استخدام البرامج الوسيطة الخاصة بك ، الموجودة في ملف middlewares.ts. على سبيل المثال ، باستخدام البرامج الوسيطة في مشهد البحث ، يمكننا ببساطة إعادة توجيه جميع المعلومات حول الفيلم إلى الطرق المناسبة ، بدلاً من القيام بنفس الوظيفة في كل مرة بداخلها.
لدى Telegram أيضًا لوحة مفاتيح مضمّنة. ربما تكون قد واجهت رسائل مع الأصوات ، والتي بموجبها هناك عدة أزرار شفافة ، وعندما تنقر على واحد منهم يتغير عدد الأصوات. هذه الأزرار هي لوحة المفاتيح المضمنة
يحتوي كل زر على معلومات ، عند النقر فوق الزر ، سيتم إرساله إلى المعالج المقابل.
يجب ألا يتجاوز حجم المعلومات المنقولة 64 بايت! لتعليم الروبوت للاستماع إلى نقرات الأزرار ، نحتاج إلى تسجيلهم باستخدام bot.action (/ trigger / ، callback). تحتوي المعلمة الأولى على جميع البيانات التي كانت مرتبطة بالزر. قررت استخدام شيء مثل Actions from Redux ، حيث يتم إرفاق كائن من النموذج {a: actionName ، p: payload} بكل زر. عند تسجيل المستمعين ، يمكننا استخدام RegExp بسيط ، على سبيل المثال: bot.action (/ actionName / ، callBack). جميع معالجات لوحة المفاتيح المضمنة موجودة في ملفات Actions.ts.
بالإضافة إلى ذلك ، توجد في بعض المشاهد ملفات helpers.ts ، والتي تحتوي على وظائف صغيرة يتم إخراجها من أجل تفريغ الملفات المتبقية. بالنسبة للجزء الأكبر ، هناك مولدات لوحة المفاتيح لإجراءات مختلفة من قبل المستخدم.
التعريب
بما أن هذا موضوع مهم ، أعتقد أنه يجدر ذكره بشكل منفصل. كما قلت سابقًا ، يحتوي Telegraf.js على عدد كبير إلى حد ما من البرامج الوسيطة ، أحدها
telegraf-i18n . يحتوي المستودع على إرشادات تفصيلية ولم أواجه أية مشكلات خاصة بهذا الأمر ، لكنني مع ذلك سأضيف بعض الكلمات حول كيفية عمل هذا في هذا المشروع.
يوجد مجلد لغات حيث توجد ملفات الترجمة ، وهي كائن JSON من النموذج {"key": "translation"}. علاوة على ذلك ، حيثما نحتاج إلى استخدام لغات مختلفة ، فإننا نستخدم الطريقة من هذه المكتبة ، حيث ننقل الترجمة التي نحتاجها حسب المفتاح ، وفي الناتج نحصل على الترجمة المقابلة. يمكن استخدام جلسة لتخزين معلومات حول اللغة التي يحددها المستخدم. كما تجدر الإشارة إلى الأزرار مرة أخرى. هناك وظيفة مطابقة في نفس المكتبة ، لذا إذا تغير النص الموجود على الزر وفقًا للغة ، فستساعدك هذه الوظيفة في تعليق المستمع الصحيح.
هام: إذا كنت تريد استخدام الترجمة وكتابة روبوت في TypeScript ، فلا تنس إضافة مجلد الترجمة إلى tsconfig.json ، وإلا فلن يتم تجميع الشفرة. على سبيل المثال:
"include": ["src/locales/*.json"]
استنتاج
شكرا لك على القراءة حتى النهاية! في هذه المقالة ، حاولت وصف عملية إنشاء روبوت Telegram ككل بالتفصيل قدر الإمكان ، دون أي ارتباط قوي بمشروعي. آمل أنه بعد قراءة هذا المقال ، وكذلك دراسة الكود المصدري لـ Eve ، يمكنك بسهولة إنشاء روبوت يمكن أن يساعدك.
كما وعدت ، يمكنك إلقاء نظرة على شفرة المصدر على
جيثب ، ومحاولة حواء في العمل
هنا . سأكون ممتنًا جدًا لأي نقد أو اقتراحات للتحسين.
أود أيضًا أن أشير إلى
القسم الموجود في وثائق Telegraf.js بمشاريع مثيرة للاهتمام ومفتوحة المصدر يمكنك أن تنظر إليها وتستلهمها الهندسة المعمارية والحلول. أنا ، بدوره ، أود أن أذكر واحد منهم -
الحرس الحرس . روبوت كبير حقًا وصنع جيدًا ، حيث اقترضت بعض الحلول لتطويري.
وفي الوقت الحالي ، أخبرت كل ما أردت ، سأكون سعيدًا بالإجابة على أسئلتكم واقتراحاتكم وتعليقاتكم!