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.
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.
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;
}
$update
digunakan Kepada menampung update yang dikirimkan telegram.$tasks
digunakan Kepada menyimpan command apa saja yang dapat dikerjakan.$token
digunakan Kepada menampung bot token.$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;
}
}
- Method constructor ini digunakan Kepada mengisi nilai properti token dan apiURL yang sebelumnya telah dibuat.
- 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");
}
};
}
}
- Method ini menggunakan access modifier private
- 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. - 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.
- Method replyWithText sederhananya adalah melakukan request ke server telegram Kepada memberi perintah pada bot kita agar mengirimkan pesan ke chat tujuan berdasarkan chat id.
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);
}
}
- Method ini berfungsi Kepada Membikin command handler yang dikirimkan ke bot telegram kita.
- 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.
- 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"]);
}
}
}
- Dalam method ini, kita mengambil data update yang dikirimkan oleh telegram dan kita simpan ke dalam properti
update
- 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.
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.
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
- Ganti XXXX dengan bot telegram Engkau.
- 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
.
Video Demonstrasi
Source Code
Source code tutorial ini juga dapat Engkau lihat di link berikut ini: