Membuat Bot Telegram Dengan PHP Metode Long-Polling
Pada artikel lalu saya menerangkan tentang apa itu bot Telegram. Cara membuatnya dengan izin dari BotFather berserta metode-metode yang digunakan bot Telegram tersebut, lebih jelasnya silahkan baca artikel saya sebelumnya yakni (Membuat Bot Telegram).
Adapun artikel ini ditulis yakni fokus lebih kepada cara kerjanya disertai sumber kodenya atau fokus ke praktek pembuatannya. Oleh karena itu adalah wajib Anda membaca tulisa saya yang lalu mengenai bot (Membuat Bot Telegram). Jika tidak kemungkinan Anda tidak bisa melanjut membaca artikel ini.
Cara Membuat Bot dengan PHP
Sesuai judul yakni menggunakan metode long-polling. Sebelum jauh mengenai pembuatan bot ini pastikan Anda sudah menginstal Apache atau setidaknya XAMPP bisa baca artikel saya sebelumnya mengenai hal tersebut:
- Install LAMP dan PHPMyAdmin di Ubuntu
- Instal Apache, MySQL, PHP dan phpMyAdmin di Archlinux
- XAMPP Langkah Awal Belajar Pemrograman Web
Perlu diketahui saya menulis, memberikan contoh dan mengetes bot ini pada komputer yang mana saya menggunakan sistem operasi Archlinux 64bit. Jika Anda menggunakan sistem operasi lainnya semisal Windows ataupun MacOS, pada dasarnya tidak menjadi masalah hampir mirip hanya saja cara mengeksekusinya yang berbeda dikarenakan perbedaan dari sistem operasi tersebut.
Langsung saja saya berikan sumber kodenya secara full yakni:
<?php //masukan nomor token Anda di sini define('TOKEN','163931681:AAEySP58DC658GhCJqZtYIMDCjn8MldTxK0'); //Fungsi untuk Penyederhanaan kirim perintah dari URI API Telegram function BotKirim($perintah){ return 'https://api.telegram.org/bot'.TOKEN.'/'.$perintah; } /* Fungsi untuk mengirim "perintah" ke Telegram * Perintah tersebut bisa berupa * -SendMessage = Untuk mengirim atau membalas pesan * -SendSticker = Untuk mengirim pesan * -Dan sebagainya, Anda bisa memm * * Adapun dua fungsi di sini yakni pertama menggunakan * stream dan yang kedua menggunkan curl * * */ function KirimPerintahStream($perintah,$data){ $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data), ), ); $context = stream_context_create($options); $result = file_get_contents(BotKirim($perintah), false, $context); return $result; } function KirimPerintahCurl($perintah,$data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,BotKirim($perintah)); curl_setopt($ch, CURLOPT_POST, count($data)); curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $kembali = curl_exec ($ch); curl_close ($ch); return $kembali; } /* Perintah untuk mendapatkan Update dari Api Telegram. * Fungsi ini menjadi penting karena kita menggunakan metode "Long-Polling". * Jika Anda menggunakan webhooks, fungsi ini tidaklah diperlukan lagi. */ function DapatkanUpdate($offset) { //kirim ke Bot $url = BotKirim("getUpdates")."?offset=".$offset; //dapatkan hasilnya berupa JSON $kirim = file_get_contents($url); //kemudian decode JSON tersebut $hasil = json_decode($kirim, true); if ($hasil["ok"]==1) { /* Jika hasil["ok"] bernilai satu maka berikan isi JSONnya. * Untuk dipergunakan mengirim perintah balik ke Telegram */ return $hasil["result"]; } else { /* Jika tidak maka kosongkan hasilnya. * Hasil harus berupa Array karena kita menggunakan JSON. */ return array(); } } function JalankanBot() { $update_id = 0; //mula-mula tepatkan nilai offset pada nol //cek file apakah terdapat file "last_update_id" if (file_exists("last_update_id")) { //jika ada, maka baca offset tersebut dari file "last_update_id" $update_id = (int)file_get_contents("last_update_id"); } //baca JSON dari bot, cek dan dapatkan pembaharuan JSON nya $updates = DapatkanUpdate($update_id); foreach ($updates as $message) { $update_id = $message["update_id"];; $message_data = $message["message"]; //jika terdapat text dari Pengirim if (isset($message_data["text"])) { $chatid = $message_data["chat"]["id"]; $message_id = $message_data["message_id"]; $text = $message_data["text"]; $data = array( 'chat_id' => $chatid, 'text'=> 'tes balas halo', 'parse_mode'=>'Markdown', 'reply_to_message_id' => $message_id ); //kita gunakan Kirim Perintah menggunakan metode Curl KirimPerintahCurl('sendMessage',$data); } } //tulis dan tandai updatenya yang nanti digunakan untuk nilai offset file_put_contents("last_update_id", $update_id + 1); } while(true){ sleep(2); //beri jedah 2 detik JalankanBot(); }
Anda bisa copas semua kode tersebut di atas, dan berinama contohnya situsalibot.php
dan simpan disesuaikan dengan path dari Apache Anda, bagi pengguna XAMPP biasanya terletak di htdocs, bagi pengguna LAMP biasanya di /var/www/html
atau /srv/http
. Dalam contoh di sini saya meletakannya di /code/web
.
Jika sudah maka eksekusikan dengan cara:
php situsalibot.php</blockquote>
Penjelasan Kode
Pada awal baris kode saya menjadikan
TOKEN
sebagai konstan dikarenakan token ni bernilai tetap. Adapun mengenai token ini disesuaikan dengan bot yang Anda buat. Di contoh ini saya menulis token nya seperti berikut disesuaikan dengan token bot saya.define('TOKEN','163931681:AAEySP58DC658GhCJqZtYIMDCjn8MldTxK0');Kemudian saya membuat fungsi bernama
BotKirim
, dimana fungsi tersebut pada dasarnya hanya penyederhaan dari URL saja.function BotKirim($perintah){ return 'https://api.telegram.org/bot'.TOKEN.'/'.$perintah; }Saya membuat dua fungsi
kirim perintah
, yakni mengikirimkan perintah-perintah (commands) ke bot API tersebut. Adapun mengenai perintah bot API bisa Anda baca di: https://core.telegram.org/bots/api#available-methodsAdapun mengenai penjelasan fungsi
kirim perintah
itu yakni:
- Menggunakan metode
stream
denganPOST
Disini kita gunakan metodePOST
untuk mengirimkan perintah ke bot API tersebut.function KirimPerintahStream($perintah,$data){ $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data), ), ); $context = stream_context_create($options); $result = file_get_contents(BotKirim($perintah), false, $context); return $result; }- Menggunakan metode
CURL
.CURL
merupakan salah satu metode terbaik menurut saya, dikatakanCURL
ini lebih cepat dan lebih bersih dibanding menggunakan metodeStream
, bisa Anda baca menganai hal itu di Stack Over Flow (https://stackoverflow.com/questions/6025668/is-the-php-curl-api-cleaner-faster-better-than-using-streams-for-http-https-acce).function KirimPerintahCurl($perintah,$data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,BotKirim($perintah)); curl_setopt($ch, CURLOPT_POST, count($data)); curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $kembali = curl_exec ($ch); curl_close ($ch); return $kembali; }Lalu kemudian saya membuat fungsi
DapatkanUpdate
untuk mendapatkan update JSON dari bot API ini. Mengapa? Dikarenakan kita menggunakan metode long-polling, maka wajib untuk mengecek update-nya dari commandgetUpdates
di bot API ini.function DapatkanUpdate($offset) { //kirim ke Bot $url = BotKirim("getUpdates")."?offset=".$offset; //dapatkan hasilnya berupa JSON $kirim = file_get_contents($url); //kemudian decode JSON tersebut $hasil = json_decode($kirim, true); if ($hasil["ok"]==1) { /* Jika hasil["ok"] bernilai satu maka berikan isi JSONnya. * Untuk dipergunakan mengirim perintah balik ke Telegram */ return $hasil["result"]; } else { /* Jika tidak maka kosongkan hasilnya. * Hasil harus berupa Array karena kita menggunakan JSON. */ return array(); } }
Dan yang terakhir fungsi
JalankanBot
. Sesuai dengan namanya yakni untuk mengeksekusi bot tersebut agar berjalan dengan sebagai mana mestinya.function JalankanBot() { $update_id = 0; //mula-mula tepatkan nilai offset pada nol //cek file apakah terdapat file "last_update_id" if (file_exists("last_update_id")) { //jika ada, maka baca offset tersebut dari file "last_update_id" $update_id = (int)file_get_contents("last_update_id"); } //baca JSON dari bot, cek dan dapatkan pembaharuan JSON nya $updates = DapatkanUpdate($update_id); foreach ($updates as $message) { $update_id = $message["update_id"];; $message_data = $message["message"]; //jika terdapat text dari Pengirim if (isset($message_data["text"])) { $chatid = $message_data["chat"]["id"]; $message_id = $message_data["message_id"]; $text = $message_data["text"]; $data = array( 'chat_id' => $chatid, 'text'=> 'tes balas halo', 'parse_mode'=>'Markdown', 'reply_to_message_id' => $message_id ); //kita gunakan Kirim Perintah menggunakan metode Curl KirimPerintahCurl('sendMessage',$data); } } //tulis dan tandai updatenya yang nanti digunakan untuk nilai offset file_put_contents("last_update_id", $update_id + 1); }Perlu diketahui, fungsi di atas menggunakan metode
file_put_contents
dimana saya menggunakan tersebut untuk menandaioffset
dengan file agar nantinya digunakan untuk mendapatkan nilaioffset
yang telah di-update dari bot kita ada yang mengirim pesan ke bot tersebut. Jika Anda pengguna GNU/Linux pastikan direktori dimana mana menyimpat bot Anda tersebut dengan permission write. Adapun gambaranya seperti berikut:Dan yang terkahir saya menggunakan
while
, dikarenakan kita sedang membuat bot. Bot adalah salah satu program yang dirancang terus menerus berjalan, maka dari itu diPHP
saya menggunakan teknikwhile(true)
. Ini mengartikan akan terus dieksesi oleh sistem selama sistem tersebut hidup.while(true) { sleep(2); //beri jedah 2 detik JalankanBot(); }Adapun saya memberikan jedah 2 detik dengan fungsi
sleep(2)
hanya sekadar jedah agar memberi kesempatan pada sistem untuk sinkronisasi. Anda bisa menghapusnya jika mau, opsional saja.Demikianlah mengani pembuatan bot ini menggunakan
PHP
. Baru saya tulis mengunakan metode long-polling, artikel selanjutnya yakni pembuatan dengan webhook. Semoga Bermanfaat.Revisi Kode Terbaru
Perhatian kode di atas hanya dapat berjalan di GNU/Linux, jika Anda menginginkan kode di atas dapat berjalan di OS lain seperti Windows atau MacOS, silahkan baca tulisan revisi saya: https://situsali.com/menjalankan-bot-php-long-pooling-di-windows-xampp/