telegram

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:

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:

  1. 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;
        }
  2. 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 (http://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://www.situsali.com/menjalankan-bot-php-long-pooling-di-windows-xampp/

 

Artikel Terkait

16 responses to “Membuat Bot Telegram Dengan PHP Metode Long-Polling”

  1. Ading Avatar
    Ading

    Super sekali….semoga artikelnya bermanfaat.

    1. Ali Avatar
      Ali

      terima kasih Kang 🙂

  2. Hidayat Jundurrohman Avatar

    mantebb bang ali… step by step spt ini yg ane tunggu2..

  3. Muhaimin Avatar

    memang mantap penerangannya.

  4. Angga Avatar
    Angga

    sangat bermanfaat sekali.
    bagaimana cara untuk mengirim sebuah file image, via bot telegram ? mohon pencerahan nya.

    sudah saya coba seperti ini, tetapi tidak bisa

    script :
    $data = array(
    ‘chat_id’ => ‘109703667’,
    ‘photo’=> ‘http://2.131.177.87/edc_app/assets/img/capture/rangkingedc_2016-09-27.png’,
    );
    KirimPerintahCurl(‘sendPhoto’,$data);

    1. madun Avatar
      madun

      maaf ka sya newbie di sistem tp saya sedkit2 sdh bisa cara buat bot dan hasilnya sukses,yang saya mau tanya bagaimana menghubungkan bot dengan iklan saya di fanpage fb saya biar smua bisa di jalankan oleh bot sepenuhnya,,trima kasih

      1. Ali Avatar

        Saya kurang tau mas, tapi pakai saja API yang disediakan oleh Facebook.

  5. kaktheo Avatar

    Ini contoh bot telegram yang saya buat.

  6. hsbc Avatar
    hsbc

    Jika kita sdh pakai manybot apa masih bisa pakai ini php?

    1. Ali Avatar

      Tidak bisa. Manybot tidak dirancang untuk itu.

  7. Sulanpai Project Avatar

    untuk contoh tutorial menggunakan metode webhooks nya belum ada gan?
    mohon dibalas…

    1. Ali Avatar

      Belum saat ini masih tahap saya tulis, draftnya sudah ada, semoga secepatnya selesai. Thanks.

  8. Febri Avatar

    Buat BOT telegram sama dengan buat web?. Editnya pakek aplikasi note++ dan jalaninnya menggunakan xampp?.

  9. Toha Indra Muji Deli Avatar
    Toha Indra Muji Deli

    Bang itu pakai Code Igniter nggak?kenapa “while” ku error ya? tp klo nggak aku pasang class extend Ci_Controller nya aman-aman aja bang…

    1. Ali Avatar

      Bukan, ini PHP biasa

      1. Riyan Avatar
        Riyan

        Bang bisa minta nomor HPnya kah. . Ada yg pengen saya diskusikan

Leave a Reply to Ali Cancel reply

Your email address will not be published. Required fields are marked *