Membuat Bot Telegram Selamat Datang


Setelah kemarin mengenal dasar-dasar bot Telegram, kini saatnya kita mengenal bot Telegram dengan lebih mendalam. Tidak ada cara yang lebih ampuh untuk mendalami sesuatu selain dengan mempraktekkannya secara langsung. Demikian juga dengan belajar bot, tentunya ada cara yang lebih bagus untuk belajar bot selain dari praktek langsung membuat bot. Jadi dalam artikel kali ini, saya akan mencoba mengupas langkah-langkah membuat bot Telegram. Cukup bot yang sederhana saja.

Bot apa?

Bot apakah yang akan kita buat?
Sepengamatan saya selama bergabung di grup @botphp, rupanya fitur yang banyak diminati orang Indonesia dari sebuah bot Telegram adalah bot yang memberi salam selamat datang kepada mereka yang baru bergabung dengan sebuah grup. Singkatnya, welcome bot atau bot selamat datang.
Menurut hemat pribadi, fitur bot selamat datang ini kurang berguna, malah seringkali cenderung spammy. But hey, different strokes for different folks. Jadi saya tetapkan artikel kali ini akan menjelaskan cara membuat sebuah bot selamat datang.

Ditulis memakai bahasa pemrograman apa?

Pertanyaan berikutnya, bahasa pemrograman apa yang akan digunakan?
Hmmm...sejujurnya saya bukanlah seorang penulis kode, apalagi programmer. Saya tidak memiliki pengetahuan tentang programming, juga tidak memiliki bahasa pemrograman favorit.
Jadi, saya akan memilih bahasa pemrograman berdasarkan pendekatan non teknis.

Sebuah bot selamat datang tentunya harus sedia setiap saat, jadi sekiranya ada yang bergabung dengan grup pada waktu dini hari, bot tersebut akan selalu siap untuk menyapa. Kebutuhan agar bot selalu siap 24 jam sehari dan 7 hari seminggu ini mewajibkan ia dipasang pada sistem yang selalu on. Tentunya tidak masuk akal memasang bot Telegram di laptop atau desktop. Karena komputer tersebut tidak selamanya hidup, kadang PLN "mati lampu", koneksi internet operator seluler "tidak ada jaringan", dan lain sebagainya.
Solusinya adalah dengan memasang bot di VPS (Virtual Private Server). Namun kemudian, ada kendala lain dalam menggunakan VPS, misal bagi saya pribadi adalah kendala dalam pembayaran. Maklum saya tidak memiliki kartu kredit atau Paypal yang umumnya dijadikan alat pembayaran VPS.
Karena pilihan berbayar belumlah memungkinkan, kini kita beralih kepada pilihan yang gratis. Dari beberapa alternatif, pilihan saya jatuh kepada now.
now telah jamak dikenal dan digunakan untuk memasang proyek-proyek yang menggunakan bahasa pemrograman javascript, atau lebih tepatnya NodeJS. Walau kini now juga memiliki fitur docker yang memungkinkannya digunakan untuk memasang program berbahasa pemrograman apapun.

Nah, kiranya jelas jika bahasa pemrograman yang akan kita gunakan kali ini adalah javascript/NodeJS, dengan alasan kita bisa memasang bot dengan relatif mudah dan gratis.

Framework?

Setelah membaca artikel "Belajar Dasar Bot Telegram" mungkin Anda akan berpendapat bahwa membuat bot Telegram itu rumit dan sulit. Well, jika membuat botnya dari nol memang rumit dan sulit. Namun untungnya di luar sana ada programmer-programmer yang berbaik hati membuat alat bantu untuk memudahkan kita membuat bot. Alat bantu tersebut umum disebut sebagai framework atau kerangka kerja. Dengan menggunakan framework bot kita tidak perlu memusingkan perihal update, offset, polling, webhook, rate limit, metode, type, dan lainnya. Kita tinggal fokus ke fitur apa yang akan kita buat untuk bot.

framework bot Telegram paling terkenal yang menggunakan javascript adalah node-telegram-bot-api (ntba). Namun sayangnya, pengembangannya lumayan lambat. Saat artikel ini ditulis, bot API telah mencapai versi 3.3 namun ntba baru mendukung bot API v3.1. Selain itu dependency-nya juga lumayan banyak.
Kita beralih ke pilihan lain yang tidak kalah populer; telegraf. Ia sudah mendukung bot API versi teranyar dan dependency-nya pun relatif sedikit.

Okay, keputusan finalnya adalah: kita akan membuat bot Telegram selamat datang yang ditulis menggunakan bahasa javascript/NodeJS dengan framework telegraf dan kemudian akan dipasang di now.

Coding time...

Pastikan pada sistem Anda telah terpasang nodejs terbaru. Silakan rujuk https://nodejs.org/en/download/current/. Atau jika sistem operasi Anda adalah Debian Sid, bisa merujuk artikel saya yang lalu; "Memasang Node.js Teranyar di Debian Sid".

Menulis bot

Tahapan tutorial di bawah ini saya tulis dengan asumsi Anda menggunakan sistem operasi Linux. Jika ternyata tidak, you're on your own. Namun saya pikir penggunaan NodeJS tidak akan begitu berbeda antar sistem operasi, paling hanya perlu sedikit penyesuaian di sana dan di sini.

Langkah pertama, buat sebuah map (folder) untuk menyimpan berkas-berkas bot. Misal nama map tersebut adalah nowbot.

mkdir nowbot

Berpindahlah ke dalam map yang baru dibuat tadi.

cd nowbot

Inisiasi proyek nodejs-nya.

npm init

Anda kemudian akan ditanya perihal data proyek yang kemudian akan disimpan dalam berkas package.json. Jadi, jangan khawatir salah menjawab karena kita akan selalu bisa menyunting berkas package.json jika sekiranya ada yang tidak sesuai.
Berikut contoh package.json yang saya buat.

{
  "name": "nowbot",
  "version": "1.0.0",
  "description": "Example Telegram bot on zeit now",
  "main": "nowbot.js",
  "scripts": {
    "start": "node nowbot.js"
  },
  "author": "Sahri Riza Umami",
  "license": "ISC"
}

Yang patut jadi perhatian adalah nama berkas javascript pada bagian main dan script. Dalam contoh karena nama berkasnya adalah nowbot.js maka skrip bot yang kita buat harus bernama nowbot.js.

Pasang telegraf.

npm i telegraf


The script

Saatnya menulis skrip bot. Buat sebuah berkas javascript dengan nama berkas sesuai nama dalam package.json, misal dalam contoh nama berkasnya adalah nowbot.js.
Di sini akan dicontohkan membuat berkas nowbot.js menggunakan nano. Tentunya Anda bisa menggunakan penyunting teks apapun yang ada dalam sistem.

nano nowbot.js

Salin skrip berikut ke dalam berkas nowbot.js.

const Telegraf = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN)

const escapeHtml = string => string
  .replace(/</g, '&lt;');

function buildName(user) {
  let name = `${escapeHtml(user.first_name)}`
  if (user.last_name) name += ` ${escapeHtml(user.last_name)}`
  if (user.username) name += ` (@${user.username})`
  name += ` [${user.id}]`

  return name
}

bot.on('message', (ctx) => {
  if (ctx.updateSubTypes == 'new_chat_members') {
    ctx.replyWithHTML(
      `Hai ${buildName(ctx.message.new_chat_member)}, selamat datang di ${ctx.chat.title}!`, {  
        'reply_to_message_id': ctx.message.message_id,
        'reply_markup': {
          'inline_keyboard': [
            [
              {
                text: 'Harap baca ini dulu',
                url: 'http://telegraf.js.org'
              }
            ]
          ]
        }
      }
    )
  }
})

const secret = Math.random().toString(36).slice(2)
bot.telegram.setWebhook(`${process.env.NOW_URL}/${secret}`)
bot.startWebhook(`/${secret}`, null, process.env.PORT, process.env.HOST)

Tekan tuts CTRL+O agar nano menyimpan skrip.
Berikut penjelasan isi skrip tersebut:

const Telegraf = require('telegraf')

Ini sudah jelas, membuat constant Telegraf dari modul framework telegraf.

const bot = new Telegraf(process.env.BOT_TOKEN)

telegraf akan memproses bot berdasar token yang diberikan dan memaparkan hasilnya ke dalam constant bot. Kita tidak perlu memikirkan soal update, limit, offset atau hal lainnya.
Namun kita tidak akan menuliskan token bot langsung ke dalam skrip ini. Karena kita menggunakan now versi gratis, sementara versi gratisan ini URL-nya dapat diakses oleh siapapun. Jadi demi keamanan kita hanya akan memberikan token melalui process environment sebagaimana akan dilakukan pada langkah akhir tutorial ini.

const escapeHtml = s => s
  .replace(/</g, '&lt;');

Agar lebih cantik, bot akan mengirim salam selamat datang dalam bentuk tebal dan monospace (huruf yang memiliki lebar yang sama). Ada dua pilihan agar bot bisa mengirim pesan berbentuk demikian, yakni dengan menggunakan Markdown atau HTML. Saya sendiri lebih menyukai HTML karena ia lebih mudah untuk escaped dan umumnya bahasa pemrograman telah memiliki fitur atau pustaka untuk ini.

Dari jutaan pengguna Telegram, banyak di antaranya yang menggunakan nama atau username unik dan aneh yang bisa membuat html parser Telegram kebingungan atau membuat bot crash. Misal, nama seperti {F}yodoro<b> akan menyebabkan galat karena bot menemukan tag pembuka <b> namun tidak menemukan tag penutup </b>. Nah, di sinilah gunanya constant escapeHtml di atas; untuk mengamankan karakter-karakter yang berpotensi membuat bot crash atau mengacaukan isi pesan.

function buildName(user) {
  ...
}

Ini adalah fungsi untuk menyusun nama anggota yang baru masuk. Seperti diketahui, ada beragam kombinasi nama pengguna Telegram. Ada yang mempunyai nama depan dan belakang, ada yang hanya nama depan saja, ada juga yang tidak memiliki username, dan lain sebagainya.

bot.on('message', (ctx) => {
  if (ctx.updateSubTypes == 'new_chat_members') {

Karena fungsi bot ini hanyalah mengucapkan selamat datang pada anggota grup yang baru masuk, maka ia cukup hanya mampu mengenali pesan (message) saja. Pesannya pun cukup pesan new_chat_members yang menyatakan adanya anggota grup baru.

ctx.replyWithHTML(

Seperti yang telah dijelakan di paragraf terdahulu, bot akan mengirimkan pesan dalam format HTML.

`Hai ${buildName(ctx.message.new_chat_member)}, selamat datang di ${ctx.chat.title}!`, {

Teks ucapan selamat datang. Di sini kita akan menggunakan kata dengan pola seperti berikut: "Hai Nama (@username)[user_id], selamat datang di Group!".

'reply_to_message_id': ctx.message.message_id,

Dalam mengucapkan selamat datang, bot akan melakukannya dengan mengutip notification message. Gunanya agar si anggota baru mendapatkan notifikasi jika ia mendapatkan pesan dari grup barunya.

'reply_markup': {
  'inline_keyboard': [

Jangan buat ucapan selamat datang yang panjang dan bertele-tele. Jika banyak anggota baru yang masuk, ucapan selamat datang hanya akan menjadi spam. Cukup tuliskan teks yang singkat dan padat. Sekiranya ada hal lain yang patut disampaikan, misalnya tata tertib grup, buat tata tertib tersebut dalam sebuah channel/group post atau sebuah laman paragra.ph kemudian buat sebuah tombol tautan menuju tata tertib tersebut.
Di sini tombol tautan tersebut adalah sebuah inline keyboard.

text: 'Harap baca ini dulu',
url: 'https://t.me/pegelinux/197'

Ini adalah sebuah tombol inline keyboard. Tombol ini memiliki tulisan "Harap baca ini dulu", dan jika ditekan akan mengarahkan user menuju pos ke 197 di kanal @pegelinux.

const secret = Math.random().toString(36).slice(2)
bot.telegram.setWebhook(`${process.env.NOW_URL}/${secret}`)
bot.startWebhook(`/${secret}`, null, process.env.PORT, process.env.HOST)

Fungsi ini untuk menetapkan dan memulai webhook.
Seperti umumnya produk gratis, dalam now versi gratis pun aplikasi akan ditidurkan (sleep) jika tidak aktif dalam selang waktu tertentu. Untuk menyiasatinya bot akan menggunakan metode webhook yang akan selalu membuka koneksi untuk menerima pesan.
Kita tidak bisa login ke dalam server now. Jadi jika misalnya ada perbaikan dalam skrip, kita harus memasang ulang (redeploying) bot di now. Tiap kali redeploying, tiap kali itu pula URL aplikasi kita akan berubah. Karenanya kita perlu membuat webhook baru tiap kali aplikasi dipasang ulang ke now.

Memasang bot ke now

now memiliki banyak now client, piranti lunak untuk mempermudah memasang aplikasi dari lokal ke server now. Karena now client juga tersedia dalam npm registry, maka akan lebih mudah jika kita memasang now client versi NodeJS melalui npm.

sudo npm i now -g

Setelahnya, jalankan perintah berikut untuk mengunduh berkas biner now.

sudo npm i now -g --unsafe-perm

Jika now telah terpasang, jalankan perintah now untuk mengunggah bot ke server now. Jika Anda belum memiliki akun now, pastinya akan diminta untuk mendaftar akun terlebih dahulu. Jangan khawatir, proses pendaftaran bisa dilakukan langsung melalui now client dan hanya membutuhkan email sebagai persyaratan.

now --public -e BOT_TOKEN=<token>

Ganti <token> dengan token bot Anda.

Bot telah siap untuk dipakai.

Welcome bot in action

Demikian artikel kali ini. Semoga bermanfaat.
Jika menemui kesalahan dalam artikel, atau menemukan kendala dalam mencoba tutorial ini, silakan tuliskan dalam kolom komentar.

7 komentar:

  1. Bot selamat datang cenderung spammy, absolutely true! ahaah
    Basically, bots are annoying, they must be as silent as possible.

    Faktanya ada yang lebih dari itu, ternyata manusia suka disambut. Makanya bot ini digemari, terutama bagi para pengguna baru.

    BalasHapus
    Balasan
    1. Itu username sampeyan bagaimana caranya bisa linked ke blog?
      Sudah jajal merubah di tema, ternyata masih merujuk ke profil.

      Hapus
    2. Di blog ini saya komentar pakai opsi Name/URL. Kalau sebagai author blog sendiri, gatau caranya, dulu juga bingung waktu masih bawaan blogger. Sekarang dah pakai disqus. haha

      Hapus
  2. bisa kasih tutor via vidio g gan penting nih buat coba2

    BalasHapus
    Balasan
    1. Ini kebanyakan ngetik di terminal sih, jadi rasanya terlalu berlebihan kalau divideokan.
      BTW, jika ada yang kurang dipahami silakan ditanyakan di sini.

      Hapus
    2. ya saya rasa lebih baik di buat vidio kang soalnya agar lebih paham bagi yang pemula seperti saya ini, klo banyak subcriber via youtube kan lumayan bisa nambah penghasilan kang mohon di pertimbangkan kang lumayan tuh. Kalau sudah disediakan channel YT langsung kabari kang saya bantu sponsorin nanti

      Hapus
    3. I see. Saya timbang dulu.

      Hapus

Kembali ke atas