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:

* <a href="https://situsali.com/install-lamp-dan-phpmyadmin-di-ubuntu-14-04/" target="_blank" rel="noopener">Install LAMP dan PHPMyAdmin di Ubuntu</a>
* <a href="https://situsali.com/instal-apache-mysql-php-dan-phpmyadmin-di-archlinux/" target="_blank" rel="noopener">Instal Apache, MySQL, PHP dan phpMyAdmin di Archlinux</a>
* <a href="https://situsali.com/xampp-langkah-awal-belajar-pemrograman-web/" target="_blank" rel="noopener">XAMPP Langkah Awal Belajar Pemrograman Web</a>

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

Seperti gambar berikut: botTelegram_eksekusiPHP

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-methods

Adapun mengenai penjelasan fungsi kirim perintah itu yakni:

* Menggunakan metode `stream` dengan `POST`

Disini kita gunakan metode POST 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, dikatakan CURL ini lebih cepat dan lebih bersih dibanding menggunakan metode Stream, 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 command getUpdates 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 menandai offset dengan file agar nantinya digunakan untuk mendapatkan nilai offset 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:

botTelegram_LongPoll Dan yang terkahir saya menggunakan while, dikarenakan kita sedang membuat bot. Bot adalah salah satu program yang dirancang terus menerus berjalan, maka dari itu di PHP saya menggunakan teknik while(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/