مقدمه ساخت ربات با php
در حال حاضر تلگرام یکی از برترین پیام رسانها در بین اپلیکیشن های پیام رسان است. با وجود محدودیتهای دسترسی به این پیام رسان در کشور ما، باز از این پیام رسان استفاده میشود چون قابلیت و تفاوتهای بسیار زیادی با اپلیکیشن های مشابه دارد.
به غیر از کشور ما تعداد کاربران این پیام رسان به خصوص پس از نارضایتی اخیر از سیاستهای اشتراک گذاری واتس آپ، به طور مثبتی افزایش یافته است. اکنون بیش از ۷۰۰ میلیون نفر در جهان از این پیام رسان استفاده میکنند. با وجود اینکه تعداد کاربران واتس آپ تقریباً سه برابر تلگرام است ولی نمیتوان نتیجه گرفت که واتس آپ واقعاً پیام رسان خوبی است.
شاید برای عموم مردم که فاقد علم برنامه نویسی هستند واتس آپ میتواند گزینه مناسبی باشد ولی با وجود API های تلگرام و استفاده از آنها برای هر کاری، این پیام رسان یک غول هزار جادو است. از دیدگاه برنامه نویسی فقط API ربات چت تلگرام امکاناتی را میتواند در اختیار ما بگذارد که فراتر از ذهن است.
در آموزش ساخت ربات با php نیاز به دانش برنامه نویسی و مخصوصاً برنامه نویسی PHP خواهید داشت. اگر تخصصی در زمینه برنامه نویسی PHP ندارید پیشنهاد میکنیم به مجموعه آموزش PHP فرادرس مراجعه کنید. آموزشهای بسیار متنوعی در این مجموعه وجود دارد که برای افزایش مهارت یک برنامه نویس حتماً لازم است.
پیش نیاز ساخت ربات با php
برای ساخت ربات با php در این آموزش، به دو مورد مهم نیاز خواهیم داشت.
- نصب PHP 7.2 و Composer
- حساب کاربری تلگرام و توکن API ربات
برای ایجاد ربات تلگرام به یک توکن خاص از خود تلگرام نیاز داریم. برای این کار از BotFather@ یک ربات جدید بسازید و طبق راهنمایی هایی که می شوید نام کاربری وارد کنید تا در نهایت توکن ربات را به شما داده شود. در تصویر زیر یک ربات با نام pretzelblogbot ساخته شده و HTTP API آن تولید شده است. مراحل ایجاد ربات در تلگرام آسان است و در این آموزش از گفتن مراحل آن اجتناب شده است.
تاکنون توانستیم ربات تلگرام خود را راه اندازی کنیم. HTTP API ربات خود را به خاطر داشته باشید چون در ادامه مراحل آموزش ساخت ربات با php دیگر به آن نیاز خواهیم داشت. در صورت نیاز و بسته به سلیقه، می توانید ربات خود را با یک تصویر نمایه و موارد دیگر سفارشی سازی کنید.
مراحل ساخت ربات با php
در این بخش از آموزش ساخت ربات با php میخواهیم مراحل برنامه نویسی ربات تگرامی را با استفاده از Composer توضیح دهیم. لازم به ذکر است کامپوزر Composer ابزاری است که فرآیند مدیریت وابستگیها در PHP را برای ما آسان میکند. در این آموزش فرض بر این است شما با این ابزار کار کردهاید. برای اطلاعات بیشتر میتوانید به سایت کامپوزر یعنی getcomposer.php مراجعه کنید و اطلاعات تکمیلی را از آن جا دریافت کنید.
راه اندازی پروژه PHP
حال زمان آن رسیده که به هسته اصلی این پروژه یعنی پیاده سازی ربات چت تلگرام بپردازیم. در ابتدا با استفاده از دستور زیر یک پروژه Composer را راه اندازی کنید.
$ composer init
در حالت کلی در کامپوزر می توانیم مستقیماً با API HTTP تلگرام کار کنیم، ولی قرار است در آموزش ساخت ربات با php از یک کتابخانه بسیار قدرتمند که توسط Irfaq Sayed برای ربات تلگرام در Composer ساخته شده است کار کنیم. دستور زیر را برای گرفتن این کتابخانه در کامپوزر وارد کنید.
$ composer require irazasyed/telegram-bot-sdk
پس از دریافت این کتابخانه در پروژه، نوبت به تعریف ساختار دایرکتوری می رسد. ساختار پروژه ربات تلگرام در Composer به صورت زیر خواهد بود:
chat-bot/ ├─ composer.json ├─ composer.lock ├─ vendor/ ├─ src/ ├─ public/ ├─ .env ├─ bootstrap.php ├─ helpers.php ├─ setup.php
ابتدا فایل های معمول را داریم که توسط Composer تولید شده است. src/ پوشه ای است که در آن همه دستورات و کدهای برنامه را قرار می دهیم. public/ حاوی کدهایی خواهد بود که برای نمایش عمومی لازم خواهیم داشت. bootstrap.php مواردی مانند بارگیری خودکار و متغیرهای بارگیری از فایل env را تنظیم می کند. helpers.php حاوی توابع کاربردی کوچکی است که در برنامه استفاده می شود و setup.php یک فایل کوچک است که به ما کمک می کند ارتباط خود را با تلگرام تنظیم کنیم.
حال می توانیم توکن API خود را که قبلاً از BotFather دریافت کرده بودیم کپی کنیم و آن را در فایل env. قرار دهیم.
# .env TELEGRAM_BOT_TOKEN="1234567890:YOUR_TOKEN"
در TELEGRAM_BOT_TOKEN توکن خود را قرار دهید و برای تکمیل این دنباله، autoload را راه اندازی می کنیم. برای انجام این کار، فایل composer.json را تغییر می دهیم و این کد را به آن اضافه می کنیم:
"autoload": { "psr-4": { "Pretzel\\": "src/" }, "files": [ "helpers.php" ] }
namespace یا همان فضای نام پروژه می تواند هر چیزی باشد. در کد بالا همه چیز را از src/ در فضای نام Pretzel بارگیری می شود (به اختیار خودتان می توانید این نام را تغییر دهید) و فایل helpers.php نیز به همین ترتیب وجود دارد. اکنون پروژه PHP خود را آماده اجرا داریم.
راه اندازی ارتباط با تلگرام
تلگرام با یک سیستم مبتنی بر رویداد (Event) کار میکند تا بهروزرسانیهای جدید را به شما اطلاع دهد. برای این منظور باید یک کنترل کننده وب هوک Webhook راه اندازی کنیم. در واقع می خواهیم یک فایل PHP داشته باشیم که هر بار که کسی به ربات ما پیام می دهد، تلگرام درخواستی برای آن ارسال می کند.
ابتدا به توکن ربات خود نیاز داریم. با این توکن در تلگرام هویت خود را تشخیص می دهیم. این توکن را در فایل env. قرار دادیم. بنابراین متغیرهای بارگذاری را به صورت زیر تنظیم می کنیم.
$ composer require vlucas/phpdotenv
سپس کدهای زیر را به bootstrap.php خود اضافه می کنیم:
// bootstrap.php <?php require __DIR__ . "/vendor/autoload.php"; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
حال میتوانیم با استفاده از تابع ()env به راحتی مقادیر را از فایل env. خود بگیریم. پس از این کار یک تابع کمکی در helpers.php خود راه اندازی می کنیم.
// helpers.php <?php function telegram(): \Telegram\Bot\Api { return new \Telegram\Bot\Api( env('TELEGRAM_BOT_TOKEN') ); }
با این کد به راحتی می توانیم نمونهای از بستهبندی API تلگرام را بدون نیاز به جستجوی مداوم فایل env. همیشه در اختیار داشته باشیم. حال می توانیم این دو مورد را در فایل setup.php خود ترکیب کنیم.
// setup.php <?php require 'bootstrap.php'; telegram()->setWebhook(['url' => env('TELEGRAM_WEBHOOK')]); echo "Setup the Telegram webhook!";
تا این قسمت از آموزش ساخت ربات با php در Composer یک TELEGRAM_WEBHOOK از فایل env. دریافت کرده ایم. در ادامه باید نوعی URL را به تلگرام ارسال کنیم تا تلگرام بتواند به روز رسانی های خود را به آن ارسال کند. اگر با لوکال هاست Local Host کار می کنید می توانید با نصب expose ادامه مراحل را برای راه اندازی وب هوک محلی انجام دهید.
راه اندازی وب هوک محلی
برای شروع به گرفتن URL برای محیط محلی خود، ابتدا expose را نصب می کنیم.
$ composer global require beyondcode/expose
این ابزار expose را به صورت سراسری نصب می کند و به ما امکان دسترسی به آن را می دهد. اگر مدتی است که از Composer استفاده میکنید، احتمالاً قبلاً این کار را انجام دادهاید، اما مطمئن شوید که composer global config bin-dir –absolute در PATH$ شما باشد.
بعد باید PHP خود را به نحوی اجرا کنیم. برای پروژه ای مانند این پروژه، وب سرور PHP یکپارچه خوب است. بنابراین می توانیم از کدهای زیر در پوشه اصلی پروژه خود برای اجرای آن استفاده کنیم:
$ php -S localhost:8080 -t public [Mon Nov 28 11:28:18 2022] PHP 8.0.0 Development Server (http://localhost:8080) started
سپس، یک تب ترمینال دیگر را باز کنید و کد های زیر را اجرا کنید:
$ expose share localhost:8080 --subdomain=pbbot
در خروجی بهدستآمده، بایستی یک URL پیدا کنید که به sharedwithexpose.com ختم میشود. در این پروژه دامنه، pbbot.sharedwithexpose.com است و URL مورد نیاز ما خواهد بود. اجرای دو تب مختلف ترمینال به طور همزمان دشوار است. پس از اسکریپتهای Magic Composer استفاده می کنیم، بنابراین فقط باید یک دستور را اجرا کنیم تا ربات خود را بهروز کنیم. می توانیم از & عملکرد پوسته برای اجرای همزمان هر دو مورد را استفاده کنیم. بنابراین می توانید این کد را به فایل composer.json اضافه کنید.
"scripts": { "dev": "php -S localhost:8080 -t public &>/dev/null & expose share localhost:8080 --subdomain=pbbot" }
ساب دامین و پورت را مطابق میل خودتان می توانید تنظیم کنید. موارد &>/dev/null فقط تضمین میکند که خروجی وب سرور اصلی PHP با Expose مشکلی ندارد. از آنجایی که Expose نمای کلی درخواست را به ما می دهد، به آن نیاز نداریم. اکنون می توانید یک فرمان را اجرا کنید تا ربات تلگرام فعال شود.
$ composer run dev
حال بایستی URL webhook خود را به فایل env. اضافه کنیم:
# .env TELEGRAM_BOT_TOKEN="1234567890:YOUR_TOKEN" TELEGRAM_WEBHOOK="https://pbbot.sharedwithexpose.com/webhook.php"
توجه داشته باشید که URL باید HTTPS باشد. webhook.php فایلی است که برای رسیدگی به درخواست های دریافتی از تلگرام استفاده می شود. در مرحله بعد، آن را ایجاد می کنیم. ابتدا می خواهیم اسکریپت setup.php خود را اجرا کنیم.
$ php setup.php Setup the Telegram webhook!
تنظیم وب هوک
در ادامه آموزش ساخت ربات با php به تنظیم وب هوک می پردازیم. تاکنون به تلگرام گفتیم هر گونه اطلاعاتی را برای webhook.php ارسال کن، اما هنوز آن فایل را نداریم. برای تنظیم، کافی است آن را در پوشه public/ خود ایجاد کنیم. کنترل کننده وب هوک اساساً مسئول گرفتن هرگونه به روز رسانی پردازش نشده، ارسال آن ها به ربات و بازگرداندن نتیجه به تلگرام است.
// public/webhook.php <?php require __DIR__ . '/../bootstrap.php'; telegram()->commandsHandler(true);
تست و نوشتن اولین دستور
اکنون می توانیم اولین دستور خود را بنویسیم. با یک دستور خیلی ساده شروع می کنیم. می خواهیم وقتی به ربات خود hello می کنیم، جمله Hello World به ما بازگردد.
ابتدا باید یک کلاس جدید برای دستور خود ایجاد کنیم. این کلاس را در src/Commands/HelloCommand.php قرار می دهیم تا بتوانیم از طریق کلاس Pretzel\Commands\HelloCommand به آن دسترسی داشته باشیم. هر دستوری که ایجاد می کنیم باید از کلاس پایه Bot SDKs ارث بری کند. همچنین باید نامی داشته باشد. بنابراین ساختار اصلی به صورت شکل زیر است.
// src/Commands/HelloCommand.php <?php namespace Pretzel\Commands; use Telegram\Bot\Commands\Command; class HelloCommand extends Command { protected $name = 'hello'; public function handle() { // TODO: Implement command } }
اکنون در داخل تابع ()handle به مجموعه کاملی از توابع نوع replyWith دسترسی داریم که میتوانیم از آنها برای پاسخ دادن به پیامی که به تازگی دریافت کردهایم استفاده کنیم. ساده ترین راه استفاده از replyWithMessage است.
این توابع همگی دسته ای از آرگومان ها را در قالب یک آرایه می گیرند. هر تابع send مربوط به یکی از توابع replyWith است. کار مهمی که این توابع replyWith انجام می دهند، اضافه کردن پارامتر chat_id به آرگومان ها است. پارامتر دیگری که به آن نیاز داریم متن است. همانطور که از نامش پیداست باید حاوی متن پیام ما باشد. بنابراین کلاس ما باید به صورت زیر باشد.
// src/Commands/HelloCommand.php <?php namespace Pretzel\Commands; use Telegram\Bot\Commands\Command; class HelloCommand extends Command { protected $name = 'hello'; public function handle() { $this->replyWithMessage([ 'text' => 'Hello World!' ]); } }
ثبت دستور در ربات
در آخرین مرحله از ساخت ربات با php باید دستور خود را در ربات ثبت کنیم، تا بداند چه دستوراتی در دسترس است. برای این کار به فایل bootstrap.php خود بر می گردیم و کدهای زیر را به آن اضافه می کنیم:
// bootstrap.php telegram()->addCommands([ Pretzel\Commands\HelloCommand::class, ]);
حال می توانیم با ربات خود تعامل داشته باشیم. چت ربات خود در تلگرام را باز کنید و دستور hello/ را برای آن ارسال کنید. طبق تصویر زیر خواهید دید پیام Hello World! نمایش داده می شود.
کلام آخر در مورد ساخت ربات با php
به پایان آموزش ساخت ربات با php رسیدیم. در این آموزش سعی شد با استفاده از ابزار Composer یک ربات ساده تلگرامی ساخته شود. بدیهی است این آموزش در برگیرنده تمامی مطالب نیست و برای تکمیل یادگیری باید از منابع بیشتری استفاده کرد. برای تکمیل این آموزش پیشنهاد میکنیم از فرادرس به عنوان بزرگترین پلتفرم آموزشی کشور استفاده کنید تا بتوانید ایدههای شخصی خود را به نحو احسن پیاده سازی کنید.