Inline Bot adalah bot dengan kemampuan responsif mengolah permintaan user secara on-the-fly dan dapat diakses secara instan tanpa perlu private chat melainkan cukup dengan mention @usernamebot.
BAHAN BAKU
Untuk mengimplementasikan eksperimen ini perlu dipersiapkan beberapa hal:
- Bot Telegram berikut API Token, anda dapat menyimak cara membuatnya dan mendapatkan API Token pada artikel ini.
- Satu file Apps Script, anda bisa menyimak cara membuatnya dan deployment Web Apps di artikel ini.
- Script eksperimen ini yang dapat unduh atau salin dari repository.
- ID User anda sebagai admin bot yang akan digunakan untuk menampung keterangan error bila terjadi kendala, gunakan @simrsinfobot untuk mengetahui ID User anda.
Di dalam script terdapat beberapa konstata yang harus anda isi dengan ID, API TOKEN, dan URL file bahan baku milik anda:
Bila anda menemui kendala saat deployment silahkan simak cara penanganannya pada artikel iniSiLiKiDi
CARA INSTAN AKSES BOT
Inline Query adalah parameter yang dilewatkan secara real-time oleh Telegram kepada bot sesaat user mengetik username bot yang diawali @ di kotak input chat tanpa perlu mengeksekusinya menjadi message.
Tidak hanya mengakses bot dengan instan, hasil olahan pun ditampilkan on-the-fly mengambang tidak berbentuk object Message sehingga lebih cepat, lebih efisien, dan lebih interaktif dibandingkan Reply Markup.
Bot Telegram yang dilengkapi fitur inline query dikenal sebagai Inline BotSiLiKiDi
MENGAKTIFKAN INLINE BOT
Anda harus mengaktifkan Inline Mode agar bot anda siap menjadi Inline Bot. Secara default fitur ini tidak aktif sehingga anda perlu menyetel fitur ini menjadi On [Enabled] dengan BotFather:
- Pada tampilan BotFather pilih bot anda.
- Klik tombol Bot Settings
- Klik tombol Inline Mode
- Klik tombol Turn on
- Bot anda telah menjadi Inline Bot, dan lakukan langkah serupa untuk menonaktifkan fitur ini.
MENDETEKSI KIRIMAN INLINE QUERY
Setelah inline mode diaktifkan maka bot anda akan mulai menerima kiriman JSON inline_query dari Telegram. Lalu bagaimana kita bisa mengetahui kiriman JSON tersebut adalah Inline Query?
Berikut adalah struktur JSON Inline Query:
{
"update_id": 420112440,
"inline_query": {
"id": "7866573845116548286",
"from": {
"id": 1850121251,
"is_bot": false,
"first_name": "JOHN",
"last_name": "DOE",
"username": "johndoe",
"language_code": "en"
},
"chat_type": "supergroup",
"query": "Java Coffee",
"offset": ""
}
}
Dari struktur JSON tersebut dapatlah disimpulkan:
- Jelas terlihat perbedaannya dengan JSON Message, untuk mengirim balik hasil olahan ke user yang biasanya kita gunakan notasi message.chat.id kali ini digunakan notasi inline_query.from.id sebagai destinasinya.
- Inline Query mempunyai ciri khas hadirnya properti inline_query sehingga kita bisa mengeceknya dengan notasi berikut:
function doPost(e) {
const data = JSON.parse( e.postData.contents );
try {
/************************
* CEK BILA INLINE QUERY *
*************************/
if ( ( data || {} ).inline_query ) {
...
/*******************
* CEK BILA MESSAGE *
********************/
} else if ( ( data || {} ).message ) {
...
}
} catch(e) { ... }
}
DATA QUERY DARI USER
Dari struktur JSON inline_query bisa kita dapatkan data argumen yang dituliskan user dari properti query yang nilainya "Java Coffee":
let dataDariUser = data.inline_query.query;
Apakah user menuliskan parameter ataupun tidak, sama-sama akan tetap dikirimkan Telegram dalam respon JSON inline query, sehingga nilai dari properti query bisa saja bernilai kosong tanpa dataSiLiKiDi
Dengan demikian sangat disarankan untuk mempersiapkan dua state kondisi pada inline bot anda:
- Mengolah inline query dengan query tanpa nilai atau tanpa keyword.
- Mengolah inline query dengan query yang punya nilai.
MENGIRIMKAN JAWABAN BOT
Setelah kita ketahui struktur respon JSON dan data query yang diminta user, selanjutnya diolah lalu dikirimkan dengan bantuan metode answerInlineQuery:
let dataQuery = {
method: "post",
contentType: "application/json",
payload: JSON.stringify({
method: "answerInlineQuery",
inline_query_id: String( data.inline_query.from.id ),
results: jawabanQuery
})
};
UrlFetchApp.fetch( telegramAPIURL + "/", dataQuery );
Jawaban dari bot ditampung dalam properti resultsSiLiKiDi
MENGUMPULKAN JAWABAN DENGAN InlineQueryResult
Properti results berbentuk array dengan elemen-elemen di dalamnya menyimpan objek-objek dari jawaban query yang disebut InlineQueryResult object.
Terdapat 20 jenis InlineQueryResult dan masing-masing memiliki properti yang unik dan untuk mengetahui jenisnya tersebut dapat dilihat pada nilai properti type seperti tampak berikut:
const jawabanQuery = [
{
type: "article",
id: String(genID()),
title: "INFOBOT",
message_text: "@simrsinfobot" + "\n" + "Bot informasi ID dan Base64 generator" + "\n" + "crafted by SiLiKiDi",
parse_mode: "HTML",
disable_web_page_preview: false,
url: "https://t.me/simrsinfobot",
hide_url: true,
description: "Bot informasi ID dan Base64 generator",
thumb_url: "https://res.cloudinary.com/rsudcibabat/image/upload/v1629736555/assets/bot/boticon.jpg",
thumb_width: 64,
thumb_height: 64
},
{ ... }
]
MEMBUAT ID UNIK SETIAP JAWABAN
Setiap objek jawaban harus memiliki ID unik yang membedakan dari objek lainnya dengan jenis type yang sama.
Contoh script pembangkitan ID unik misalkan seperti berikut yang akan menghasilkan angka random dalam interval 100000-500000:
function genID(){
let minimal = 100000;
let maksimal = 500000;
return Math.floor( Math.random() * ( maksimal - minimal + 1 ) ) + minimal;
}
MEMBUAT JAWABAN STATIS SEBAGAI DEFAULT
Jawaban Default berguna jika user tidak menuliskan argumen apapun setelah @usernamebot yang pada eksperimen kali ini kita akan membuat jawaban default yang statis misalkan menampilkan official website anda:
{
type: "article",
id: String( genID() ),
title: "TELEGRAM BOT SCRIPT",
message_text: "TELEGRAM BOT SCRIPT" + "\n" + "Tutorial Bot Telegram dengan Apps Script",
parse_mode: "HTML",
disable_web_page_preview: false,
url: "https://telegram-bot-script.blogspot.com/",
hide_url: true,
description: "Step-by-step pemrograman interaksi Bot Telegram dengan Google Apps Script",
thumb_url: "https://blogger.googleusercontent.com/img/a/AVvXsEhwCpCaBKv_dETin9reb18ZpjigkVtmvlqWlBGK1p1ZeuHqNx9CIV436lC5GlVJ503gbocG5LYA0BUWoEEdVi4oNa63Pl-XhUYGon8zJ636ojZlrLA7wHdHQ-kQHvwLH14WdNF55UV5XPnta2GQ02iGpRXadLbTINGnrzUSk5YfDkPa6gZ2x96CQtnO4Q=s0",
thumb_width: 64,
thumb_height: 64
}
Anda bisa membuat lebih dari satu jawaban dengan syarat harus berbentuk object yang dibungkus dengan kurung kurawal { }.
JAWABAN DINAMIS DENGAN DUCKDUCKGO
Jika user mengirimkan parameter tambahan setelah @usernamebot, selanjutnya parameter tambahan tersebut akan kita jadikan sebagai keyword pencarian DuckDuckGo Instant Answer.
Untuk mengakses DuckDuckGo API Instant Answer dapat melalui dua jalur berikut:
Hasil pencarian DuckDuckGo Instant Answer berupa JSON yang darinya kita ambil beberapa properti nilai yang diperlukan saja:
Proses pencarian keyword DuckDuckGo sepenuhnya dituangkan dalam fungsi searchDuckDuckGo( searchKeywords ) yang terpisah. Hasil pemilahan properti yang diperlukan kemudian ditampung sementara dalam array searchResult.
Array searchResult inilah yang menjadi kumpulan objek-objek jawaban balik untuk user yang selanjutnya ditampung dalam properti results dan dikirimkan melalui metode answerInlineQuery:
let dataQuery = {
method: "post",
contentType: "application/json",
payload: JSON.stringify({
method: "answerInlineQuery",
inline_query_id: String( data.inline_query.from.id ),
results: searchResult
})
};
UrlFetchApp.fetch( telegramAPIURL + "/", dataQuery );
DUCKDUCKGO vs GOOGLE vs BING
Ketiga search engine sama-sama menerapkan limitasi hanya saja dari ketiganya hanya DuckDuckGo yang membuka keran hasil pencarian dalam API JSON secara gratis yang dikenal dengan DuckDuckGo Instant Answer.
Perlu dimaklumi bahwa sumber pencarian DuckDuckGo belum sebanyak crawler Google dan Bing baru mencapai 100 sumber lebih termasuk di dalamnya Wikipedia, Wikia, CrunchBase, GitHub, WikiHow, dan The Free Dictionary.
Untuk mendapatkan kemudahan serupa dalam repon JSON via pencarian Google dan Bing, sampai dengan artikel ini ditulis, memerlukan akses premiumSiLiKiDi
Sekalipun mengakali Google Search dengan teknik web scraping dan Apps Script sama-sama produk dari Google, tetap saja dibatasi mengakses layanan API Google Search dengan tampilan Error 429 Too Many Requests:
FINAL SCRIPT
Final Script dapat diunduh di repository.
DEMO BOT
Demo Bot: @simrsinlinebot.
Dapatkan skrip semua materi di repository
Dukung donasi agar tutorial ini tetap operasional:
SiLiKiDi
Komentar
Posting Komentar