روبوت برقية بسيط في بيثون في 30 دقيقة

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

الجزء 1: تسجيل روبوت


الجزء الأبسط والأكثر وصفًا. باختصار شديد: تحتاج إلى العثور على botFather @ bot ، وكتابته / start ، أو / newbot ، وقم بملء الحقول التي يسألها (اسم الروبوت واسمه المختصر) ، واحصل على رسالة تحتوي على رمز bot ورابط إلى الوثائق. يجب حفظ الرمز المميز ، ويُفضل أن يكون موثوقًا به ، لأن هذا هو المفتاح الوحيد لترخيص الروبوت والتفاعل معه.

الجزء 2: التحضير لكتابة التعليمات البرمجية


كما سبق ذكره في العنوان ، سنكتب الروبوت في بيثون. توضح هذه المقالة كيفية العمل مع مكتبة PyTelegramBotAPI (Telebot). إذا لم يكن Python مثبتًا لديك ، فأنت بحاجة أولاً إلى القيام بذلك: في محطة Linux ، تحتاج إلى الدخول

sudo apt-get install python python-pip 

إذا كنت تستخدم Windows ، فأنت بحاجة إلى تنزيل Python من الموقع الرسمي.

بعد ذلك ، في محطة Linux أو موجه أوامر Windows ، أدخل

 pip install pytelegrambotapi 

أنت الآن جاهز لكتابة الرمز.

الجزء 3: تلقي الرسائل ونقول "مرحبا"


استطراد صغير. يمكن للبرق أن يخبر الروبوت عن إجراءات المستخدم بطريقتين: من خلال الاستجابة لطلب الخادم (Long Poll) ، ومن خلال Webhook ، عندما يرسل خادم Telegram نفسه رسالة كتبها شخص ما إلى الروبوت. من الواضح أن الطريقة الثانية تبدو أفضل ، ولكنها تتطلب عنوان IP مخصصًا ، ويتم تثبيت SSL على الخادم. في هذه المقالة أريد أن أتحدث عن كتابة روبوت ، وليس إعداد خادم ، لذلك سنستخدم Long Poll.

افتح محرر النصوص المفضل لديك ، ودعنا نكتب رمز الروبوت!

أول شيء فعله هو استيراد مكتبتنا وتوصيل الرمز المميز للبوت:

 import telebot; bot = telebot.TeleBot('% %'); 

أعلن الآن طريقة لتلقي الرسائل النصية:

 @bot.message_handler(content_types=['text']) def get_text_messages(message): 

في هذا القسم من الشفرة ، أعلنا مستمعًا للرسائل النصية وطريقة معالجتها. يمكن أن يأخذ حقل content_types قيمًا مختلفة ، وليس واحدة فقط ، على سبيل المثال

 @bot.message_handler(content_types=['text', 'document', 'audio']) 

سوف تستجيب للرسائل النصية والوثائق والصوت. يمكن الاطلاع على مزيد من التفاصيل في الوثائق الرسمية.

سنقوم الآن بإضافة القليل من الوظائف إلى طريقتنا: إذا كتب المستخدم "Hello" إلينا ، فسنقول "Hello ، كيف يمكنني مساعدتك؟" ، وإذا كتبوا لنا الأمر "/ help" ، فسوف نطلب من المستخدم كتابة "Hello":

 if message.text == "": bot.send_message(message.from_user.id, ",     ?") elif message.text == "/help": bot.send_message(message.from_user.id, " ") else: bot.send_message(message.from_user.id, "   .  /help.") 

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

 bot.polling(none_stop=True, interval=0) 

الآن سوف يسأل برنامج الروبوت الخاص بنا باستمرار خادم Telegram "هل كتب لي أحدهم؟" وإذا كتبنا إلى برنامج الروبوت الخاص بنا ، فسيقوم Telegram بإرسال رسالتنا. نحن نحفظ الملف بأكمله ، والكتابة في وحدة التحكم

 python bot.py 

حيث bot.py هو اسم ملفنا.

الآن يمكنك كتابة روبوت وإلقاء نظرة على النتيجة:

الصورة

الجزء 4: أزرار المواضيع والرسالة


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

 name = ''; surname = ''; age = 0; @bot.message_handler(content_types=['text']) def start(message): if message.text == '/reg': bot.send_message(message.from_user.id, "  ?"); bot.register_next_step_handler(message, get_name); #  –  get_name else: bot.send_message(message.from_user.id, ' /reg'); def get_name(message): #  global name; name = message.text; bot.send_message(message.from_user.id, '   ?'); bot.register_next_step_handler(message, get_surnme); def get_surname(message): global surname; surname = message.text; bot.send_message('  ?'); bot.register_next_step_handler(message, get_age); def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); bot.send_message(message.from_user.id, ' '+str(age)+' ,   '+name+' '+surname+'?') 

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

 def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); keyboard = types.InlineKeyboardMarkup(); #  key_yes = types.InlineKeyboardButton(text='', callback_data='yes'); # «» keyboard.add(key_yes); #    key_no= types.InlineKeyboardButton(text='', callback_data='no'); keyboard.add(key_no); question = ' '+str(age)+' ,   '+name+' '+surname+'?'; bot.send_message(message.from_user.id, text=question, reply_markup=keyboard) 

والآن يقوم برنامج الروبوت الخاص بنا بإرسال لوحة المفاتيح ، ولكن إذا قمت بالنقر فوقها ، فلن يحدث شيء. لأننا لم نكتب طريقة معالج. دعنا نكتب:

 @bot.callback_query_handler(func=lambda call: True) def callback_worker(call): if call.data == "yes": #call.data  callback_data,       .... #  ,    bot.send_message(call.message.chat.id, ' : )'); elif call.data == "no": ... # 

يبقى فقط إلحاق سطر واحد إلى بداية الملف:

 from telebot import types 

هذا كل شيء ، حفظ وتشغيل الروبوت لدينا:

الصورة

Source: https://habr.com/ru/post/ar442800/


All Articles