Membuat Bot Telegram dengan Botman di Laravel 8

Hallo guys, kali ini saya akan membahas bagaimana caranya membuat chatbot dengan botman di Laravel 8. Pada tutorial ini kita akan mencoba belajar membuat bot telegram dengan perintah sederhana terlebih dahulu.

Membuat Bot Telegram dengan Botman di Laravel 8

Disini kita akan membuat bot telegram untuk mencari Hadits berdasarkan kitab yang dipilih dan nomor hadits yang ingin dicari. Sebelum melangkah lebih jauh, kita kenalan dulu sama Botman. Apa sih Botman itu?

Jadi Botman itu adalah sebuah framework yang digunakan untuk membuat chatbot dengan menggunakan bahasa pemrograman PHP. Botman support beberapa saluran perpesanan yang berbeda, seperti Amazon Alexa, Facebook, Telegram, Slack, dll. Untuk mengetahui seluk beluk dan dokumentasi botman, silahkan kunjungi website officialnya.

Bagaimana cara membuat bot telegram dengan botman di laravel ?

Berikut beberapa step yang kita akan lakukan di tutorial ini.

Install Laravel 8

Pada langkah pertama ini kita akan menginstall laravel 8 terlebih dahulu. Disini saya berikan contoh nama projectnya yaitu laravelhadits-bot.

composer create-project --prefer-dist laravel/laravel laravelhadits-bot

Ubah .env file

Setelah itu, buka file .env dan ubah nama database, username, dan password di file .env tersebut. Serta tambahkan juga baris baruTELEGRAM_TOKEN

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=Nama_database
DB_USERNAME=Username_database
DB_PASSWORD=Password_database

TELEGRAM_TOKEN=Token_telegram_kamu

Install Botman dan Botman Driver

Pada langkah ini kita akan menginstall Botman Driver, jalankan 3 perintah dibawah ini.

composer require botman/botman
composer require botman/driver-web
composer require botman/driver-telegram

Penjelasan:

Pada line pertama kita membutuhkan driver utama botman, setelah itu line kedua kita membutuhkan driver-web untuk testing bot kita secara local, pada line terakhir kita membutuhkan driver-telegram agar bisa berkomunikasi dengan telegram bot.

Buat Konfigurasi File

Langkah ini kita akan memberikan konfigurasi pada folder config.

buat folder dengan nama botman, lalu buat 2 file yaitu config.php dan web.php

File config.php yang memiliki fungsi untuk cache conversation, jadi bisa diubah berapa detik cache akan bertahan. Tambahkan kode berikut dalam file config/botman/config.php

<?php

return [
    'conversation_cache_time' => 30000,
    'user_cache_time' => 30000,
];
?>

File web.php yang memiliki fungsi untuk matchingData dari driver. Tambahkan kode berikut dalam file config/botman/web.php

<?php

return [
    
    'matchingData' => [
        'driver' => 'web',
    ],
];

Setelah itu jalan migrate

php artisan migrate

Tambahkan Route

Buka file yang berletak di routes/web.php dan tambahkan kode berikut:

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BotManController;


Route::get('/', function () {
    return view('welcome');
});

Route::match(['get', 'post'], '/botman', [BotManController::class, 'handle']);

Buat Controller dengan artisan command

Setelah itu kita akan membuat controller yang bernama BotManController , jalankan perintah dibawah untuk membuat controller

php artisan make:controller BotManController

perintah diatas maka otomatis akan membuat controller. Selanjutnya kita buka file controller tadi yang terletak di app/http/controller/BotManController.php. Tambahkan kode dibawah ini;

<?php
namespace App\Http\Controllers;

use BotMan\BotMan\BotMan;
use App\Conversations\ExampleConversation;
use BotMan\BotMan\Cache\LaravelCache;
use BotMan\BotMan\BotManFactory;
use BotMan\BotMan\Drivers\DriverManager;


class BotManController extends Controller
{
    /**
     * Place your BotMan logic here.
     */
    public function handle()
    {
        // Load the driver(s) you want to use
        DriverManager::loadDriver(\BotMan\Drivers\Telegram\TelegramDriver::class);

        $config = [
            // Your driver-specific configuration
            "telegram" => [
               "token" => env('TELEGRAM_TOKEN')
            ]
        ];
        $botman = BotManFactory::create($config, new LaravelCache());


        $botman->hears('/start|start|mulai', function (BotMan $bot) {
            $user = $bot->getUser();
            $bot->reply('Assalamualaikum '.$user->getFirstName().', Selamat datang di Hadits Telegram Bot!. ');
            $bot->startConversation(new ExampleConversation());
        })->stopsConversation();

        $botman->hears('/kitab|kitab', function (BotMan $bot) {
            $bot->startConversation(new ExampleConversation());
        })->stopsConversation();

        $botman->hears('/lapor|lapor|laporkan', function (BotMan $bot) {
            $bot->reply('Silahkan laporkan di email weare@zalabs.my.id . Laporan kamu akan sangat berharga buat kemajuan bot ini.');
        })->stopsConversation();

        $botman->hears('/tentang|about|tentang', function (BotMan $bot) {
            $bot->reply('HaditsID Telegram Bot By ZaLabs. Mohon maaf jika server terasa lamban, dikarenakan menggunakan free hosting dari Heroku(.)com. Data didapatkan dari https://s.id/zXj6S .');
        })->stopsConversation();

        $botman->listen();
    }

}

Buat Conversations

Buat folder baru didalam folder app berikan nama foldernya yaitu Conversations. Setelah itu Buat file baru bernama ExampleConversation.php.

Ubah file app/Conversations/ExampleConversation.php sesuaikan dengan kode dibawah ini.

<?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 ExampleConversation extends Conversation
{
    protected $kitab = 'muslim';
    /**
     * First question
     */
    public function askHadits()
    {
        $question = Question::create("Silahkan pilih kitab yang ingin dicari.")
            ->fallback('Unable to ask question')
            ->callbackId('ask_reason')
            ->addButtons([
                Button::create('HR. Abu Daud')->value('dawud'),
                Button::create('HR. Bukhari')->value('bukhari'),
                Button::create('HR. Ibnu Majah')->value('majah'),
                Button::create('HR. Muslim')->value('muslim'),
                Button::create('HR. Nasai')->value('nasai'),
                Button::create('HR. Tirmidzi')->value('tirmidzi'),
            ]);

        return $this->ask($question, function (Answer $answer) {
            if ($answer->isInteractiveMessageReply()) {
                switch ($answer->getValue()) {
                    case 'dawud':
                        $this->kitab = 'dawud';
                        $this->jawabanNya('HR. Abu Daud');
                        break;
                    case 'bukhari':
                        $this->kitab = 'bukhari';
                        $this->jawabanNya('HR. Bukhari');
                        break;
                    case 'majah':
                        $this->kitab = 'majah';
                        $this->jawabanNya('HR. Ibnu Majah');
                        break;
                    case 'muslim':
                        $this->kitab = 'muslim';
                        $this->jawabanNya('HR. Muslim');
                        break;
                    case 'nasai':
                        $this->kitab = 'nasai';
                        $this->jawabanNya('HR. Nasai');
                        break;
                    case 'tirmidzi':
                        $this->kitab = 'tirmidzi';
                        $this->jawabanNya('HR. Tirmidzi');
                        break;

                    default:
                        # code...
                        break;
                }

            }
        });
    }

    public function jawabanNya($tokoh)
    {
        $this->ask('Kamu memilih kitab dari '.$tokoh.'. Silahkan masukkan nomor hadits yang ingin dicari.', function (Answer $answer) {
            $no = $answer->getText();
            $hasil=$this->getData($this->kitab, $no);
            $jawaban = sprintf("Hadits menjelaskan tentang: ".$hasil[3].". \r\t\n\n ".$hasil[0]."\r\t\n\n ".$hasil[1]);
            $this->say($jawaban);
            if ($hasil[2]==true) {
                $this->say('Silahkan laporkan permasalahan ini dengan menu /lapor .');
            }
        });
    }

    public function getData($kitab, $no)
    {
        try {
            $str='https://scrape-fastapi.herokuapp.com/hadits/?tokoh='.$kitab.'&no='.$no;
            $dt = json_decode(file_get_contents($str));
            return [$dt->data->contents->arab, $dt->data->contents->id, false, $dt->data->contents->judul];
        } catch (\Throwable $th) {
            return ["Something went wrong 😯️","Sepertinya ada masalah.🧐️", true];
        }

    }
    /**
     * Start the conversation
     */
    public function run()
    {
        $this->askHadits();
    }
}

Buat File Blade

Setelah itu kita buat blade file untuk kita uji coba bot kita secara local / web. Kita berikan nama file bladenya yaitu welcome.blade.php. Tambahkan kode dibawah ini.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Botman Chatbot in Laravel - AfrizalMY.com</title>
        <link href="https://afrizalmy.com/cloudme.fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
    </head>
    <body>
    </body>

    <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/assets/css/chat.min.css">
    <script>
        var botmanWidget = {
            aboutText: 'Write Something',
            introMessage: "✋ Hi! I'm Afrizal MY"
        };
    </script>

    <script src='https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/js/widget.js'></script>

</html>

Jalankan server

Kita uji coba melalui local / web terlebih dahulu, jalan php artisan serve.

Lalu kita akan mencoba chat melalui widget di pojok kanan bawah, hasilnya akan seperti ini.

Buat Telegram Bot

Setelah kita berhasil menjalankan pada local server, kita ingin dong bot kita bisa dipakai melalui telegram. Maka dari itu kita akan membuat Telegram Bot terlebih dahulu dengan BotFather.

Buka telegram, lalu cari di pencarian Botfather, ketikkan /newbot, masukkan nama dan username bot kamu, setelah itu akan di berikan token dari BotFather.

ubah pada file .envtadi bagian TELEGRAM_TOKEN ubah Token_telegram_kamu dengan token yang BotFather kirimkan tadi.

TELEGRAM_TOKEN=Token_telegram_kamu

Jalankan melalui Ngrok Server

Karena Telegram memerlukan URL yang valid dan aman untuk menyiapkan webhook dan menerima pesan dari pengguna bot kamu, disini saya akan menggunakan ngrok atau kamu dapat menerapkan aplikasimu di server dan menyiapkan sertifikat SSL, tetapi untuk demo saya akan tetap menggunakan ngrok. Buka Halaman Unduh  dan klik tombol unduh yang sesuai dengan sistem operasi kamu.

Jangan lupa jalankan server laravel php artisan serve terlebih dahulu.

Setelah itu jalankan ngrok dengan perintah ./ngrok http <port_laravel>. Ubah <port_laravel> sesuai port yang kamu gunakan di laravel.

Hubungkan bot ke telegram

Langkah terakhir adalah menautkan aplikasi kita ke Telegram Bot yang kita buat sebelumnya dan untuk melakukan itu kita akan membuat permintaan POST ke URL ini dan meneruskan URL yang dihasilkan ngrok untuk kita:

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

Kamu bisa melakukan ini melalui Postman atau CURL dengan menjalankan perintah ini:

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

Jika kalian melakukannya dengan benar, kalian akan menerima respon JSON yang tepat ini:

{
    "ok": true,
    "result": true,
    "description": "Webhook was set"
}

Ubah file VerifyCsrfToken

Setelah berhasil memberikan menghubungkan bot dengan telegram, kita HARUS menambahkan /botman pada file app/Http/Middleware/VerifyCsrfToken.php.

Karena jika tidak diubah maka system akan merespond 419 unknown status.

Berikut cuplikan file VerifyCsrfToken

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    protected $except = [
        // tambahkan dibawah ini
        '/botman'
    ];
}

Test di Telegram

Berikut adalah hasil akhir dari tutorial ini

Live Demo : http://t.me/hadits_id_bot

Yap, kita sampai sini kita sudah berhasil bagaimana caranya membuat bot telegram menggunakan botman pada laravel 8.

Cukup sekian ya teman-teman, semoga artikelnya membantu.