Halo Bot - simple mode dan lengkap (GAS-00)

7 menit saja |

Kita buat dengan cara yang simple, agar yang baru belajar lebih mudah belajar dan mengembangkan ya.

Pengantar

Ini adalah materi paling dasar dari pembuatan bot telegram untuk Google Apps Script. Versi materi halo bot yang lebih sederhana.

Tujuan

Agar kamu bisa belajar COPY PASTE dan bot bisa berjalan saja. Itu sudah cukup, tujuan sudah tercapai.

Untuk memenuhi tujuan ini, yang terpenting adalah:

  • TELITI membaca / melihat instruksi
  • SABAR mengikuti (baca materi atau nonton video)
  • TIDAK LOMPAT-LOMPAT, ikuti secara teratur dari awal
  • JANGAN MELAKUKAN apa yang tidak diajarkan. Karena diawal ini: hanya belajar COPAS.
  • Lakukan dengan TEKUN, jika gagal ULANGI bikin BARU dari AWAL saja.
  • GIGIH mencoba, jika gagal sampe 3x: itu sudah biasa! Bukan materinya yang keliru, 99% karena TIDAK TELITI dan TIDAK MENGIKUTI PETUNJUK.

Selebihnya jika tujuan telah tercapai, kamu baru bebas memodifikasinya. Malah harus mempelajari dan mengembangkan sendiri, dengan BANYAK praktek.

Perbedaan

Perbedaan dengan Halo Bot sebelumnya:

  • Token bot tidak tersembunyi, buat pemula lebih mudah.
  • Dibuat sederhana (tidak pake mini DB user), sedikit langkah dijalankan
  • Penambahan sample echo/say
  • Penambahan sample kirim foto dari URL
  • Penambahan pong dengan kalkulasi waktu dan random image
  • Penambahan sample button inline
  • Menambahkan halaman callback
  • Dilengkapi (debugging) β€˜jebakan’ kesalahan, jika ada kesalahan code akan memberitahukan ke admin bot

Selebihnya tidak ada yang berbeda, masih sama-sama menggunakan Library v2.

Preview

Triller singkat tentang Hello Bot

Mulai

Langkah-langkah yang harus diselesaikan:

  1. Register Bot di @botFather
  2. Buat proyek baru
  3. Tambahkan Library
  4. COPAS code
  5. Deploy new versi
  6. Set webhook dan Test
  7. Belajar Modifikasi

Selain membaca materi ini, pastikan juga menonton video nya ya. Agar pemahaman dan feel nya dapat.

Blog akan di update setelah video tayang. Terutama step detail per poin. Karena membutuhkan waktu panjang mengerjakan semuanya sendirian.

1. Register Bot

Langkah paling awal, buatlah bot di @botFather dan dapatkan Token Bot-nya.

Sebagai langkah awal, klik START pada bot.

START bot ini JANGAN kelewatan di step awal. Agar bot mengenali kita.

2. Buat Proyek

Buka script.google.com atau Google Drive, buat New Script: Baru, Lainnya, Skrip Google Apps.

Sesuaikan bahasanya ya jika menggunakan Bahasa Inggris atau lainnya.

Pada GAS, ada 2 jenis editor.

  1. Editor Lama (Legacy)
  2. Editor Baru

3. Library

Berikut ini ID Library GAS Telegram Versi 2 :

  • πŸ”° ID Legacy: MWkhreE4chZ56V_bDwpYUBPvg_do21SJR
  • πŸ”° ID New Editor: 11LhYmqUg8UVtqMg3rPaau5uHwCMtsE_0RwUQim4ZY-OCfDe_YyIYKPSP

Untuk versi, SELALU pakai yang angkanya TERBESAR.

4. Copy Paste

SELALU teliti, kesalahan 99% karena TIDAK teliti.

1. Kode.gs

Copy paste saja ini di Kode.gs jangan lupa disesuaikan TOKEN nya.

Dibuat lebih sederhana, token tidak disembunyikan (agar mudah).

// masukkan TOKEN BOT dari BOT Father
const token = 'ISI_DENGAN_TOKEN_BOT'

const tg = new telegram.daftar(token)

// masukkan ID kamu, jika belum tau cek di @strukturbot
const adminBot = 123456

// jika debug true, akan mengirimkan struktur JSON ke admin bot
const debug = false 

// -- fungsi telegram

// cek informasi bot
function getMe(){
  let me = tg.getMe()
  return Logger.log(me)
}

function setWebhook() {
  var url = "ISI_DARI_URL_HOOK"
  var r = tg.setWebhook(url)
  return Logger.log(r)
}

// cek info hook bot
function getWebhookInfo() {
  let hasil = tg.getWebhookInfo()
  return Logger.log(hasil)
}

// hapus hook
function deleteWebhook() {
  let hasil = tg.deleteWebhook()
  return Logger.log(hasil)
  
}

// -- kalau mau bikin fungsi sendiri, taruh di bawah sini ---


2. Proses.gs

Buat file script baru, kita kasih nama Proses.gs

// fungsi buat handle hanya menerima pesan berupa POST, kalau GET keluarkan pesan error
function doGet(e) {
  return tg.util.outputText("Hanya data POST yang kita proses yak!");
}

// fungsi buat handle pesan POST
function doPost(e) {  
  // data e kita verifikasi
  let update = tg.doPost(e);
  
  try {
    if (debug) return tg.sendMessage(adminBot, JSON.stringify(update, null, 2))
    prosesPesan(update)
  } catch (e) {
    tg.sendMessage(adminBot, e.message)
  }
  
}

// fungsi utama untuk memproses segala pesan yang masuk
function prosesPesan(update) {  

  // deteksi tipe message
  if (update.message) { 

    // penyederhanaan variable
    var msg = update.message;

    // deteksi event letakkan di sini

    // jika ada pesan berupa text
    if (msg.text) {

      // jika user klik start, bot akan menjawab
      var pola = /\/start/i
      if (pola.exec(msg.text)) {
        var nama = msg.from.first_name
        if (msg.from.last_name)
          nama += ' ' + msg.from.last_name
        // perhatikan, ini menggunakan sendMsg bukan sendMessage
        var pesan = "πŸ™‹πŸ½ Halo, <b>" + tg.util.clearHTML(nama) + "</b>, perkenalkan aku ini bot!"
        pesan += `\n🎁 Dibuat dengan <b>GAS Library</b> versi <code>${tg.versi()}</code>`
        pesan += "\n\nπŸ’πŸ»β€β™€οΈ Bergabunglah di @botindonesia untuk silaturrahim dan belajar bersama membuat bot Telegram."

        var keyboard = []

        // keyboard baris pertama
        // index dimulai dari 0
        keyboard[0] = [
          tg.button.url('πŸ“š Materi Bot', 'http://j.mp/GASBot'),
          tg.button.url('πŸ‘₯ @botindonesia', 'https://t.me/botindonesia'),
        ]
        // keyboard baris kedua
        keyboard[1] = [
          tg.button.text('😼 Halo Human', 'me_click')
        ]

        return tg.sendMsgKeyboardInline(msg, pesan, keyboard, 'HTML')
      }

      // jika user ketik /ping, bot akan jawab Pong!
      // pola dan jawaban paling sederhana
      var pola = /^[\/!]ping$/i
      if (pola.exec(msg.text)) {
        // balas pong dengan mereply pesan
        // menggunakan parse_mode Markdown
        return tg.sendMessage(msg.chat.id, 'πŸ“ *Pooong!*', 'Markdown', false, false, msg.message_id)
      }

      
      // jika user ketik /pong, sekalian dihitung selisihnya
      // dan diberikan berbagai contoh kasus

      // balas pong dengan mereply pesan
      // menggunakan parse_mode Markdown
      var pola = /^[\/!]pong$/i
      if (pola.exec(msg.text)) {
      
        // awal waktu pakai timestampnya message saja
        // jika bot macet timestamp pengirim tetap diperhitungkan
        // pilihan lain bisa bikin time sendiri
        var waktuAwal = msg.date 
        var hasil = tg.sendMessage(msg.chat.id, '<b>Ping</b>', 'HTML', false, false, msg.message_id)

        var newMsg = hasil.result
        var waktuAkhir = new Date()

        let fotoMie = [
         'https://assets-pergikuliner.com/uploads/bootsy/image/7377/medium_medium_Mie_instan_Indonesia__pergikuliner.com_.jpg',
         'https://cdn-2.tstatic.net/manado/foto/bank/images/mie_20180331_140834.jpg',
         'https://cdn-2.tstatic.net/pontianak/foto/bank/images/tom-yam-ramen_20171129_091301.jpg',
         'https://steemitimages.com/p/o1AJ9qDyyJNSpZWhUgGYc3MngFqoAMdKHenXrMvJdYNGVi3g2',
         'https://bebaspedia.com/wp-content/uploads/2020/03/Mie-Ramen.jpg'
        ]
        
        // hitung selisih waktunya dalam satuan detik
        var selisihWaktu = (waktuAkhir / 1000 ) - waktuAwal
        // foto gambar disembunyikan di emoticon mie
        var pesan = '<a href="'+tg.util.random(fotoMie)+'">🍜</a> '
        pesan += `<b>Ping</b>... in <i>mie telur</i> rebus.\nπŸ₯’ Dimasak dalam <code>${selisihWaktu.toLocaleString()}</code> detik.`

        return tg.editMessageText(msg.chat.id, newMsg.message_id, false, pesan, 'HTML')
      }

      // tangkap pesan echo atau say
      var pola = /^([\/!](echo|say))/i
      if ( cocok = pola.exec(msg.text) ) {
        var pesan = msg.text.replace(cocok[1], '')
        // bersihkan pesan dari spasi
        pesan = pesan.trim()
        // deteksi jika panjang pesan < 1, jangan lakukan apa-apa
        if (pesan.length<1) 
          return false
        
        // kirim pesan echo / say nya, tanpa parse_mode
        return tg.sendMsg(msg, pesan)
      }

      // kirim foto dari URL
      var pola = /^[\/!](foto|ph?oto)$/i
      if ( cocok = pola.exec(msg.text) ) {        
        var url = 'https://blog.banghasan.com/assets/images/me/banghasan_pedang.jpg'
        var caption = 'Test Kirim Foto'
        return tg.sendPhoto(msg.chat.id, url, caption, 'HTML')
      }

      // kalau mau kembangin sendiri menjadi bot interaktif, code nya taruh di bawah ini
      // -- mulai custom deteksi text --

      // akhir deteksi pesan text
    }

    // deteksi jika ada foto
    if (msg.photo) {
      // taruh codinganmu di sini
      // misal menampilkan foto ID
      return tg.sendMsg(msg, '⚜️ File ID: ' + msg.photo[0].file_id)
    }
    
    // akhir update message
  }

   // deteksi callback
   if (update.callback_query) {
      // proses di halaman berikutnya, biar gak terlalu panjang     
     return prosesCallback(update.callback_query)
   }
  
}

3. Callback.gs

Idem dengan atas, buat file script baru dan beri nama Callback.gs kemudian copas code berikut ini:

function prosesCallback(cb) {

  if (/me_click/i.exec(cb.data)) {
    var pesan = '~ hasil tidak mengkhianati usaha ~'
    pesan +='\n\n' + ' '.repeat(12)
    pesan += 'Semangat Belajar! ✊🏼'
    return tg.answerCallbackQuery(cb.id, pesan, true)
  }

}

5. Deploy

Kunci sukses deploy:

  • SELALU gunakan EDITOR LAMA (LEGACY) untuk mendeploy
  • Setiap deploy selalu NEW versi

6. SetWebhook dan Test

Set webhook hanya dilakukan sekali, kecuali kondisi tertentu yang menyebabkan webhook lepas.

7. Modifikasi

Untuk belajar modifikasi, bisa di cek pada videonya saja yak.

Video

Sangat dianjurkan menonton video nya.

Silakan cek juga playlist lainnya :

Referensi

Sebagai referensi dan tambahan bacaan dan materi, silakan diperiksa sebagai berikut:

Penutup

Jika ada pertanyaan silakan bergabung ke grup Telegram @botIndonesia bersama para coder lainnya kita saling sapa, diskusi, sharing dan silaturrahim. Jangan lupa dibaca pinned message (pesan tersemat) pada grup.

Mohon maaf jika ada salah kata atau ada khilaf, dan semoga bermanfaat.