به پنجمین جلسه از آموزش ساخت ربات تلگرام خوش آمدید. این جلسه به ساخت منو در ربات تلگرام اختصاص خواهد داشت.
در جلسه قبل ارسال انواع داده در ربات تلگرام را بررسی کردیم و دیدیم که چگونه می توان انواع داده زیر را در ربات تلگرام ارسال کرد:
- ارسال پیام
- ارسال عکس (تصویر)
- ارسال فایل صوتی
- ارسال فایل ویدئویی (کلیپ)
- ارسال داکیومنت (فایل)
- ارسال استیکر
- ارسال موقعیت مکانی (نقشه)
- ارسال اطلاعات تماس
در این جلسه می خواهیم ربات طراحی شده در جلسه قبل را کمی بهینه سازی و کاربردی تر کنیم. به این صورت که یک منوی چندگزینه ای در زیر کادر ارسال پیام اضافه کرده و در پاسخ به فشرده شدن هر کدام از دکمه های این منو (فهرست)، یکی از انواع داده فوق را برای کاربر ارسال می کنیم. در شکل زیر نمایی از منوی ساخته شده را می بینید.
ساخت منو در ربات تلگرام
ساخت منو در ربات تلگرام
برای ساخت منو در ربات تلگرام اولین قدم تعریف دکمه های منو و نحوه چیدمان آنهاست. به قطعه کد زیر توجه کنید:
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 |
<?php $key1 = 'ارسال پیام'; $key2 = 'ارسال عکس'; $key3 = 'ارسال فایل صوتی'; $key4 = 'ارسال فایل ویدئویی'; $key5 = 'ارسال داکیومنت'; $key6 = 'ارسال استیکر'; $key7 = 'ارسال موقعیت مکانی'; $key8 = 'ارسال اطلاعات تماس'; $reply_keyboard = [ [$key1 , $key2] , [$key3 , $key4] , [$key5 , $key6] , [$key7 , $key8] , ]; $reply_kb_options = [ 'keyboard' => $reply_keyboard , 'resize_keyboard' => true , 'one_time_keyboard' => false , ]; ?> |
در خطوط ۳ تا ۱۰ دکمه های منو و عنوان آنها را مشخص کرده ایم. در خطوط ۱۲ تا ۱۷ نحوه چیدمان دکمه های منو مشخص شده است. دقیقا همین آرایشی که در کدهای فوق دیده می شود در مورد دکمه های منو برقرار است (چهار ردیف دکمه و در هر ردیف دو دکمه). برای توضیحات بیشتر می توانید به ویدئوی ضمیمه آموزش مراجعه کنید.
در خطوط ۱۹ تا ۲۳ تنظیمات مربوط به منو مشخص شده است. پارامتر اول نحوه چیدمان دکمه ها را مشخص می کند. پارامتر resize_keyboard باعث شکل و شمایل شکیل تر و کشیدگی دکمه های منو می شود. پارامتر one_time_keyboard نیز یکبار مصرف بودن/نبودن منو را مشخص می کند. چنانچه این پارامتر با مقدار false مقداردهی شود، منو بصورت ماندگار و همیشگی در مکان خود حضور خواهد داشت.
واکنش به فشرده شدن دکمه های منو
برای واکنش به فشرده شدن دکمه های منو، از ساختار سوئیچ و قطعه کد زیر استفاده می کنیم. جزئیات بیشتر در مورد ساختار سوئیچ و نحوه عملکرد آن، در جلسه چهارم از آموزش PHP مورد بحث قرار گرفته است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php switch($text) { case "/start" : show_menu(); break; case $key1 : send_message(); break; case $key2 : send_photo(); break; case $key3 : send_audio(); break; case $key4 : send_video(); break; case $key5 : send_document(); break; case $key6 : send_sticker(); break; case $key7 : send_location(); break; case $key8 : send_contact(); break; } ?> |
خط ۵ مربوط به نمایش منو به کاربر است. مناسب ترین زمان جهت نمایش منوی طراحی شده به کاربر، در زمان راه اندازی (start) ربات است. کدهای مربوط به نمایش منو در تابع ()show_menu (که در ادامه آموزش آورده شده) قرار گرفته است.
خطوط ۷ تا ۱۴ هر کدام مربوط به ارسال یکی از انواع داده در ربات تلگرام است (ارسال پیام، ارسال عکس، ارسال فایل صوتی و …). برای هر کدام از این حالت ها یک تابع نوشته شده است.
نمایش منو در ربات تلگرام
نمایش منو در ربات تلگرام توسط قطعه کد زیر انجام می شود (تابع ()show_menu) :
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php function show_menu() { $json_kb = json_encode($GLOBALS['reply_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); } ?> |
قطعه کد بالا مشابه کد ارسال پیام در ربات تلگرام است. تنها دو تغییر جدید وجود دارد. اولین تغییر مربوط به خط ۵ است که تنظیمات مربوط به منوی طراحی شده (reply_kb_options$) بصورت json شده درون متغیر json_kb$ قرار گرفته است. دومین تغییر نیز در خط ۸ دیده می شود که باعث نمایش منوی طراحی شده در ربات می شود (پارامتر سوم ، reply_markup’ => $json_kb’).
همانگونه که در قطعه کد بالا مشاهده می کنید، نمایش منو در ربات تلگرام توسط کد ارسال پیام انجام می شود. سناریوی ما به این صورت است که زمانیکه کاربر برای اولین بار ربات را راه اندازی می کند (دستور start/ را به سرور ما می فرستد) ما در پاسخ منوی مورد نظر را به وی نمایش می دهیم.
خروجی قطعه کد بالا بصورت زیر است :
نمایش منو در ربات تلگرام
تعریف توابع لازم جهت واکنش به دکمه های منو
جهت واکنش به فشرده شدن دکمه های منو، ۸ تابع در دستور switch دیدیم که در ادامه قطعه کد مربوط به پیاده سازی آنها را می بینیم:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
<?php // ارسال پیام function send_message() { $reply = "salam"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); } //------------------------------------- // ارسال عکس - تصویر function send_photo() { $url = $GLOBALS['bot_url'] . "/sendPhoto"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'photo' => new CURLFILE(realpath("image_file.png")) , 'caption' => "توضیحات عکس" , // optional ]; send_reply($url, $post_params); } //------------------------------------- // ارسال فایل صوتی function send_audio() { $url = $GLOBALS['bot_url'] . "/sendAudio"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'audio' => new CURLFILE(realpath("audio_file.mp3")) , 'caption' => "توضیحات فایل صوتی" , // optional 'title' => "عنوان آزمایشی" , // optional 'performer' => "test person" , // optional ]; send_reply($url, $post_params); } //------------------------------------- // ارسال فایل ویدئویی function send_video() { $url = $GLOBALS['bot_url'] . "/sendVideo"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'video' => new CURLFILE(realpath("video_file.mp4")) , 'caption' => "توضیحات فایل ویدئویی" , // optional ]; send_reply($url, $post_params); } //------------------------------------- // ارسال داکیومنت - فایل function send_document() { $url = $GLOBALS['bot_url'] . "/sendDocument"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'document' => new CURLFILE(realpath("document.pdf")) , 'caption' => "توضیحات داکیومنت " , // optional ]; send_reply($url, $post_params); } //------------------------------------- // ارسال استیکر function send_sticker() { $url = $GLOBALS['bot_url'] . "/sendSticker"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'sticker' => new CURLFILE(realpath("sticker.webp")) , ]; send_reply($url, $post_params); } //------------------------------------- // ارسال موقعیت مکانی - نقشه function send_location() { $url = $GLOBALS['bot_url'] . "/sendLocation"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'latitude' => 32.657269 , 'longitude' => 51.677568 , ]; send_reply($url, $post_params); } //------------------------------------- // ارسال اطلاعات تماس function send_contact() { $url = $GLOBALS['bot_url'] . "/sendContact"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'phone_number' => "09131234567" , 'first_name' => "mzsoftware.ir" , 'last_name' => "website" , // optional ]; send_reply($url, $post_params); } ?> |
قطعه کدهای بالا نیازی به شرح و توضیح ندارند، چرا که دقیقا همان کدهای نوشته شده در جلسه قبل هستند. تنها کاری که ما انجام داده ایم، قرار دادن هر یک از آن کدها در یک تابع جداگانه است.
در ادامه تصاویر مربوط به عکس العمل ربات در پاسخ به فشرده شده برخی از دکمه های منو آورده شده است :
نمایش عکس در ربات تلگرام
نمایش فایل ویدئویی در ربات تلگرام
نمایش داکیومنت در ربات تلگرام
نمایش موقعیت مکانی در ربات تلگرام
این جلسه آموزشی نیز به پایان رسید. دیدیم که چگونه می توانیم ساخت منو در ربات تلگرام را انجام دهیم. در آینده با بخش های دیگری از ربات تلگرام آشنا خواهیم شد. با ما همراه باشید…
57 دیدگاه. ارسال دیدگاه جدید
سلام و خسته نباشید
آموزشاتون واقعا عالی هستند فقط یه سوال، من میخوام زیر منو برای یکی از از دکمه ها بزارم یعنی وقتی روی یه دکمه میزنیم یه منوی جدید باز بشه چطوری میشه انجام داد این کار رو؟
سلام دوست عزیز به جلسه دهم بخش “ویرایش دکمه های منو” مراجعه کنید.
سلام ، وقت بخیر
ممنون بابت این آموزش 🙏
میخواستم بدونم این کدها رو در کجا میزنید و چطور میتونیم بعد از کد زدن ، اون کد رو در تلگرام اجرا کنیم؟
در ضمن قسمتهای اولیه برای بنده در سایت موجود نیست!
ممنون میشم اگر پاسخ بنده رو بدید 🙏
با سلام، دوست عزیز کدنویسی ها در ویرایشگر کد آنلاین (موجود بر روی هاست) نوشته میشه. در این خصوص در جلسات ابتدایی توضیح داده شده.
برای دیدن جلسات ابتدایی آموزشها در زمان اسکرول کردن به سمت پایین، بر روی دکمه «بارگذاری موارد بیشتر» کلیک کنید.
ایشالله که هرچی میخوای خدا بهت بده. واقعا عالی هستی!!!
با سلام خدمت شما
تشکر می کنم از آموزش های شما
می خواستم بدونم آیا می توانم به مستندات مربوط به ربات تلگرام دسترسی داشته باشم جهت آشنایی با متدها، توابع و کاربرد هر کدام از آنها
ممنون می شوم راهنمایی کنید
بله دوست عزیز، مستندات ربات تلگرام در آدرس زیر قرار داره:
https://core.telegram.org/bots/api
سلام. من جلسه اول و دوم شما دیدم ولی در مرحله ای که باید یو آر ال رو چک کنم این ارور رو میده
{“ok”:false,”error_code”:400,”description”:”Bad Request: invalid webhook URL specified”}
دوست عزيز يا آدرسي كه براي وب هوك تنظيم كردين اشتباهه و يا مشكل از گواهي SSL تون هست.
سلام و خسته نباشید واقعا آموزشهاتون عالی و کامل هستن
فقط یه مشکلی دارم
میخوام بدونم چطور میشه دکمه بازگشت به منوی اصلی رو توی کد به کار برد. یعنی من چند تا دکمه دارم که با لمس کردن یکی از اون دکمه ها یه بخش جدید با چند تا دکمه دیگه ظاهر میشه و میخوام که بین این دکمه ها یه دکمه بازگشت قرار بدم که وقتی کاربر اون دکمه رو لمس کرد منوی من برگرده به همون منوی قبلی که بود یعنی بره به یه منو قبل تر
اگه توضیح بدین ممنون میشم
دوست عزیز برای اینکار کافیه که در دستور سوئیچ یه case دیگه برای دکمه بازگشت در نظر بگیرید و در این حالت تابع ()show_menu رو فراخوانی کنید.
سلام ببخشید من میخواستم بدونم چجوری میشه وقتی یه دکمه از دکمه های منو رو فشار دادن به یه کانال تلگرام منتقل بشن؟؟
ممنونم برای آموزش هاتون
دوست عزیز اینکار تنها با فشار دادن دکمه منو قابل انجام نیست. چون با کلیک بر روی دکمه های منو، متن نوشته شده روی دکمه برای ربات ارسال میشه.
ولی در پاسخ میشه با متد sendMessage در قالب پیام لینک کانال رو برای کاربر ارسال کرد.
راهکاری مشابه چیزی که در جلسه نهم آموزشها به اون اشاره شده.
سلام استاد عزیز، واقعا بی نظیرید… آموزشاتون کامل و بسیار قابل فهم هستن دمتون گرم حرف ندارین
خدا خیرتون بده که این فیلم های آموزشی گرانبها رو رایگان در اختیار ما گذاشتید … 🙂
دوست عزیز لطف دارید، براتون آرزوی موفقیت و سربلندی میکنم.
سلام من برای اولین بار می خوام ربات درست کنم و ربات مدیریت گروه می خوام درست کنم
چه هاست و دامینی خریداری کنم خوبه و روش خریداری هم بلد نیستم ممنون میشم راهنمایی کنید
دوست عزیز هاست موردنیاز خودتون رو میتونید از شرکت «پارس وب هاست» تهیه کنید:
https://my.parswebhost.net/aff.php?aff=352
دقت کنید که هاست ربات تلگرام تهیه کنید.
سلااااااااااااام بخدا بهترین آموزش ربات نویسی که تو عمرم دیده بودم آموزشات شما بود، بسیار دقیق و تمیز ….
واقعااااا دمتون گررررررم 🙂 خدا خیرتون بده
ممنونم دوست عزیز، لطف دارید.
خیلی عالی
واقعا ممنونم
با سلام
فقط میخواستم بگم خدا خیرتون بده، آموزش بسیار کامل و روانه و اینکه رایگان هم هست. فقط خواستم خدا قوت و خسته نباشید عرض کنم خدمت شما مدرس عزیز
ممنونم دوست عزیز، لطف دارید.
سلام آموزشهای خیلی واضحی دارین ممنون.
میخواستم ببینم این اپ چه طوری با بات کار میکنه، توی نتم آموزش خاصی پیدا نکردم.
https://play.google.com/store/apps/details?id=com.alexandershtanko.androidtelegrambot&hl=en
دوست عزیز حدسی که میزنم این هست که دستورات از طریق ربات توسط پوش نوتیفیکیشن برای اپ اندروید ارسال میشه و اپ اونها رو اجرا و نتیجه رو برگشت میده.
انجام اینکار هم مستلزم این هست که شما با بحث ارسال پوش نوتیفیکیشن و همینطور برنامهنویسی اندروید آشنا باشید.
با سلام
من چگونگی دریافت شماره کابر رو یاد گرفتم اما چه طور میتونم کاری کنم که ربات فقط شماره هایی که ایرانی هستن رو بپذیره و شماره های مجازی رو قبول نکنه؟
با تشکر
دوست عزیز من با فرمت ظاهری شمارههای مجازی آشنا نیستم ولی اگر متفاوت از شماره موبایلهای متعارف (۱۱ رقم و شروع با رقم صفر) باشن، میشه این مسئله رو متوجه شد.
برای مثال شما با استفاده از توابع ()strlen و ()substr (که در بخش آموزش php وبسایت شرح داده شدن) میتونید واقعی و یا مجازی بودن شماره کاربر رو تشخیص بدین.
سلام. برای آپلود عکس به سرور باید چکار کنیم؟
یعنی کاربر یک دکمه آپلود عکس رو بزنه و بعد یک عکس رو ارسال کنه و بعد سمت سرور عکس رو دریافت کنیم و ذخیره کنیم.
دوست عزیز این مورد در جلسه ۱۱ آموزشها (آپلود فایل در ربات تلگرام) مطرح شده
می تونید به اون جلسه مراجعه کنید.
سلام. خیلی ممنونم بابت آموزش خوبتون.
اگر بخوام بعد از کلیک بر روی هر منو، دوباره منوی خاصی نمایش داده بشه، باید چیکار کنم؟
دوست عزیز سوال شما قبلا در بخش دیدگاهها پاسخ داده شده. برای مشاهده پاسخ روی لینک زیر کلیک کنید:
mzsoftware.ir/making-menu-in-telegram-bot/#comment-746
سلام مهندس جان ممنون از آموزش های عالیتون
من یک مشکل کوچیک دارم، می خوام بدونم به چه صورت می شه این کار رو کرد که وقتی روی یک منو کلیک می کنیم زیر منو نمایش داده بشه؟
و بجای کلمه start/ از کلمه فارسی شروع استفاده کنیم؟
دوست عزیز این موضوع در جلسه دهم با عنوان «ویرایش دکمه های منو» مورد بحث قرار گرفته.
فقط دقت داشته باشید که برای نمایش زیرمنوها، باید توی بخش switch (در آموزش جاری) تابع مجزایی در نظر بگیرید و فراخوانیش کنید.
سلام ببخشید می شه یه آموزش دیگه هم بدید که چگونه می شه مثلا دو تا دکمه ارسال متن ۱ و ارسال متن ۲ داریم و می خواهیم برای هر دکمه متن یا فیلم یا … متفاوتی ارسال شود.
با تشکر از آموزش های خوب شما. تنها در این مسئله برایم سوالی ایجاد شد.
دوست عزیز اینکار براحتی امکانپذیره.
به این صورت که توی برنامه میتونید دو تا تابع مختلف مثلا به نامهای ()send_message_1 و ()send_message_2 تعریف و توی بخش switch فراخوانیشون کنید.
عالییی ❤❤❤
سلام و سپاس از توضیحات کاملتون.
ببخشید میشه توضیح بدین اگر خواستیم با زدن هر دکمه، متن متفاوتی ارسال بشه باید چیکار کنیم؟ مثلا اگر بخوایم برای “درباره ما” یه متن جدا ارسال بشه و برای “درباره محصول” یه متن دیگه، باید چیکار کنیم؟
دوست عزیز برای انجام اینکار کافیه تا توی switch موجود در سورس این جلسه برای هر دکمه، تابع جداگانهای با اسامی متفاوت در نظر بگیرین و بسته به پیامارسالی فراخوانیشون کنید.
برای مثال برای ارسال متن «درباره ما» تابعی به نام ()send_about_us و برای ارسال متن «درباره محصول» تابعی به نام ()send_about_product
سلام
لطفا آموزش دریافت شماره موبایل کاربر با استفاده از ربات تلگرام رو هم آموزش بدید.
(جهت استفاده در فرم ثبت نام و دریافت شماره کاربر و ذخیره در دیتابیس)
دوست عزیز برای دریافت شماره موبایل کاربر میتونید از کد زیر استفاده کنید :
مابقی کدها مثل قبل هستن.
اموزش ها و راهنمایی ها مثل همیشه عالی
طبق آموزش جلسه ۷ اطلاعات ثبت نام کاربر رو دریافت و طبق اموزش جلسه ۱۳ در دیتابیس ذخیره میکنم.
حالا به جای وارد کردن شماره به صورت دستی، میخوام خود ربات شماره را دریافت و ذخیره کنه.
مشکلی که دارم این هستش که بعد از دریافت شماره نمیدونم این شماره رو به چه صورت تفکیک و ذخیرش کنم.
آیا تو متغیر های callback_query چیزی باید وارد و صدا بزنم؟
ممنون میشم راهنمایی کنید.
دوست عزیز برای استخراج شماره موبایل ارسالی می تونید از قطعه کد زیر استفاده کنید :
ممنون از راهنماییتون
عالی بود
از دو متغیر دیگه contact هم کمک گرفتم که کاربر شماره دیگهای ارسال نکنه
ممنون بابت آموزش هاتون
سلام مهندس
با تشکر از آموزش های خوبتون
میخواستم بپرسم با دکمه ربات میشه لینک مستقیم ساخت (به اینصورت که روی دکمه منو بزنیم مستقیم بره به آدرس لینک شده) بدون اینکه دکمه شیشه ای باز بشه؟
خیر دوست عزیز، با دکمه منو نمیشه همچین کاری کرد. باید از دکمه شیشه ای استفاده کنید.
سلام
برای کلیدهای شیشه ای آموزش قراردادن لینک و url رو آموزش دادید.
آیا برای کلیدهای منو هم این امکان وجود داره که آدرس و لینک قرار داد؟
با تشکر
خیر دوست عزیز، این قابلیتها تنها مختص کلیدهای شیشه ای هستش.
سلام، نحوه آموزشتون عالیه، بسیار ممنونم.
ولی متاسفانه من توی آموزشهاتون نحوه فروارد کردن رو ندیدم
فروارد کردن با نقلقول، بدون نقلقول، و اگه راهکاری برای فروارد فایلهای صوتی بدون اینکه نقلقول و میزان ویشون پاک شه بذارین ممنون میشم (آخه جدیدن امکانش وجود نداره ظاهرا)
دوست عزیز تاکنون آموزشی نداشتیم که توش لازم باشه در مورد فروارد کردن پیام صحبت بشه
ولی اگر در آینده موردی پیش اومد به این مسئله هم می پردازیم
آهان ممنون چون مرحله به مرحله آموزشاتون رو نگاه میکنم ندیده بودم.
الان یک مشکلی دارم مثلا تو ربات کاربر کلمه فارسی بنویسه من رو هاستم کلمه فارسی رو به صورت کد شده میتونم ببینم
تو نت سرچ کردم ولی با این کد هم درست نشد چه کار باید بکنم؟
header(‘Content-Type: text/html; charset=utf-8’);
دوست عزیز روی هاست منظورتون کجاست؟ توی فایل یا دیتابیس؟
واقعا ممنون از آموزشتون، بدون اینکه از برنامه نویسی چیزی بلد باشم تونستم بسازمش و کارم کرد.
حالا اگه بخوام بعد از انتخاب یکی از منوها پیام لطفا اسم خود را وارد کنید برای کاربر بیاد، بعد اینکه اسمش رو وارد کرد هم پیام از همکاریتان ممنون براش فرستاده بشه، باید چه تغییراتی بدم؟
دوست عزیز این مورد توی جلسه هفتم (پاسخگویی به پیام در ربات تلگرام) آموزش داده شده
سلام خسته نباشید
من نمیدونم چرا تا قبل اینکه این کدهارو اعمال کنم رباتم کار میکنه
اما بعد از اینکه کدها رو میزارم کلا رباتم از کار میوفته
دوست عزیز اگر کدها مطابق آموزش باشه، دلیلی برای عدم عملکرد ربات وجود نداره.
شاید خطایی در کدتون وجود داره که باعث این اتفاق میشه.
سلام.
اگر بخوایم در واکنش به فشرده شدن یه کلید یه منوی دیگه رو قرار بدیم باید چیکار کرد؟
فکر نمی کنم کدش مثل همینا باشه چون من هرچی کلید های جدید تعریف کردم و تابع نشون دادن کلید های جدید رو در واکنش یکی از کلید ها گذاشتم جوابی نگرفتم.
میشه کدش رو قراربدید؟
دوست عزیز موضوع مدنظر شما در جلسه دهم مورد بحث قرار گرفته (با عنوان ویرایش دکمه های منو)
برای یافتن پاسختون می تونین به اون بخش مراجعه کنین
ممنون که پیگیری میکنید.