تخفیف ویژه

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

دسته بندی: لاراول
زمان مطالعه: 17 دقیقه
۱۳ تیر ۱۳۹۹

تلگرام یک سرویس پیام‌رسان مبتنی بر وب است. این برنامه به‌طور رسمی Platform ربات خود را در تاریخ 24 ژوئن 2015 منتشر کرد. ما می‌توانیم از این ربات‌های تلگرام برای ارسال پیام، آهنگ، تصویر، فیلم و بسیاری از مطالب دیگر برای یک فرد، گروه یا کانال خاصی استفاده کنیم. در ادامه به آموزش ساخت ربات تلگرام با لاراول و BotMan می‌پردازیم.

فهرست محتوای این مقاله

ساخت ربات تلگرام

برای شروع کار، ابتدا باید یک ربات در تلگرام ایجاد کنیم.

ساخت ربات تلگرام با لاراول

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

  1. به botfather@ رفته و بر روی Start کلیک کنید.
  2. newbot/ را انتخاب کنید.
  3. اسم ربات خود را وارد کنید. به‌طور مثال Imagebot
  4. یک Username که با bot باید تمام شود را برای ربات خود انتخاب کنید. به‌طور مثال myImagebotir_bot یا myImagebotirbot که این نام نباید تکراری باشد، یعنی باید Unique و خاص باشد.
  5. token خود را در جایی امن ذخیره کنید، چون داشتن token برای کار با این ربات ضروری است.

شروع کار با Botman

همان‌طور که در ابتدا گفتیم، ربات تلگرام خود را با استفاده از Botman می‌خواهیم Dynamic یا پویا کنیم. برای این ‌کار ابتدا به نصب Botman می‌پردازیم.

نصب Botman

برای سرعت دادن به نصب Botman کافی است، توسط دستور زیر، Botman Studio را که شامل بروزترین نسخه‌ی Laravel و Botman است را نصب کنید.

composer create-project --prefer-dist botman/studio ilovedogs

برای اینکه از نصب شدن صحیح Botman Studio مطمئن شوید، از طریق Terminal دستور زیر را در پوشه‌ی ilovedogs که همان پوشه‌ای است که Botman Studio را در آن نصب کردیم، اجرا کنید.

php artisan botman:tinker

سپس "Hi" را تایپ کنید و آن را به سمت Botman ارسال کنید، در صورتی که جواب "Hello" را دریافت کردید، Botman به درستی بر‌روی سیستم شما نصب شده است.

ساخت ربات تلگرام با لاراول

ساخت و سفارشی‌سازی Command ها

می‌خواهیم رباتی که می‌سازیم، قادر به پاسخگویی به انواع مختلف پیام‌ها و درخواست‌ها باشد. به‌طور مثال در لیست زیر تعدادی از ویژگی‌هایی که ربات ما باید قادر به پاسخگویی آن‌ها باشد را آورده‌ایم.

  • ارسال تصادفی عکس سگی از‌ تمام نژادها
  • ارسال تصادفی عکس سگی از‌ یک نژاد خاص
  • ارسال تصادفی عکس سگی از‌ یک مجموعه و زیرمجموعه نژادها
  • پشتیبانی و پاسخ به سوالات
  • دادن پیغامی مناسب به درخواست‌های نامعتبر

ارسال تصادفی عکس سگی از‌ تمام نژادها

برای شروع کار ابتدا محتویات درون routes/botman.php را به‌طور کامل پاک کنید.

اگر تا‌ به‌‌ حال تجربه‌ی کار با یک ربات تلگرام را داشته باشید، می‌دانید که برای دریافت یک یا چند داده لازم است یک درخواست با یک Keyword خاص به سمت ربات مورد نظر ارسال کنید. در این ربات برای دریافت عکس سگی از تمام نژاد‌ها از دستور random/ استفاده می‌کنیم.

درون routes/botman.php دستورات زیر را وارد کنید.

<?php

use App\Conversations\StartConversation;

$botman = resolve('botman');

$botman->hears('/random', 'App\Http\Controllers\AllBreedsController@random');

سپس از طریق دستور زیر در Terminal, یک Controller به‌نام AllBreedsController ایجاد کنید.

php artisan make:controller AllBreedsController

حال به AllBreedsController رفته و محتویات آن را به شکل زیر تغییر دهید.

<?php

namespace App\Http\Controllers;

use App\Services\DogService;
use App\Http\Controllers\Controller;

class AllBreedsController extends Controller
{
    /**
     * Controller constructor
     * 
     * @return void
     */
    public function __construct()
    {
        $this->photos = new DogService;
    }

    /**
     * Return a random dog image from all breeds.
     *
     * @return void
     */
    public function random($bot)
    {
        // $this->photos->random() is basically the photo URL returned from the service.
        // $bot->reply is what we will use to send a message back to the user.
        $bot->reply($this->photos->random());
    }

}

حال یک instance از DogService، که وظیفه‌ی برقراری ارتباط از طریق API و دریافت عکس‌ها را دارد در app/services/DogService.php ایجاد می‌کنیم.

محتویات DogService.php را به شکل زیر وارد می‌کنیم.

<?php

namespace App\Services;

use Exception;
use GuzzleHttp\Client;

class DogService
{
    // The endpoint we will be getting a random image from.
    const RANDOM_ENDPOINT = 'https://dog.ceo/api/breeds/image/random';

    /**
     * Guzzle client.
     *
     * @var GuzzleHttp\Client
     */
    protected $client;

    /**
     * DogService constructor
     * 
     * @return void
     */
    public function __construct()
    {
        $this->client = new Client;
    }

    /**
     * Fetch and return a random image from all breeds.
     *
     * @return string
     */
    public function random()
    {
        try {
            // Decode the json response.
            $response = json_decode(
                // Make an API call an return the response body.
                $this->client->get(self::RANDOM_ENDPOINT)->getBody()
            );

            // Return the image URL.
            return $response->message;
        } catch (Exception $e) {
            // If anything goes wrong, we will be sending the user this error message.
            return 'An unexpected error occurred. Please try again later.';
        }
    }
}

ارسال تصادفی عکس سگی از‌ یک نژاد خاص

همان‌طور که در بالا گفتیم، برای دریافت یک یا چند داده لازم است یک درخواست با یک Keyword خاص به سمت ربات مورد نظر ارسال کنید، در این ربات برای دریافت عکس سگی از‌ یک نژاد خاص از دستور {نژاد سگ} b/ استفاده می‌کنیم.

مانند بالا ،درون routes/botman.php دستورات زیر را، این بار برای ارسال تصادفی عکس سگی از‌ یک نژاد خاص وارد کنید.

$botman->hears('/b {breed}', 'App\Http\Controllers\AllBreedsController@byBreed');

حال به AllBreedsController رفته و محتویات زیر را برای ارسال تصادفی عکس سگی از‌ یک نژاد خاص، به کد اصلی اضافه کنید.

/**
 * Return a random dog image from a given breed.
 *
 * @return void
 */
public function byBreed($bot, $name)
{
    // Because we used a wildcard in the command definition, Botman will pass it to our method.
    // Again, we let the service class handle the API call and we reply with the result we get back.
    $bot->reply($this->photos->byBreed($name));
}

در این مرحله باز هم مانند قبل، این بار به DogService.php رفته و متد byBreed را در آن، به شکل زیر تعریف می‌کنیم.

/**
 * Fetch and return a random image from a given breed.
 *
 * @param string $breed
 * @return string
 */
public function byBreed($breed)
{
    try {
        // We replace %s    in our endpoint with the given breed name.
        $endpoint = sprintf(self::BREED_ENDPOINT, $breed);

        $response = json_decode(
            $this->client->get($endpoint)->getBody()
        );

        return $response->message;
    } catch (Exception $e) {
        return "Sorry I couldn\"t get you any photos from $breed. Please try with a different breed.";
    }
}

حال به ابتدای DogService.php رفته و دستور زیر را بعد از const RANDOM_ENDPOINT وارد کنید.

// The endpoint we will hit to get a random image by a given breed name.
const BREED_ENDPOINT = 'https://dog.ceo/api/breed/%s/images/random';

ارسال تصادفی عکس سگی از‌ یک مجموعه و زیرمجموعه نژادها

برای دریافت عکس سگی از‌ یک مجموعه و زیرمجموعه نژادها از دستور {زیر مجموعه نژاد سگ}:{نژاد سگ} s/ استفاده می‌کنیم.

ساخت ربات تلگرام با لاراول

مانند بالا ،درون routes/botman.php دستورات زیر را، این بار برای ارسال تصادفی عکس سگی از‌ یک مجموعه و زیرمجموعه نژادها وارد کنید.

$botman->hears('/s {breed}:{subBreed}', 'App\Http\Controllers\SubBreedController@random');

حال یک Controller جدید، به‌نام SubBreedController را توسط دستور زیر ایجاد کنید.

php artisan make:controller SubBreedController

حال به SubBreedController رفته و محتویات آن را به شکل زیر تغییر دهید.

<?php

namespace App\Conversations;

use App\Services\DogService;
use App\Http\Controllers\Controller;

class SubBreedController extends Controller
{
    /**
     * Controller constructor
     *
     * @return void
     */
    public function __construct()
    {
        $this->photos = new DogService;
    }

    /**
     * Return a random dog image from all breeds.
     *
     * @return void
     */
    public function random($bot, $breed, $subBreed)
    {
        $bot->reply($this->photos->bySubBreed($breed, $subBreed));
    }
}

در این مرحله باز هم مانند مراحل قبل به DogService.php رفته و دستورات زیر را به آن اضافه کنید.

/**
 * Fetch and return a random image from a given breed and its sub-breed.
 *
 * @param string $breed
 * @param string $subBreed
 * @return string
 */
public function bySubBreed($breed, $subBreed)
{
    try {
        $endpoint = sprintf(self::SUB_BREED_ENDPOINT, $breed, $subBreed);

        $response = json_decode(
            $this->client->get($endpoint)->getBody()
        );

        return $response->message;
    } catch (Exception $e) {
        return "Sorry I couldn\"t get you any photos from $breed. Please try with a different breed.";
    }
}

حال به ابتدای DogService.php رفته و دستور زیر را بعد از const BREED_ENDPOINT وارد کنید.

// The endpoint we will hit to get a random image by a given breed name and its sub-breed.
const SUB_BREED_ENDPOINT = 'https://dog.ceo/api/breed/%s/%s/images/random';

پشتیبانی و پاسخ به سوالات

در بعضی از ربات‌های تلگرام، به خصوص Chatbot ها، شما نمی‌خواهید که کاربر تنها بتواند با ارسال یک Keyword خاص با ربات گفت‌وگو یا انتقال داده انجام دهد. گاهی اوقات از کاربر می‌خواهید که اطلاعاتی را درباره خودش وارد کند تا با توجه به آن اطلاعات عمل‌های خاصی را انجام دهید.

ساخت ربات تلگرام با لاراول

برای ایجاد یک بخش برای این کار‌ها، یا به‌طور مثال بخش Conversation یا گفت‌و‌گو، به routes/botman.php رفته و کد زیر را اضافه کنید.

$botman->hears('Start conversation', 'App\Http\Controllers\ConversationController@index');

حال یک Controller جدید، به‌نام ConversationController را توسط دستور زیر ایجاد کنید.

php artisan make:controller ConversationController

در این مرحله به ConversationController رفته و محتویات آن را به شکل زیر تغییر دهید.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Conversations\DefaultConversation;

class ConversationController extends Controller
{
    /**
     * Create a new conversation.
     *
     * @return void
     */
    public function index($bot)
    {
        // We use the startConversation method provided by botman to start a new conversation and pass
        // our conversation class as a param to it.
        $bot->startConversation(new DefaultConversation);
    }
}

در این مرحله به app/Conversations رفته و DefaultConversation.php را ایجاد کنید.

در DefaultConversation.php دستورات زیر را وارد کنید.

<?php

namespace App\Conversations;

use BotMan\BotMan\Messages\Incoming\Answer;
use BotMan\BotMan\Messages\Outgoing\Question;
use BotMan\BotMan\Messages\Outgoing\Actions\Button;
use BotMan\BotMan\Messages\Conversations\Conversation;

class DefaultConversation extends Conversation
{
    /**
     * First question to start the conversation.
     *
     * @return void
     */
    public function defaultQuestion()
    {
        // We first create our question and set the options and their values.
        $question = Question::create('Huh - you woke me up. What do you need?')
            ->addButtons([
                Button::create('Random dog photo')->value('random'),
                Button::create('A photo by breed')->value('breed'),
                Button::create('A photo by sub-breed')->value('sub-breed'),
            ]);

        // We ask our user the question.
        return $this->ask($question, function (Answer $answer) {
            // Did the user click on an option or entered a text?
            if ($answer->isInteractiveMessageReply()) {
                // We compare the answer to our pre-defined ones and respond accordingly.
                switch ($answer->getValue()) {
                case 'random':
                    $this->say((new App\Services\DogService)->random());
                    break;
                    case 'breed':
                        $this->askForBreedName();
                        break;
                    case 'sub-breed':
                        $this->askForSubBreed();
                        break;
                }
            }
        });
    }

    /**
     * Ask for the breed name and send the image.
     *
     * @return void
     */
    public function askForBreedName()
    {
        $this->ask('What\'s the breed name?', function (Answer $answer) {
            $name = $answer->getText();

            $this->say((new App\Services\DogService)->byBreed($name));
        });
    }

    /**
     * Ask for the breed name and send the image.
     *
     * @return void
     */
    public function askForSubBreed()
    {
        $this->ask('What\'s the breed and sub-breed names? ex:hound:afghan', function (Answer $answer) {
            $answer = explode(':', $answer->getText());

            $this->say((new App\Services\DogService)->bySubBreed($answer[0], $answer[1]));
        });
    }

    /**
     * Start the conversation
     *
     * @return void
     */
    public function run()
    {
        // This is the boot method, it's what will be excuted first.
        $this->defaultQuestion();
    }
}

دادن پیغامی مناسب به درخواست‌های نامعتبر

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

برای ایجاد این بخش ابتدا به routes/botman.php رفته و کد زیر را اضافه کنید.

$botman->fallback('App\Http\Controllers\FallbackController@index');

حال یک Controller جدید، به‌نام FallbackController را توسط دستور زیر ایجاد کنید.

php artisan make:controller FallbackController

در این مرحله به FallbackController رفته و محتویات آن را به شکل زیر تغییر دهید.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class FallbackController extends Controller
{
    /**
     * Respond with a generic message.
     *
     * @param Botman $bot
     * @return void
     */
    public function index($bot)
    {
        $bot->reply('Sorry, I did not understand these commands. Try: \'Start Conversation\'');
    }
}

تست ربات

برای تست کردن نحوه‌ی کارکرد ربات، ابتدا دستور زیر را وارد کنید.

php artisan serve

سپس وارد localhost خود شده و از صفحه‌ی اصلی Botman، قسمت Tinker را انتخاب کنید. در این جا کافی است، شما یکی از دستوراتی که در routes/botman.php وارد کردید، مانند random/ را اجرا کنید. در صورتی  که لینک عکس برای شما ارسال شود، مطمئن شوید، که ربات به درستی کار می‌کند.

نصب Driver تلگرام

پس از ساخت ربات تلگرام با لاراول ، سفارشی‌سازی و تست ربات، حال نوبت به نصب Driver تلگرام برای ایجاد ارتباط با این ربات در Botman رسیده است.

ساخت ربات تلگرام با لاراول

برای این کار دستور زیر را در Terminal و در پوشه‌ی ilovedogs وارد کنید.

composer require botman/driver-telegram

حال دستور زیر را به فایل env. موجود در پوشه‌ی برنامه اضافه کنید، و به جای YOUR_TOKEN، همان Tokenی را که در ابتدا گفتیم، در یک جای امن ذخیره کنید، وارد کنید.

نصب ngrok

تلگرام برای راه اندازی webhook و دریافت پیام‌های مختلف از سمت کاربران ربات، نیاز به یک URL امن و معتبر دارد که در این ‌جا ما از ngrok استفاده می‌کنیم.

برای نصب ngrok به سایت آن یعنی ngrok.com مراجعه کنید و با توجه به سیستم عامل خود، آن را به راحتی نصب کنید.

سپس آن را unzip کنید و در مکانی که آن را unzip کردید، کدی مانند کد زیر، که در همان قسمت نصب ngrok به شما نمایش داده شده است، را در Terminal وارد کنید.

./ngrok authtoken 1sYdDibllywd0Xbp342VTRq1Mxl_6xSwfryHYjv7BHRr8iHMh

در آخر توسط کد زیر آن را بر روی localhost و Port 8000 اجرا کنید.

./ngrok http 8000

لینک کردن ربات به تلگرام

مرحله‌ی آخر این آموزش، نحوه لینک کردن ربات Botman به تلگرام است.

برای این‌ کار باید به شکل زیر یک request از نوع Post به api تلگرام ارسال کنید.

https://api.telegram.org/bot{TOKEN}/setWebhook

هم‌چنین می‌توانید از طریق Terminal یا Postman دستور زیر را اجرا کنید.

curl -X POST -F 'url=https://{YOU_URL}/botman' https://api.telegram.org/bot{TOKEN}/setWebhook

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

جمع‌بندی:

امروزه با گسترش تکنولوژی بسیاری از کسب و کار‌های فیزیکی به کسب و کارهایی مجازی تبدیل شده است. تعداد بسیار زیادی از این نوع کسب و کارها به یک پشتیبانی که به درخواست‌های مشتری یا کاربر اعم از پیگیری سفارشات، انتقادات، شکایت‌ها و بسیاری دیگر از درخواست‌ها پاسخ بدهد نیاز دارد. ربات‌های تلگرام یکی از پشتیبان‌های قوی و حرفه‌ای برای پاسخ‌گویی به این درخواست‌ها و نیاز‌ها هستند. در این مقاله به آموزش ساخت ربات تلگرام با لاراول و Botman پرداختیم. اگر در این مورد سوال یا نظری داشتید خوشحال می‌شویم که با ما و کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر لاراول علاقه دارید می‌توانید در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

 

چه امتیازی به این مقاله می دید؟
نویسنده علی مجیدی
Backend Developer | PHP & Laravel Developer

نظرات کاربران

neyvid

بسیار عالی…ممنون

Vidafatehi

سلام من می‌خوام ی سایت کاری برای کسب کار راه اندازی کنم لطفاً راهنمایی کنید

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :