Beberapa hal perlu urut belajarnya.. jadi sebaiknya belajar berurut adalah rekomendasinya.

This the multi-page printable view of this section. Klik disini untuk ngeprint.
Beberapa hal perlu urut belajarnya.. jadi sebaiknya belajar berurut adalah rekomendasinya.
Buat teman-teman yang baru mau belajar membuat bot telegram pilihan yang paling tepat memulainya adalah belajar dari sini.
Di sini, kita akan belajar membangun bot telegram secara gratis, cepat, dan mudah menggunakan Google Apps Script.
Atau bagi yang ingin migrasi dari lib v1/v2, perlu juga menyimak materi ini.
Ada 5 langkah sederhana untuk membuat bot, yakni:
Masing-masing telah dijelaskan pada halaman linknya ya.
Untuk lebih detail dapat ditonton pada videonya.
Pada materi lanjutan dijelaskan bagaimana coding untuk cycle dalam sebuah aplikasi. Yakni, membuat - memodifikasi - dan mendeploy.
Materi juga menjelaskan:
Berbekal poin-poin utama itu, kita akan bisa mengembangkan bot sesuaka hati.
Berikut ini source code untuk halo lumpia:
Sumber kode ini bisa didapatkan juga pada Github bangHasan - Halo Lumpia
Langsung disimak saja tanpa materi tulisan..
Disadur dari blog blogHasan
Masih terbersit pada ingatan, tiap kali development bot telegram menggunakan Google Apps Script ketika ada perubahan sedikit kita harus melakukan deployment.
Bayangkan jika ada sebuah proses banyak yang harus berulang-ulang, betapa ribetnya menjalankan rutinitas edit - deploy - test berulang-ulang. Yang mana proses deploy sendiri tidak cepat prosesnya.
Maka pada saat lumpia hadir, hal ini sudah dikonsep sebagaimana hingga saat development dapat dilakukan debugging. Mengubah-ubah fungsi tanpa harus deploy terlebih dahulu.
Terdapat 3 mode atau method untuk menghandle yang diperkenalkan pada tutorial atau materi ke dua ini.
Yakni sebuah mode dimana ketika diaktifkan, semua pesan yang masuk akan direspon oleh bot menjadi data JSON.
Untuk mengaktifkan mode debug, mudah saja:
Yakni sebuah mode, yang akan menampilkan seluruh rangkaian proses, baik trigger, middleware ataupun saat build message, termasuk juga result.
Sehingga dengan mengaktifkan mode verbose ini, kita dapat memantau dan menganalisis proses yang terjadi, dan kira-kira nyangkut dimanakah code yang dibuat ketika ada kesalahan.
Untuk mengaktifkannya juga sama dengan diatas:
Mode verbose ini dapat digunakan bersama handleUpdate()
Yakni sebuah fungsi khusus pada lumpia framework, untuk memproses sebuah update atau pesan.
Dengan menggunakan fungsi / method ini, kita bisa memanipulasi data apa saja yang akan dikirim atau diproses termasuk jika ada perubahan kondisi tertentu.
Contoh kode untuk menghandle / proses update message dari user:
Tidak perlu deploy lagi untuk menguji trigger atau command-command yang telah dibikin sebelumnya.
Untuk mengujinya, sekarang tinggal jalankan saja fungsi handleUpdate tersebut.
Tayang pertamakali, hari ini:
Ahad - 31 Oktober 2021
pukul 14:00 WIB.
Untuk lebih jelas memahaminya, silakan ditonton pada video berikut ini.
Dengan mengenal mode verbose dan fungsi handleUpdate()
saat develop bot telegram menjadi lebih mudah.
Terutama ketika harus membuat sample perulangan kasus, step by step, dan mendebug message by message.
Informasi di Telegram: https://t.me/bot_indonesia/70
Disadur dari tulisan asli pada blog bangHasan
Masih pada materi dasar, materi yang sebagian besar orang terlihat membosankan. Karena hasilnya tidak langsung tampak indah. Namun materi dasar adalah pondasi. Tanpa memahami materi dasar, alhasil mentok sana sini.
So, bagi yang belum paham bagaimana menggunakan regex.. silakan dibaca dan dipahami materi ini yak.
ReGex merupakan kepanjangan dari Regular Expression.
Perlu diperhatikan saja, regex tiap bahasa pemrograman itu agak berbeda-beda. Meski terlihat sama, tapi ada aja bedanya.
Karena lumpia framework berjalan pada bahasa pemrograman javascript, jadi kata kuncinya adalah regex javascript
.
Definisinya regex adalah..
Hmm cari aja deh di google hehe.
Karena bukan perkuliahan yang perlu dibahas secara spesifik dan tuntas, kita cukup ambil poin-poin pentingnya saja di sini yak.
Kalau versi saya sih simple saja, yakni buat nangkap atau ngambil karakter (text) dengan pola tertentu.
Mungkin awalnya rumit, tapi setelah mengalami sendiri ketika ada kasus yang komplek harus dikelola.
Maka regex ini menjadi kunci dalam pembuatan bot (proses menangkap, memfilter, mengubah, dan atau menyajikan data) spesifik.
Bahkan hampir setiap penggunaan pada lumpia framework adalah berdasarkan regex.
Coba mari kita perhatikan, bila menggunakan gaya umum untuk mendapatkan seluruh angka dari teks:
umur 21 tahun, berangkat jam 13:00 WIB
bakal ribet memecah-mecahnya.
Dengan mengenal regex, akan terasa mudah mendapatkannya.
β¦ karena regex adalah kunci.
Yuk, kita mulai..
Rumusnya selalu diawali dan diakhiri dengan garis miring: /pola/
kemudian dilanjutkan simbol flag
jika ada.
Maksud pola
adalah pola yang akan kita tangkap pada sebuah teks, misalnya kita akan deteksi kalimat yang ada kata halo nya. Maka penulisannya adalah: /halo/
Sementara flag
adalah kondisi tertentu yang diinginkan, misalnya tidak membedakan huruf besar dan huruf kecil pada pola
, maka bisa pakai flag i
Sehingga: /halo/i
maka ketika user mengetik Halo
, halo
, haLO
, atau HALO
dimana saja posisinya, boleh di depan tengah atau belakang, semuanya tetap terdeteksi.
Bagaimana penerapan nya pada bot Telegram yang menggunakan lumpia?
Gunakanlah method hear
atau hears
untuk mendeteksinya.
Syntax Lumpia:
bot.hears(regex, callback);
Sehingga:
Simple kan :-D
OKEH, lanjoet..
Tanda khusus yang memiliki arti spesial pada regex. Ga semua harus dihapali, tapi ini yang sering dipakai ya:
^
caping atas artinya diawal kata / kalimat$
dolar, artinya diakhir kalimat.
titik berarti sembarang karakter, kecuali ganti baris*
artinya 0 karakter atau lebih (banyak)+
artinya 1 karakter atau lebih (banyak)?
artinya 0 atau 1. Misal: https?
artinya boleh http
atau https
\b
penanda satu kata penuh{m,n}
artinya minimal m dan maksimal n, misal A{1,3}
artinya huruf A minimal 1 dan maksimal 3[]
grup karakter ATAU sebanyak 1 aja, misal [abc]
boleh a, b atau c.[^abc]
grup yang BUKAN berisi itu di dalamnya|
karakter ATAU\w
huruf alphabetnumeric. Senilai pola: [a-zA-Z0-9_]
\n
ganti baris\s
spasi\0
karakter null\d
artinya digit atau angka, senilai pola [0-9]
(...)
tanda kurung, berarti hasilnya digrup(?:...)
digrup tapi tidak dimasukkan dalam tangkapan(?<nama>...)
digrup dan diberi namaMasih banyak tanda khusus, namun itu yang bakal sering kita pakai ya.
Flag yang sering dipergunakan:
i
ignore case untuk tidak membedakan huruf besar dan kecilg
global mencari semua pola yang cocokm
multiline cari di semua barisu
support karakter unicodeMasih ada beberapa flag, namun diawal kita perlu mengenal 3 itu saja dulu. Untuk pendahuluan yang mudah dihapal dan sering dipakai.
Karena karakter /
sudah dipakai sebagai penanda regex. Maka jika ingin menuliskan karakter itu harus di escape penulisannya, dengan karakter backslash \
.
Karakter-karakter spesial yang harus di escape adalah semua karakter yang telah disebutkan diatas.
Misalnya untuk menangkap user mengetik apa kabar?
, maka penulisan polanya adalah:
tanpa di escape, tanda tanya (?) akan untuk penangkapan ada huruf r atau tidak.
Contoh lainnya, misalnya:
\.
\(
\+
Biar lebih aktual dan lebih dapat feel pemahamannya, langsung saja kita menuju beberapa contoh, kasus, dan implementasinya.
Ini contoh simple sekaligus untuk menunjukkan escape karakter khusus.
Misal:
User: /ping
Bot : Pong!
Karena kita inginkan pola yang ditangkap adalah ada garis miringnya, maka itu harus di escape.
//ping/i
/\/ping/i
Penjelasan:
/
untuk /ping
HARUS di escape dengan backslash : \/
i
^
, sehingga menjadi: /^\/ping/i
$
, sehingga finalnya menjadi: /^\/ping$/i
Code pada lumpia framework:
Sehingga, user mengetik /ping
saja (boleh huruf besar atau kecil) yang akan direspon.
user: /ping
bot: pong!
user: /PING
bot: pong!
user: ping
user: piiingg
user: makan emping
user: pingin mie rebus
user: !ping
user: kepingin beli lumpia
Silakan di test, dengan cara re-deploy atau dengan handleUpdate pada lumpia.
Kasus lain, ada yang ingin menangkap dengan angka saja. Misalnya kebutuhannya disuruh memasukkan umur.
User: umur 21 tahun
Bot : 21
Akan kita tangkap angka 21 nya sesudah user mengetikkan dengan diawali kata umur
Pola nya adalah:
/umur (\d+)/i
Artinya yang akan kita tangkap dengan grup kurung ()
adalah \d
adalah angka saja, dengan terserah panjangnya asalkan minimal 1 karakter angka (makna tanda +
).
Pemakaiannya:
Penjelasannya:
ctx.match
adalah hasil tangkapan group regexnyaumur 21
atau umur 21 th
aku berumur 21 tahun
Sekarang kita buat fungsi trigger dimana bot akan memantulkan isi text.
Misal:
User: !echo Halo mas
Bot : Halo mas
Maka, pola-nya adalah sebagai berikut:
/^!echo (.+)/i
Maksudnya:
^
kata !echo
harus diawal kalimat. Tidak ditengah atau diakhir.()
adalah grup pertama untuk hasil yang ditangkap..
sembarang karakter kecuali ganti baris+
perulangan sembarang karakter, apa aja minimal 1 sampai tidak terbatasSehingga, code pemakaian pada lumpia framework:
Penjelasan detailnya mirip dengan /ping
::: warning Silakan dipahami secara perlahan-lahan⦠:::
Misalnya disuruh memasukkan tempat tanggal lahir.
User: !echo Kediri, 23-06-2001
Bot : Kamu lahir di Kediri, tanggal 23-06-2001
Pola deteksi tanggal sederhananya adalah:
/^!echo (.*),\s*(\d\d-\d\d-\d{4})$/i
Artinya :
(.*)
sampai ketemu koma.\s*
sesudah koma, ada spasi atau tidak, tetep kedetek\d
artinya angka, jika \d\d
artinya angka dijejer 2x (atau 2 digit)\d{4}
artinya angka yang dijejer 4Code pemakaiannya:
Dengan pola penulisan tanggal
sederhana ini, secara umum bisa ditangkap dan mudah dipahami.
Namun, ada yang ingin lebih memfilternya atau membuat lebih detail.
Contoh pola kompleksnya:
Yang ini ga usah diartikan haha.. Cuma buat pelengkap saja agar paham banyak cara menangkap sekaligus mevalidasinya.
Validasinya adalah tanggal tidak boleh lebih dari 31, dan bulan tidak boleh lebih dari 12.
Pada beberapa kasus, ada yang ingin menangkap berbaris-baris pesan.
Contoh ini dapat kita temui pada kasus bot hastags.
User:
!echo Puisi Rahasia
Aku akan menulis
sebuah puisi rahasia
tapi ini rahasia ya
rahasia sekali
Maaf, ini rahasia.
Selesai.
Contohnya seperti itu. Bagaimana menangkapnya?
Ada banyak cara atau metode. Namun, cara yang saya sukai adalah dengan menangkap pesan statisnya (!echo
), kemudian membuangnya. Dengan demikian, pesan dinamisnya akan kita dapatkan akhirnya.
Pesan statisnya dikit, jadi itu saja yang ditangkap. Maka pesan statis dibuatkan group.
Pola:
/^(!echo )/i
Dan kodenya seperti ini kira-kira:
Dengan cara demikian, kita akan mendapatkan isi pesan secara penuh bebas diisi karakter apa saja.
Agar bot terkesan ramah, kadang perlu kita buat bot sapaan.
Kadang ga cukup kata halo, ada yang yang nulisnya macam-macam: halo, hallo, hai, dan seterusnya.
Data semua kata yang memungkinkan dipakai:
pola /(halo|hallo)/i
Artinya, pola yang akan ditangkap kata halo
, atau hallo
yang letaknya dimana saja maka bot akan meresponnya.
Kodenya seperti ini kira-kira:
Mari kita tingkatkan dan kembangkan secara bertahap.
pola /halo+/i
pesan ditangkap: halo, haloo, haloooo β¦ huruf o bisa panjang
o
minimal 1, maksimal banyakkkk
pola /hall?o+/i
pesan ditangkap: mirip level 2, hanya bisa doble l. Halo, hallo, hallooo.. dst
l
kedua, boleh ada boleh tidak.
pola /h[ae]ll?o+/i
pesan ditangkap: bisa halo, helo, hallo, hello, halooo.. dst
huruf a
atau e
, pilih salah satu. Tapi tidak keduanya.
pola /(h[ae]ll?o+|h[ae]i+)/i
pesan ditangkap: mirip dengan level 4, ditambahkan kata hai, hei, haii, heii
Disapu jagat, semua huruf ditambahkan +
pola /(h+[ae]+l+o+|h+[ae]i+)/i
Ada banyak contoh kasus lainnya. Namun, silakan banyak-banyak mencoba sesuai dengan kasus masing-masing.
Karena regex itu ilmu praktek dan latihan, jadi teman-teman harus mencobanya sendiri.
Sekadar buat tambahan referensi, tak perlu diambil hati.. copas aja kalau butuh hehe.
/^#[^ !@#$%^&*(),.?":{}|<>]*$/i
/[ -~]/gm
/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/i
/[^@ \t\r\n]+@[^ @\t\r\n]+\.[^@ \t\r\n]+/i
/(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/i
/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/gmi
/(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/gm
/(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/gm
/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/gm
/^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$/
/^((\-?|\+?)?\d+(\.\d+)?),\s*((\-?|\+?)?\d+(\.\d+)?)$/i
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/i
Berikut ini source code pada video.
Sumber: Gist - Github
/* | |
artinya ini adalah komentar, tidak diproses oleh GAS | |
MATERI Belajar REGEX dengan LUMPIA | |
pola regex : /pola/flag | |
*/ | |
/* | |
user: /ping | |
bot: pooong! | |
*/ | |
bot.hears(/^\/ping$/i, ctx => { | |
ctx.reply('pooong!'); | |
}) | |
/* | |
Deteksi ANGKA | |
user: umur saya 21 tahun | |
bot: 21 | |
*/ | |
/* bot.hears(/(\d+)/, ctx => { | |
let bilangan = ctx.match[1]; | |
ctx.reply(bilangan); | |
}) */ | |
/* | |
ECHO | |
user: !echo abc | |
bot: abc | |
user: !echo saya orang keren | |
bot: saya orang keren | |
*/ | |
bot.hears(/^(!echo )/i, ctx => { | |
// tips menangkap multiline echo | |
// pola yang di dapat, dibersihkan | |
let pesan = ctx.message.text.replace(ctx.match[1], ''); | |
ctx.reply(pesan) | |
}) | |
/* | |
TTL - tempat, tanggal lahir | |
user: !ttl Kediri, 23 Juni 2001 | |
bot: Kamu lahir di Kediri, tanggal 23 Juni 2001 | |
*/ | |
var pola = /^!ttl (\w+), (\d{1,2} \w+ \d{4})/i | |
bot.hears(pola, ctx => { | |
ctx.reply('Kamu lahir di '+ ctx.match[1] + ', tanggal ' + ctx.match[2]); | |
}) | |
/* | |
Belajar mendeteksi URL | |
user: https://google.com | |
bot: URL yang kamu ketik adalah https://google.com | |
*/ | |
var pola = /(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*))/i | |
bot.hears(pola, ctx => { | |
ctx.reply('URL yang kamu ketik adalah '+ ctx.match[1]); | |
}) | |
// ---- END |
Tulisan ini disadur dari blog bangHasan.
Jika ingin live dan biasanya tanggapan juga lebih cepat, sangat disarankan bergabung pada group Telegram @botIndonesia.
ππΌ Semoga bermanfaat β¦
Materi ada pada video, belum sempat dibuat berupa tulisan.
Silakan ditonton yak!
Berikut ini source code pada video.
Sumber: Gist - Github
const button = lumpia.button; | |
const markup = lumpia.markup; | |
const helper = lumpia.helper; | |
bot.options.username = 'belajarGASbot'; | |
/* | |
Contoh kasus: membuat template pesanan user | |
Link: https://t.me/belajarGASbot?start=order | |
*/ | |
bot.start(ctx => { | |
let payload = ctx.payload; | |
if (!payload) { | |
let pesan = '<b>Selamat datang</b>, di bot Kita !!'; | |
pesan += '\n\n β KLIK <a href="https://t.me/belajarGASbot?start=order">ORDER</a>'; | |
pesan += '\n\n β KLIK <a href="https://t.me/belajarGASbot?start=kode123">Info Modem</a>'; | |
pesan += '\n\n β Kode Refferalmu: https://t.me/' + bot.options.username | |
pesan += '?start=ref' + ctx.from.id; | |
return ctx.replyWithHTML(pesan, { | |
disable_web_page_preview: true | |
}); | |
} | |
var pola = /^ref(\w+)/i; | |
var cocok; | |
if (cocok = pola.exec(payload)) { | |
// terserah teman-teman | |
// kode ref nya mau diolah seperti apa | |
return ctx.reply('Kode referalnya adalah: ' + cocok[1]); | |
} | |
if (payload == 'order') { | |
let formatOrder = `\n | |
Nama: | |
Alamat: | |
Jumlah barang: | |
Mohon segera diproses yak...! | |
`; | |
let pesan = 'Masukkan format seperti berikut ini' + formatOrder; | |
return ctx.reply(pesan); | |
} | |
if (payload == 'kode123') { | |
let pesan = 'Informasi Barang Kode 123, adalah:'; | |
pesan += `\n | |
Nama Produk: Modem ABC-123 | |
Warna: Hitam | |
KCU: AA112233 | |
Harga: Rp. 230.000,00 | |
Untuk lebih lengkapnya, silakan buka web https://banghasan.com | |
`; | |
return ctx.reply(pesan, { | |
disable_web_page_preview: true | |
}); | |
} | |
if (payload == 'waktu') { | |
let pesan = Utilities.formatDate(new Date(), 'GMT+7', 'HH:mm:ss') + ' WIB.' | |
return ctx.reply(pesan); | |
} | |
let pesan = "Payloadnya adalah: " + ctx.payload; | |
ctx.reply(pesan); | |
}) | |