Akademi Manajemen Informatika

Halo, selamat datang di Sandi Dharma Blog. lelet tak jumpa, kali ini kita akan belajar Membikin sebuah bot telegram sederhana menggunakan PHP ya. Meskipun sederhana, Kepada mengikuti tutorial ini Engkau disarankan minimal sudah mengerti sedikit tentang pemrogramman khususnya menggunakna bahasa PHP.

Yuk kita mulai…!!!

Menyiapkan Bot

Sebelum kita melakukan koding koding trulala, kita siapkan dulu nih bot telegram kita. Kepada Membikin bot telegram kita perlu menghubungi Bot Father. Bot Father adalah sebuah bot telegram yang bertugas Kepada membantu kita Membikin bot telegram. Buka telegram Engkau, kemudian cari Bot Father pada kolom pencarian.

Cari Bot Father

Akan Eksis banyak bot yang muncul, pastikan Engkau pilih bot yang Mempunyai centang di belakangnya. Engkau juga Dapat klik link berikut Kepada memulai chat dengan Bot Father
https://t.me/BotFather

Kepada Membikin bot Engkau Dapat kirimkan perintah /newbot kepada Bot Father Lewat Engkau akan diminta memasukkan beberapa informasi seperti nama bot yang Ingin dibuat, dan username. Silahkan ikuti saja langkahnya hingga bot selesai dibuatkan dan Engkau diberi api token. Token ini nantinya akan kita gunakan Kepada memberi perintah kepada bot kita. Oleh karena itu, sebisa mungkin jangan bagikan token bot Engkau ke orang lain ya. Tapi kalo terlanjur nggak papa kok, Engkau Dapat meminta Bot Father Kepada menghapus token dan menggantinya dengan yang baru.

Berikut ini adalah screenshoot percakapan saya dengan Bot Father Begitu Membikin bot Kepada tutorial ini.

Membuat Bot

Pada Begitu Membikin bot, Eksis kemungkinan username yang Engkau mau sudah digunakan orang lain. Engkau Dapat berikan alternatif username yang lainnya.

Let’s Code!

Setelah Membikin bot di telegram, kita lanjut Kepada Membikin program Kepada bot kita. Program ini dapat kita anggap sebagai otak dari bot kita. Oleh karena itu sebenarnya bot yang telah kita buat sebelumnya dengan Bot Father Enggak akan Dapat melakukan apa-apa tanpa program.

Oke sesuai dengan judul postingan, kita akan ngoding menggunakan bahasa PHP ya.

Siapkan folder Kepada project kita, buat sebuah file php baru dengan nama terserah Engkau tapi di tutorial ini saya akan Membikin bot dengan nama Telebot sehingga file php saya adalah Telebot.php.

Membikin Kelas

Dalam file Telebot.php ini kita akan buat sebuah kelas dengan nama yang sama seperti nama file nya Yakni Telebot.

php

class Telebot
{
  // To be implemented latter
}

Tambahkan private dan public properties

php

class Telebot
{
    private $update;
    private $tasks = [];

    public string $token;
    public string $apiURL;
}
  1. $update digunakan Kepada menampung update yang dikirimkan telegram.
  2. $tasks digunakan Kepada menyimpan command apa saja yang dapat dikerjakan.
  3. $token digunakan Kepada menampung bot token.
  4. $apiURL digunakan Kepada menyimpan url api telegram bot Kepada berkomunikasi.

Tambahkan Method __construct

php

class Telebot
{
    // kode lainnya

    public function __construct(string $token)
    {
        $this->token = $token;
        $this->apiURL = "https://api.telegram.org/bot" . $this->token;
    }
}
  1. Method constructor ini digunakan Kepada mengisi nilai properti token dan apiURL yang sebelumnya telah dibuat.
  2. Method ini akan dijalankan ketika kita menginisialisasi kelas Telebot

Tambahkan Method createContext

php

class Telebot
{
    // kode lainnya

    private function createContext($update)
    {
        return new class($this->apiURL, $update)
        {
            public
                $apiURL,
                $update,
                $updateId,
                $message,
                $messageId,
                $from,
                $chat,
                $chatId,
                $date,
                $text;

            public function __construct($apiURL, $update)
            {
                $this->apiURL = $apiURL;
                $this->update = $update;
                $this->updateId = $update->update_id;
                if ($update->message != null) {
                    $this->message = $update->message;
                    $this->messageId = $update->message->message_id;
                    $this->from = $update->message->from;
                    $this->chat = $update->message->chat;
                    $this->chatId = $update->message->chat->id;
                    $this->date = $update->message->date;
                    $this->text = $update->message->text;
                }
            }

            public function replyWithText(string $text, array $options = [])
            {
                $data["chat_id"] = $this->chatId;
                $data["text"] = $text;

                if (array_key_exists("reply_to_message_id", $options)) {
                    $data["reply_to_message_id"] = $options["reply_to_message_id"];
                }

                if (array_key_exists("parse_mode", $options)) {
                    if (in_array($options["parse_mode"], ["Markdown", "MarkdownV2", "HTML"])) {
                        $data["parse_mode"] = $options["parse_mode"];
                    }
                }
                $queries = http_build_query($data);
                file_get_contents($this->apiURL . "/sendMessage?$queries");
            }
        };
    }
}
  1. Method ini menggunakan access modifier private
  2. Method ini mengembalikan sebuah anonymous class yang di dalamnya kita mengekstraksi data update yang dikirim dari telegram seperti id chat, pengirim pesan, isi pesan, dan lain-lain. Selain itu, anonymous class ini juga menyediakan method bernama replyWithText yang dapat digunakan Kepada membalas chat yang dikirim ke bot telegram.
  3. Sebenarnya anonymous class dalam method ini lebih Bagus Apabila dipisahkan ke dalam file php yang berbeda, Tetapi agar bot kita tetap sederhana dan Enggak banyak file maka disini kita buat dalam method sebagai anonymous class.
  4. Method replyWithText sederhananya adalah melakukan request ke server telegram Kepada memberi perintah pada bot kita agar mengirimkan pesan ke chat tujuan berdasarkan chat id.
READ  #20: Function - Belajar Golang Dari Dasar

Membikin Method command

php

class Telebot
{
    // kode lainnya

    public function command(string $command, callable $callback)
    {
        $task = [
            "args" => [$command, $callback],
            "do" =>  function (string $command, callable $callback) {
                if ($this->update == null) return;

                $ctx = $this->createContext($this->update);

                if ($ctx->message != null) {
                    if (strpos($ctx->text, "/$command") === 0) {
                        $callback($ctx);
                    }
                }
            }
        ];
        array_push($this->tasks, $task);
    }
}
  1. Method ini berfungsi Kepada Membikin command handler yang dikirimkan ke bot telegram kita.
  2. Method ini menerima 2 parameter. Parameter pertama adalah command yang Ingin ditangani, dan parameter kedua adalah handler atau fungsi yang akan dijalankan Begitu command dikirimkan.
  3. Command handler yang didaftarkan menggunakan method ini disimpan ke dalam properti $task

Membikin Method run

php

class Telebot
{
    // kode lainnya

    public function run()
    {
        $json = file_get_contents('php://input');
        $this->update = json_decode($json);

        foreach ($this->tasks as $task) {
            $task["do"](...$task["args"]);
        }
    }
}
  1. Dalam method ini, kita mengambil data update yang dikirimkan oleh telegram dan kita simpan ke dalam properti update
  2. Dalam method ini kita juga menjalankan handler-handler yang telah didaftarkan sebelumnya menggunakan method command.

Secara lengkap kode bot telegram kita akan menjadi seperti berikut ini:

php

class Telebot
{
    private $update;
    private $tasks = [];

    public string $token;
    public string $apiURL;

    public function __construct(string $token)
    {
        $this->token = $token;
        $this->apiURL = "https://api.telegram.org/bot" . $this->token;
    }

    private function createContext($update)
    {
        return new class($this->apiURL, $update)
        {
            public
                $apiURL,
                $update,
                $updateId,
                $message,
                $messageId,
                $from,
                $chat,
                $chatId,
                $date,
                $text;

            public function __construct($apiURL, $update)
            {
                $this->apiURL = $apiURL;
                $this->update = $update;
                $this->updateId = $update->update_id;
                if ($update->message != null) {
                    $this->message = $update->message;
                    $this->messageId = $update->message->message_id;
                    $this->from = $update->message->from;
                    $this->chat = $update->message->chat;
                    $this->chatId = $update->message->chat->id;
                    $this->date = $update->message->date;
                    $this->text = $update->message->text;
                }
            }

            public function replyWithText(string $text, array $options = [])
            {
                $data["chat_id"] = $this->chatId;
                $data["text"] = $text;

                if (array_key_exists("reply_to_message_id", $options)) {
                    $data["reply_to_message_id"] = $options["reply_to_message_id"];
                }

                if (array_key_exists("parse_mode", $options)) {
                    if (in_array($options["parse_mode"], ["Markdown", "MarkdownV2", "HTML"])) {
                        $data["parse_mode"] = $options["parse_mode"];
                    }
                }
                $queries = http_build_query($data);
                file_get_contents($this->apiURL . "/sendMessage?$queries");
            }
        };
    }

    public function command(string $command, callable $callback)
    {
        $task = [
            "args" => [$command, $callback],
            "do" =>  function (string $command, callable $callback) {
                if ($this->update == null) return;

                $ctx = $this->createContext($this->update);

                if ($ctx->message != null) {
                    if (strpos($ctx->text, "/$command") === 0) {
                        $callback($ctx);
                    }
                }
            }
        ];
        array_push($this->tasks, $task);
    }

    public function run()
    {
        $json = file_get_contents('php://input');
        $this->update = json_decode($json);

        foreach ($this->tasks as $task) {
            $task["do"](...$task["args"]);
        }
    }

}

Membikin Webhook

Setelah Membikin kode program Kepada bot kita, sekarang kita akan Membikin webhook Kepada bot telegramnya.

READ  Definisi hingga 3 Jenjang Karirnya

Dalam Membikin bot telegram, webhook adalah salah satu Metode telegram Kepada memberi Mengerti server bot kita tentang update yang terjadi pada bot kita. Update yang dimaksud ini adalah sekumpulan informasi mengenai aktifitas bot seperti chat yang diterima, gambar yang diterima, atau aktifitas lainnya.

Selain menggunakan webhook, Eksis Metode lain Kepada mendapatkan update dari telegram Yakni menggunakan metode long polling. Metode long polling Yakni mengirimkan request ke server telegram secara berkala Kepada meminta informasi update bot.

Jadi, perbedaannya adalah dengan menggunakan webhook telegram memberi Mengerti ke server kita tentang update yang terjadi, sedangkan dengan menggunakan long polling server kita yang meminta informasi update tersebut.

READ  4 Fungsi serta Kelebihannya dalam Pemrograman

Oke lanjut…

Kepada Membikin webhook kita akan Membikin sebuah file baru dalam folder project kita bernama index.php. Seperti aplikasi web php yang lainnya, file index akan dieksekusi ketika kita mengakses url Penting.

Berikut ini adalah isi Kepada file index.php kita

php

require_once("./Telebot.php");

// initialize bot
$bot = new Telebot("masukkan bot token di sini");

// handle start command
$bot->command("start", function ($ctx) {
    $ctx->replyWithText("Engkau mengirimkan command /start");
});

// handle hello command
$bot->command("hello", function ($ctx) {
    $ctx->replyWithText("Halo kak " . $ctx->from->first_name);
});

// run bot
$bot->run();

Dalam file tersebut kita menyertakan file Telebot.php. Setelah itu kita menginisialisasi objek Telebot sebagai bot telegram kita.

Kita juga mendaftarkan handler Kepada dua buah command Yakni start dan hello.

Terakhir kita jalankan bot kita menggunakan method run.

Menjalankan Bot dan Webhook

Perlu Engkau ketahui, webhook yang sudah kita buat Enggak Dapat dijalankan begitu saja karena telegram mengharuskan webhook yang didaftarkan dapat diakses melalui internet dan menggunakan enkripsi https.

Nah Kepada mencapai hal itu, kita Dapat menggunakan metode tunneling pada localhost kita. Pada tutorial ini kita akan menggunakan Sokongan dari tool bernama ngrok. Kepada Metode install dan menggunakan ngrok sebelumnya sudah dijelaskan pada postingan Metode Mengakses Aplikasi Localhost Melalui Internet Menggunakan Ngrok

Pertama kita jalankan aplikasi kita di lokal terlebih dahulu menggunakan built-in server Punya php. Caranya buka folder project di terminal, kemudian masukkan perintah berikut:

Pada perintah tersebut kita menjalankan aplikasi dengan port 8000 sehinnga di local aplikasi kita Dapat diakses melalui http://127.0.0.1:8000.

Pastikan path php Engkau terdaftar di environment variable

Setelah aplikasi berjalan di lokal, kita melakukan tunneling Kepada aplikasi kita menggunakan ngrok. Buka terminal baru, kemudian jalankan perintah berikut:

Setelah dijalankan, Engkau akan diberi sebuah url https Kepada mengakses aplikasi. Kepada sementara catat url ini dan biarkan terminal Lanjut terbuka.

Buka browser Engkau, kemudian akses url berikut:
https://api.telegram.org/botXXXX/setWebhook?url=YYYY

  1. Ganti XXXX dengan bot telegram Engkau.
  2. Ganti YYYY dengan url yang diberikan oleh ngrok.

Setelah diakses maka akan menghasilkan response berikut

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

Setelah itu kita coba kirimkan command ke bot kita.
Apabila semuanya Betul maka bot kita dapat merespon command /start dan command /hello.

Chat Dengan Bot

Video Demonstrasi

Source Code

Source code tutorial ini juga dapat Engkau lihat di link berikut ini:

https://github.com/ruangdeveloper/php-telebot