به هفتمین جلسه از آموزش ساخت ربات تلگرام خوش آمدید. این جلسه به آموزش پاسخگویی به پیام در ربات تلگرام اختصاص خواهد داشت.
در جلسه قبل آموزش ساخت دکمه های شیشه ای در ربات تلگرام را دیدیم. در این جلسه سناریویی فرضی را در ذهن داریم که تا حدی مشابه جلسه قبل است. می خواهیم یک دکمه شیشه ای داشته باشیم که پس از کلیک بر روی آن، ربات اطلاعات فردی کاربر را از وی درخواست کند: ابتدا نام و نام خانوادگی و سپس سن کاربر. در نهایت نیز پس از دریافت این اطلاعات، پیام تشکری را به کاربر نشان می دهیم.
این سناریو از این جهت حائز اهمیت است که ما می خواهیم بدانیم که پیام دریافتی از سوی کاربر، در پاسخ به کدام سوال (پیام) ارسالی از سوی ربات بوده است. این موضوع آموزش جاری است که در ادامه به پیاده سازی آن خواهیم پرداخت. پس با ما همراه باشید…
پاسخگویی به پیام در ربات تلگرام
ساخت دکمه شیشه ای مورد نیاز
برای ساخت دکمه شیشه ای موردنظر خود مانند جلسه قبل عمل می کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $inline_keyboard = [ [ [ 'text' => "ثبت نام" , 'callback_data' => "register" ] ] , ]; $inline_kb_options = [ 'inline_keyboard' => $inline_keyboard ]; ?> |
در قطعه کد فوق یک دکمه شیشه ای ایجاد شده که متن «ثبت نام» بر روی آن قرار می گیرد. همه چیز مشابه آموزش جلسه قبل است. چنانچه با همان دستور start/ و تابع ()show_menu جلسه قبل ربات را راه اندازی کنیم، خروجی زیر را در ربات مشاهده خواهیم کرد:
نمایش دکمه شیشه ای در ربات تلگرام
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php switch($text) { case "/start" : show_menu(); break; } //-------------------- function show_menu() { $json_kb = json_encode($GLOBALS['inline_kb_options']); $reply = $GLOBALS['click_on_button']; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply , 'reply_markup' => $json_kb ]; send_reply($url, $post_params); } ?> |
تنها تغییری که در تابع ()show_menu نسبت به جلسه قبل بوجود آمده، استفاده از متغیر click_on_button به جای پیغام متنی مستقیم است. در این جلسه کمی کدمان را تمیزتر کرده و برای هر کدام از پیام هایی که می خواهیم در ربات برای کاربر ارسال کنیم، در ابتدای برنامه یک متغیر تعریف کرده ایم.
1 2 3 4 5 6 7 8 |
<?php $click_on_button = "برای ثبت نام بر روی دکمه زیر کلیک کنید"; $enter_your_name = "نام و نام خانوادگی خود را وارد کنید"; $enter_your_age = "سن خود را وارد کنید"; $register_successful = "با تشکر - ثبت نام شما انجام شد"; ?> |
کدهای تابع detect_callback_received_and_reply
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php function detect_callback_received_and_reply() { $callback_data = $GLOBALS['data']; if($callback_data == "register") { $force_reply_options = [ 'force_reply' => true ]; $json_fr = json_encode($force_reply_options); $reply = $GLOBALS['enter_your_name']; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply , 'reply_markup' => $json_fr ]; send_reply($url, $post_params); } } ?> |
کدهای استفاده شده در تابع ()detect_callback_received_and_reply هم تا حد زیادی مشابه جلسه قبل است. تفاوت اصلی این است که این بار پس از کلیک بر روی دکمه شیشه ای، می خواهیم درخواستمان از کاربر را به صورت پاسخگویی به پیام (reply) نمایش دهیم. برای این کار دو خط ۹ و ۱۰ به کد قبلی اضافه شده است.
خروجی به این صورت است:
پاسخگویی به پیام در پاسخ به فشردن دکمه شیشه ای
کدهای مورد نیاز برای پاسخگویی به پیام در ربات تلگرام
برای پاسخگویی به پیام در ربات تلگرام اولین کار تغییردادن کدهای مربوط به جیسون دریافتی از سوی سرور تلگرام است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php if( isset($update_array["callback_query"]) ) { $data = $update_array["callback_query"]["data"]; $callback_query_id = $update_array["callback_query"]["id"]; $chat_id = $update_array["callback_query"]["message"]["chat"]["id"]; detect_callback_received_and_reply(); } else if( isset($update_array["message"]) ) { $text = $update_array["message"]["text"]; $chat_id = $update_array["message"]["chat"]["id"]; if( isset($update_array["message"]["reply_to_message"]) ) { $text_replied = $update_array["message"]["reply_to_message"]["text"]; detect_text_received_and_reply(); } } ?> |
کدها همانند قبل هستند، تنها خطوط هایلایت شده می بایست اضافه شوند. کدهای مربوط به تابع ()detect_text_received_and_reply را در ادامه خواهیم دید.
کدهای تابع detect_text_received_and_reply
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php function detect_text_received_and_reply() { $text = $GLOBALS['text']; // پیام دریافتی از کاربر $text_replied = $GLOBALS['text_replied']; // پیام ارسالی اولیه از سوی ربات switch($text_replied) { case ($GLOBALS['enter_your_name']) : // ذخیره پیام ورودی $force_reply_options = [ 'force_reply' => true ]; $json_fr = json_encode($force_reply_options); $reply = $GLOBALS['enter_your_age']; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply , 'reply_markup' => $json_fr ]; send_reply($url, $post_params); break; case ($GLOBALS['enter_your_age']) : // ذخیره پیام ورودی $reply = $GLOBALS['register_successful']; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); break; } } ?> |
در خطوط ۵ و ۶ دو متغیر به نام های text$ و text_replied$ تعریف شده است. در خط ۸ به متغیر text_replied$ سوئیچ کرده و حالتهای مختلف آن را بررسی می کنیم. چنانچه مقدار این متغیر برابر با enter_your_name (نام و نام خانوادگی خود را وارد کنید) باشد، مجددا ربات را به حالت پاسخگویی (reply) برده و سوال دوم را از کاربر می پرسیم (enter_your_age ، معادل: سن خود را وارد کنید).
در case دوم نیز سوال و جواب را خاتمه داده و با یک پیغام تشکر، کار را تمام می کنیم (register_successful ، معادل: با تشکر – ثبت نام شما انجام شد).
خروجی این دو مرحله را در ادامه می بینید:
پاسخگویی به پیام در ربات تلگرام – پاسخگویی به سوال اول
پاسخگویی به پیام در ربات تلگرام – پاسخگویی به سوال دوم
پاسخگویی به پیام در ربات تلگرام – خاتمه عملیات
این جلسه آموزشی نیز به پایان رسید. دیدیم که چگونه می توانیم پاسخگویی به پیام در ربات تلگرام را انجام دهیم. در آینده با بخش های دیگری از ربات تلگرام آشنا خواهیم شد. با ما همراه باشید…
20 دیدگاه. ارسال دیدگاه جدید
سلام استاد خسته نباشید
میخواستم ببینم امکان داره برای بهتر نوشتن کدها، به جای اینکه متن در کد نوشته بشه در یه فایل تکست دیگه نوشته بشه و آدرس اون به ربات داده بشه تا هنگام نیاز متن رو از تکست برای کاربر بفرسته؟
مثلا عبارت «لطفا از منوی زیر یک گزینه را انتخاب کنید» در یه فایل تکست جداگانه باشه
بله دوست عزیز، اتفاقا در پروژه های بزرگتر کار درست و اصولی همین هست.
البته اون فایل جانبی باید یه فایل PHP باشه که شما با ضمیمه کردنش به فایل اصلی ربات بتونید به متغیرهای درون اون (همون جملات و عبارات) دسترسی داشته باشید.
سلام
ممنون از آموزشهاتون، خیلی به من کمک کردش.
یه سوال داشتم. اگر بخوام بدون دیتابیس فقط ۲ تا عدد از کاربر بگیرم با هم جمع کنم، باید چی کار کنم؟
دوست عزیز به هر حال عدد اول رو که از کاربر دریافت می کنید باید در جایی ذخیرش کنید. حالا یا در دیتابیس و یا درون یک فایل متنی.
توی آموزشهاتون فایل متنی رو آموزش دادید؟
بله دوست عزیز، کار با فایلها در دوره آموزش PHP در جلسات نهم و دهم آموزش داده شده.
با سلام
چرا در بخش مربوط به انکود جیسون از متغییر گلوبال نمی شه استفاده کرد؟
چرا اگر این طوری نوشته شود جواب نمی دهد، در صورتی که هر دو یک چیز هستند.
با تشکر فراوان
دوست عزیز دلیلش این هست که متغیر force_reply_options$ که می بایست به تابع ()json_encode پاس بشه، دقیقا در خط بالایی تعریف شده و براحتی در دسترس هست.
GLOBALS$ زمانی استفاده میشه که متغیر موردنیاز جهت دسترسی، در خارج از بخش (تابع مربوطه) تعریف شده باشه و ما مستقیما به اون دسترسی نداشته باشیم.
خیلی ممنون
خواهش میکنم دوست عزیز، موفق باشید.
با عرض سلام و خسته نباشید
چطور میتونیم یوزرنیم (username@) شخص رو بدست بیاریم؟
دوست عزیز اگر کاربر برای خودش یوزرنیم ایجاد کرده باشه، توسط کد زیر (در همون بخش ابتدایی کد ربات) میتونید اون رو اسخراج کنید:
سلام
اول از همه تشکر و خسته نباشید بگم بابت مطالب آموزندتون
سوالی از خدمتتون داشتم
بنده وقتی کلید شیشه ای ثبت نام رو کلیک میکنم و به نوعی وارد تابع detect_text_received_and_reply میشم،
منو روی کیبورد و آیکون مربوطش حذف میشه (منو جلسه ۵ آموزش) و برای بازگشت منو باید دستور استارت مجدد وارد کنم.
میشه راهنمایی کنید چیکار باید کرد که این منو باقی بمونه؟
دوست عزیز این مسئله توی برخی از پلتفرم های تلگرام وجود داره و هنوز حل نشده.
راه کارش استفاده از همون دستور start/ هست و یا اینکه بعد از ریپلای شدن پیام، شما مجددا در جواب، دکمه های منو رو به کاربر نمایش بدین (با استفاده از پارامتر reply_markup).
سلام مجدد
در مثال بالا میشه بفرمایید در تابع detect_text_received_and_reply پارامتر reply_markup را کجا و به چه صورت باید استفاده کنم؟
دوست عزیز پارامتر reply_markup باید در case دوم و در انتهای آرایه post_params استفاده بشه.
برای جزئیات بیشتر به جلسات پنجم (ساخت منو در ربات تلگرام) و ششم (ساخت دکمه های شیشه ای در ربات تلگرام) مراجعه کنید.
سلام وقتتون بخیر
میشه لطفا کمکم کنین
توی کد بالا اونجایی که نوشتین “ذخیره پیام ورودی” من میخوام متنی که کاربر فرستاده رو توی یه متغیر ذخیره کنم که بعدا ازش استفاده کنم!
بصورت زیر ذخیره میکنم ولی جواب نمیگیرم!
[‘name2= $GLOBALS[ ‘text$
دوست عزیز من متوجه منظورتون نشدم.
شما پیام دریافتی از کاربر رو در متغیر text$ دارین.
خب، مشکل چیه که میگین جواب نمی گیرم؟
خط ۱۲ اسم طرفو تو یه متغیر x ذخیره میکنم ! خط ۲۵ هم سن طرفو تو یه متغیر y ذخیره میکنم!
بعدا که میخوام این دوتارو برای خود طرف بفرستم ، مقدار متغیر x برگردونده نمیشه ! ولی y چرا
دوست عزیز دلیلش اینه که شما توی case دوم از محدوده مجاز دسترسی به متغیر x خارج شدین و دیگه نمیتونین به اون دسترسی داشته باشین
برای ذخیره مقادیر، شما باید این اطلاعات رو توی یه فایل ذخیره کنین و یا توی دیتابیس (نه متغیر)