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 hal selain dengan mempraktekkannya secara langsung. Demikian juga dengan belajar bot, tentunya tiada 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 masyarakat 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 mendalam tentang programming, juga tidak memiliki bahasa pemrograman favorit.
Jadi, saya akan memilih bahasa pemrograman berdasarkan pendekatan non teknis.

Sebuah bot selamat datang tentunya harus siaga tiap 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 bisa diandalkan. 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 lain yang gratis. Dari beberapa alternatif, pilihan saya jatuh kepada now dari Zeit.
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 proyek 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 alihkan pilihan ke framework NodeJS lain yang tidak kalah populer; telegraf. Pengembang telegraf lumayan sigap mendukung API 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 Zeit 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. 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 = s => s
  .replace(/</g, '&lt;');

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

  return name
}

bot.on('new_chat_members', (ctx) => {
  ctx.replyWithHTML(
    `Hai ${buildName(ctx.message.new_chat_member)}, selamat datang di <b>${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)

Simpan skrip. Misal pada nano adalah dengan cara menekan tuts CTRL+O bersamaan.
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 memroses 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, maka URL proyek bot kita 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 karakter unik dan atau aneh pada nama atau username-nya 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 lainnya.

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

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

ctx.replyWithHTML(

Fungsi ini akan membalas peringatan masuknya anggota baru dengan pesan selamat datang yang menerima format berbentuk 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!". Di mana Nama adalah nama si anggota yang baru masuk, dan Group adalah nama grup yang dimasukinya.

'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': [

Seperti yang telah saya kemukakan di awal, bot selamat datang cenderung membanjiri grup karena mengucapkan selamat datang secara beruntun. Misal jika ada 5 orang yang masuk bersamaan, maka bot akan mengucapkan salam sebanyak 5 kali pula. Memang bisa dibuat bot yang bisa mendeteksi anggota yang masuk secara beruntun dan menghindari salam yang beruntun, namun ini menjadikan bot tersebut rumit dan tidak sesuai dengan tema bahasan kali ini.

Sederhananya; jangan buat ucapan selamat datang yang panjang dan bertele-tele. Cukup tuliskan teks yang singkat dan padat. Sekiranya ada hal lain yang patut disampaikan, misalnya tata tertib grup, maka buatlah tata tertib tersebut dalam sebuah channel/group post atau sebuah laman paragra.ph kemudian buat sebuah tombol tautan menuju tata tertib tersebut.
Dalam contoh bot yang kita buat kali ini, tombol tautan tersebut adalah sebuah inline keyboard.

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

Kode di atas adalah sebuah tombol inline keyboard. Tombol ini memiliki tulisan (label) "Harap baca ini dulu", dan jika ditekan akan mengarahkan user menuju ke sebuah postingan pada sebuah kanal (dalam contoh adalah pos ke 197 pada 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)

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.
Kegunaan kode di atas adalah untuk membuat webhook baru secara otomatis tiap kali kita memasang ulang bot 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 dari dalam folder bot untuk mengunggahnya 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>

Perintah di atas akan mengunggah bot ke kita ke server Zeit. Karena kita menggunakan layanan gratis, maka proyek bot kita akan dapat dilihat siapa saja (public) yang memiliki URL-nya. Karenanya kita juga menjadikan token bot sebagai environment variable agar tidak disimpan di dalam server Zeit dan rentan dilihat orang lain.
Jangan lupa untuk mengganti <token> dengan token bot Anda.

Sampai langkah ini, mestinya si bot telah siap untuk dipakai.

Welcome bot in action

Demikian artikel kali ini. Semoga bermanfaat.