دوستان توجه کنند این پستت کپی هست نویسندش من نیستم ! ولی گفتم تو اینجا هم بزارم مفید واقع شه براتون روش فوق العاده ای هست و خودم با این روش یاد گرفتم
ادرس اصلی پست :
http://ashiyane.org/forums/showthrea...legram-Bot-API
* فقط یجاهای پست اشتباهات سینتکس کد و... بود که برطرف کردم و گذاشتم
خب ، قصد من اینه که اینجا مراحل ساخت یک روبات را بررسی کنیم ، اولین مرحله ی ساخت یک روبات برای تلگرام اینه که با BotFather@ روبات را رجیستر کنیم و یک Token براش دریافت کنیم ، من بیش از این توضیح نمیدم چون میخوام به مباحث دیگه ای بپردازم ، به این لینک مراجعه کنید اگر روباتتون رو نساختید هنوز :
http://apkfa.ir/telegram-bot-botfather/
خب اگر طبق آموزش بالا پیش رفته باشید در آخر BotFather یک Token میده بهتون به این شکل :
Use this token to access the HTTP API:
56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU
بسی خوب ، شکل کلی Request هایی که به تلگرام میدیم به این صورته :
https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe
ما میتونیم به دو صورت POST و GET به این API درخواست بدیم ، که در ادامه هر 2 حالتشو بررسی میکنیم ، فعلا ببینید خروجی این دستور چیه :
کد PHP:
{"ok":true,"result":{"id":56944213,"first_name":"MyBot","username":"MyBot"}}
کد PHP:
{
"ok":true,
"result":{
"id":56944213,
"first_name":"MyBot",
"username":"MyBot"
}
}
الآن راحت تر میتونیم به عناصر دسترسی داشته باشیم ، خب در آینده ما نیاز داریم که عنصر خاصی از این خروجی JSON را بدست بیاریم ، پس بذارید نشون بدم چجوری باید اینکار بکنیم :
کد PHP:
<?php
$json = '{"ok":true,"result":{"id":56944213,"first_name":"MyBot","username":"MyBot"}}';
$obj = json_decode($json);
echo $obj->result->username;
?>
فکر کنم متوجه شدید چیکار کردیم ، رشته ی JSON را با تابع json_decode دیکد کردم تا بتونم به Object های اون دسترسی داشته باشم ، بعد از اون از obj$ که والد کل هست ، به ولدهای result و username رفتم ، خروجی کد بالایی MyBot هست که همون Username سایت ما هست
از cURL استفاده میکنم تا با بقیه ی زبان ها شباهت بیشتری داشته باشه کارمون.
کد PHP:
<?php
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,"https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getMe");
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$json=curl_exec($curl);
$obj = json_decode($json);
echo $obj->result->username;
?>
1 نکته باید اینجا مد نظر داشت ، اینکه CURLOPT_SSL_VERIFYPEER رو روی False قرار بدید ، من اینجا Certificate رو Ignore کردم ، مشکلی هم نداره از نظر من ، ولی اگر میخواید Ignore نکنید با آپشن CURLOPT_CAINFO مسیر گواهینامه رو مشخص کنید.
خیلی خب اینجا اسم روبات رو دریافت کردم ، کار بعدی که میخوام انجام بدم اینه که ببینم روبات من در چه گروه هایی عضو هست و چه کامندهایی بهش داده شده ، برای این کار 2 راه تعبیه کردند ، یکی کامند getUpdates هست و دیگری WebHook
توی getUpdates ما باید مدام Req بدیم ببینیم کامند جدیدی بهمون داده شده یا نه ، اما توی WebHook اینطوری نیست ، WebHook وقتی کامند به ما داده میشه خودش برامون ارسالش میکنه ، و نیازی به ریکوئست ما نیست. مسلماً WebHook خیلی راحت تره نه !؟ (:
الآن بیشتر روبات های انجمن ها Request ـی هستند ، یعنی باید مدام Request بدیم ببینیم مثلا تاپیک Duty آپدیت شده یا نه !؟
اما در WebHook این ما نیستیم که به تاپیک Duty ریکوئست میدیم تا ببینیم آپدیت شده یا نه!! بلکه این انجمن آشیانه هست که به ما Request میده و میگه تاپیک Duty آپدیت شده ، این هم پست هاش
خب یه جورایی میشه گفت پیاده سازی WebHook در Telegram یکمی سخت هست ، ولی من 1 روز وقت گذاشتم روش و تونستم انجامش بدم ، اما الآن با هم متد GetUpdates رو بررسی می کنیم ، در آینده WebHook رو.
یه چیزی که باید بهش توجه داشته باشیم اینه که ولدهایی که از GetUpdates نشأت میگیرند با WebHook یکمی تفاوت دارند که اون رو هم جداگانه بررسی میکنیم
اولین کار اینه که ببینیم چه پیام هایی در گروه هایی که روبات ما در اون عضو هست داده شده ، در BotFather@ میتونید تنظیم کنید که پیام هایی که با / شروع میشن (مثلا salam/) براتون فرستاده بشن یا همه ی پیام ها. شما همه ی پیام ها رو انتخاب کنید چون در آینده لازمش داریم
خب اینجا GetUpdates رو بررسی میکنم ، Url ـی که به ما خروجی میده به این صورته :
کد:
https://api.telegram.org/bot56923213...xoU/getUpdates
خب خروجی این ، 100 پیام آخر هست ، به این صورت :
http://pastebin.com/raw.php?i=pVHjYR8V
خب اینجا میخوام برای راحتی کار همیشه آخرین ولد رو بگیرم ، نه همه ی ولدها رو ، متد GetUpdates یک فیلد به نام offset داره که میشه update_id مورد نظر رو داخلش قرار بدیم تا فقط اون رو بگیریم ، Update_id یکی یکی جلو میره ، در قدم اول لازمه من کل JSON رو بگیرم ، و در آخر به ولد آخر اشاره کنم و Update ID رو تنظیم کنم روی اون ،
خب کد PHP من به این شکل میشه :
کد PHP:
<?php
$up_id='';
function GetUpdateId(){
$obj=json_decode(file_get_contents("https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getUpdates"));
$fin=end($obj->result);
$GLOBALS['up_id']=$fin->update_id;
}
GetUpdateId();
$fin=json_decode(file_get_contents("https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getUpdates?offset=".$up_id++));
echo $fin->result[0]->message->text;
?>
اول یک متغیر up_id تعریف میکنم که update_id رو در اون ذخیره میکنم ، بعد یک تابع GetUpdateId تعریف میکنم که میره به متد getUpdates ، مقدار JSON را دیکد میکنه و آخرین update_id را درون متغیر up_id قرار میده ، و در اخر یک بار تابع GetUpdateId را اجرا میکنم تا آخرین UpdateID رو بدست بیارم و متن آخرین پیامی که در گروههای روباتم ارسال میشن رو به دست بیارم ، ممکنه سوال پیش بیاد که چرا اینکارو کردم ، به خاطر اینکه متد GetUpdates والدهای ارسالیش محدود به 100 تا هست ، یعنی با ارسال پیام 101 ام ، پیام ئه اول را در اختیار نخواهیم داشت..
خیلی خب الآن پیام رو گرفتم ، میخوام یه پیام بفرستم ، میخوام اگر کسی در گروه گفت "سلام" من بهش بگم : "سلام. خوبی!؟"
متد دریافت پیام ها رو که کار کردیم ، متد بعدی متد ارسال پیامه ،
کد PHP:
https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/sendMessage?chat_id={Chat_ID}&text={Message Text}
خب 2 قسمت قرمز مشخص کردم که حتما باید به این متد بدیمش ، اولی Chat_ID هست ، Chat_ID منظور گروهی هست که در اون پیام "سلام" داده شده و ما باید بهش جواب بدیم ، یه بار دیگه خروجی JSON ـی که متد GetUpdates بهمون داده رو ببینین :
http://pastebin.com/raw.php?i=pVHjYR8V
داخل والد Message ولد Chat رو می بینیم که والد ولدهای title و id هست ، title عنوان گروهی هست که در اون پیام ارسال کردیم و id هم ایدی اون گروه که ما اینجا باهاش کار داریم.
خب الآن سورس من میشه چیزی شبیه به این :
https://gist.github.com/anonymous/293774dd163f66c84713
تابع GetUpdateID رو که قبلا توضیح دادم ، الآن یک متغیر جدید می بینید به نام Message_ID ، فکر میکنید چرا این رو ایجاد کردم !؟
به خاطر اینکه اگر این متغیر وجود نداشته باشه ، یک بار که یه کاربر بگه "سلام" روبات تا ابد بهش میگه : "سلام ، خوبی!؟"
اما وقتی Message_ID رو ست کنیم و در شرط ببینیم که متفاوت باشه با پیام قبلی ، این اتفاق نمی افته.
ما اینجا یک حلقه ی بی نهایت داریم ، توی این حلقه ی بی نهایت GetUpdateID رو صدا می زنیم ، آخرین پیام هارو میگیریم ، و اگر متن پیام برابر بود با "سلام" و آیدی پیام ، با آیدی پیام قبلی برابر نبود ، پیام "سلام. خوبی!؟" را در همون گروه ارسال می کنیم
ببینید :
مشکلی که این روبات داره اینه که real Time نیست ، یعنی ما باید هی Request بدیم و چک کنیم ، در پست بعدی در مورد WebHook صحبت میکنم که اصلا چجوری باید باهاش کار کنیم...
https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
سلام مجدد ،
الآن میخوام بر مبنای WebHook این برنامه رو بنویسیم :
کد PHP:
<?php
$update = json_decode(file_get_contents('php://input'));
$message=$update->message->text;
if($message=="سلام"){
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("سلام. خوبی !؟")));
echo "Ok";
}
?>
خط دوم باعث میشه هر دیتایی که به صورت POST دریافت میکنیم json_decode کنیم ، خط سوم متغیر پیام را با مقدار ولد text پر میکنه و خط چهارم اگر این متغیر برابر با "سلام" بود پیام "سلام. خوبی!؟" را ارسال میکنه به گروهی با chat_id مشخص شده :
ساخت یک بازی :
اول باید بگیم بازی چجوری شروع بشه ، فرض کنید با کامند "randomgame/" میخوایم بازی رو شروع کنیم ، باید عدد رندوم را در یک فایل txt ذخیره کنیم که در دفعات بعدی ازش استفاده کنیم
در دفعات بعدی اول باید چک کنیم فایل var.txt خالی هست یا نه ، اگر خالی باشه یعنی اصلاً بازی شروع نشده ، پس نباید به پیام ها پاسخی بدیم ، اما اگر این فایل حاوی عدد بود ، و پیام کاربر هم
فقط عدد بود کار شروع میشه ، اگر عددی که یوزر داده بود ، پایین تر از مقدار var.txt بود بگه : "برو بالا" ، اگر هم بالاتر بود ، بگه : "برو پایین"
کد PHP:
<?php
$update = json_decode(file_get_contents('php://input'));
$message=$update->message->text;
$id=$update->message->message_id;
if($message=="/randomgame"){
$file = fopen("var.txt","w");
echo fwrite($file,rand(1,100));
fclose($file);
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("یه عدد انتخاب کردم ، اگه گفتی چیه !؟ :D")));
}else{
if((is_numeric($message)) && (filesize('var.txt') != 0) ){
if($message<file_get_contents('var.txt')){
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("برو بالا")."&reply_to_message_id=".$id));
}elseif($message>file_get_contents('var.txt')){
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("بیا پایین")."&reply_to_message_id=".$id));
}elseif($message==file_get_contents('var.txt')){
$rep=json_decode(file_get_contents("https://api.telegram.org/bot117421868:AAFO2KMXjoy5Bf5gsEQdmzhjNHV43BDAwKw/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("آفرین درسته ")."&reply_to_message_id=".$id));
file_put_contents("var.txt", "");
}
}
}
?>
فقط یه چیزی هست ، اینجا یک پارامتر reply_to_message_id هم ارسال کردم به متد SendMessage که برای نقل قول به کار میره.
موفق باشید
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
سلام مجدد ،
من از cURL خالص استفاده میکنم.
متد SendPhoto به این صورت استفاده میشه:
کد:
https://api.telegram.org/TOKEN/SendPhoto
الزام |
توضیحات |
نام متد |
بله |
آیدی چت رومی که روبات در آن است |
chat_id |
بله |
عکس (در ادامه توضیحات داده خواهد شد) |
photo |
خیر |
متنی در مورد عکس |
caption |
خیر |
آیدی پیامی که نقل قول می شود |
reply_to_message_id |
خب ، پس ما حتما باید chat_id و photo را ارسال کنیم. اما اینجا یک مسئله ای هست ، اونم اینه که تلگرام فقط فایلهایی که بر روی سرور خودش آپلود شدن و file_id دارند رو به مسنجر ارسال می کنه ، این یعنی ما باید اول فایل رو آپلود کنیم و بعد اون رو ارسال کنیم.
فرض میکنم که قصد دارم این عکس رو ارسال کنم:
اول باید عکس رو در سرور خودم ذخیره کنم ، از این تابع استفاده میکنم:
کد PHP:
function Download($url, $saveto)
{
$content = file_get_contents($url);
file_put_contents($saveto, $content);
}
بسی خوب ، این تابع رو به این صورت که اجرا کنیم :
کد PHP:
Download("http://up.ashiyane.org/images/40r2bz28vnf9tc5ztegl.jpg","file.jpg");
عکس روی سرور با نام file.jpg ذخیره میشه. الآن نیاز دارم تا یک Request ئه cURL بدم به متد SendPhoto ، برای اینکه فایل رو ارسال کنیم با هدر multipart ، یک '@' قبل از محل فایل قرار میدادیم ، اما در PHP 5.5 کلاس CURLFile به جای این کار استفاده میشه ، در Guzzle یا urllib2 هم تقریبا به همین صورته
کد PHP:
<?php
$token='bot93735019:AAHjnEyT614C5nXDxWpiouLZQ1B1sxbpzO4';
$ch = curl_init('https://api.telegram.org/'.$token.'/SendPhoto');
$cfile = new CURLFile(realpath('file.png'),'image/png','photo.png');
$data = array('chat_id' => '108432389', 'photo' => $cfile );
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);
?>
خروجی که به ما داده میشه ، حاوی file_id ، نام کاربری روباتمون ، حجم فایل ، طول و عرض عکس هست. یادتونه گفتم telegram فقط فایلهایی رو به مسنجر میفرسته که file_id داشته باشن !؟ اینجا میتونیم file_id رو بدست بیاریم که اگر دوباره خواستیم همین عکس رو ارسال کنیم دیگه آپلودش نکنیم
خروجی JSON به صورت Format شده :
https://gist.githubusercontent.com/a...688bdca/a.json
ولد photo خودش والد 3 تا ولد دیگه هست ، به ترتیب حاوی 3 تا سایز مختلف از عکس ، اگر بخواین هر وقت عکس با بیشترین سایز خودش ارسال بشه ، اینطوری باید عمل کرد.
کد PHP:
کد PHP:
$json='{"ok":true,"result":{"message_id":555,"from":{"id":93735019,"first_name":"Boogh","username":"BooghBot"},"chat":{"id":108432389,"first_name":"Alireza"},"date":1437582347,"photo":[{"file_id":"AgADBAADzKcxG2tIlgVTV4qymcwQpYXBaTAABE-OpMG5MyiTeAgAAgI","file_size":1504,"width":69,"height":90},{"file_id":"AgADBAADzKcxG2tIlgVTV4qymcwQpYXBaTAABD-OvbH4eCgSdwgAAgI","file_size":22617,"width":247,"height":320},{"file_id":"AgADBAADzKcxG2tIlgVTV4qymcwQpYXBaTAABHLnGv34_RnFdggAAgI","file_size":38955,"width":500,"height":649}]}}';
$obj=json_decode($json);
echo $obj->result->photo[2]->file_id;
حالا میخوام وقتی کامند ashiyane/ رو دریافت کردم ، هدر آشیانه ( اینجا) رو ارسال کنم.
سورس میشه این :
کد PHP:
<?php
function Download($url, $saveto)
{
$content = file_get_contents($url);
file_put_contents($saveto, $content);
}
$update = json_decode(file_get_contents('php://input'));
$message=$update->message->text;
if($message=="/ashiyane"){
if(file_exists("ashiyane.png")){
$token='bot93735019:AAHjnEyT614C5nXDxWpiouLZQ1B1sxbpzO4';
$ch = curl_init('https://api.telegram.org/bot'.$token.'/SendPhoto');
$cfile = file_put_contents('FileID.txt');
$data = array('chat_id' => '108432389', 'photo' => $cfile );
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result=curl_exec($ch);
}else{
Download("http://ashiyane.org/forums/images/metro/blue/misc/vbulletin4_logo.png","ashiyane.png");
$token='bot93735019:AAHjnEyT614C5nXDxWpiouLZQ1B1sxbpzO4';
$ch = curl_init('https://api.telegram.org/bot'.$token.'/SendPhoto');
$cfile = new CURLFile(realpath('ashiyane.png'),'image/png','ashiyane.png');
$data = array('chat_id' => '108432389', 'photo' => $cfile );
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result=curl_exec($ch);
$obj=json_decode($result);
$fileID=$obj->result->photo[2]->file_id;
file_put_contents('FileID.txt',$fileID);
}
}
?>
خب این سورس چیکار میکنه !؟ اول یک تابع Download داریم که دو آرگومان Link و File رو میدیم بهش ، تابع لینک را دریافت میکنه و دانلود را آغاز میکنه. و در فایلی که گفتیم ذخیره میکنه
متغیر update$ مقدار ارسالی WebHook را دیکد میکنه و متغیر message$ ولد پیام را استخراج میکنه و در خودش قرار میده.
چک میکنم اگر کامند وارده ashiyane/ بود ، اگر فایلی به اسم ashiyane.png در سرور وجود داشت ، بر مبنای FileID که در FileID.txt قرار داره فایل رو ارسال کنه ، و اگر این فایل وجود نداشت ، فایل رو آپلود کنه و از روی Response که داده میشه FileID را در یک فایل متنی ذخیره کنه.
البته یکمی طولانیه کدها که میتونید خودتون تابعش کنید و طبیعتا اینطوری کدنویسی یکمی کمتر میشه.
بقیه ی متدها هم اکثرا به همین صورت هستند ، مثلا SendAudio
کد PHP:
<?php
$token='bot93735019:AAHjnEyT614C5nXDxWpiouLZQ1B1sxbpzO4';
$ch = curl_init('https://api.telegram.org/'.$token.'/SendAudio');
$cfile = new CURLFile(realpath('Test.mp3'),'audio/mpeg3','Test.mp3');
$data = array('chat_id' => '108432389', 'audio' => $cfile );
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result=curl_exec($ch);
$obj=json_decode($result);
$fileID=$obj->result->audio->file_id;
file_put_contents('FileID.txt',$fileID);
?>
با این مباحثی که گفتم ، امیدوارم با روبات نویسی برای تلگرام آشنا شده باشین
موفق باشید
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
سلام ،
یک سری مباحث هست که باقی مونده که اونها رو توی این پست تکمیل خواهم کرد ، اول به یک سوال دوستان ( که سوال اکثریت هم بوده!) پاسخ میدم ؛
چیزی که در این پست میخوام توضیح بدم Keyboard هایی هست که بعضی روباتها دارند ،
شبیه به این
این کیبوردها توسط شئ ReplyKeyboardMarkup ایجاد میشن ، این شئ خودش 4 تا مقدار داره :
- keyboard : آرایه از کلید که بعد با هم بررسی میکنیم ، این مورد اجباری هست
- resize_keyboard : باعث می شود سایز کیبورد به صورت عمودی تنظیم شود
- one_time_keyboard : باعث می شود کیبورد فقط یک بار قابل استفاده باشد ، یعنی با اولین استفاده کیبورد مخفی شود
- selective : باعث می شود کیبورد فقط برای اشخاص خاصی قابل نمایش باشد ، نام کاربری این اشخاص باید در قسمت text ـه شی message درج شود
خب ، در ابتدا اجازه دهید درخت JSON یک کیبورد ساده را بررسی کنیم:
کد PHP:
{
"keyboard":[
[
"Row 1->Column 1",
"Row 1->Column 2"
],
[
"Row 2->Column 1",
"Row 2->Column 2"
],
[
"Row 3->Column 1",
"Row 3->Column 2"
]
]
}
کیبوردی که توسط این JSON برای ما ساخته خواهد شد به شکل زیر خواهد بود:
http://up.ashiyane.org/images/8zesdmrl7isl5ijyooy.png
فکر کنم با مقایسه ی کیبورد و JSON به ماجرا پی برده باشید :
هر ولد Keyboard یک سطر است و مقادیر درون آن که با , جدا می شود ستون های آن سطر هستند
حالا یک آرایه ی PHP خواهم ساخت و آن را به JSON تبدیل میکنم :
کد PHP:
$ar = array(
'keyboard' =>
array (
0 =>
array (
0 => 'Row 1->Column 1',
1 => 'Row 1->Column 2',
),
1 =>
array (
0 => 'Row 2->Column 1',
1 => 'Row 2->Column 2',
),
2 =>
array (
0 => 'Row 3->Column 1',
1 => 'Row 3->Column 2',
),
),
);
مقادیر keyboard را مشاهده می کنید ، 3 سطر داریم که آرایه های درونی keyboard هستند و داخل هر سطر یک آرایه است که بیانگر ستون هاست ، سایر تنظیمات را نیز می توان به همین صورت اعمال کرد ، مثلا resize_keyboard را برابر true قرار دهیم:
کد PHP:
$ar = array(
'keyboard' =>
array (
0 =>
array (
0 => 'Row 1->Column 1',
1 => 'Row 1->Column 2',
),
1 =>
array (
0 => 'Row 2->Column 1',
1 => 'Row 2->Column 2',
),
2 =>
array (
0 => 'Row 3->Column 1',
1 => 'Row 3->Column 2',
),
),
'resize_keyboard'=>true
);
حال قصد داریم روباتی بنویسیم که ستونها و سطرهای یک کیبورد را برای ما محاسبه کرده و آن کیبورد را به ما نمایش می دهد ، سورس به صورت زیر است :
کد PHP:
<?php
function AddtoKeyboard($row,$col){
$ar = array(
'keyboard' =>
array (
),
);
for($i=1,$f=0;$i<=$row;$i++,$f++){
$ar2=array("Row ".$i);
array_push($ar["keyboard"],$ar2);
for($d=1;$d<$col;$d++){
array_push($ar["keyboard"][$f],"Column");
}
}
return $ar;
}
$array = array();
$update = json_decode(file_get_contents('php://input'));
$id=$update->message->message_id;
$message=$update->message->text;
$m = explode(",", $message);
if((count($m))==2){
$keyb=json_encode(AddtoKeyboard($m[0],$m[1]));
$rep=file_get_contents("https://api.telegram.org/bot93735019:AAG09uklgYZlSrRKtgDwgE2XxPRBWh7Sc8o/SendMessage?chat_id=".$update->message->chat->id."&text=Success!"."&reply_markup=".$keyb);
}else{
$rep=json_decode(file_get_contents("https://api.telegram.org/bot93735019:AAG09uklgYZlSrRKtgDwgE2XxPRBWh7Sc8o/SendMessage?chat_id=".$update->message->chat->id."&text=".urldecode("Enter in (row,col) format! (E.g : (2,3) means a keyboard with 2 rows and 3 columns)")));
}
?>
روبات در ابتدا نوع تعداد سطر و ستون را به صورت row,col دریافت می کند ، سپس با Explode این 2 را به یک تابع AddtoKeyboard ارسال میکند ، وظیفه ی این تابع Push کردن کلیدها در آرایه ی شئ ReplyKeyboardMarkup است تا آن را به متد SendMessage ارسال کنیم ، در زیر نمونه ای از کارکرد این روبات را می بینید :
http://up.ashiyane.org/images/x1gtzzp66uif1l1nry9r.png
به روبات گفته شد کیبوردی با 2 سطر و 3 ستون بسازد ، که آن را مشاهده میکنید...
بسیار خب ، فکر نکنم مطلب دیگه ای باقی مونده باشه ، هر سوالی داشتید میتونید بپرسید در تاپیکهای مربوطه...
موفق باشید ، در پناه حق