چگونه ربات برای تلگرام بنویسیم.

telegram botFatherیکی از مسنجرهایی که عاشقشم تلگرام هستش . البته درصد دوست داشتن من بعد از مهاجرت ایرانی ها از وایبر یکمی کمتر شده ولی باز هرچی هم باشه بهترین مسنجر دنیاست .

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

رباتی که ما خواهیم ساخت قرار نیست کار خاصی بکنه ولی کم کم میتونید بزرگش کنید و کارهای خارق العاده براتون انجام بده .

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

این شد دلیل ، که بشینم و یه ربات بنویسیم و شمارو با مراحلش آشنا کنم .

خب هی فکر کردم چه رباتی بنویسم هم کوچیک باشه هم به درد بخور که به گروه هایی که عضوشم داشتم فکر میکردم که یهو دیدم چه بهتر از گروه کاربران لاراول که یه ربات بنویسم و با یه سری کامند ها اطلاعات برگزاری جلسه بعد رو از روی سایت بخونه و نمایش بده .

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

مرحله یک : ساخت بات و دریافت توکن اجازه دسترسی (authorization token)

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

یک : توی سایت در این لینک ثبت نام کنید و توکن دریافت کنید .

دو : با استفاده از یکی از ربات های خود تلگرام به اسم (botFather) توکن دریافت کنید .

که من خودم مرحله دو رو بیشتر پسندیدم و حس کردم راحت تر هست . براتون توضیح میدم .

۱-روی این لینک کلیک کنید :

https://telegram.me/botfather

۲-توی مسنجر خودتون این بات نمایش داده میشه . دکمه استارت رو بزنید و لیست کامندهای این بات براتون بیاد  .

لیست کامندها و توضیحات خیلی شفاف هستش

/newbot

با این کامند میتونید اسم و یوزرنیم رباتتون رو اضافه کنید . بعد این کار توکن براتون داده میشه .

بعد دریافت توکن میتونید از همه متدهای ای پی آی تلگرام استفاده کنید .

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

خیلی راحت میتونید postman رو وا کنید و رکویست هایی که میخواید رو بزنید . نحوه استفاده از توکن هم یکم متقاوت هست و  باید ساختار زیر رو برای همه درخواست هاتون باید رعایت کنید .

https://api.telegram.org/bot<token>/METHOD_NAME

 

مثلا اگه بخواین اطلاعات رباتتون رو دریافت کنید به صورت زیر درخواست میفرستید.

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

مرحله دو : دریافت پیام ها

برای دریافت پیام ها در روش وجود داره :

یک : استفاده از متد

می تونید postman رو وا کنید و یه رکویست به این متد (getUpdates) بفرستید . مثل مثال زیر :

https://api.telegram.org/bot104125181:AAHJEMSvcBovhBkVPqaqldNi36SnK9OyhaM/getUpdates

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

دو : استفاده از webhook

ویکی پدیا وب هوک رو اینجوری تعریف میکنه :

A webhook in web development is a method of augmenting or altering the behavior of a web page, or web application, with custom callbacks. These callbacks may be maintained, modified, and managed by third-party users and developers who may not necessarily be affiliated with the originating website or application. The term “webhook” was coined by Jeff Lindsay in 2007 from the computer programming termHook.[1]

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

بهتر و با مثال برای تلگرام بگم :

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

تلگرام برای اینکه داده ها امن باشه از شما میخواد که از https استفاده کنید و سخت ترین قسمت ماجرا اینجاست که برای یه ربات باید هزینه ssl هم بکنید ولی می تونید از ssl های رایگان استفاده کنید که به لطف کشور عزیزمون شرکت هایی که ssl رایگان میدند برای ایران بسته هستند ولی میتونید از cloudflare استفاده کنید که خیلی راحت هستش کافیه از dns manager کلاود فلیر استفاده کنید و با استفاده از اون بگید که میخوام رو این دامنه و یا زیر دامنه ssl ست باشه .

بعد از اینکه مطمین شدید ssl رو دامنتون فعال شد . میتونید یه رکویست به این متد (setWebhook) مثل مثال زیر بزنید :

https://api.telegram.org/bot104125181:AAHJEMSvcBovhBkVPqaqldNi36SnK9OyhaM/setWebhook

اگه از وب هوک استفاده کنید دیگه متد (getUpdates) براتون غیر فعال میشه .

کافیه توی body مقدار url خودتون که اپتون اونجاست ست کنید . برای حذف وب هوک هم کافیه به همین متد مقدار url رو خالی بزارید و رکوستتون رو ارسال کنید .

مرحله سوم : تعریف دستور

ربات شما توی هر گروهی که باشه مثل اعضای اون گروه باهاش رفتار میشه . یعنی هر پیامی که ارسال میشه یه نسخه هم برای ربات شما ارسال میشه . شما میتونید این پیام هارو چک کنید و آنالیز کنید و جوابی متناسب با اون بدید و یا بیخیالش بشید .

ولی یه گزینه تلگرام داره که شما با اون میتونید لیست دستور هایی که ربات شما بهش جواب میده رو مشخص کنید . دستورات رو میتونید با استفاده از botFather و با کامند /setcommands اضافه کنید .

/setcommands

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

پس از ثبت ربات شما توی هر گروهی باشه با زدن اسلش لیست کامندها نمایش داده میشه .

مرحله چهارم : پردازش پیام و ارسال جواب

الان باید منطق برنامتون رو بنویسید .

یعنی با چه پیام و یا دستوری ربات شما باید چیکار کنه .

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

یه مسله ای که حتما بهش توجه کنید اینه که پیام به صورت json براتون ارسال میشه . با استفاده کد زیر میتونید پیام رودریافت و به صورت آبجکت استفاده نمایید .

$update = json_decode(file_get_contents('php://input'));

مثلا اگه شما تعریف کرده باشید که وقتی دستور /next_event_datetime ارسال شد . بره و از سایت لاراتاکز تاریخ و زمان برگزاری جلسه بعد رو پیدا کنه و به کاربر ارسال کنه . کدش به صورت زیر میشه .

برای گرفتن اطلاعات از سایت موردنظر هم از این پکیج  استفاده کردم .

 

<?php

//telegram sdk and configuration
$client = new Zelenin\Telegram\Bot\Api('someRandomToken');

$update = json_decode(file_get_contents('php://input'));

//your app
try {

    if($update->message->text != '/next_event_datetime')
        exit;
    
    $dom = Sunra\PhpSimple\HtmlDomParser::file_get_html('http://laratalks.com/');
    $element = $dom->find('#location header.section-header h3', 0);
    $dateTime = $element->plaintext;
    
    $response = $client->sendMessage([
        'chat_id' => $update->message->chat->id,
        'text' => $dateTime
    ]);

} catch (\Zelenin\Telegram\Bot\NotOkException $e) {

    //echo error message ot log it
    //echo $e->getMessage();

}

کافیه این کدها رو بسته به نیاز خودتون تغییر بدید .

اینم بات کوچیکی که نوشتم :

http://telegram.me/laraTalkBot

از امیر حبیب‌زاده

از سال 89 برنامه‌نویسی رو شروع کردم، ساختن رو خیلی دوست دارم، قبلا ایوند رو کمک کردم بسازیم الان هم دارم به ساختن تريژر کمک میکنم. پیگیر بلاک‌چین و غیرمتمرکز سازی هستم و محیط‌زیست دغدغه الان من هستش.