وباکا

آموزش تخصصی برنامه نویسی وب

جلسه دهم- ساخت صفحه کلید درجا (inline keyboard) برای ربات تلگرام

در این جلسه روش ساخت صفحه کلید درجا(inline) یا صفحه کلید شیشه ای برای ربات های تلگرام را آموزش می دهیم.  صفحه کلیدهای معمولی ربات در پایین پنجره چت نمایش داده شده و شکل آزاردهنده ای دارند، با صفحه کلید های شیشه ای ربات حرفه ای و زیبا بسازید.

صفحه کلید درجا(inline keyboard)

اگر شما هم مثل بسیاری از کاربران ، از کیبورد های آزاردهنده ربات تلگرام خسته شده اید می توانید از کیبورهای شیشه ای استفاده کنید که در بدنه صفحه گفتگو نشان داده می شوند، استفاده کنید. این صفحه کلید های اینلاین به ربات شما شکل زیباتر می دهند.

با داشتن صفحه کلید اینلاین وقتی روی یک کلید کلیک می کنید معمول ترین حالت این است که شما یک callback بسازید و به این کال بک پاسخ بدهید.به عبارت دقیق تر وقتی کاربر روی دکمه اینلاین کلیک کند، api تلگرام برای ربات یک update جدید به وب هوک شما می فرستد و برنامه api شما می تواند به آن آپدیت پاسخ مناسبی بدهد.

نمونه برنامه api برای ساخت inline keyboard

برای نشان دادن نحوه ساخت صفحه کلید شیشه ای یک ربات پیاده می کنیم که با ارسال هر پیامی به آن به ما تاریخ جاری را بدهد و یک کیبورد اینلاین به آن اضافه می کنیم که با کلیک بر روی آن تاریخ را دوباره نشان داده شود .

برای استفاده از این آموزش باید آموزش های قبلی برنامه نویسی ربات را مطالعه کرده باشید. در آموزش های قبلی ساخت ربات تلگرام را داشتیم. همچنین روش استفاده از وب هوک برای دریافت update های ربات را آموزش دادیم و از واسط بات ساز برای ارتباط با api تلگرام و دسترسی به ربات استفاده کردیم.

در مثال زیر از callback به جای update استفاده می کنیم و قبل از هر کاری باید فرق این دو را بدانید. اگر اپدیت ما مربوط به CallBack بود در update ما یک خاصیت جدید به نام  callback_query اضافه می شود که در این callback query مقادیر مختلفی هستند که در ادامه بررسی خواهند شد.

ساخت کیبورد اینلاین برای ربات

قبل از هر کاری باید هنگام ارسال پیام به ربات، کیبورد اینلاین را هم بفرستیم .برای این کار از متد sendMessage استفاده می کنیم. پارامترهای این متد غیر از text و chat_id می تواند آرایه ای حاوی دکمه های صفحه کلیدها باشد. در جلسه قبل روش ارسال صفحه کلید معمولی را آموزش دادیم در اینجا برای ارسال گزینه های صفحه کلید اینلاین از آرایه ای با کلید inline_keyboard استفاده می کنیم :

[
'inline_keyboard'=>[
[
['text'=>'Google','url'=>'http://google.com'],['text'=>'Yahoo!','url'=>'http://yahoo.com']
] , // سطر اول
[
['text'=>'Codenevisan','url'=>'http://blog.webaca.ir']
]// سطر دوم
]
]

در این آرایه دوبعدی ، بعد اول سطرها و بعد دوم ستون ها را تعیین می کند. صفحه کلید ما دارای دوسطر خواهد بود. دستورات زیر پیام به همراه صفحه کلید اینلاین را به ربات می فرستد.

ربات نشان دهنده تاریخ با صفحه کلید اینلاین

جلسه قبل رباتی را برنامه نویسی کردیم که ابتدا دستور /data را گرفته و سپس یک صفحه کلید دارای سه کلید برای نمایش سال، ماه و روز بصورت جداگانه نشان می داد، در این قسمت همان ربات را دوباره پیاده سازی می کنیم با این تفاوت که سال ، ماه و روز را بصورت صفحه کلید اینلاین نشان می دهد.

ساخت صفحه کلید اینلاین

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


$kb1=['inline_keyboard'=>[
[
['text'=>'سال','callback_data'=>'y'],
['text'=>'ماه','callback_data'=>'m'],
['text'=>'روز','callback_data'=>'d'],
],
[
['text'=>'کدنویسان ','url'=>'http://blog.webaca.ir']
]
]
];
$kb2 = json_encode($kb1);
$text_reply= "کدام قسمت از تاریخ را می خواهید؟";
if($command == '/date'){
sendMessage(
['text'=>$text_reply,
'chat_id'=>$chat_id,
'reply_markup'=> $kb2 ]); }

پارامتر reply_markup برای ارسال صفحه کلید به ربات استفاده می شود و می تواند حاوی کلید های زیر باشد:

keyboard : برای ارسال صفحه کلید معمولی

inline_keyboard : برای ارسال صفحه کلید شفاف (اینلاین)

شکل زیر صفحه گفتگو با ربات فوق را نشان می دهد .

ربات با صفحه کلید شیشه ای

پاسخگویی به دکمه های صفحه کلید اینلاین

بعد از ارسال موفق صفحه کلید شفاف برای ربات، نوبت می رسد به نوشتن دستورات برای پاسخگویی به دکمه های اینلاین.

در مثال فوق می بینید که یکی از خصوصیات ارسال شده به ربات، callback_data است که دارای مقادیر مختلفی برای هر دکمه است تا هنگام کلیک روی دکمه در صفحه تلگرام، این مقدار به برنامه برگشت داده شود.

تلگرام باید اطمینان پیدا کند که کوئری به وب هوک شما رسیده است و تا زمانی که شما به کوئری پاسخ ندهید ، تصویر Loading که کنار دکمه می آید ناپدید نمی شود همچنین هنگام کلیک روی دکمه ها، اطلاعات در یک متغیر بنام callback_query به برنامه ارسال می شود. خصوصیات اصلی callback_query عبارتند از:

id: شناسه ای کوئری اینلاین است که برای پاسخگویی به درخواست به آن نیاز داریم .

message: پیامی است که ما همراه کی بورد به کاربر فرستاده ایم . از message مقادیر شناسه چت و شناسه پیام را بدست می آوریم.

data : همان داده ای است که همراه دکمه به تلگرام فرستاده ایم.

پس برای بدست آوردن اطلاعات از کوئری اینلاین می توانیم از دستورات زیر را استفاده کنیم:

$content= file_get_contents("php://input");
$update = json_decode($content);
if ( $update->callback_query){
$id = $update->callback_query->id;
$chat_id = $update->callback_query->message->chat->id;
$message_id = $update->callback_query->message->message_id;
$data = $update->callback_query->data;
}else{
// آپدیت دارای کلید درجا نیست
}

شکل کامل برنامه ربات تاریخ بصورت زیر است :

<?php
function sendMessage($datas){
$url = "https://panel.botsaz.com/api/bot/sendMessage";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
$datas["api_key"]=API_KEY;
curl_setopt($ch, CURLOPT_POSTFIELDS,
http_build_query($datas));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
curl_close ($ch);
return json_decode($server_output);
}
ob_start();
define("API_KEY" , "584bbd612a4499f7d707b50e053b5664");
$content= file_get_contents("php://input");
$update = json_decode($content);
$command = strtolower($update->message->text);
$chat_id= $update->message->from->id;
$kb1=['inline_keyboard'=>[
[ ['text'=>'سال','callback_data'=>'y'],
['text'=>'ماه','callback_data'=>'m'],
['text'=>'روز','callback_data'=>'d'],
],
[
['text'=>'کدنویسان ','url'=>'http://blog.webaca.ir']
]
]];
$kb2 = json_encode($kb1);
$text_reply= "کدام قسمت از تاریخ را می خواهید؟";
if($command == '/date'){
sendMessage(['text'=>$text_reply, 'chat_id'=>$chat_id, 'reply_markup'=> $kb2 ]);
}else if (isset($update->callback_query)){
$chat_id = $update->callback_query->message->chat->id;
$data = $update->callback_query->data;
switch($data){
case 'y' : $dat = "Year  : ".date("Y"); break;
case 'm' : $dat = "Month : ".date("m"); break;
case 'd' : $dat = "Day   : ".date("d"); break;
}
$text_reply = $dat . "\n" . $text_reply;
sendMessage(['text'=>$text_reply, 'chat_id'=>$chat_id, 'reply_markup'=> $kb2 ]);
}

و نتیجه گفتگو با ربات تاریخ را در شکل زیر می بینید:

ربات تلگرام با صفحه کلید اینلاین

در این جلسه روش ساخت صفحه کلید درجا (inline) که به آن صفحه کلید شیشه ای هم گفته می شود را آموزش دادیم در آینده آموزش های بیشتری برای برنامه نویسی ربات های تلگرام به زبان php را ارائه خواهیم کرد…

فهرست مطالب