در جلسات قبل با روش فراخوانی متدهای API تلگرام با ربات ارتباط برقرار کرده، مشخصات ربات را خوانده، لیست آخرین پیام های ارسال شده به ربات را بدست آورده و متدهای مهم برای ارتباط با ربات را معرفی کردیم. دراین جلسه روش دوم ارتباط با ربات که استفاده از وب هوک است را آموزش می دهیم.
استفاده از webhook برای ارتباط با ربات تلگرام
وب هوک یک روش جالب است که ویکی پدیا وب هوک رو بصورت تعریف کرده است:
A webhook in web development is a method of augmenting or altering the behavior of a web page, or web application, with custom callbacks. These callbacks may be maintained, modified, and managed by third-party users and developers who may not necessarily be affiliated with the originating website or application. The term “webhook” was coined by Jeff Lindsay in 2007 from the computer programming termHook.
مضمون آن عبارت است از:
وب هوک یک رویداد است که وقتی در سیستم اتفاقی بیفتد، برای URL هایی که در سیستم تعریف شده اطلاعات و مقادیری ارسال می شود. که یک کاربر سوم میتواند با برنامه نویسی کارهای مورد نظرش را انجام دهد.
به عنوان مثال وقتی برای ربات های تلگرام از وب هوک استفاده می کنید، نیازی به چک کردن مداوم برای پیام ها ندارید، بلکه خود تلگرام وقتی پیامی رسید، آن را برای شما ارسال می کند و شما می توانید پیام را بررسی کرده و اقدامات مناسبی انجام دهید.
بنابراین می توان گفت : در روش وب هوک برنامه ای با زبان php (یا هر زبان دیگر) نوشته و روی یک سرور قرار می دهیم و آدرس این برنامه را با فراخوانی متد setWebhook از API تلگرام ، به تلگرام اعلام می کنیم. تا پس از این سرور تلگرام به محض دریافت پیام یا دستوری برای ربات برنامه ما را فراخوانی کرده و پیام ها را به آن تحویل دهد. برنامه ما با بررسی محتوای پیام ها، پاسخ آنها را آماده کرده و به سرور تلگرام می فرستد و سرور تلگرام این پاسخ ها را به صفحه گفتگو هدایت می کند.
برای بالابردن امنیت تلگرام از شما می خواهد تا از پروتکل HTTPS برای ارتباط با سیستم تلگرام استفاده کنید و مشکل اینجاست که برای ساخت یک ربات ساده ناچار خواهید بود یک هاست با گواهینامه SSL ثبت کنید که دارای هزینه است. در جلسات بعد با استفاده از سروهای کمکی روشی آموزش خواهیم داد که بدون داشتن گواهینامه SSL بتوانید ربات خود را کنترل کنید.
نکته : توجه کنید که اگر از وب هوک استفاده کنید متد (getUpdates) برای شما غیر فعال می شود و نمی توان به طور همزمان هر دو روش long polling و webhook را با هم استفاده کرد.
برای تنظیم وب هوک برای ربات باید درخواست زیر را اجرا کنیم:
https://api.telegram.org/bot418901969:AAHu5FfbN0W5tqBNdf0L98E2SC25jbNYWHs/setWebhook?url=https://mywebpagetorespondtobot
در مقابل url باید آدرس کامل صفحه ای از وب سایت که مسئول ارتباط با ربات است را وارد کنیم.
برنامه نویسی برای ربات
در روش web hook باید برنامه ای برای پاسخگویی به سرور تلگرام نوشته شود، در این برنامه باید تعیین شود که برای هر کدام از پیام ها یا دستورات دریافت شده توسط ربات، ربات چه عملی را انجام دهد که برای برنامه نویسی این قسمت می توان از زبان php استفاده کرد.
به عنوان مثال می خواهیم برنامه ای بنویسیم که هر دستور را که از ربات دریافت می کند در جواب آن پیغام تائید را بفرستد، برای این کار یک فایل مثلاً به نام mybot.php روی هاست وب ایجاد کرده و کد زیر را درآن می نویسیم :
$result= json_decode(file_get_contents("php://input"));
$user_id = $result->message->from->id;
$text = $result->message->text;
$token = "418901969:AAHu4fEO N0W5tqBNdf0L98E2SC25jbNYWHs";
$text_reply = "پیام شما دریافت شد.";
$url = "https://api.telegram.org/bot".$token."/sendMessage?chat_id=".$user_id; $url .= "&text=" .$text_reply;
$res = file_get_contents($url);
در تبادل پیام بین تلگرام ، ربات و برنامه شما، همیشه پیام ها با فرمت جی سان (json) ارسال می شوند و برنامه ای که پیام های ربات را دریافت می کند باید ابتدا پیام را از حالت جی سان بازگشایی کند و هنگام ارسال اطلاعات به ربات، داده ها را به فرمت جی سان تبدیل نماید.
قطعه کد زیر پیام جی سان دریافت شده از ربات را به یک شیء تبدیل می کند تا توسط دستورات برنامه قابل استفاده شود:
$result= json_decode(file_get_contents('php://input'));
در این قطعه کد ابتدا اطلاعات ارسالی از api تلگرام بصورت json خوانده شده و پس از تبدیل به یک شیء و در متغیر $string قرار می گیرد
در ادامه مقدار $user_id ، شناسه کاربری که دستور را اجرا کرده است و $text ، متن پیام ارسالی بدست می آید.
متغیر $token باید مساوی توکن ربات قرار داده شود (همان شماره api که هنگام ساخت ربات به ما داده شده است)
$token = '418901969:AAHu4fEON0W5tqBNdf0L98E2SC25jbNYWHs';
در پایان متغیر $url با درخواست متد api تلگرام به نام sendMessage پر شده و شناسه کاربر و متن پیام شما دریافت شده به آن فرستاده می شود.
$text_reply = 'پیام شما دریافت شد.';
$url = 'https://api.telegram.org/bot'.$token.'/sendMessage?chat_id='.$user_id;
$url .= '&text=' .$text_reply;
$res = file_get_contents($url);
پس از ایجاد فایل mybot.php روی هاست اینترنتی باید url مربوط به فایل php را به عنوان وب هوک ربات تنظیم کنید . برای این کار در نوار آدرس مرورگر آدرس زیر را درخواست کنید:
https://api.telegram.org/bot<token>/setWebhook?url=https://<domain>/mybot.php
که به جای <token> باید توکن ربات مثلاً رشته زیر و بجای <domain> باید نام وب سایت خودتان ) مثلاً webaca.ir ) را وارد کنید.
418901969:AAHu4fEON0W5tqBNdf0L98E2SC25jbNYWHs
توجه کنید که سایت شما باید دارای گواهینامه SSL بوده و پروتکل https را استفاده کنید، اگر از http استفاده کنید جواب نخواهد داد.
حالا برای تست برنامه می توانید در صفحه چت ربات چیزی نوشته و ارسال کنید تا ربات به شما جواب دهد : پیام شما دریافت شد