آموزش ساخت ربات تلگرام با PHP

آموزش ساخت ربات تلگرام با PHP

فرقی نمی‌کند بگوییم بات، روبات یا ربات زیرا مهم کاربرد این کانسپت است که امروزه به بخش لاینفکی از کسب‌وکارهای فناورانه مبدل شده و بسیاری از کارشناسان بر این باورند که روز به روز وابستگی به ربات‌ها به مراتب بیشتر هم خواهد شد که در همین راستا در ادامه قصد داریم نحوهٔ ساخت یک ربات تلگرام را آموزش داده سپس ببینیم که به چه شکل می‌توانیم با استفاده از زبان برنامه‌نویسی PHP با ربات خود ارتباط برقرار سازیم.

معرفی Telegram Bot
پس از سال ۲۰۱۶، ربات‌ها به یک تِرِند در دنیای فناوری تبدیل شدند و به نظر هم می‌رسد که روز به روز به میزان محبوبیت آن‌ها افزوده خواهد شد؛ اما آنچه مسلم است اینکه ربات‌ها صرفاً در صنعت هوش مصنوعی کاربرد ندارند بلکه به سادگی می‌توان از آن‌ها به منظور توسعهٔ قابلیت‌های وب‌سایت خود استفاده نموده و یا به عنوان یک سرویس مجزا و بدون هزینه کردن برای سرور و دیگر مسائل مربوطه، آن را برای تعامل با جامعهٔ هدف خود مورد استفاده قرار داد.

به طور خلاصه، Telegram Bot یک اپلیکیشن به اصطلاح Third-party است که بر بستر تلگرام اجرا می‌شود که برای کسب اطلاعات بیشتر، توصیه می‌کنیم به مستندات رسمی بات تلگرام مراجعه نمایید. از جمله مزایای ربات‌ها می‌توان به هزینه‌ٔ پایین توسعه و نگهداری آن‌ها از یکسو و همچنین کاربرد آن‌ها روی هر نوع دیوایسی، از لپ‌تاپ گرفته تا موبایل و تبلت، از سوی دیگر اشاره کرد اما روی هم رفته از جمله‌ قابلیت‌های ربات‌ها می‌توان به موارد زیر اشاره کرد:

- ارسال اخبار و نوتیفیکیشن: ربات‌ها می‌توانند به عنوان یک خبرسان هوشمند عمل کرده و کاربران وب‌سایت شما را به محض پابلیش شدن یک خبر، مقاله یا پست جدید مطلع سازند (به عنوان مثال می‌توان به ربات خبرنامهٔ تِک‌کرانچ اشاره کرد.)

- امکان تعامل با دیگر سرویس‌ها: ربات‌های تلگرام این امکان را در اختیار دولوپرها قرار می‌دهند تا با دیگر بات‌ها مثل Gmail Bot یا Github Bot ارتباط برقرار سازند.

- فروشگاه آنلاین: یک ربات تلگرام می‌تواند به عنوان یک سرویس تجارت الکترونیک برای فروش خدمات و محصولات به کار گرفته شود (ای‌پی‌آی تلگرام از سرویس‌های پرداخت Android Pay و Apple Pay پشتیبانی می‌کند.)

- ساخت اپلیکیشن: بات‌های تلگرام این امکان را در اختیار دولوپرها می‌گذارند تا بدون هزینه کردن برای اجارهٔ سرور و غیره، اقدام به طراحی و عرضهٔ اپلیکیشن‌های مختلفی همچون سرویس ترجمه، نظرسنجی، تست آنلاین و غیره کنند.

- طراحی گیم: با استفاده از ربات‌های تلگرام می‌توان با بهره‌گیری از قابلیت‌های HTML5 اقدام به طراحی بازی‌های آنلاین کرد.

- ساخت شبکه‌های اجتماعی: یک ربات تلگرام را می‌توان به عنوان یک شبکهٔ اجتماعی که کاربران بر بستر آن می‌توانند به تعامل با یکدیگر بپردازند نیز مورد استفاده قرار داد.

تفاوت ربات‌های تلگرام با کاربران عادی
به طور کلی، ربات‌های تلگرام دارای یکسری تفاوت‌ عمده و محدودیت‌هایی نسبت به کاربران عادی تلگرام هستند. به طور مثال، ربات‌های تلگرامی از فضای ابری محدودتری نسبت به کاربران عادی برخوردارند. علاوه بر این، یک ربات نمی‌تواند با یک کاربر عادی شروع به چت کند بلکه این کاربران عادی هستند که مکالمه با یک ربات را می‌توانند شروع کرده و ربات هم پاسخ ایشان را خواهد داد. همچنین به خاطر داشته باشید که همچون Github_bot@، نام‌کاربری ربات‌های تلگرام همواره به کلمهٔ bot ختم می‌شود.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

مدیریت ربات تلگرام با زبان PHP
به عنوان گام اول، فایلی با نامی دلخواه مثلاً MyTmpTelegramBot.php می‌سازیم و کدهای زیر را وارد می‌کنیم:

<?php
class MyTmpTelegramBot
{
    const BOT_TOKEN = "489256710:AAEVCOOZOZ7ZGW5M25whB60vlWugmYp_jKE";
    const TELEGRAM_API_URL = "https://api.telegram.org/bot";

    public $url;

    public function __construct()
    {
        $this->url = SELF::TELEGRAM_API_URL . SELF::BOT_TOKEN;
    }

    private function runScript($method)
    {
        return file_get_contents($this->url . '/'. $method);
    }

    public function getUpdates()
    {
        return $this->runScript('getupdates');
    }

    public function sendMessage($chatId, $text)
    {
        $url = "sendmessage?text=$text&chat_id=$chatId";
        return $this->runScript($url);
    }
}

$obj = new MyTmpTelegramBot();
$updatesJson = $obj->getUpdates();
$updatesJson2Array = json_decode($updatesJson, true);
$chatId = $updatesJson2Array['result'][0]['message']['chat']['id'];
$obj->sendMessage($chatId, 'Hi');

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

به طور کلی، می‌شد بدون استفاده از قابلیت شییٔ‌گرایی این اسکریپت را به مراتب ساده‌تر نوشت اما به منظور ارتقاء مهارت‌های کدنویسی OOP، این مثال را به صورت شییٔ‌گرا نوشتیم (برای آشنایی بیشتر با مبحث OOP، به مقالهٔ Inheritance (وراثت) در زبان PHP چیست؟ مراجعه نمایید.) در همین راستا، کلاسی ایجاد کرده‌ایم تحت عنوان MyTmpTelegramBot که حاوی دو کانستند تحت عناوین BOT_TOKEN و TELEGRAM_API_URL و همچنین یک پراپرتی با نام url$ است.

در خط نهم، یک کانستراکتور نوشته‌ایم که این وظیفه را دارا است تا به محض ساخت یک آبجکت از روی کلاس مد نظر فراخوانی شده و پراپرتی url$ را مقداردهی کند و نیاز به توضیح نیست که برای دستیابی به یک پراپرتی در دیگر بخش‌های یک کلاس، از دستور <-this$ استفاده می‌کنیم (برای آشنایی بیشتر با مفهوم کانستراکتور در زبان PHP، به مقالهٔ آشنایی با مفاهیم Constructor و Destructor در PHP به زبان ساده مراجعه نمایید.)

همان‌طور که در خط یازدهم مشاهده می‌شود، به منظور دستیابی به کانستندها، ابتدا کلیدواژهٔ SELF را نوشته و علائم :: را قرار داده سپس نام کانستنت را آورده‌ایم به طوری که از این پس ما لینکی صحیح به منظور ارتباط برقرار کردن با ای‌پی‌آی تلگرام در اختیار داریم.

در خط چهاردهم هم فانکشنی نوشته‌ایم تحت عنوان ()runScript که یک پارامتر ورودی تحت عنوان method$ می‌گیرد. کاری که این فانکشن انجام می‌دهد این است که متد از پیش تعریف شده در زبان PHP تحت عنوان ()file_get_contents را فراخوانی می‌کند که این وظیفه را دارا است تا لینک مد نظر ما را اجرا کند. به عنوان پارامتر ورودی این فانکشن هم پراپرتی url$ را به متد ورودی مد نظر متصل می‌کنیم و در نهایت خروجی این تابع را ریترن می‌کنیم (با توجه به اینکه فانکشن ()runscript قرار است تا فقط و فقط از داخل این کلاس فراخوانی شد، تایپ آن را برابر با private قرار داده‌ایم.)

در خط نوزدهم فانکشن دیگری نوشته‌ایم تحت عنوان ()getUpdates که این وظیفه را دارا است تا متد getupdates گنجانده شده در ای‌پی‌آی تلگرام را فراخوانی کند که برای این منظور فانکشن ()runScript را فراخوانی کرده و به عنوان پارامتر ورودی هم استرینگ getupdates را به آن پاس می‌دهیم (توجه داشته باشیم چنانچه بخواهیم یک فانکشن را داخل بدنهٔ کلاس در فانکشن دیگری صدا بزنیم، باید از دستور <-this$  استفاده کرد.)

در خط بیست‌وچهارم فانکشن دیگری نوشته‌ایم تحت عنوان ()sendMessage که این وظیفه را دارا است تا پیامی را برای ربات‌مان ارسال کند که این فانشکن دو پارامتر ورودی می‌گیرد که یکی chatId$ و دیگری text$ است. داخل این فانکشن ابتدا متغیری تحت عنوان url$ ساخته‌ایم که حاوی متد sendmessage گنجانده شده در API تلگرام است که حاوی دو پارامتر وروردی تحت عناوین text و chat_id است که مقادیر آن‌ها را برابر با پارامترهای ورودی این فانکشن قرار داده‌ایم. در نهایت هم متغیر url$ را عنوان پارامتر ورودی فانکشن ()runScript در نظر گرفته و خروجی آن را ریترن کرده‌ایم.

تا این مرحله از کار، کدهای کلاس ما تکمیل شده‌اند. حال جهت تست اسکریپت فوق، خارج از بدنهٔ کلاس و در خط سی‌ویکم آبجکتی از روی کلاس مذکور تحت عنوان obj$ می‌سازیم و در خط بعد هم ابتدا فانکشن ()getUpdates را فراخوانی کرده و آن را داخل متغیری تحت عنوان updatesJson$ ذخیره می‌سازیم.

با توجه به اینکه خروجی این فانکشن یک آبجکت جیسون است، نیاز داریم تا آن را به یک آرایه تبدیل کنیم تا به سادگی به کلیدهای آن دسترسی داشته باشیم که برای این منظور متغیر دیگری در خط سی‌‌و‌سوم می‌سازیم تحت عنوان updatesJson2Array$ و مقدار آن را برابر با متد از پیش نوشته شده در زبان PHP تحت عنوان ()json_encode قرار می‌دهیم و به عنوان پارامتر اول هم متغیر updatesJson$ را گذاشته و به عنوان پارامتر دوم هم مقدار true را در نظر می‌گیریم تا خروجی، یک آرایهٔ پی‌اچ‌پی باشد.

حال برای آنکه بتوانیم برای این ربات یک پیام ارسال کنیم، ابتدا باید به شناسهٔ چت دسترسی پیدا کنیم؛ برای این منظور، متغیری تحت عنوان chatId$ ساخته و کلید id از کلید chat که در کلید message قرار دارد را در آن ذخیره می‌سازیم.

در خط آخر هم به سادگی فانکشن ()sendMessage را فراخوانی کرده و به عنوان شناسهٔ چت متغیر chatId$ و به عنوان پیام هم استرینگ Hi را به آن پاس داده‌ایم. حال اگر اسکریپت فوق را در مرورگر اجرا کنیم و چنانچه ارور خاصی وجود نداشته باشد، یک پیام تحت عنوان Hi برای ربات‌ تلگرامی ما ارسال خواهد شد (لازم به ذکر است رباتی که در این آموزش ساخته شد حذف گردیده است؛ لذا برای پیشروی با این آموزش، حتماً نیاز است تا یک ربات اختصاصی به همان ترتیبی که توضیح داده شد و با استفاده از BotFather ساخته شود.)



بهزاد مرادی