
نواصل قصة تطوير روبوت Telegram للبحث عن التذاكر - HappyTicketsBot ، يمكن العثور
على البداية في الجزء الأول .
في الثاني ، سأتحدث عن الروبوت نفسه ، شارك الرمز ، وكذلك الأفكار التي من المرجح ألا تصبح حقيقة واقعة. معظم الوظائف بحلول وقت إنشاء الروبوت كانت مكتوبة بالفعل بتنسيق نصي ، لذلك كانت المهمة الرئيسية هي إنشاء واجهة تفاعل المستخدم عبر Telegram-messenger. اتضح أنه ليس علميا كما هو الحال في الجزء الأول ، لذلك الاهتمام هو الكثير من التعليمات البرمجية.
Spoiler: HappyTicketsBot لم يطير بعيدًا لتشغيل خادم أجنبي ، إنه محلي وروسي ، لكن يومًا ما (أعتقد) سيبدأ =)
استكمال: بعد أن تم مشاركة الروبوت بين جمهور المسرح ، كتبوا عنه في وسائل الإعلام. طوفان من المستخدمين ارتفع بشكل حاد. بعد يومين من اللعبة ، "استلمها على الفور ، وكيف سقطت" ، انتقل الروبوت إلى الخادم وشهد عددًا من التحسينات. أنا راضي =)
1. بدءا من الصفر
نظرًا لعدم وجود كلمة على الإطلاق في تصميم روبوتات Telegram ، كان علي أن أبدأ بالمقالات والبرامج التعليمية الأساسية ، والتي تعد كثيرة جدًا على الشبكة. نعم ، بالمناسبة ، ما هي النهاية في ذلك الوقت ، كما تخيلت بشكل سيء)) أصبحت
هذه المجموعة من الدروس هي الأكثر إفادة وتطبيقاً. الوحدة التي تتفاعل مع Telegram كانت pyTelegramBotAPI (
github ).
استغرق أطول من تطوير أيديولوجية الديكور ، قرأت عنها في
هذه المقالة . هناك جزءان ومفهومان للغاية.
2. البرنامج النصي للتفاعل الروبوت مع المستخدم. البحث الأساسي
كما ذكرنا سابقًا في المقدمة والجزء
الأول من المقالة ، كانت كل شفرة التحليل تقريبًا جاهزة. بقي لتغيير طريقة تحديد معايير البحث. بناءً على ذلك ، تم بناء برنامج سلوك بوت. تقتصر الأوامر المتاحة للمستخدم على المجموعة التالية:
- / بحث - بدء بحث جديد ،
- / إعادة تعيين - إعادة تعيين معلمات البحث وبدء واحدة جديدة ،
- / LastSearch - إرجاع النتائج باستخدام معلمات الاستعلام الأخير ،
- / addURL أضف عنوان URL الخاص بالأداء في اهتمامات لتتبع خفض الأسعار ،
- / checkURL - تحديث الأسعار لأداء الفائدة ،
- / showURL - سرد جميع عناوين URL المضافة إلى قائمة الاهتمامات
وفقًا لبرنامج البحث
/ البحث الأساسي
، ينتقل المستخدم من حالة إلى أخرى ، ويدخل بالتتابع البيانات اللازمة للمرشح. بعد إدخال المعلمة الأخيرة - مكان العرض التقديمي - يتم تحليل الملصق مباشرةً باستخدام القواميس المعلنة عالميًا ، حيث يكون المفتاح هو معرف المستخدم ، والقيم هي معلمات البحث المدخلة.
من أجل تذكر حالة المستخدم ، يتم تخزينها في قاعدة البيانات. للعمل معها ، يتم استخدام وحدات Vedis (مكون قاعدة بيانات ذات قيمة مفتاح ، وقراءة
الوثائق ) ، وتستخدم التعداد (العمل مع التعدادات ، التفاصيل
1 ،
2 ).
في ملف تكوين منفصل ، Myconfig.py ، قمنا بتعيين معلمات bot (بما في ذلك الرمز المميز الفريد الذي تم استلامه من Telegram) وسرد الحالات التي يمكن للمستخدم الدخول إليها. خرجوا قليلا.
from enum import Enum token = "4225555:AAGmfghjuGOI4sdfsdfs5656sdfsdf_c"
نتيجة لذلك ، حصلنا على سلسلة واضحة من انتقال الحالة من واحدة إلى أخرى.

للتخزين نستخدم قاعدة بيانات Vedis. تتم تهيئة المستخدم الذي أرسل الرسالة دائمًا من خلال message.chat.id.
رمز ملف dbwoker.py ، الذي يصف التفاعل مع قاعدة البيانات from vedis import Vedis import Myconfig as config
يوجد أدناه مثال عن معالج يتم تنشيطه بواسطة الأمر / find. كما ترون ، في هذا المثال ، لا يوجد إدخال بيانات - لا يوجد سوى تغيير للحالة إلى "S_ENTER_MONTH". بعد رؤية الرسالة عند إدخال الرقم ، يقوم المستخدم بإدخالها وإرسال رسالة. عند استلام رسالة بالحالة S_ENTER_MONTH ، تبدأ الخطوة التالية. في حالة أخطاء الإدخال ، لا يتغير الوضع.
إذا استقبل الروبوت رسالة من أحد المستخدمين بالحالة S_ENTER_MONTH ، فسيتم تشغيل المعالج التالي. من الناحية الأيديولوجية ، يحدث أيضًا في المراحل الأخرى من البرنامج النصي للبحث الأساسي.
@bot.message_handler(func=lambda message: dbworker.get_current_state(message.chat.id) == config.States.S_ENTER_MONTH.value) def user_entering_month(message): if not message.text.isdigit(): bot.send_message(message.chat.id, ", ") return # 1 num[message.chat.id]=message.text # if int(num[message.chat.id])>12 or int(num[message.chat.id])<1: bot.send_message(message.chat.id, " 1 12. ") # 2 return url_list[message.chat.id]=take_url(num[message.chat.id]) # URL- if url_list[message.chat.id]==[]: # bot.send_message(message.chat.id, " , . ") return bot.send_message(message.chat.id, "! .") dbworker.set_state(message.chat.id, config.States.S_ENTER_PRICE.value) #
بالإضافة إلى البحث القياسي ، من الممكن حفظ العروض المثيرة للاهتمام.
3. تتبع التغيرات في الأسعار
يمكن للمستخدم إضافة عناوين URL إلى قائمة الاهتمامات لتلقي تنبيه عند انخفاض السعر. نتذكر أنه لا يزال لدينا حالة غير مدرجة في البحث الأساسي - S_ENTER_URL. ال
@bot.message_handler(commands=["addURL"]) def cmd_add_url(message): bot.send_message(message.chat.id, " url, . https://") dbworker.set_state(message.chat.id, config.States.S_ENTER_URL.value) # @bot.message_handler(func=lambda message: dbworker.get_current_state(message.chat.id) == config.States.S_ENTER_URL.value) def user_entering_URL(message): perf_url=message.text user_id=message.chat.id try: add_new_URL(user_id,perf_url) bot.send_message(message.chat.id, ' !') dbworker.set_state(message.chat.id, config.States.S_START.value) # except: bot.send_message(message.chat.id, 'URL ! !') dbworker.set_state(message.chat.id, config.States.S_ENTER_URL.value)
لتخزين القائمة ، استخدم ملف .csv. للتفاعل معها ، تحتاج إلى وظيفتين - الكتابة والقراءة مع التحقق من تغيرات الأسعار. إذا تغير ، أخبر المستخدم.
def add_new_URL(user_id,perf_url): WAITING_FILE = "waiting_list.csv" with open(WAITING_FILE, "a", newline="") as file: curent_url='https://'+perf_url text=get_text(curent_url)
رمز وظيفة تحديث الأسعار أطول قليلاً def update_prices(bot): WAITING_FILE = "waiting_list.csv" with open(WAITING_FILE, "r", newline="") as file: reader = csv.reader(file) waitingList=[] for row in reader: waitingList.append(list(row)) L=len(waitingList) lowest={} with open(WAITING_FILE, "w", newline="") as fl: writer = csv.writer(fl) for i in range(L): lowest[waitingList[i][1]]=waitingList[i][2]
نتيجة لذلك ، من خلال الأمر
/ checkURL ، يمكن للمستخدم الحصول على هذه النتيجة (الآن أدرك أنه سيكون من الضروري عرض اسم الأداء ، أيضًا ، لكن هذه أشياء من السلسلة "لم تصل إلى الأيدي").

حسنا حسنا. يمكننا البحث ، يمكننا تتبع. لقد بدأ زوجين من الأصدقاء باستخدام الروبوت ، وأردت معرفة من هم وما الذي يبحثون عنه. هذه المعلومات جيدة لكتابة في السجلات.
4. نكتب النشاط والأخطاء في السجلات
وحدة تسجيل سوف تساعدنا في هذا. يتم تسجيل المعلومات فقط في مرحلة إكمال البحث الأساسي ، في المعالج ، حيث تنتقل حالة المستخدم من S_ENTER_PLACE إلى S_START. خطأ تسجيل ، بدوره ، يحدث عندما تحدث.
لا أستطيع أن أقول الكثير عن كيفية عمل الوحدة ، لذلك من الأفضل أن تنتقل إلى المعلومات في
الخارج .

وصف المسجل def save_logs(str): loggerInfo.info(str)
بسبب اتصال غير متصل ، تعطل الروبوت بشكل دوري ، لذلك تم اكتشاف خطأ في الاتصال بالإنترنت وإعادة تشغيل الروبوت تلقائيًا بعد 10 ثوانٍ. لكنه لم ينقذ دائمًا ، لذلك ظللت يعمل على برنامج TeamViewer لرفعه إذا لزم الأمر.
5. غير محققة
لقد حصلنا على الروبوت الذي يحل محل وظيفة البرنامج النصي ، ولكن يسمح لك بتلقي المعلومات في شكل مناسب داخل برنامج المراسلة. أغلق احتياجاتي الأساسية.
استمر التفكيك مع الوحدات النمطية وكتابة معالجات رفيعة حوالي شهر في وضع العمل في عطلات نهاية الأسبوع وأحيانًا في المساء. في نهاية هذه الفترة ، بدأ الاهتمام في التلاشي وتوقف الأداء الوظيفي عند نقطة البداية. لم يكن من الممكن اختراق مبادئ العمل على webhook-ahs ، ثم تم حظر Telegram. قبل ذلك ، كانت هناك خطة لسحب النهاية الخلفية إلى خادم عمل ، ولكن ... لن يتم وضع vpn هناك لهذا =)
إليك ما تبقى في الخطط ، بعضها يمكن تحقيقه وسيحققه مرة واحدة في أمسية صيفية / شتوية ضعيفة:
- اختبار الحمل مع تدفق كبير من المستخدمين. لم يتضح بعد ما إذا كانت الروبوتات ستعمل بثبات ولن تخلط بين المستخدمين ؛
- إشعار بظهور أداء جديد في جدول الفنان. لدي العديد من "الأرانب البيضاء" المفضلة ، لا يمكنني تتبع الجميع (لكنني أرغب في ذلك) ؛
- إشعار بظهور بيع تذاكر فئة معينة. كان هناك أحد معارفه ، أحد الهواة في الصف الأول من الأكشاك ، كان من الصعب اللحاق به يدويًا ؛
- التحقق التلقائي المنتظم لعناوين URL ذات الأهمية بالنسبة لخفض الأسعار حسب الموقت. الآن يتم ذلك بناءً على الأمر ، لا يمكن ضبط المؤقت بسرعة ، لذلك تم تركه بطريقة بسيطة ؛
- الحفاظ على تاريخها من الزيارات إلى العروض. في مكان ما في ملف .csv ، اسم تاريخ الفنانين - تعليقك حتى لا تخسره ؛
- البحث عن فئة معينة من التذاكر. ليس فقط السعر ، ولكن أيضًا القطاع (الطابق الأرضي ، إلخ) ؛
- نقل كل شيء إلى مهارة أليس. لم لا؟
- جعل تطبيق المحمول مع نفس الوظيفة. لم لا؟
كان هناك اتصال في مسرح البولشوي. للقبض على تذاكر Nureyev ، لكنني لم أستطع التقاط ملصقات html في أمسيين ، لذلك تم تأجيلها أيضًا من قائمة الملصقات غير المحققة.
حكم
كان الكسل هو محرك التقدم ، وأوقفه. لم تتم الأمور عند تحميل برنامج الروبوت إلى خادم تابع لجهة خارجية ؛ ومع ذلك ، فإن ذلك يتطلب كفاءات ومعرفة أوسع في مجال الويب. لقد كان المشروع مثيراً للاهتمام وسمح لنا أن نتعلم بيثون أفضل قليلاً ، ونرى جانبًا آخر منه (بالإضافة إلى التعلم الآلي المعتاد) ، كما قدم العديد من الأمسيات الرائعة في المسرح بسعر معقول. بفضله على هذا ، قام بإغلاق المهام مع اثارة ضجة.
بغض النظر عن كيف حاولت ، فإن المقالة لا تزال تحصل على الكثير من التعليمات البرمجية ونص صغير. سأكون سعيداً لشرح ما هو غير مفهوم أو غير موصوف في التعليقات =)