Tutorial Cara Membuat Bot Telegram – Bag. 2

Edisi sebelumnya kamu sudah belajar bagaimana membuat bot Telegram dengan bantuan @BotFather. Sekarang saatnya kamu membuat mesin bot yang berjalan di belakang layar. Mesin bot yang bertugas menjalankan semua perintah-perintah yang diterima oleh bot di aplikasi Telegram. Mesin bot ini nantinya akan mengirimkan respond ke aplikasi Telegram, sehingga bisa berinteraksi dengan pengguna Telegram.

Dalam tutorial kali ini, mesin bot yang akan kamu buat menggunakan bahasa pemrograman PHP. Bahasa pemrograman yang umum digunakan untuk membangun aplikasi berbasis web. Sedangkan perangkat lain yang dibutuhkan untuk membuat mesin bot ini adalah sebuah server yang dapat menjalankan aplikasi PHP. Disini digunakan server dari Digital Ocean (gunakan tautan ini untuk mendapatkan kredit gratis senilai $10 di Digital Ocean), dengan spesifikasi 512 MB Memory / 20 GB Disk / NYC3 – Ubuntu 14.04.4 x64, dan menggunakan ServerPilot (gunakan tautan ini untuk mendapatkan kredit gratis senilai $10 di ServerPilot) sebagai webserver dan pengatur domain dan aplikasi web.

Pada tutorial ini, mesin bot akan di buat dengan alamat: http://www.dwinoviyati.com/labs/haloro_bot.php. Semua perintah yang diterima oleh HaloRoBot di aplikasi Telegram akan dijalankan oleh program haloro_bot.php ini, yang kemudian hasilnya akan diteruskan ke aplikasi Telegram dan di tampilkan oleh HaloRoBot. Dibawah ini adalah kode dalam file haloro_bot.php:

<?php
 
define('BOT_TOKEN', '191339814:AAGx-ZySMny2YE7YLSMP7NCtANjSHg9FLdU');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');
 
function apiRequestWebhook($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }
 
  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }
 
  $parameters["method"] = $method;
 
  header("Content-Type: application/json");
  echo json_encode($parameters);
  return true;
}
 
function exec_curl_request($handle) {
  $response = curl_exec($handle);
 
  if ($response === false) {
    $errno = curl_errno($handle);
    $error = curl_error($handle);
    error_log("Curl returned error $errno: $error\n");
    curl_close($handle);
    return false;
  }
 
  $http_code = intval(curl_getinfo($handle, CURLINFO_HTTP_CODE));
  curl_close($handle);
 
  if ($http_code >= 500) {
    // do not want to DDOS server if something goes wrong
    sleep(10);
    return false;
  } else if ($http_code != 200) {
    $response = json_decode($response, true);
    error_log("Request has failed with error {$response['error_code']}: {$response['description']}\n");
    if ($http_code == 401) {
      throw new Exception('Invalid access token provided');
    }
    return false;
  } else {
    $response = json_decode($response, true);
    if (isset($response['description'])) {
      error_log("Request was successfull: {$response['description']}\n");
    }
    $response = $response['result'];
  }
 
  return $response;
}
 
function apiRequest($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }
 
  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }
 
  foreach ($parameters as $key => &$val) {
    // encoding to JSON array parameters, for example reply_markup
    if (!is_numeric($val) && !is_string($val)) {
      $val = json_encode($val);
    }
  }
  $url = API_URL.$method.'?'.http_build_query($parameters);
 
  $handle = curl_init($url);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($handle, CURLOPT_TIMEOUT, 60);
 
  return exec_curl_request($handle);
}
 
function apiRequestJson($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }
 
  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }
 
  $parameters["method"] = $method;
 
  $handle = curl_init(API_URL);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($handle, CURLOPT_TIMEOUT, 60);
  curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode($parameters));
  curl_setopt($handle, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
 
  return exec_curl_request($handle);
}
 
function processMessage($message) {
  // process incoming message
  $message_id = $message['message_id'];
  $chat_id = $message['chat']['id'];
  if (isset($message['text'])) {
    // incoming text message
    $text = $message['text'];
 
    if (strpos($text, "/start") === 0) {
      apiRequestJson("sendMessage", array('chat_id' => $chat_id, 
        "text" => "Berikut ini adalah beberapa perintah yang tersedia di HaloRoBot:\n/halo : Perintah untuk menyapa Bot:\n/apakabar : Perintah untuk menanyakan kabar Bot\n/tanggal : Perintah untuk menanyakan tanggal sekarang pada Bot\n/waktu : Perintah untuk menanyakan waktu sekarang pada Bot.", 
        'reply_markup' => array(
        'resize_keyboard' => true)));
    } else if (strpos($text, "/help") === 0) {
      apiRequestJson("sendMessage", array('chat_id' => $chat_id, 
        "text" => "Berikut ini adalah beberapa perintah yang tersedia di HaloRoBot:\n/halo : Perintah untuk menyapa Bot:\n/apakabar : Perintah untuk menanyakan kabar Bot\n/tanggal : Perintah untuk menanyakan tanggal sekarang pada Bot\n/waktu : Perintah untuk menanyakan waktu sekarang pada Bot.", 
        'reply_markup' => array(
        'resize_keyboard' => true)));
    } else if (strpos($text, "/stop") === 0) {
      // stop now
    } else if (strpos($text, "/halo") === 0) {
      apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Halo juga!'));
    } else if (strpos($text, "/apakabar") === 0) {
      apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Kabar saya baik! Bagaimana dengan kamu?'));
    } else if (strpos($text, "/tanggal") === 0) {
      apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Tanggal saat ini adalah ' . date("d F Y")));
    } else if (strpos($text, "/waktu") === 0) {
      apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Waktu saat ini adalah ' . date("H:i:s")));
    } else {
      apiRequestWebhook("sendMessage", array('chat_id' => $chat_id, "reply_to_message_id" => $message_id, "text" => 'Perintah tidak aktif.'));
    }
  } else {
    apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'I understand only text messages'));
  }
}
 
 
define('WEBHOOK_URL', 'https://www.dwinoviyati.com/labs/haloro_bot.php');
 
if (php_sapi_name() == 'cli') {
  // if run from console, set or delete webhook
  apiRequest('setWebhook', array('url' => isset($argv[1]) && $argv[1] == 'delete' ? '' : WEBHOOK_URL));
  exit;
}
 
 
$content = file_get_contents("php://input");
$update = json_decode($content, true);
 
if (!$update) {
  // receive wrong update, must not happen
  exit;
}
 
if (isset($update["message"])) {
  processMessage($update["message"]);
}
?>

Kemudian kita laporkan tautan script ini ke Telegram, bahwa untuk mengolah semua komunikasi dengan bot yang kita buat menggunakan script tersebut. Yaitu dengan cara menjalankan perintah berikut ini di command line:

curl -H "Content-Type: application/json" -X POST -d '{"url":"https://www.dwinoviyati.com/labs/haloro_bot.php"}' https://api.telegram.org/bot191339814:AAGx-ZySMny2YE7YLSMP7NCtANjSHg9FLdU/setWebhook

Dengan demikian selesai sudah tahap akhir pembuatan bot Telegram ini. Selanjutnya kita coba berinteraksi dengan bot Telegram HaloRo Bot melalui telegram. Kita ketikan @HaloRo di kotak pencarian, kemudian klik pada HaloRo bot yang muncul di hasil pencarian. Di halaman chating klik “Start” untuk memulai berinteraksi dengan bot. Berikut ini adalah penampakannya:

botfather-telegram-test-bot

Jika kita ketikan perintah “/tanggal” maka bot akan membalas dengan menampilkan data tanggal saat perbincangan berlangsung. Selamat!!! Kamu sudah memiliki bot Telegram.

12 Replies to “Tutorial Cara Membuat Bot Telegram – Bag. 2”

  1. set webhook nyaa udh berhasil bang, jadi seperti ini {“ok”:true,”result”:true,”description”:”Webhook was set”}

    tapi scriptnya di tes di hook.io error, jadi seperti ini
    PHP Parse error: syntax error, unexpected ‘<' in /root/microcule/bin/binaries/micro-php(43) : eval()'d code on line 224

    solusinya gimana ya…??

  2. Siang, ada problem nih min.
    Command yang sudah buat contoh /start /help /apakabar , ketika mengetik perintah tersebut tidak mersepon, tapi jika mengetikan perintah selain yang sudah di buat malah work (Perintah tidak aktif.).

  3. {
    “ok”: false,
    “error_code”: 404,
    “description”: “Not Found”
    }
    kalo kaya gini kenapa ya pak?

        1. maksudnya kita jalankan perintah “cUrl” diatas, yang fungsinya adalah menjalankan perintah khusus yg disediakan oleh telegram untuk mencatat setingan bot kita, yaitu alamat kode bot kita. 🙂

  4. mau tanya, webhooknya sudah berhasil tapi tidak ada response
    di folder bot hosting error lognya seperti ini
    [26-Apr-2017 09:58:58 Asia/Jakarta] Curl returned error 28: Resolving timed out after 5513 milliseconds
    Mohon Bantuannya

  5. Selamat malam mas Hasan,

    Terima kasih banyak sudah berbagi tutorial membuat bot dengan webhook.

    Saya menggunakan aplikasi hook.io untuk menyimpan kode php sesuai tutorial diatas. Saya pun melakukan penyesuaian kode token bot dan webhook url milik saya (website yang saya gunakan adalah wixsite.com). Saat saya coba test code di hook.io tersebut, muncul pesan sebagai berikut :

    PHP Parse error: syntax error, unexpected ‘<' in /root/microcule/bin/binaries/micro-php(43) : eval()'d code on line 224 .

    Untuk menghubungkan bot dengan hook, saya menyusun URL sebagai berikut :

    https://api.telegram.org/bot/setWebhook?url=https://hook.io//

    Setelah saya jalankan URL tersebut, hasilnya sbb :

    {“ok”:true,”result”:true,”description”:”Webhook is already set”}

    Kemudian, saat saya coba input command di bot, tidak ada respon apapun.

    Kira-kira saya ada kesalahan dimana ya? (Sebagai informasi, saya tidak memiliki pengalaman bahasa program php)
    Terima kasih atas bantuannya.

    1. Selamat pagi mb Wati,
      terima kasih sudah mampir..

      PHP Parse error: syntax error, unexpected ‘< ' in /root/microcule/bin/binaries/micro-php(43) : eval()'d code on line 224 .

      Untuk error tersebut saya kurang paham mb, mungkin bisa di cek di hook.io nya, atau dicoba cek lagi.

      Untuk munghubungkan bot dengan hook, silahkan dilihat lagi perintah cURL yang ada di manual, sesuaikan formatnya sebagai berikut:

      curl -H “Content-Type: application/json” -X POST -d ‘{“url”:”https://www.dwinoviyati.com/labs/haloro_bot.php“}’ https://api.telegram.org/bot191339814:AAGx-ZySMny2YE7YLSMP7NCtANjSHg9FLdU/setWebhook

      Silahkan disesuaikan di bagian yang dicetak tebal.

    1. Selamat pagi mas Adam,

      Jika menggunakan OS Windows, silahkan download cURL dari link berikut ini. Bisa menggunakan “curl download wizard” dihalaman tersebut jika tidak tau paket mana yang harus didownload.

      Jika menggunakan OS Mac, silahkan jalankan command tersebut di terminal.
      Jika menggunakan OS Linux, jalankan command tersebut di console atau command prompt.

      Semoga bisa membantu.

Leave a Reply to Adam Cancel reply

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