تلگرام یک سرویس پیامرسان مبتنی بر وب است. این برنامه بهطور رسمی Platform ربات خود را در تاریخ 24 ژوئن 2015 منتشر کرد. ما میتوانیم از این رباتهای تلگرام برای ارسال پیام، آهنگ، تصویر، فیلم و بسیاری از مطالب دیگر برای یک فرد، گروه یا کانال خاصی استفاده کنیم. در ادامه به آموزش ساخت ربات تلگرام با لاراول و BotMan میپردازیم.
ساخت ربات تلگرام
برای شروع کار، ابتدا باید یک ربات در تلگرام ایجاد کنیم. برای ساخت این ربات به ترتیب مراحل زیر عمل کنید.
به botfather@ رفته و بر روی Start کلیک کنید.
newbot/ را انتخاب کنید.
اسم ربات خود را وارد کنید. بهطور مثال Imagebot
یک Username که با bot باید تمام شود را برای ربات خود انتخاب کنید. بهطور مثال myImagebotir_bot یا myImagebotirbot که این نام نباید تکراری باشد، یعنی باید Unique و خاص باشد.
token خود را در جایی امن ذخیره کنید، چون داشتن token برای کار با این ربات ضروری است.
شروع کار با Botman
همانطور که در ابتدا گفتیم، ربات تلگرام خود را با استفاده از Botman میخواهیم Dynamic یا پویا کنیم. برای این کار ابتدا به نصب Botman میپردازیم.
نصب Botman
برای سرعت دادن به نصب Botman کافی است، توسط دستور زیر، Botman Studio را که شامل بروزترین نسخهی Laravel و Botman است را نصب کنید.
برای اینکه از نصب شدن صحیح 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 دستورات زیر را، این بار برای ارسال تصادفی عکس سگی از یک نژاد خاص وارد کنید.
حال به 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 دستورات زیر را، این بار برای ارسال تصادفی عکس سگی از یک مجموعه و زیرمجموعه نژادها وارد کنید.
حال یک 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 رفته و کد زیر را اضافه کنید.
در این مرحله به 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 رفته و کد زیر را اضافه کنید.
حال یک 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 وارد کنید.
در آخر توسط کد زیر آن را بر روی 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 پرداختیم. اگر در این مورد سوال یا نظری داشتید خوشحال میشویم که با ما و کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه دارید میتوانید در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
۷ دیدگاه
۰۵ دی ۱۴۰۱، ۱۱:۵۹
سلام من میخام داخل هر پست یک دگمه با عنوان سفارش ایجاد کنم که نمیدونم راهش چیه؟ کار هر دگمه اینه که کد محصول هر پست رو که داخل توضیحات هر پست به تفکیک نوشته شده رو به دایرکت بنده ارسال بکنه. نکته اش اینجاست که با کلیک روی هر کدوم از دگمهها عبارت مختلفی رو برای دایرکت میفرسته؟ اینو چطور میشه انجامش داد؟کسی بلده راهنمایی بکنه؟
مرتضی۳۱ شهریور ۱۴۰۰، ۰۵:۱۷
سلام. من همون اول نصب به مشکل برخوردم. با اجرای دستور "php artisan botman:tinker" به خطای زیر برمیخورم:
Unable to set stream resource to non-blocking mode
نازنین کریمی مقدم۳۱ شهریور ۱۴۰۰، ۱۱:۰۹
درود
آیا از vpn یا قندشکن استفاده میکنید؟ چون تحریم هستیم و از ایران نمیشه به صورت مستقیم دسترسی پیدا کرد.
مرتضی۰۹ مهر ۱۴۰۰، ۰۶:۱۹
ممنون، با تحریم شکن مشکل حل میشه؟؟
نازنین کریمی مقدم۱۰ مهر ۱۴۰۰، ۱۰:۵۱
درود
بله معمولا اوکیه امتحان کنید و اگر درست نشد میتونید باز مطرح کنید تا با کمک هم حل کنیم.
neyvid۱۶ اسفند ۱۳۹۷، ۱۶:۳۸
بسیار عالی...ممنون
Vidafatehi۰۹ بهمن ۱۳۹۷، ۱۹:۰۷
سلام من میخوام ی سایت کاری برای کسب کار راه اندازی کنم لطفاً راهنمایی کنید