check home phone-call search send

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

به جرات میتوان گفت تلگرام همه گیر ترین اپلیکیشن پیام رسان ایران هست پیام رسانی که نزدیک 30 میلیون ایرانی عضو این پیام رسان هستند. پیام رسانی که امکانات جالب به استفاده کننده ها ارائه میدهد در ادامه چند امکان این پیام رسان رو مورد بررسی قرار میدهیم.

امکانات تلگرام :

  • ربات
  • ایجاد گروه
  • نام کاربری
  • افزودن کانال
  • لیست پخش
  • چت حفاظت شده
  • حریم خصوصی و امنیت
  • دریافت فایل های صوتی و تصویری
  • و . . . 

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

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

تلگرام یکی از پیام رسان هایی هست که به صورت 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 در بخش نظرات اعلام کنید و آدرس آن را بدهید و اگر دوست داشتید آموزش آن را برای دیگران قرار دهید .

Avatar
پشتیبان سورس ایران 2180 مطلب منتشر شده

در مجموعه سورس ایران سعی می کنیم علاوه بر آموزش برنامه نویسی، به مسائل مرتبط و مهارت های نرم بپردازیم تا بعدهای مختلف را پوشش دهیم.

دیدگاه کاربران

تعداد دیدگاه های کاربران : 9 دیدگاه
Avatar
مریم
پاسخ دهید

سلام دوستان من یه مشکلی داشتم که این فایل هایی که باید اپلود کنم دقیقا چه فایلهای باید همراه با فایلی که روی وبهوک ست میکنم اپلود کنم. دوستان خواهش می کنم راهنمایی کنید

Avatar
حسن
پاسخ دهید

سلام .
دوست عزیز شما باید فایل php رو داخل پوشه public_html بریزید

Avatar
امیر
پاسخ دهید

دوستان عزیز،به نظر بنده مطالب سایت عالی و گویاست،اما در صورتیکه مفاهیم برایتان گنگ نامفهوم هستند،میتونید در کانال تلگرام ما ، آموزشهای ساخت ربات تلگرامی رو یاد بگیرید و به همراه صدها سورس که دو کانال موجود هست رباتسازی رو آغاز کنید.

با تشکر از مدیریت محترم سایت

Avatar
بهرام
پاسخ دهید

با سلام.
نوشتین:”لان می‌توانید تمام فایل‌های خود را به دایرکتوری وب هوک آپلود کنید و ربات خود را آزمایش نمایید.”
منظورتون چیه؟؟

من دامنه و هاست خریداری کرده ام.
یه ساب دامین به نام robot..ir
ایجاد کرده ام.
حتی ssl هم روی آن فعال کرده ام.
توی botfather هم ربات ایجاد و توکن دریافت کرده ام.

اگه کسی میتونه کامل راهنماییم کنه که ادامه کار چی هستش؟
یک ماه هست که روی این قضیه کار میکنم و سایتهای متعددی رفتم،ولی هیچ کسی اطلاعات دقیقی ننوشته!!

ینی معلوم نیس فایلهامو کجا آپلود کنم و چطوری فایل php که ایجاد کردم رو به رباتم وصل کنم؟؟

    Avatar
    پرهام در پاسخ بهرام
    پاسخ دهید

    درود
    من هم همین مشکل رو دارم
    لطفا یکی کمک کنه.

    Avatar
    حسن در پاسخ بهرام
    پاسخ دهید

    سلام.
    دوست عزیز شما باید فایل php رو داخل پوشه public_html بریزید . سوالی بود تو تلگرام در خدمتم @toagt

Avatar
یونس سعیدی
پاسخ دهید

سلام!
چطوری میشه که لیست کاربران ربات رو گرفت؟

Avatar
پوریا
پاسخ دهید

دمت گرم عالی بود

Avatar
حسن
پاسخ دهید

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


شما با موفقیت در خبرنامه ما عضو شدید