Membuat Bot Telegram Sederhana Menggunakan PHP

By Rizky Kurniawan - July 23, 2022 ~8 mins read

Halo, selamat datang di Ruang Developer Blog. Lama tak jumpa, kali ini kita akan belajar membuat sebuah bot telegram sederhana menggunakan PHP ya. Meskipun sederhana, untuk mengikuti tutorial ini kamu 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. Untuk membuat bot telegram kita perlu menghubungi Bot Father. Bot Father adalah sebuah bot telegram yang bertugas untuk membantu kita membuat bot telegram. Buka telegram kamu, kemudian cari Bot Father pada kolom pencarian.

Cari Bot Father

Akan ada banyak bot yang muncul, pastikan kamu pilih bot yang memiliki centang di belakangnya. Kamu juga bisa klik link berikut untuk memulai chat dengan Bot Father https://t.me/BotFather

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

Berikut ini adalah screenshoot percakapan saya dengan Bot Father saat membuat bot untuk tutorial ini.

Membuat Bot

Pada saat membuat bot, ada kemungkinan username yang kamu mau sudah digunakan orang lain. Kamu bisa berikan alternatif username yang lainnya.

Let’s Code!

Setelah membuat bot di telegram, kita lanjut untuk membuat program untuk 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 tidak akan bisa melakukan apa-apa tanpa program.

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

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

Membuat Kelas

Dalam file Telebot.php ini kita akan buat sebuah kelas dengan nama yang sama seperti nama file nya yaitu 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 untuk menampung update yang dikirimkan telegram.
  2. $tasks digunakan untuk menyimpan command apa saja yang dapat dikerjakan.
  3. $token digunakan untuk menampung bot token.
  4. $apiURL digunakan untuk menyimpan url api telegram bot untuk 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 untuk 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 untuk membalas chat yang dikirim ke bot telegram.
  3. Sebenarnya anonymous class dalam method ini lebih baik jika dipisahkan ke dalam file php yang berbeda, namun agar bot kita tetap sederhana dan tidak banyak file maka disini kita buat dalam method sebagai anonymous class.
  4. Method replyWithText sederhananya adalah melakukan request ke server telegram untuk memberi perintah pada bot kita agar mengirimkan pesan ke chat tujuan berdasarkan chat id.

Membuat 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 untuk membuat 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 saat command dikirimkan.
  3. Command handler yang didaftarkan menggunakan method ini disimpan ke dalam properti $task

Membuat 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"]);
        }
    }

}

Membuat Webhook

Setelah membuat kode program untuk bot kita, sekarang kita akan membuat webhook untuk bot telegramnya.

Dalam membuat bot telegram, webhook adalah salah satu cara telegram untuk memberi tahu 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, ada cara lain untuk mendapatkan update dari telegram yaitu menggunakan metode long polling. Metode long polling yaitu mengirimkan request ke server telegram secara berkala untuk meminta informasi update bot.

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

Oke lanjut…

Untuk membuat webhook kita akan membuat sebuah file baru dalam folder project kita bernama index.php. Seperti aplikasi web php yang lainnya, file index akan dieksekusi ketika kita mengakses url utama.

Berikut ini adalah isi untuk 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("Kamu 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 untuk dua buah command yaitu start dan hello.

Terakhir kita jalankan bot kita menggunakan method run.

Menjalankan Bot dan Webhook

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

Nah untuk mencapai hal itu, kita bisa menggunakan metode tunneling pada localhost kita. Pada tutorial ini kita akan menggunakan bantuan dari tool bernama ngrok. Untuk cara install dan menggunakan ngrok sebelumnya sudah dijelaskan pada postingan Cara Mengakses Aplikasi Localhost Melalui Internet Menggunakan Ngrok

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

php -S 127.0.0.1:8000

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

Pastikan path php kamu terdaftar di environment variable

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

ngrok http 8000

Setelah dijalankan, kamu akan diberi sebuah url https untuk mengakses aplikasi. Untuk sementara catat url ini dan biarkan terminal terus terbuka.

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

  1. Ganti XXXX dengan bot telegram kamu.
  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. Jika semuanya benar maka bot kita dapat merespon command /start dan command /hello.

Chat Dengan Bot

Video Demonstrasi

Source Code

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

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

Bagikan:

Ingin Berdiskusi?

Yuk bergabung di Grup Telegram Ruang Developer atau mulai diskusi melalui GitHub. See You!

Dapatkan contoh source code project backend, frontend, atau fullstack untuk kamu amati, tiru, dan modifikasi sesuka hati. Klik untuk melihat detail!
comments powered by Disqus

Berlangganan Gratis

Kamu akan menerima email update dari Ruang Developer

Beri Dukungan

Beri dukungan, dapatkan full source code project web untuk bahan referensi, tiru, dan modifikasi.
Lightbox