Menjalankan Bot PHP (Long-Pooling) di Windows XAMPP


Berdasarkan banyaknya pertanyaan dari Grup Telegram Bot Indonesia, mereka menanyakan bagaimana cara menjalankan bot dari kode sumber di artikel lama saya dengan judul Membuat Bot Telegram Metode Long-Pooling di Windows dan dengan XAMPP.

Beberapa tulisan saya di sini mengenai tutorial pada dasarnya semua sudah dites sebelum diterbitkan. Hanya saja, saya dalam kegiatan sehari-hari lebih sering menggunakan GNU/Linux terutama distro Archlinux, baik di PC rumah ataupun komputer jinjing (laptop) saya pribadi. Agak jarang beberapa tutorial, dalam tanda pentik khususnya mengenai pemrograman, saya tes di sistem operasi Windows. Oleh karena itu, dalam artikel kali ini saya mencoba untuk memberikan sebuah arahan khusus bagi pengguna Windows mengenai bagaimana mana cara menjalankan bot Telegram dengan XAMPP.

Untuk Siapa Tulisan Ini?

Sebelum melanjut membaca tulisan ini ada kiranya Anda memiliki 3 kriteria berikut:

  1. Mengetahui dasar-dasar PHP.
  2. Mengetahui JSON dan pemanfaatannya.
  3. Mengetahui dasar atau paling tidak pernah sedikit tahu cara menggunakan CMD.

Jika 3 kriteria di atas tidak ada pada diri Anda sebaiknya jangan membaca tulisan ini, ada kiranya Anda pelajari dulu hal di atas. Dimana? cara termudah adalah dengan Anda mencarinya di Google.

Pendahuluan

Sedikit ulasan mengenai XAMPP, merupakan kependekan dari X Apache, MariaDB/MySQL, PHP dan Perl. X menunjukan untuk cross-platform, artinya tidak hanya dapat dijalankan di Windows saja, bisa juga dijalankan di GNU/Linux dan MacOS. XAMPP ini merupakan sebuah paket aplikasi satu-kesatuan dimana dikhususkan bagi kita yang baru mau memulai belajar pemrograman PHP tanpa perlu ribet dan dipusingkan dengan banyaknya pengaturan integrasi antara Apache dengan PHP.

Dan kebetulan pula XAMPP ini merupakan aplikasi yang cukup banyak dipakai para pemula PHP meskipun ada juga yang menggunakan WAMP, bahkan sebagai dari mereka untuk pengguna Windows, disarankan menggunakan WAMP karena WAMP ini memang dikhususkan bagi Windows, meskipun XAMPP itu cross-platform. Oke, saya tidak akan menjelaskan XAMPP terlalu banyak di sini, begitu juga perbandingannya dengan yg lain. Fokus tulisan ini hanya kepada pengguna Windows dan XAMPP.

Sebelumnya tulisan seperti ini sudah saya tulis di channel Telegram Situsali.com dan kini baru saya publikasikan dalam bentuk tulisan artikel di Situs Ali, di channel Telegram Situsali saya memang fungsikan selain sebagai media reposting blog, juga sebagai beberapa tulisan cepat yang belum terpublikasi di sini. Memang saya akui cukup telat saya menuliskannya, mengingat ada beberapa perkerjaan kantor saya yang harus diselesaikan hingga saya menunggu waktu luang untuk menuliskan tulisan ini, dan saya merasa tulisan ini seperti hutang yang saya harus dilunasi.

Pokok Persoalan

Langsung saja ke pokok persoalan menanggapi pertanyaan mengenai cara membuat bot Telegram dengan PHP metode long-polling di sistem operasi Windows, di mana katanya skrip bot yang saya buat tersebut tidak berjalan sebagai mana mestinya. Saya memang jarang sekali menggunakan Windows, jadi belum sempat mencoba. Nah, kebetulan ketika saya berada di Windows 7 mencoba mengaplikasikan hal itu, dan saya pasang XAMPP, untuk memastikan bahwa skrip atau kode yang saya tulis di sini tidaklah salah.

Kemudian saya cobalah skrip tersebut dan ternyata benar, skrip yang saya buat tersebut tidak berjalan dengan sebagaimana mestinya, setelah saya selidiki ternyata masalahnya ada di curl. Untungnya diartikel itu saya memasukan dua metode yakni curl dan stream. Saya disana menggunakan curl bukan dengan stream. Oleh karena itu bagi pengguna Windows coba ganti baris kode ke-104 yakni KirimPerintahCurl('sendMessage',$data); diganti dengan KirimPerintahStream('sendMessage',$data);.

// KirimPerintahCurl('sendMessage',$data);
//ganti dengan
KirimPerintahStream('sendMessage',$data);

Sekarang Anda tinggal jalankan bot Anda dengan CMD di Windows tanpa perlu menyalakan Apache pada XAMPP dan tidak perlu membuka peramban (browser). Pertama masuk ke direktori XAMPP dimana Anda meletakanya dengan perintah cd, lalu kemudian, ketik perintah php\php htdocs\botAnda.php.

Sebagai contoh, misalnya saya meletakan direktori XAMPP saya berada di c:\xampp. kemudian bot saya letakan di c:\xampp\htdocs\bot\situsali.php. Maka yang saya lakukan sebagai berikut:

C:
CD "C:\xampp"
php\php htdocs\bot\situsali.ph

situsali-bot-win7

Dan bot tersebut pastinya nanti akan berjalan dengan sebagaimana mestinya. Jika Anda tidak terbiasa dengan cara demikan, Anda lebih terbiasa dengan cara menjalankan XAMPP lalu membukanya dengan peramban di https://localhost, kabar gembira sekarang skrip telah disempurnakan, terima kasih kepada Mas Pringgo Radianto (Radya) yang telah membantu memberikan masukan dan revisian kode dan juga saya perbaiki sedikit, berikut kode revisinya, bisa Anda copas semua dan ganti kode lama dengan kode berikut:

<?php
//masukan nomor token Anda di sini
define('TOKEN','TOKEN BOT ANDA');

//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 KirimPerintah($perintah,$data){
    // Detek otomatis metode curl atau stream (by Radya)
     if(is_callable('curl_init')) {
       $hasil = KirimPerintahCurl($perintah,$data);
        //cek kembali, terkadang di XAMPP Curl sudah aktif
        //namun pesan tetap tidak terikirm, maka kita tetap gunakan Stream
        if (empty($hasil)){
            $hasil = KirimPerintahStream($perintah,$data);
         }   
      }
      else {
         $hasil = KirimPerintahStream($perintah,$data);
        }
     return $hasil;         
 }


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
            );
            
           $hasil = KirimPerintah('sendMessage',$data);
         }     
      }
      //tulis dan tandai updatenya yang nanti digunakan untuk nilai offset
      file_put_contents("last_update_id", $update_id + 1);
  }
  
//revisi (by Radya)
while (true) {
  JalankanBot();

  $jeda = 2; // jeda 2 detik
  // Detek otomatis, cli atau browser (by Radya)
  if(php_sapi_name()==="cli") {
        sleep($jeda); //beri jedah 2 detik
  } else {
        echo '<meta http-equiv="refresh" content="'.$jeda.'">';
        echo 'Bot sedang jalan';
        break;
  }
}

Dan Anda bisa menjalankan bot tersebut dengan atau tanpa menggunakan CMD, bisa dijalankan dengan cara lama yakni Apache pada XAMPP dinyalakan dan kemudian Anda membuka peramban lalu masuk ke localhost seperti gambar berikut:

situsali-bot-win72

Perlu diketahui skrip terbaru ini meskipun dicontoh di atas dijalankan di Windows, Anda dapat juga menggunakannya di OS lainnya seperti GNU/Linux dan MacOS.

Pertanyaan yang Sering ditanyakan (FAQ)

FAQ kependekan dari Frequently asked questions, yang berarti pertanyaan yang sering ditanyakan. Sedikit ulasan mengenai kode dari skrip bot di sini, ada beberapa pertanyaan mendasar dan ini sering maka perlu dijelaskan di sini, adapun pertanyaan tersebut yakni:

  1. Bagaimana saya bisa tahu aktifitas bot Ini? Semua kode saya gunakan fungsi (function) dan memiliki nilai pengembalian (return). Jadi Anda bisa memanfaatkan apa yang dikembalikan dari fungsi tersebut dengan cara var_dump.Misalnya Anda ingin mengetahui apa sih isi dari fungsi DapatkanUpdate? tinggal var_dump saja seperti berikut:
    var_dump(DapatkanUpdate(0));
    Begitu juga pada fungsi lainnya di KirimPerintah. Anda bisa lihat hasil nilainya. Karena bot Telegram ini mengunakan JSON sebagai pertukaran data, dan dalam kode bot ini  JSON yang dikembalikan nilainya (json_decode) dengan array, Agar Anda dapat memanfaatkannya dengan mudah. Selain menggunakan var_dump Anda juga bisa menggunakan print_r agar array mudah terbaca seperti berikut:
    echo '<pre>';
    print_r(DapatkanUpdate(0));
    echo '</pre>';
    Sekali lagi cara di atas berlaku bagi fungsi lainnya. Jika sudah sebaiknya Anda baca dokumentasi bot API Telegram, tentang apa saja nilai dan manfaat nilai tersebut di: https://core.telegram.org/bots/api di sini semua field, type dijelaskan dengan lengkap tinggal Anda manfaatkan saja.
  2. Bagaimana saya bisa tahu bot ini mengirim pesan apa? Jika Anda membaca kembali skrip di atas (skrip TERBARU)  pada baris ke-113 saya menulis kode:
    $text = $message_data["text"];
    Dengan begitu Anda bisa mengetahui apa sih isi pesan dari bot Anda.
  3. Bagaimana saya bisa memanfaatkan bot dengan perintah slash /perintah ? Jawaban pertanyaan ini bisa dijawab di pertanyaan poin ke-2, yakni memanfaatkan nilai balik (return) dari variabel $text. Dan untuk mempermudah Anda memisahkan mana perintah mana isi perintah bisa memanfaatkan kode explode. Contohnya:
    $text = $message_data["text"];
    $pecah = explode(' ',$text,2);
    $perintah = $pecah[0];
    $isi = $pecah[1];
    if ($perintah == "/perintah"){
     echo $isi;
    }
    Dengan demikian Anda tinggal buat saja perintahnya di botFather dan pisahkan misalnya dengan if atau switch, tinggal Anda pilih saja logikanya mana yang terbaik bagi Anda.

Semoga tulisan ini bermanfaat, jika ada yang masih belum paham harap berkomentar. Sekali lagi, pengguna awam atau pertanyaan yang sangat mendasar sebaiknya Anda cari dulu di Google sebelum bertanya di sini. Terima Kasih ?