به ششمین جلسه از آموزش ساخت ربات تلگرام خوش آمدید. این جلسه به آموزش ساخت دکمه های شیشه ای در ربات تلگرام اختصاص خواهد داشت.
دکمه های شیشه ای نوعی از دکمه ها در ربات تلگرام هستند که برخلاف دکمه های منو (که در جلسه قبل آموزش داده شد)، در متن گفتگو و در میان پیام های ربات نمایش داده می شوند. عملکردهای مختلفی برای دکمه های شیشه ای در ربات تلگرام وجود دارد، از جمله: باز کردن یک آدرس وب (url)، ارسال اطلاعات (data) به ربات جهت مشخص کردن واکنش کاربر به یک سوال، نظرسنجی و …
می خواهید بدانید که نحوه ساخت دکمه های شیشه ای در ربات تلگرام به چه صورت است؟ پس با ما همراه باشید…
دکمه های شیشه ای در ربات تلگرام
ساخت دکمه های شیشه ای در ربات تلگرام
برای ساخت دکمه های شیشه ای در ربات تلگرام اولین قدم تعریف دکمه های شیشه ای و نحوه چیدمان آنهاست. به قطعه کد زیر توجه کنید:
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 |
<?php $inline_keyboard = [ // 1 [ [ 'text' => "Open Google" , 'url' => "www.google.com" ] , [ 'text' => "Open Bing" , 'url' => "www.bing.com" ] ] , // 2 [ [ 'text' => "I Agree" , 'callback_data' => "agree" ] ] , // 3 [ [ 'text' => "Send Link To Friends" , 'switch_inline_query' => "پیام آزمایشی ۱" ] ] , // 4 [ [ 'text' => "Copy Link in Input Area" , 'switch_inline_query_current_chat' => "پیام آزمایشی ۲" ] ] , ]; $inline_kb_options = [ 'inline_keyboard' => $inline_keyboard ]; ?> |
در خطوط ۳ تا ۲۵ عناوین دکمه های شیشه ای، عملکرد و نحوه چیدمان آنها مشخص شده است. برای مثال براکت های قرار گرفته در خطوط ۵ و ۸ یک سطر از چیدمان دکمه های شیشه ای را مشخص می کنند (در قطعه کد فوق چهار سطر از دکمه های شیشه ای وجود دارد). درون این جفت براکت ها در هر خط (خطوط ۶ و ۷) یک دکمه شیشه ای تعریف شده است. پارامتر اول (text) عنوان نمایش داده شده بر روی دکمه شیشه ای و پارامتر دوم (url) نحوه عملکرد آن را مشخص می کند. در قطعه کد فوق دو دکمه جهت باز کردن دو سایت گوگل و بینگ تعریف شده است.
باز کردن آدرس وب توسط دکمه های شیشه ای
در خطوط ۱۲ ، ۱۷ و ۲۲ سه نوع دیگر از دکمه های شیشه ای تعریف شده است. نوع اول (خط ۱۲ – callback_data) مربوط به زمانی است که کاربر بر روی یک دکمه شیشه ای کلیک کرده و در پس پرده پیامی برای ربات ارسال می شود. ربات می بایست این پیام را پردازش کرده و واکنش مناسب را انجام دهد. نوع دوم (خط ۱۷ – switch_inline_query) و نوع سوم (خط ۲۲ – switch_inline_query_current_chat) کاربردهای خاصی دارند و در ربات های خاصی که قابلیت inline mode را دارند، استفاده می شوند. قابلیت inline mode در آینده آموزش داده خواهد شد. برای توضیحات بیشتر می توانید به ویدئوی ضمیمه آموزش مراجعه کنید.
خطوط ۲۷ تا ۲۹ نیز تنظیمات مربوط به دکمه های شیشه ای است که تنها یک گزینه دارد. این تنظیمات درون آرایه inline_kb_options$ ذخیره شده که در آینده برای نمایش دکمه های شیشه ای از آن استفاده خواهیم کرد.
نمایش دکمه های شیشه ای در ربات تلگرام
برای نمایش دکمه های شیشه ای از قطعه کدی مشابه جلسه قبل استفاده می کنیم (تابع ()show_menu و وابسته کردن آن به دستور start/).
تنها یک تغییر کوچک لازم است و آن هم قرار دادن متغیر inline_kb_options در مکان مورد نظر (خط ۱۲ در قطعه کد زیر). این همان آرایه ای است که در قطعه کد قبل جهت ذخیره تنظیمات مربوط به دکمه های شیشه ای تعریف شد.
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 = "یکی از گزینه های زیر را انتخاب کنید"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply , 'reply_markup' => $json_kb ]; send_reply($url, $post_params); } ?> |
خروجی قطعه کد بالا بصورت زیر است :
نمایش دکمه های شیشه ای در ربات تلگرام
کدهای لازم جهت واکنش به فشرده شدن دکمه های شیشه ای
جهت واکنش به فشرده شدن دکمه های شیشه ای نوع دوم (callback_data) می بایست کدهای زیر را اضافه کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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"]; } ?> |
ابتدا می بایست تغییری در کدهای نوشته شده جهت پردازش اطلاعات دریافتی توسط ربات ایجاد کرد. تا پیش از این تنها منتظر ارسال پیام به ربات تلگرام بودیم ولی حالا غیر از پیام، ممکن است data هم برای ربات ارسال شود. ارسال data یعنی فشرده شدن یک دکمه شیشه ای. خطوط ۳ تا ۱۰ اطلاعات لازم پس از فشرده شدن یک دکمه شیشه ای را استخراج می کند.
جهت پردازش اطلاعات دریافتی توسط ربات و انجام واکنش مناسب به آن از تابع ()detect_callback_received_and_reply استفاده کرده ایم. این تابع در ادامه شرح داده شده است.
شرح کدهای تابع detect_callback_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 |
<?php function detect_callback_received_and_reply() { $callback_data = $GLOBALS['data']; if($callback_data == "agree") { // ثبت نظر در دیتابیس $reply = "با تشکر - نظر شما ثبت شد"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); //------------------------------ $reply = "با تشکر - نظر شما ثبت شد"; $url = $GLOBALS['bot_url'] . "/answerCallbackQuery"; $post_params = [ 'callback_query_id' => $GLOBALS['callback_query_id'] , 'text' => $reply , 'show_alert' => true ]; send_reply($url, $post_params); } } ?> |
در خط ۷ ابتدا بررسی کرده ایم که داده دریافتی توسط ربات عبارت agree باشد. سناریوی ما به این صورت است که دکمه ای با عنوان «I Agree» به کاربر نمایش داده شده و کاربر با کلیک بر روی آن موافقت خود را با یک مسئله خاص اعلام می کند. در زمان کلیک بر روی این دکمه عبارت agree به ربات ارسال می شود (طبق کدهای نوشته شده).
در پاسخ به فشرده شده دکمه شیشه ای (ارسال عبارت agree به ربات)، ما پیام تشکری را برای کاربر ارسال می کنیم. در کدهای فوق این کار به سه شکل متفاوت انجام شده است. در خطوط ۱۱ تا ۱۴ این کار با ارسال یک پیام ساده انجام می شود. راه دیگر حالت اعلان (نوتیفیکیشن) است که پیام تشکر برای چند ثانیه به کاربر نشان داده شده و پس از آن محو می شود. نوع سوم نیز نمایش پیام تشکر در یک آلرت (پنجره کوچک) است.
لازم به ذکر است که در سناریوهای واقعی معمولا پس از فشردن دکمه های شیشه ای از این نوع (callback_data)، می بایست پاسخ کاربر را در محلی ذخیره کنیم (درون یک فایل و یا بانک اطلاعاتی). محل نوشتن کدهای مربوطه در خط ۹ نشان داده شده است. از آنجا که تاکنون آموزشی در زمینه کار با بانک های اطلاعاتی (دیتابیس) نداشته ایم، نوشتن این کدها را به آینده و در زمان خود موکول می کنیم.
نمایش پیام در پاسخ به فشردن دکمه شیشه ای
نمایش اعلان (نوتیفیکیشن) در پاسخ به فشردن دکمه شیشه ای
نمایش آلرت در پاسخ به فشردن دکمه شیشه ای
این جلسه آموزشی نیز به پایان رسید. دیدیم که چگونه می توانیم ساخت دکمه های شیشه ای در ربات تلگرام را انجام دهیم. در آینده با بخش های دیگری از ربات تلگرام آشنا خواهیم شد. با ما همراه باشید…
31 دیدگاه. ارسال دیدگاه جدید
سلام استاد وقتتون بخیر
من میخوام یه ربات تلگرام درست کنم که وصل بشه به دیتابیس سایتم و زمانیکه یه کد رو کاربر تو ربات ارسال میکنه از دیتابیس بخونه و رمز رو بده.
چطوری این کارو بکنم راهنمایی میکنید؟
دوست عزیز به جلسات ۱۲ و ۱۳ سایت مراجعه کنید (کار با دیتابیس در ربات تلگرام)
خسته نباشید آیا جایی هست که تمامی Function های مربوط تلگرام رو داشته باشه؟
بله دوست عزیز، به آدرس https://core.telegram.org/bots/api و بخش Available methods مراجعه کنید.
سلام سایتی رو که ازش هاست تهیه کردین برای ربات معرفی کنید ممنون میشم.
تشکر.
دوست عزیز هاست موردنیاز خودتون رو میتونید از شرکت «پارس وب هاست» تهیه کنید:
https://my.parswebhost.net/aff.php?aff=352
دقت کنید که هاست ربات تلگرام تهیه کنید.
با سلام خدمت جناب زعفری عزیز، من میخوام به ربات sendChatAction یعنی (…Typing) رو اضافه کنم که مثلا یه فایل پر حجم از طرف ربات به کاربر ارسال میشه متوجه بشه درخواستش در حال پردازشه و بهش بی محلی نشده…
اگه امکان داره اینو راهنمایی کنید ممنون 🙂
دوست عزیز برای اینکار میتونید از قطعه کد زیر استفاده کنید:
ضمنا مقادیر دیگه ای هم که در پارامتر action بجای typing میتونید استفاده کنید، اینها هستن:
record_video_note, upload_video_note, find_location, upload_document, record_audio, upload_audio, record_video, upload_video, upload_photo
بسیار سپاس گذارم … 🙂
ممنون از آموزش های بسیار خوبتون و خدا قوت
من میخوام یک دکمه فروارد به دکمه ها اضافه کنم که هر موقع فشرده بشه مثلا کل متن و دکمه هایی که خواستم را بشه به کانال یا گروهی فروارد بشه، منظورم اینه که عین فروارد معمولی موقع زدن دکمه فروارد لیست کانالها و گروه ها مون بیاد و انتخابش کنیم که فروارد بشه
دوست عزیز راه حل درست و منطقی برای اینکار استفاده از متدهای sendMessage و یا forwardMessage هست. به این صورت که پارامتر chat_id این دو متد باید به چت آیدی گروه و یا یوزرنیم کانال مربوطه (به فرمت channelusername@) تنظیم بشه. البته برای اینکار لازم هست که ربات از قبل در گروه/کانال موردنظر به عنوان admin اضافه شده باشه.
ضمنا پارامترهای متد forwardMessage به این صورت هست:
– chat_id (در بالا گفته شد)
– from_chat_id (چت آیدی مبدا ارسال پیام)
– message_id (شناسه پیام ارسالی)
سلام خسته نباشید
برای ارسال فایل (مثل جلسه ۴) موقع لمس دکمه های شیشه ای (بجای ارسال پیام) باید چیکار کنیم؟
دوست عزیز برای انجام این کار کافیه تا در درون تابع ()detect_callback_received_and_reply در بخش if مربوط به callback_data مربوطه، کد ارسال فایل رو قرار بدین.
با سلام
آموزش ها عالین. خدا قوت و ممنون.
اگر بخوایم پستی که توسط این ربات درست میشه و دارای لینک شیشهای هست رو ارسال کنیم به یه کانال باید چه کار کنیم؟
با تشکر
دوست عزیز روال کار دقیقا مشابه ارسال پیام عادی در ربات هست (توسط متد sendMessage).
تنها تفاوت این هست که در پارامتر chat_id باید یوزرنیم کانال موردنظر قرار بگیره (به فرمت ChannelUsername@)
سلام.
من در رویداد پاسخ به یک دکمه شیشهای میخوام چند دکمه شیشهای دیگه نشون داده بشه.
آیا این کار شدنیه؟
چون من خودم هر کاری کردم عملی نشد. اگه پیام ارسال بشه نشون میده ولی اگه دکمه شیشه ای باشه نه نشون نمیده.
چکار کنم به نظرتون؟
دوست عزیز برای پیدا کردن پاسخ، به جلسه دهم آموزشها مراجعه کنید (بخش ویرایش دکمههای شیشهای)
سلام دوست عزیز ، بنده هنوز اطلاعاتی از سایت شما نگرفتم و قرار بود یکم از شما یاد بگیرم و به طور اتفاقی پرسش و پاسخ ها رو دیدم ، واقعااااااا تحسینت میکنم بابت این صبرت که اینقدر با حوصله و مودبانه جواب همه رو میدی آفرین به شماااااااا خدا قوت ، شما روز به روز موفق تر خواهی شد.
ممنونم دوست عزیز، بنده هم برای شما آرزوی موفقیت میکنم.
سلام
ببخشید آموزشهای شما چطوری هستن، چون من فقط بلدم سورس رو فعال کنم، دیگه سورس نویسی هیچی، و کدها و فیلم ها چجورین؟
دربارشون یه توضیح بدید که میشه هر رباتی خواستیم بسازیم؟
دوست عزیز طراحی ربات تلگرام و بطور کلی برنامه نویسی، غیر از تمرین و تکرار راه دیگه ای نداره. (البته کمی خلاقیت رو هم اگر چاشنی کار کنید که دیگه عالی میشه)
شما اگر تجربه ای در زمینه برنامه نویسی ندارین، توصیه می کنم ابتدا به سراغ دوره های آموزش ++C و PHP برید تا ابتدا با مبانی برنامه نویسی و حل مسئله آشنا بشید.
بعد از اون میتونید آموزش ساخت ربات تلگرام رو شروع کنید و هر ربات دلخواهی رو طراحی کنید.
ممنون از بابت آموزش خوبتون.
من میخوام یک دکمه شیشه ای بسازم که بعد از فشرده شدن به صورت خودکار حذف بشه، یعنی بعد اینکه کاربر دکمه را فشار داد و پاسخ دریافت شد، برای اینکه دوباره امکان استفاده از دکمه رو نداشته باشه دکمه رو حذف کنم، چطوری میتونم اینکار رو بکنم؟
دوست عزیز این مورد توی جلسه ۱۳ (کار با دیتابیس در ربات تلگرام – بخش دوم) آموزش داده شده.
توی جلسه فوق به قسمت حذف محصول مراجعه کنید.
با سلام و خسته نباشید
چجوری میشه که یک دکمه منو فشرده بشه
هم همراه متنی که ربات جواب میده دکمه شیشه ای بیاد هم کلید های منو عوض شه (آپدیت شه )؟
آموزش ها رو تا جلسه ۱۰ دیدم، اگه میشه راهنمایی کنید ممنون
دوست عزیز در آن واحد و در قالب یک پیام نمیشه اینکارو کرد، باید با ارسال دو پیام متوالی اینکار رو انجام بدید
یک پیام برای نمایش دکمه های شیشه ای و یک پیام دیگه برای نمایش دکمه های منو
سلام
ممنون از آموزش خوبتان میشه در مورد دکمه های بازگشتی به منو اصلی هم بفرمایید از چه کدی استفاده میشه
دوست عزیز اگر درست متوجه منظورتون شده باشم، شما میخواین دکمه ها رو آپدیت کنین و یه سری دکمه جدید بجای قبلی ها قرار بدین.
ویرایش دکمه های منو در جلسه دهم آموزشها مطرح شده. توصیه می کنم اون آموزش رو ببینین، احتمالا مشکلتون حل میشه
با سلام
آموزش مفیدی بود ممنون
اگر بخواهیم دکمه های معمولی ربات که از قبل طراحی شده را بصورت دکمه شیشه ای در بیاوریم چه تغییری در کد باید اعمال شود؟
ممنون از شما
دوست عزیز اگر منظورتون از دکمه های معمولی، دکمه های منو هست، باید عرض کنم که هر دو نوع دکمه (شیشه ای و معمولی) توسط متد sendMessage و پارامتر reply_markup قابل نمایش هستند.
در جلسه پنجم محتوای متغیرهای reply_keyboard$ و reply_kb_options$ رو با کدهای نظیرشون در جلسه ششم جایگزین کنید (inline_keyboard$ و inline_kb_options$).
ممنون از پاسختون
من داخل کد بررسی کردم و متغیر های reply_keyboard و reply_kb_options پیدا نکردم اصلا
فقط reply_markup و reply_to_message هست!!!
دوست عزیز من کدتون رو دیدم، نمیدونم از چه فریم ورک و یا کتابخونه ای دارین استفاده میکنین
ولی طبق آموزش های ما راه حل همونیه که خدمتتون عرض کردم