بخش دوم : آموزش ساخت ربات حرفه ای تلگرام



آموزش ساخت ربات حرفه ای تلگرام آموزش ساخت ربات حرفه ای تلگرام

ساخت یک دیتابیس آموزش ساخت ربات حرفه ای تلگرام

ما برای نگهداری مقدار تایمر نیاز به ساخت دیتابیس داریم. روند کار به این صورت است که وقتی کاربر دستور کرونومتر را اجرا میکند ، ما آی دیِ چت را میگیریم و به همراه زمان کنونی بر حسب تایم استمپ ذخیره میکنیم ، به تبع آن ما در دیتابیس سطری ذخیره میکنیم که شامل آی دیِ چت و مقدار تایم استمپ می باشد . (chat ID  و integer timestamp) آموزش ساخت ربات حرفه ای تلگرام

آموزش ساخت ربات حرفه ای تلگرام

مشاهده بخش اول : آموزش ساخت ربات تلگرام

 

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

حال یک دیتابیس و جدول برای ذخیره ی اطلاعات کرونومتر ایجاد میکنیم : آموزش ساخت ربات حرفه ای تلگرام

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 کلاسی می نویسیم که با دیتابیس کار کند . شروع میکنیم با ساخت یک سازنده (constructor) که دو مقدار را تنظیم میکند و در آن ما آی دیِ چت و اتصال فعلی دیتابیس خودمان را ذخیره میکنیم .

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);
}

آموزش ساخت ربات حرفه ای تلگرام

و حالا برای قسمت اصلی کلاس آنجایی که کاربر وضعیت تایمر را درخواست می کند ، ما نیاز داریم تا سطر مورد نظر را بر حسب چت آی دیِ کاربر پیدا کرده و فاصله ی آن را با زمان کنونی محاسبه کنیم ، از آنجایی که هر دو مقدار integer  هستند به راحتی با انجام یک عمل منها نتیجه حاصل می شود ، در نهایت برای اینکه نتیجه را با فرمت درستی بر حسب زمان در خروجی نمایش دهیم از تابع 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));
}
}

آموزش ساخت ربات حرفه ای تلگرام

همانطور که مشاهده میکنید اگر مقداری متناسب با مقدار درخواستی در دیتابیس وجود نداشته باشد متد status چیزی بر نمیگرداند .

آموزش ساخت ربات حرفه ای تلگرام

انتخاب یک کتابخانه ی PHP

تعداد زیادی از کتابخانه های PHP  برای کار با API Telegram وجود دارند اما در زمان نوشتن این مقاله تنها یک کتابخانه وجود دارد که هم Telegram Bot API و هم Botan را پشتیبانی می کند و نام این کتابخانه PHP Telegram Bot API می باشد.

آموزش ساخت ربات حرفه ای تلگرام

با استفاده از Composer این کتابخانه را نصب میکنیم :

composer require telegram-bot/api

اگر شما تمایلی به استفاده از Botan ندارید می توانید از PHP Telegram Bot هم استفاده کنید . آموزش ساخت ربات حرفه ای تلگرام

آموزش ساخت ربات حرفه ای تلگرام

راه اندازی اسکریپت Webhook

در این بخش اسکریپتی مینویسیم برای پردازش درخواستهایی که از طرف Telegram Bot API ارسال می شود. فایلی بنام index.php ایجاد می کنیم و اجرای خودکار Composer و نمونه ای از کلاس Stopwatch را در آن include میکنیم.آموزش ساخت ربات حرفه ای تلگرام

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

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 \TelegramBot\Api\Client('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);
});

اینجا ؛ در متد command() ما بخشی را برای دریافت دستور ایجاد کرده ایم ، این بخش چت آی دی را می گیرد و یک پیغام خوش آمد گویی ارسال می کند . برای شروع کار کرونومتر ما دستور /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!');
});

آموزش ساخت ربات حرفه ای تلگرام

در اینجا نمونه ای از کلاس Stopwatch را ایجاد کرده و با فراخوانیstart()  که قبلا ایجاد کرده ایم تایمر ما شروع بکار می کند. برای تعریف دستور /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);
});

و هنگامی که کاربر تایمر را متوقف می کند ما ابتدا باید نتیجه ی status را بگیریم و نتیجه ی بدست آمده را نمایش دهیم با استفاده از متد 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!');
});

خب حالا شما می تونید همه ی این فایل ها را به پوشه ی webhook خودتان منتقل کرده و تست کنید.آموزش ساخت ربات حرفه ای تلگرام

آموزش ساخت ربات حرفه ای تلگرام

افزودن صفحه کلید

برای اینکه به کاربر نمایش بدهیم که چه دستوراتی را می تواند اجرا کند میتوانیم صفحه کلید به پیغامِ خود اضافه کنیم. کرونومترِ ما می تواند شروع شود یا متوقف شود ، پس دو حالت برای کاربر وجود دارد . برای نمایش صفحه کلید به کاربر کافی است که  متد sendMessage()  را extend کنید.آموزش ساخت ربات حرفه ای تلگرام

$keyboard = new \TelegramBot\Api\Types\ReplyKeyboardMarkup([['/go', '/status']], null, true);
$bot->sendMessage($message->getChat()->getId(), $answer, false, null, null, $keyboards);
});

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

 

آموزش ساخت ربات حرفه ای تلگرام

سایر آموزش ها :

Composer چیست

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

آموزش مقدماتی PHP 2

خرید VPS