به جرات میتوان گفت تلگرام همه گیر ترین اپلیکیشن پیام رسان ایران هست پیام رسانی که نزدیک 30 میلیون ایرانی عضو این پیام رسان هستند. پیام رسانی که امکانات جالب به استفاده کننده ها ارائه میدهد در ادامه چند امکان این پیام رسان رو مورد بررسی قرار میدهیم.
امکانات تلگرام :
- ربات
- ایجاد گروه
- نام کاربری
- افزودن کانال
- لیست پخش
- چت حفاظت شده
- حریم خصوصی و امنیت
- دریافت فایل های صوتی و تصویری
- و . . .
اگه توجه کرده باشید یکی از امکانات پیام رسان تلگرام ربات هست شاید با شنیدن واژهی ربات همهی ما ناخوداگاه به یاد رباتهای فیزیکی که توسط انسان ساخته میشود، میافتیم. اما کلمهی ربات تنها به هوش مصنوعی محدود نمیشود. ربات میتواند یک ابزار کوچک در یک نرمافزار پیامرسان باشد یا نرمافزار مستقلی که خدمات خاصی را به کاربر ارائه میدهد.
تلگرام یکی از پیام رسان هایی هست که به صورت Open Source یا همان متن باز ارائه می شود و یک API جامع و کاربردی برای برنامه نویسان دارد که توسعه نرم افزارهای مفید را امکانپذیر میسازد.
باتهای تلگرام یکی از محبوبترین ربات هایی هستند که در حال حاضر شناخته شده است. این افزونهها قابلیت نصب و توسعهی آسانی دارند و همین باعث شده تا طرفداران زیادی داشته باشند. در این مطلی سعی بر آن داریم که یک ربات ساده کرنومتر را برای تلگرام طراحی کنیم. برای پیادهسازی این بات ساده از پی اچ پی استفاده شده است. و سعی شده است که اصول اولیه آموزش ساخت ربات تلگرام با PHP به صورت ساده و روان ارائه شود .
از بات BotFather برای ایجاد ربات استفاده کنید :
اولین قدم برای ایجاد ربات این است که یک حساب کاربری برای بات خود ایجاد کنید. برای این کار از BotFather استفاده خواهیم کرد. این ربات را به لیست خود در تلگرام اضافه کرده و دستور /newbot را وارد نمایید.
بعد از اینکه ربات خود را ثبت کردید، BotFather یک توکن ( token) به شما نمایش خواهد داد که باید از آن نگه داری کنید. با انتخاب گزینهی /help تمامی دستورات لازم برای توسعهی بات به شما نشان داده میشود.
با یک آنالیزگر ارتباط برقرار کنید :
هیچ آنالیزگری در API بات های تلگرام وجود ندارد. بنابراین برای اطلاع از تعداد کاربرانی که از ربات استفاده میکنند و نحوهی عملکردشان، مجبوریم سراغ راهحل های ثانویه برویم.
Botan ابزار رایگانی است که برای انالیز رباتهای تلگرام توسعه داده شده است. با استفاده از این ابزار میتوانید کاربران خود را دسته بندی کنید، اطلاعاتشان را ببینید و نحوهی عملکردشان را مشاهده نمایید.
برای استفاده از این آنالیزگر ابتدا باید نام ربات را در آن ثبت کرده و توکن خود را بگیرید.
از وب هوک (Webhook) برای دریافت پیامهای کاربران استفاده کنید :
با استفاده از دو تکنیک webhooks و long polling میتوانید پیام های کاربران خود را در تلگرام دریافت کنید.
در روش long polling یا همان getUpdates هربار درخواستی را به تلگرام ارسال میکنید و آخرین پیامهایی را که کاربران به ربات فرستادهاند، دریافت میکنید. ولی در روش وب هوک هر زمان کاربر پیامی به ربات تلگرام شما ارسال کند، بلافاصله این پیام به آدرس وب هوک شما ارجاع داده میشود. برای استفاده از این API تلگرام باید ssl داشته باشید.
آدرس URL زیر را در مرورگر باز کنید.
https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]
برای تنظیم ssl کد زیر را در خط فرمان وارد کنید.
openssl req -newkey rsa:2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj "/C=IT/ST=state/L=location/O=description/CN=yourdomain.com"
مطمین شوید که ssl روی دامنهی شما فعال شده باشد.
sudo ufw allow 443/tcp
یک درخواست برای متد وب هوک بفرستید.
curl -F "url=https://yourdomain.com/path/to/script.php" -F "certificate=/path/to/certificate.key" "https://api.telegram.org/bot[token]/setwebhook"
در مرحلهی اخر باید پاسخ زیر را دریافت کنید.
{"ok":true,"result":true,"description":"Webhook was set"}
این پیام یعنی اینکه همه چیز درست است و میتوانیم به سراغ پیادهسازی هستهی ربات خود برویم.
پایگاه داده بسازید :
باید یک پایگاه داده برای کرنومتر خود بسازیم. زمانیکه کاربر روی دکمهی شروع کلیک میکند، باید آیدی چت و زمان فعلی سیستم عامل در یک ستون ثبت شود. برای اینکار نیاز به یک پایگاه داده داریم. در این پایگاه داده هم آیدی چت کاربر و هم زمان شروع و پایان کار کرنومتر ثبت خواهد شد. در واقع سه ستون خواهیم داشت که آیدی چت کاربر، زمان شروع کار کرنومتر و زمان پایان ان ثبت شده است. زمانی که کرنومتر برای کاربر نشان میدهد، در واقع اختلاف میان زمان فعلی و زمان قبلی ثبت شده در سیستم است.
CREATE TABLE IF NOT EXISTS `stopwatch` ( `chat_id` int(10) unsigned NOT NULL, `timestamp` int(10) unsigned NOT NULL, PRIMARY KEY (`chat_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
مرحلهی بعد: کلاس کرنومتر را ایجاد کنید :
کلاس stopwatch.php را برای کار با پایگاه داده ایجاد میکنیم. دو متغیر خصوصی برای آن در نظر میگیریم تا آیدی چت کاربر و زمان را به آن نسبت بدهیم.
class Stopwatch { /** @var mysqli */ private $mysqli; /** @var int */ private $stopwatch_id; /** * Stopwatch constructor * @param mysqli $mysqli * @param $stopwatch_id */ public function __construct(mysqli $mysqli, $stopwatch_id) { $this->mysqli = $mysqli; $this->stopwatch_id = intval($stopwatch_id); } }
زمانیکه کاربر دکمهی شروع را انتخاب میکند، زمان دقیق و آیدی چت در یک ردیف از پایگاه داده ذخیر خواهد شد.
public function start() { $timestamp = time(); $query = " INSERT INTO `stopwatch` (`chat_id`, `timestamp`) VALUES ('$this->stopwatch_id', '$timestamp') ON DUPLICATE KEY UPDATE timestamp = '$timestamp' "; return $this->mysqli->query($query); }
زمانیکه تایمر متوقف شد، ردیف فوق باید از پایگاه داده حذف شود:
/** * Delete row with stopwatch id * @return bool|mysqli_result */ public function stop() { $query = " DELETE FROM `stopwatch` WHERE `chat_id` = $this->stopwatch_id "; return $this->mysqli->query($query); }
بدنهی اصلی کلاس مربوط به زمانی است که کاربر زمان کرنومتر را در خواست کند. در اینصورت باید مقدار فعلی زمان از مقدار اولیه آن کسر شود. برای اینکار از تابع gmdate استفاده میکنیم.
/** * Find row with stopwatch id and return difference in seconds from saved Unix time and current time * @return string */ public function status() { $query = " SELECT `timestamp` FROM `stopwatch` WHERE `chat_id` = $this->stopwatch_id "; $timestamp = $this->mysqli->query($query)->fetch_row(); if (!empty($timestamp)) { return gmdate("H:i:s", time() - reset($timestamp)); } }
از کتابخانههای پی اچ پی کمک بگیرید :
پی اچ پی کتابخانه های زیادی برای کار با API تلگرام دارد. اما در حال حاضر فقط کتابخانهی PHP Telegram Bot API از هر دو API بوتان و بات تلگرام پشتیبانی میکند. با استفاده از Composer این کتابخانه را نصب کنید.
composer require telegram-bot/api
برنامهنویسی وب هوک را شروع کنید :
باید یک اسکرپیت برای پردازش پیام و ارسال جواب برای کاربر بنویسیم. برای اینکار فایل index.php را باز میکنیم و کلاس کرنومتر را به آن اضافه میکنیم. یک کانکشن به mysql باز کرده و آن را اجرا میکنیم:
require_once 'vendor/autoload.php'; require_once 'stopwatch.php'; // connect to database $mysqli = new mysqli('database_host', 'database_user', 'database_password', 'database_name'); if (!empty($mysqli->connect_errno)) { throw new Exception($mysqli->connect_error, $mysqli->connect_errno); } // create a bot $bot = new TelegramBotApiClient('bot_token', 'botanio_token'); // run, bot, run! $bot->run();
دستورات را تعریف کنید :
حالا باید ربات را به گونهای تنظیم کنیم که به دستور /start پاسخ دهد. این دستور برای شروع تمامی رباتهای تلگرام استفاده میشود.
$bot->command('start', function ($message) use ($bot) { $answer = 'Howdy! Welcome to the stopwatch. Use bot commands or keyboard to control your time.'; $bot->sendMessage($message->getChat()->getId(), $answer); });
در این دستور یک تابع تعریف میکنیم که وقتی کاربر دکمهی شروع را فشار میدهد، یک پیام خوشامد برای او فرستاده شود. برای شروع کار کرنومتر هم یک دستور /go برای آن تعریف میکنیم:
$bot->command('go', function ($message) use ($bot, $mysqli) { $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); $stopwatch->start(); $bot->sendMessage($message->getChat()->getId(), 'Stopwatch started. Go!'); });
برای تعریف دستور /status نیز همین فرایند را طی میکنیم. کافی است متد status() را فراخوانی کرده و نتیجه را دریافت کنیم. اگر این تابع مقدار تهی را بازگرداند، یعنی اینکه کرنومتر شروع به کار نکرده است.
$bot->command('status', function ($message) use ($bot, $mysqli) { $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); $answer = $stopwatch->status(); if (empty($answer)) { $answer = 'Timer is not started.'; } $bot->sendMessage($message->getChat()->getId(), $answer); });
زمانیکه کاربر کرنومتر را متوقف کرد، ما باید زمان اندازه گرفته شده را به او نشان دهیم. این کار توسط تابع stop() انجام خواهد شد.
$bot->command('stop', function ($message) use ($bot, $mysqli) { $stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); $answer = $stopwatch->status(); if (!empty($answer)) { $answer = 'Your time is ' . $answer . PHP_EOL; } $stopwatch->stop(); $bot->sendMessage($message->getChat()->getId(), $answer . 'Stopwatch stopped. Enjoy your time!'); });
الان میتوانید تمام فایلهای خود را به دایرکتوری وب هوک آپلود کنید و ربات خود را آزمایش نمایید.
یک صفحه کلید برای بات خود بسازید :
یک کیبورد برای بات خود بسازید تا کاربر بتواند دستورالعملهای آن را انتخاب کند. ربات ما دو حالت برای انتخاب خواهد داشت. یک حالت برای شروع کار کرنومتر و دیگری برای پایان کار آن. این دو حالت را توسط تابع sendMessage() پیادهسازی میکنیم.
$keyboard = new TelegramBotApiTypesReplyKeyboardMarkup([['/go', '/status']], null, true); $bot->sendMessage($message->getChat()->getId(), $answer, false, null, null, $keyboards); });
برای اینکه بتوانید ربات خود را به کاربران نشان دهید باید آن را در مخازنی مانند Storebot.me ذخیره کنید. لینک http://storebot.me/add را در مروگر خود فراخوانی کنید و فرم مربوطه را کامل نمایید. برای ذخیره ربات باید نام، نام کاربری و دسته بندی برای ربات خود انتخاب نمایید.
در این پست ما فقط یک ربات ساده کرنومتر رو پیاده سازی کردیم که به عنوان نمونه میتوانید از کدهای این بات استفاده کنید . البته داخل سایت های خارجی نمونه های زیادی پیاده سازی شده است مثل سایت tutsplus که تعداد زیادی کد داخل آن منتشر شده است . البته سعی میکنیم در زمینه آموزش ساخت ربات تلگرام با PHP مطالب بیشتری رو داخل سایت قرار دهیم.
اگه شما هم ربات خاصی رو طراحی و پیاده سازی کرده اید با زبان PHP در بخش نظرات اعلام کنید و آدرس آن را بدهید و اگر دوست داشتید آموزش آن را برای دیگران قرار دهید .
دیدگاه کاربران
تعداد دیدگاه های کاربران : 9 دیدگاهسلام دوستان من یه مشکلی داشتم که این فایل هایی که باید اپلود کنم دقیقا چه فایلهای باید همراه با فایلی که روی وبهوک ست میکنم اپلود کنم. دوستان خواهش می کنم راهنمایی کنید
سلام .
دوست عزیز شما باید فایل php رو داخل پوشه public_html بریزید
دوستان عزیز،به نظر بنده مطالب سایت عالی و گویاست،اما در صورتیکه مفاهیم برایتان گنگ نامفهوم هستند،میتونید در کانال تلگرام ما ، آموزشهای ساخت ربات تلگرامی رو یاد بگیرید و به همراه صدها سورس که دو کانال موجود هست رباتسازی رو آغاز کنید.
با تشکر از مدیریت محترم سایت
با سلام.
نوشتین:”لان میتوانید تمام فایلهای خود را به دایرکتوری وب هوک آپلود کنید و ربات خود را آزمایش نمایید.”
منظورتون چیه؟؟
من دامنه و هاست خریداری کرده ام.
یه ساب دامین به نام robot..ir
ایجاد کرده ام.
حتی ssl هم روی آن فعال کرده ام.
توی botfather هم ربات ایجاد و توکن دریافت کرده ام.
اگه کسی میتونه کامل راهنماییم کنه که ادامه کار چی هستش؟
یک ماه هست که روی این قضیه کار میکنم و سایتهای متعددی رفتم،ولی هیچ کسی اطلاعات دقیقی ننوشته!!
ینی معلوم نیس فایلهامو کجا آپلود کنم و چطوری فایل php که ایجاد کردم رو به رباتم وصل کنم؟؟
درود
من هم همین مشکل رو دارم
لطفا یکی کمک کنه.
سلام.
دوست عزیز شما باید فایل php رو داخل پوشه public_html بریزید . سوالی بود تو تلگرام در خدمتم @toagt
سلام!
چطوری میشه که لیست کاربران ربات رو گرفت؟
دمت گرم عالی بود
سلام ممنون از مطالب مفیدتون
من می خوام رباتی بنویسم که از وب سرویس یه سری اطلاعات دریافت کنه و در جواب استفاده کنند قرار بده
بعنوان مثال از مشتری کد ملی شو بگیره و از روی دیتابیس مانده حساب مشتری نشون بده
ممنون میشم راهنمای بفرمایید و کد مربوطه بفرمایید
باتشکر