وباکا

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

جلسه چهارم- ارتباط با ربات تلگرام با فراخوانی متدها (روش Long Polling)

در جلسه قبل با روش ساخت ربات تلگرام  آشنا شدید،بعد از دریافت توکن (یا API ) ربات، می توانید از همه متدهای API تلگرام برای ارتباط با ربات استفاده کنید . با کمک api تلگرام و درخواست متدهای آن مستقیماً با ربات ارتباط برقرار کرد و یا با استفاده از سرورهای پشتیبانی ربات، ربات ها را تنظیم کرده و براحتی مدیریت کرد.

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

برای استفاده از آموزش های برنامه نویسی ربات در سایت کدنویسان باید به زبان PHP تسلط داشته باشید. برای یادگیری PHP می توانید از بسته تصویری آموزش برنامه نویسی PHP در همین سایت استفاده کنید.

بطور کلی برای دریافت پیام های ربات تلگرام دو روش وجود دارد:

روش اول : فراخوانی متدهای API تلگرام (Long Polling)

روش دوم : استفاده از وب هوک (Web Hook)

استفاده از متدهای API برای ارتباط با ربات تلگرام

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

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

https://api.telegram.org/bot<token>/METHOD_NAME
در درخواست فوق به جای <token> باید شماره API مربوط به ربات را وارد کنیم و METHOD_NAME نام متدی است که باید اجرا شود. این درخواست را می توان در نوار آدرس مرور تایپ کرده و اجرا کنیم، یا اینکه آن را در داخل برنامه ای فرضاً با زبان PHP ، اجرا کنیم.

در ادامه دو متد اصلی را بررسی می کنیم، لیست کامل متدها در جلسات بعد آموزش داده خواهد شد.

درخواست مشخصات ربات

برای درخواست مشخصات ربات با api  زیر
447175705:AAFrjrIIVEJQp9GbrFUvbfp54gYgyS0eIPY
درخواست را بصورت زیر را می فرستیم:
https://api.telegram.org/bot447175705:AAFrjrIIVEJQp9GbrFUvbfp54gYgyS0eIPY/getMe

اگر درخواست فوق را در نوار آدرس مرورگر وارد کرده و اجرا کنیم، خروجی زیر را نمایش خواهد داد که مشخصات ربات codyab_bot با قالب جی سان و حاوی مشخصات ربات خواهد بود.
{"ok":true,"result":{"id":447175705,"is_bot":true,"first_name":"\u0628\u0627\u062a1","username":"bot1300_bot"}}

نکته : دقت داشته باشید که نام حروف کوچک و بزرگ را در نام متدها درست بنویسید و اطلاعات متنی را با فرمت utf8 ارسال کنید.

درخواست آخرین پیام ها

از متد getUpdates برای دریافت آخرین پیام های ارسال شده به ربات استفاده می شود، این متد را هم می توان از طریق مرورگر  بصورت زیر فراخوانی کرد:

https://api.telegram.org/bot418901969:AAHu5FfbN0W5tqBNdf0L98E2SC25jbNYWHs/getUpdates

نتیجه اجرای درخواست فوق به صورت زیر است :

{"ok":true,"result":[]}

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

ربات تلگرام

حالا دوباره متد getUpdates  را با روش فوق اجرا می کنیم ، که نتیجه متفاوت زیر را خواهد داشت  و دیده می شود پیام های فرستاده برای ربات در نتیجه فراخوانی قرار داده شده است:

{"ok":true,"result":[{"update_id":388717295,
"message":{"message_id":2,"from":{"id":190000695,"is_bot":false,"first_name":"M","last_name":"Moha","username":"mmoha94","language_code":"en-US"},"chat":{"id":190000695,"first_name":"M","last_name":"Moha","username":"mmoha94","type":"private"},"date":1506169710,"text":"salam"}},{"update_id":388717296,
"message":{"message_id":3,"from":{"id":190000695,"is_bot":false,"first_name":"M","last_name":"Moha","username":"mmoha94","language_code":"en-US"},"chat":{"id":190000695,"first_name":"M","last_name":"Moha","username":"mmoha94","type":"private"},"date":1506169716,"text":"khoobi?"}}]}

برای اینکه متد getUpdates آخرین پیام ها را برگرداند و پیام هایی که قبلا برگردانده را دوباره برنگرداند، یک پارامتر بنام offset برای آن استفاده می کنیم. مقدار این پارامتر باید در هر بار فراخوانی تغییر کرده و یک واحد از آخرین update_id بدست آمده بیشتر شود.

همچنین برای خواندن پیاپی پیام ها از ربات می توان متد را داخل یک حلقه بی نهایت قرار داده تا تکرار شود.

 

فراخوانی متدهای API با برنامه نویسی

گفته شد برای فراخوانی متدهای API تلگرام می توان از نوار آدرس مرورگر استفاده کرد یا برنامه ای با زبان PHP نوشته و با اجرای ان حتی روی سرور محلی، متدها را اجرا کرد، توجه داشته باشید که برای اجرای متدها با پروتکل https باید فایل php.ini را تنظیم کرده و extension=php_openssl.dll را در آن از حالت توضیحات خارج کرده باشیم. برای این کار در صورتی که از wamp استفاده می کنید، روی آیکن wamp در سمت راست نوار وظیفه ویندوز کلیک کرده و از منوی باز شده و زیرمنوی PHP گزینه php.ini را کلیک کنید و در فایل متنی باز شده عبارت ssl را جستجو کرده تا دستور فوق را پیدا کنید و علامت سمیکالن را از کنار آن بردارید. در پایان برای اعمال تنظیمات باید wamp  را دوباره راه اندازی کنید.

نمونه برنامه زیر برای فراخوانی متد getMe نوشته شده است:

<html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php$token="447175705:AAFrjrIIVEJQp9GbrFUvbfp54gYgyS0eIPY";
$telegram = json_decode(    file_get_contents("https://api.telegram.org/bot$token/getMe"));
if($telegram->ok == true){
echo "<h1>اطلاعات ربات</h1>";
echo "<b>نام کاربری </b>: ".$telegram->result->username;
echo "<br/><b> نام ربات </b>: ".$telegram->result->first_name;
}else
{
echo "مشکلی پیش آمد";
}
?>
</body>
</html>

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

برای اجرای متدهایی مثل getUpdates که برای خواند بروزرسانی های ربات(لیست پیام ها) استفاده می شوند، باید نتیجه فراخوانی را در یک متغیر ذخیره کنیم و از آنجا که نتیجه با فرمت JSON هست باید آنرا تفسیر کرده و تغییر شکل دهیم بطوری که قابل استفاده شود:

<?php
$token="447175705:AAFrjrIIVEJQp9GbrFUvbfp54gYgyS0eIPY";
$chatId="@testch1300";
$url = "https://api.telegram.org/bot$token/getUpdates";
$updates= json_decode(file_get_contents($url));
if($updates->ok == true){
// print reslut
}else echo "Error";
?>

تابع json_decode برای تفسیر و رمزگشایی کد JSON استفاده می شود و یک شی از نوع update بر می گرداند، ساختار این شی در سایت تلگرام تشریح شده است.

قطعه کد زیر پس از دریافت پیام ها آنها را نمایش می دهد:

<?php
$token="447175705:AAFrjrIIVEJQp9GbrFUvbfp54gYgyS0eIPY";
$chatId="@testch1300";
$url = "https://api.telegram.org/bot$token/getUpdates";
$updates = json_decode(file_get_contents($url));
if($updates->ok == true && count($updates->result) > 0){
foreach($updates->result as $update){
$last_updated_id = $update->update_id;
$chat_id = $update->message->chat->id;
$message_id = $update->message->message_id;
$message_text = $update->message->text;
echo "<br> ".$message_text ;
}
}else echo "Error";
?>

می توان فراخوانی getUpdates را در یک حلقه تکرار قرار داد تا هر بار پیام های جدید را چک کند و در صورت وجود پیام جدید، آنها را نمایش دهد و برای جلوگیری از نمایش پیام های قبلی از پارامتر  offset همراه آن استفاده می کنیم. متغیر offset در شروع کار مقدار صفر داشته و با هر بار استفاده مقدار last_update_id بعلاوه یک می شود.


در روش فوق برای ارتباط با ربات تلگرام، برای دریافت پیام های ربات باید بطور مداوم متد getUpdates را اجرا کنیم، بعبارتی باید در برنامه یک حلقه تکرار بی نهایت نوشته شود که هر بار متد را فراخوانی کرده، نتایج را نشان داده و بعد از یک توقف کوتاه دوباره فراخوانی را انجام دهد، این روش معقول نیست چرا که وقت سرورها را گرفته و دایم در حال اجرای درخواست های تکراری است که ممکن است اکثر آنها نتیجه جدید نداشته باشد.

 

در این جلسه روش long polling برای ارتباط با ربات تلگرام را آموزش دادیم، در جلسه بعد لیستی  از متدهای API تلگرام برای ارسال پیام ها، تصاویر، صدا و …را معرفی کرده و مثال های بیشتری برای ارتباط با ربات تلگرام اجرا خواهیم کرد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فهرست مطالب