ساخت یک ربات آزمون تلگرام با پایتون

منتشر‌شده در: وبسایت towardsdatascience به تاریخ ۱۱ می ۲۰۲۱ لینک منبع: Creating a Telegram Chatbot Quiz with Pythonیکی از ویژگی‌هایی که تلگرام را به یک سکوی Chatbot عالی تبدیل می‌کند، توانایی ایجاد رای‌گیری‌ها است. این مورد در سال ۲۰۱۹ معرفی شد، که بعدا با اضافه کردن حالت آزمون و از همه مهم‌تر با در دسترس قرار دادن آن برای API چت‌بات تلگرام بهبود یافت.این امکان وجود دارد که یک نظرسنجی را مستقیما در برنامه تلگرام (بدون کد گذاری) ایجاد کنیم اما در اینجا به بررسی چگونگی توسعه یک آزمون تلگرام Chatbot با استفاده از کتابخانه بات تلگرام پایتون می‌پردازیم.اول کمی گرم شدن: با یک مثال زنده بازی کنید و دانش خود از سرمایه‌های جهان را تست کنید. گفتگو را با دستور / شروع (*) قطع کنید.مسابقه قهرمانی جهان(*) لطفا صبور باشید، به محض تقاضا پیش می‌رود و ممکن است چند ثانیه طول بکشد تا بیدار شوید و گپ زدن را شروع کنید.راه‌اندازی Chatbotآماده‌سازی شامل ۳ مرحله است:با BotFather صحبت کنید تا یک بات جدید ایجاد کنید و مجوز توکن را به دست آورید.آبجکت به‌روزرسانی و مجریان روش را پیکره‌بندی کنید.چت‌بات را شروع کنید (در حالت رای‌گیری در این مثال، اما در عوض می‌توان از یک قلاب‌وب استفاده کرد)def main(): updater = Updater('secret token', use_context=True) dp = updater.dispatcher # command handlers dp.add_handler(CommandHandler("help", help_command_handler)) # message handler dp.add_handler(MessageHandler(Filters.text, main_handler)) # quiz handler dp.add_handler(PollHandler(poll_handler, pass_chat_data=True, pass_user_data=True)) # start updater.start_polling() updater.idle()مهم است که درک کنیم که مربیان تعریف‌شده در بالا، مسئول پردازش فرمان «کمک»، پیام‌های متنی ساده و پاسخ‌های نظرسنجی هستند.شناسه گپ را به دست آورید:ما در ابتدا می‌خواهیم یک روش کمکی برای گرفتن Chat id ایجاد کنیم: این روش در این آموزش بسیار مفید خواهد بود، اگر شما دیگر ربات‌های تلگرام را توسعه دهید.# extract chat_id based on the incoming objectdef get_chat_id(update, context): chat_id = -1 if update.message is not None: chat_id = update.message.chat.id elif update.callback_query is not None: chat_id = update.callback_query.message.chat.id elif update.poll is not None: chat_id = context.bot_data[update.poll.id] return chat_idسوال امتحانایجاد پاسخ پرس و جو را می‌توان با استفاده از روش send_poll انجام داد.c_id = get_chat_id(update, context)q = 'What is the capital of Italy?'answers = ['Rome', 'London', 'Amsterdam']message = context.bot.send_poll(chat_id=c_id, question=q, options=answers, type=Poll.QUIZ, correct_option_id=0)type باید Poll.QUIZ باشد تا اثرات تست را تحریک کند و correct_option_id باید با گزینه صحیح در لیست ارائه‌شدهanswers مطابقت داشته باشد.افزایش سوالات آزمونبیایید به اصول اولیه خاتمه ندهیم، بلکه آزمون را کمی خیال‌انگیزتر کنیم. می‌توان یک شمارش معکوس برای هیجان‌انگیزتر کردن آن اضافه کرد:message = context.bot.send_poll(chat_id=c_id, question=q, options=answers, type=Poll.QUIZ, correct_option_id=0, open_period=5)شکل ۱. سوال با زمان ۵ ثانیه یک توضیح اضافی را می‌توان برای ارائه اطلاعات بیشتر پس از اینکه کاربر پاسخ داده‌است، در نظر گرفت: به آیکون لامپ موجود برای کاربر توجه کنید.message = context.bot.send_poll(chat_id=c_id, question=q, options=answers, type=Poll.QUIZ, correct_option_id=0, explanation= 'Well, honestly that depends on what you eat', explanation_parse_mode = telegram.ParseMode.MARKDOWN_V2)شکل ۲. پرسش با «توضیح» اضافی ممکن است به مطالعه مقاله تابع نقشه در پایتون علاقمند باشید.پردازش پاسخمهم است که بدانیم چگونه پاسخ‌های کاربر را پردازش کنیم.در اصل API تلگرام BOT روش‌ها و ابجکت‌ها را برای ارائه یک رابط خوب و همچنین جشن گرفتن پاسخ صحیح (یا علامت زدن یک پاسخ اشتباه) فراهم می‌کند. با این حال، توسعه‌دهنده باید پاسخ‌های موفق را پی‌گیری کند و منطق لازم را ایجاد کند، مانند محاسبه یک امتیاز، افزایش پیچیدگی سوال زیر، و غیره.تمام پاسخ‌های سوالات به PollHandler فرستاده می‌شوند که در آن آبجکت به‌‌روز‌رسانی با تمام اطلاعات لازم، محموله را حمل خواهد کرد.# handling Poll answersdef poll_handler(update, context): # Quiz question question = update.poll.question # position of correct answer correct_answer = update.poll.correct_option_id # first option (text and voted yes|no) option_1_text = update.poll.options[0].text option_1_vote = update.poll.options[0].voter_countهر option در بار مفید نشان می‌دهد که آیا رای داده شده است یا خیر (voter_count برابر با ۱).# find the answer chosen by the userdef get_answer(update): answers = update.poll.options ret = "" for answer in answers: if answer.voter_count == 1: # found it ret = answer.text break return retبا استفاده ازcorrect_option_id می‌توان تعیین کرد که آیا پاسخ داده‌شده توسط کاربر صحیح است یا خیر.# determine if user answer is correctdef is_answer_correct(update): answers = update.poll.options ret = False counter = 0 for answer in answers: if answer.voter_count == 1 and \ update.poll.correct_option_id == counter: ret = True break counter = counter + 1 return retتفاوت‌های عادی نظرسنجیایجاد یک نظرسنجی معمولی به جای یک آزمون امکان‌پذیر است: منطق و کد یکسان هستند، با این حال، تفاوت‌هایی وجود دارد که نظرسنجی استاندارد را برای نظرسنجی و پرسشنامه مناسب‌تر می‌کند:جشن گرفتن بدون کاغذ رنگیاجازه دادن به پاسخ‌های چندگانهقابل رویت بودن نتایج برای کاربرانmessage = context.bot.send_poll(chat_id=cid, question=q, options=answers, type=Poll.REGULAR, allows_multiple_answers=True, is_anonymous=False)شکل ۳. تصویر تبلیغاتی منظم این متن با استفاده از ربات مترجم مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.