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

منتشر‌شده در: وبسایت 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 object
def 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 answers
def 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 user
def 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 correct
def 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)

شکل ۳. تصویر تبلیغاتی منظم
شکل ۳. تصویر تبلیغاتی منظم
این متن با استفاده از ربات مترجم مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.