در قسمت قبل از آموزش با ربات‌های تلگرام و ایجاد ربات با Bot Father آشنا شدیم. در این آموزش کار را با برنامه نویسی به زبان PHP برای این ربات پیش می‌بریم.

برای ارتباط با ربات تلگرام دو متد وجود دارد. متد setWebhook و متد getUpdates.

متد setWebhook برای ارتباط با تلگرام:

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

مزیت بلادرنگ بودن، مزیتی مهم است که یک پیشنیاز دارد و آن هم داشتن دامنه‌ای با https است.

متد getUpdates برای ارتباط با تلگرام:

در این متد درخواست‌های کاربران در سرور تلگرام ذخیره شده و ما باید در بازه‌های زمانی کوتاه از سرور تلگرام درخواست‌های کاربران را دریافت کنیم. مزیتی که این روش نسبت به setWebhook دارد در این است که نیازی به داشتن هاست یا سرور با https نداریم.

در ادامه هر دو متد را با هم بررسی می‌کنیم.

ابتدا مثالی از فعال کردن روش setWebhook بیان می‌کنیم. با الگوی زیر یک URL ساخته و آن را در مرورگر خود وارد می‌کنیم:

https://api.telegram.org/bot[TOKEN]/setWebhook?url=[URL]

در مثال فوق Token ربات خود را در [TOKEN] و آدرس فایل برنامه نویسی شده ارتباط با ربات در [URL] قرار می‌گیرد.

مثالی از پیاده سازی الگوی فوق:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook?url=https://hitos.ir/test/tlg.php

اگر دستور فوق را در مرورگر خود وارد کنیم با پیغامی مانند زیر دریافت می‌کنیم:

{"ok":true,"result":true,"description":"Webhook was set"}

پیغام فوق یک آرایه JSON است که بیان می‌کند webhook با موفقیت ثبت شده است. وقتی عملیات webhook با موفقیت انجام شود سرور تلگرام تمامی درخواست‌های کاربران را به url‌ای که برای تلگرام اعلام کردیم ارسال می‌کند.

برای حذف کردن این webhook پارامتر [URL] را حذف کرده و در خواست را دوباره با مرورگر ارسال می‌کنیم:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook

الگوی پایین برای دریافت آخرین ارسال‌ها با کمک متد getUpdates است:

https://api.telegram.org/bot[TOKEN]/getupdates

مثال استفاده از این متد:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/getupdates

اگر این آدرس را درخواست دهیم، چیزی مشابه نتیجه زیر به نمایش در می‌آید:

{"ok":true,"result":[{"update_id":818742452,
"message":{"message_id":19,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471866230,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}]}

در بالا یک آرایه json از کل پیغام‌ها دریافت کردیم.

در ادامه قصد داریم عملیات دریافت اطلاعات با متد getupdate را با ذکر یک مثال به طور کامل شرح دهیم:

header('Content-Type: text/html; charset=utf-8');
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$url= "https://api.telegram.org/bot".$token."/getupdates";
$update= file_get_contents($url);
$arrayUpdate= json_decode($update, true);
var_dump($arrayUpdate);

در اولین سطر از هدر utf-8 استفاده کردیم تا بتوانیم رشته‌های فارسی را مشاهده کنیم.

با دستورات فوق عملیات دریافت update را با زبان php انجام دادیم. برای تمرین برای ربات خود متن بفرستید و با getUpdate پیغام‌ها را دریافت کنید. اگر در متن اسکریپت دریافتی از getUpdate دقت کنید خواهید دید username و نام کاربر و دستوراتی را که درخواست داده است را می‌توانید مشاهده کنید.
در پایین دستوراتی برای پیمایش پیغام‌ها مشاهده می‌کنید:

header('Content-Type: text/html; charset=utf-8');
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$url= "https://api.telegram.org/bot".$token."/getupdates";
$update= file_get_contents($url);
$arrayUpdate= json_decode($update, true);
foreach ($arrayUpdate['result'] as $key) {
    echo "update_id: ".$key['update_id']."<br>";
    echo "user name: ".$key['message']['from']['username']."<br>";
    echo "first name: ".$key['message']['from']['first_name']."<br>";
    echo "text: ".$key['message']['text']."<br>";
    echo "<br><br><br><br>";
}

نکته: قبلا از استفاده از getUpdate حتما getWebHook را غیر فعال کنید.

استفاده از متد getWebHook برای برنامه نویسی ربات:

در فوق برای استفاده از getUpdates باید این متد را در فواصل زمانی کوتاه با CronJob اجرا کنیم تا بتوانیم با کاربران در ارتباط باشیم. هر چند که گاهی ممکن است پاسخ دیر به کاربر برسد.

در پایین آموزش را با getWebHook ادامه می‌دهیم، هر چند که حتی اگر شما از getUpdates استفاده تفاوت چندانی در اسکریپت‌ها وجود ندارد.

همانند اول آموزش با آدرس زیر فایل tlp.php را به عنوان اسکریپت دریافت کننده پیام‌های کاربران معرفی می‌کنیم:

https://api.telegram.org/bot249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w/setWebhook?url=https://hitos.ir/test/tlg.php

سورسی که در پیش رو دارید فایل tlg.php هاست است:

$message= file_get_contents("php://input");
file_put_contents("message.txt", $message);

تلگرام پیغام‌ها را با متد POST برای فایل معرفی شده با getwebhook ارسال می‌کند. برای یافتن متدهای موجود در پیغام ارسالی به فایل tlg.php سورس بالا را استفاده می‌کنیم. "php://input" کل پارامترهای دریافتی از post را دریافت می‌کند. در نهایت اطلاعات دریافتی در فایلی به نام message.txt در مسیر جاری ذخیره می‌شود. در پایین این مقدار خروجی را مشاهده می‌کنید:

{"update_id":818742456,
"message":{"message_id":23,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471875367,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}

با بررسی این رشته JSON به ساختار زیر دست پیدا می‌کنیم:

header('Content-Type: text/html; charset=utf-8');
$message= '{"update_id":818742457,
"message":{"message_id":24,"from":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim"},"chat":{"id":156173107,"first_name":"\u0633\u06cc\u062f \u0645\u0647\u062f\u06cc","username":"esmahdim","type":"private"},"date":1471876469,"text":"\/aboutus","entities":[{"type":"bot_command","offset":0,"length":8}]}}';
$message= json_decode($message, true);
echo "update_id: ".$message['update_id']."<br>";
echo "user name: ".$message['message']['from']['username']."<br>";
echo "first name: ".$message['message']['from']['first_name']."<br>";
echo "text: ".$message['message']['text']."<br>";
echo "<br><br><br><br>";

خروجی سورس بالا:

update_id: 818742457
user name: esmahdim
first name: سید مهدی
text: /aboutus

آشنایی با متد sendMessage:

متد sendMessage کار ارسال به کاربر را انجام می‌دهد:

https://api.telegram.org/bot[TOKEN]/sendMessage?chat_id=[CHAT_ID]&text=[TEXT]

در پایین سورس فایل tlg.php را به گونه‌ای تغییر می‌دهیم که پس از دریافت کاربر پاسخ مناسب را بدهد:

header('Content-Type: text/html; charset=utf-8');
$message= file_get_contents("php://input");
$arrayMessage= json_decode($message, true);
$token= "249879980:AAHNdWnXjdq6Fw17NF81xXTtjA3xs19Sc6w";
$chat_id= $arrayMessage['message']['from']['id'];
$command= $arrayMessage['message']['text'];

if($command == '/start'){
    $text= "سلام، به ربات ما خوش آمدید";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else if($command == '/aboutus'){
    $text= "این متن برای آشنایی شما با ماست";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}else{
    $text= "دستور شما نا معتبر است";
    $url= "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$chat_id."&text=".$text;
    file_get_contents($url);
}

دستور بالا به سادگی ابتدا پیام کاربر را دریافت، از آن chat_id و command را دریافت می‌کند و url مناسب را برای ارسال پیام به کاربر می‌سازد.

نکته: کامند /start در تمامی روبات‌ها به صورت پیشفرض وجود دارد، پس بهتر است برای آن یک متن نمایشی پیش فرض ایجاد کنیم.

نکته: البته شرطی هم در سورس وجود دارد که برای پاسخ دهی به دستورات نا معتبر است.

همانطور که در بالا دیدید می‌توانید کامندهای دیگری برای بات خود تعریف کنید و برای هر کامند دستورات مناسب را ایجاد کنید.

اگر در نوشتن برنامه خود مشکل دارید سوالات خود را در بخش نظرات درج کنید.

تگ ها: messenger / پیام رسانربات تلگرام / Telegram Botتلگرام