تلگرام یک سرویس پیامرسان مبتنی بر وب است. این برنامه بهطور رسمی Platform ربات خود را در تاریخ 24 ژوئن 2015 منتشر کرد. ما میتوانیم از این رباتهای تلگرام برای ارسال پیام، آهنگ، تصویر، فیلم و بسیاری از مطالب دیگر برای یک فرد، گروه یا کانال خاصی استفاده کنیم. در ادامه به آموزش ساخت ربات تلگرام با لاراول و BotMan میپردازیم.
برای شروع کار، ابتدا باید یک ربات در تلگرام ایجاد کنیم. برای ساخت این ربات به ترتیب مراحل زیر عمل کنید.
همانطور که در ابتدا گفتیم، ربات تلگرام خود را با استفاده از Botman میخواهیم Dynamic یا پویا کنیم. برای این کار ابتدا به نصب 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 به درستی برروی سیستم شما نصب شده است.
میخواهیم رباتی که میسازیم، قادر به پاسخگویی به انواع مختلف پیامها و درخواستها باشد. بهطور مثال در لیست زیر تعدادی از ویژگیهایی که ربات ما باید قادر به پاسخگویی آنها باشد را آوردهایم.
برای شروع کار ابتدا محتویات درون 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 تلگرام برای ایجاد ارتباط با این ربات در Botman رسیده است. برای این کار دستور زیر را در Terminal و در پوشهی ilovedogs وارد کنید.
composer require botman/driver-telegram
حال دستور زیر را به فایل env. موجود در پوشهی برنامه اضافه کنید، و به جای YOUR_TOKEN، همان Tokenی را که در ابتدا گفتیم، در یک جای امن ذخیره کنید، وارد کنید.
تلگرام برای راه اندازی 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 پرداختیم. اگر در این مورد سوال یا نظری داشتید خوشحال میشویم که با ما و کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه دارید میتوانید در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
سلام من میخام داخل هر پست یک دگمه با عنوان سفارش ایجاد کنم که نمیدونم راهش چیه؟ کار هر دگمه اینه که کد محصول هر پست رو که داخل توضیحات هر پست به تفکیک نوشته شده رو به دایرکت بنده ارسال بکنه. نکته اش اینجاست که با کلیک روی هر کدوم از دگمهها عبارت مختلفی رو برای دایرکت میفرسته؟ اینو چطور میشه انجامش داد؟کسی بلده راهنمایی بکنه؟
سلام. من همون اول نصب به مشکل برخوردم. با اجرای دستور "php artisan botman:tinker" به خطای زیر برمیخورم: Unable to set stream resource to non-blocking mode
درود آیا از vpn یا قندشکن استفاده میکنید؟ چون تحریم هستیم و از ایران نمیشه به صورت مستقیم دسترسی پیدا کرد.
ممنون، با تحریم شکن مشکل حل میشه؟؟
درود بله معمولا اوکیه امتحان کنید و اگر درست نشد میتونید باز مطرح کنید تا با کمک هم حل کنیم.
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: