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 http://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 ?

Artikel Terkait

24 responses to “Menjalankan Bot PHP (Long-Pooling) di Windows XAMPP”

  1. Budi Yunior Avatar
    Budi Yunior

    Script php utk webhook ini apakah harus jalan melalui https apa cukup http saja, karena sy coba di http tdk bisa, terimakasih

    1. Ali Avatar
      Ali

      harus https dan memiliki sertifikat ssl, kalau tidak punya bisa buat self-signed atau pakai gratisan macam Let’s Encrypt atau CloudFlare.

      1. taufikmas Avatar

        saya dah register di cloudfare,,, dan web skrg aktif https,, tapi kode phpnya ga bener utk webhook, mohon pencerahan. salam tofix taufikmas@gmail,com

        1. Ali Avatar

          Untuk webhook tidak perlu lagi getUpdate, jadi langsung saja, tinggal ambil dari Raw body, php://input

  2. hendiahmad Avatar

    Selamat siang untuk teknik webhook nya sudah ada?

  3. Farid Aria Avatar

    selamat siang, kalo di appserv bisa ga mas? kok setelah saya coba malah katanya “qWDWaqTw7TrAv_7yjKC8
    /getUpdates?offset=2071): failed to open stream: No such file or directory in C:
    \AppServ\www\kp\faridariaBot.php on line 58”.. maaf pemula, mohon bantuannya mas

    1. Ali Avatar
      Ali

      itu ada keterangannya No such file or directory in C:
      \AppServ\www\kp\faridariaBot.php on line 58”
      berarti gak ada berkas atau direktori

      1. kangseti Avatar

        saya mengalamahi hal yang sama mas: faultCode0faultStringWarning:file_get_contents(https://api.telegram.org/bot250261846:AAHCU-Orjpxkk4v9Lz3p6obo2mz1VkAxxWo/getUpdates?offset=7562) [function.file-get-contents]: failed to open stream: No such file or directory in C:\wamp\www\laporan\proyek\centerbot.php on line 63Bot sedang jalanphp

        file saya letakan di C:\wamp\www\laporan\proyek\centerbot.php dengan kata lain direktorinya ada dan tulisan “Bot sedang jalan” juga sudah ada. kira2 direktori mana yang belum ada ya mas?

  4. ichad Avatar
    ichad

    Mas, pls ditambahkan utk script sehingga bot kirim gambar. Saya coba modifikasi namun error failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request. Terima kasih untuk respon dan sharingnya

    1. Ali Avatar
      Ali

      baik insya Allah

  5. fiyan Avatar

    Warning: file_get_contents(https://api.telegram.org/botxxxxxxxxxxxxxx/sendMessage) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in D:\xampp\htdocs\1.php on line 29
    Bot sedang jalan

    klo keluar peringatan tersebut kira2 masalahnya ada d mana ya

    1. Ali Avatar
      Ali

      Bisa jadi masalah koneksi, atau dari pesan terkirim salah format.

      1. Anggiat Avatar
        Anggiat

        bisa tolong diperjelas lagi mas? saya juga mendapatkan error yg sama
        trims

        1. Ali Avatar

          Errornya apa dulu?

  6. Halooe Avatar

    Mas mau tanya, dengan bot instagram bisa kirim chat tertarget gk ya?
    Saya punya situs pulsa, rencananya setiap ada transaksi akan otomatis melakukan respon ke bot yang telah saya buat untuk membuat transaksi ke bot penyedia server pulsa.

  7. Sella Gahalung Avatar

    ini bot jawab sendiri atau bagaimana y maksudnya ?

  8. Loren Avatar
    Loren

    hai gan
    saya mau tanya nih membuat telegram bot dgn metode long polling
    saya memasukkan file php saya di https dan di bot saya jalan terus menerus
    bagaimana cara untuk menghentikannya?

    1. Ali Avatar

      killall php atau pencet CTRL+C aja

  9. alif Avatar
    alif

    cara jalankan php nya di termux gimana ya terima kasih

  10. hosting website toko online Avatar

    terima kasih infonya sangat membantu

  11. ahmad affandy Avatar

    Warning: file_get_contents(https://api.telegram.org/bot469067929:AAFj13dF8vJ_Kg75Gn79vEZUDpNYpuk-K-M/getUpdates?offset=322) [function.file-get-contents]: failed to open stream: No error in C:\xampplite\htdocs\funday9876bot.php on line 57
    Bot sedang jalan

    maksudnya apa ya mas ?

  12. ahmad affandy Avatar

    please, mohon saran n pencerahannya…

  13. ganang adi saputro Avatar
    ganang adi saputro

    mantap gan, terima kasih banyak sudah share

    1. Ali Avatar

      Oke gan sama sama 😀

Leave a Reply to hosting website toko online Cancel reply

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