Pengingat waktu Sholat menggunakan Bot Telegram (GAS II-12)
Ramadhan tiba, ramadhan tiba.. tiba-tiba Ramadhan! Hayuk persiapkan untuk menghadapinya. Kali ini kita buat reminder atau pengingat waktu sholat versi kedua untuk bot Telegram.
Pendahuluan
Sejak API myQuran telah dilaunching, jadwal sholat sekarang sudah sesuai dengan kemenag. API myQuran ini menggantikan API Fathimah yang dulu sempat down berkali-kali karena kehabisan sewa domain. Kemudian diganti arah ke domain API bangHasan.
Namun, biar lebih kerasa publik dan tidak berkesan personifikasi. API sekarang dialihkan ke domain myQuran.
Dengan demikian, bisa disupport oleh teman-teman komunitas dan programmer lainnya ya.
Metode
Metode penyampaian kali ini, saya ulangi dari awal ya. Buat pengguna baru, atau yang baru memulai bot bisa praktek tanpa melompat ke materi sebelumnya.
Hal ini, dikarenakan materi kali ini termasuk levelnya mudah diikuti.
Pengingat
Untuk kesekian kalinya, dan berkali-kali penulis ingatkan ya. Agar selalu teliti mencoba mengikuti materinya. Jangan dilompat-lompat, dan jangan melakukan sesuatu yang tidak diajarkan. Modifikasi dan eksperimen boleh, sesudah bot nya berjalan dengan baik.
Yang pertama kali terpenting adalah, gunakan ilmu copas saja dulu. Copas, sesuikan sedikit, test, dan jalan. Itu sudah cukup.
Selanjutnya, baru silakan dicoba-coba modifikasi. Dengan memodifikasi, pengalaman akan bertambah.
Asumsi
Tulisan ini dibuat dengan asumsi, teman-teman sudah bisa cara bikin bot di @botfather dan tahu mendapatkan token botnya. Jika belum, ya silakan buka materi lainnya ya.
Bisa baca di Bot Father.
Atau lihat di youtube sampai mendapatkan token bot saja.
Asumsinya juga teman-teman sudah punya akun Gmail, dan sudah biasa menggunakan GDrive. Sehingga tidak ada tutorial lagi tentang membuat akun Google dan cara pemakaiannya.
Reminder Sholat v2
Yuk sekarang kita buat lagi versi reminder atau pengingat waktu sholat dan imsyakiyahnya. Kita sebut aja reminder sholat versi 2. Karena menggantikan yang lama, juga menggunakan library versi 2.
Ada banyak perubahan coding, sehingga sebaiknya ditimpa atau diulangi saja dari awal atau bikin baru lagi.
Kelebihan
Kelebihan reminder sholat v2 ini adalah:
- menggunakan API myQuran, bukan lagi menggunakan API Fathimah yang kurang dimaintenance.
- jadwal sholat bersumber dari Kemenang RI yang sudah di update, dengan snapshot per feburari kemarin. Sehingga waktu nya sesuai sekali untuk muslim Indonesia
- bukan menggunakan metode scraping, melainkan API. Sehingga jauh lebih cepat proses dan aksesnya.
- API disediakan secara gratis, hostingan bot juga gratis karena disediakan oleh Google app Script.
- menggunakan Library GAS Bot Telegram versi 2, yang jauh lebih rapi dan mudah dipahami.
- Mudah di custom pesan reminder nya
- Pesan reminder dapat di custom per jadwal
- Menggunakan template dalam penyususan pesan
- Jika terjadi error, admin bot akan dapat notif pesan errornya.
- terdapat mode beta atau mode tester nya. Untuk mempermudah dikembangkan lagi atau pun di coba-coba tanpa menunggu waktu jadwal tiba
- di dukung oleh komunitas Bot Telegram Indonesia - Google App Script yang berkumpul di Grup @botIndonesia
Mulai
Jika kamu belum pernah membuat bot sama sekali sebelumnya. Untuk memulainya, kamu buka situs script.google.com kemudian buatlah proyek baru.
Akan terbuka halaman baru:
- Ganti
proyek tak berjudul
menjadi nama proyekmu, misalnya di saya nama botnyaBot Selasar
. - Kemudian tambahkan library, klik icon
Library
.
Library
Ini langkah wajib, yang kamu tidak boleh kelewatan. Jika tidak akan terjadi error.
Setelah klik Library, masukkan ID Library nya
11LhYmqUg8UVtqMg3rPaau5uHwCMtsE_0RwUQim4ZY-OCfDe_YyIYKPSP
Klik tombol cari, kemudian PILIH VERSI yang ANGKANYA TERBESAR.
Klik tambahkan
.
Maka akan kembali ke halaman editor.
Script
Hapus script yang sudah ada, ganti atau copas aja dengan yang berikut ini:
// REMINDER JADWAL SHOLAT
// Berdasarkan API myQuran.com
// API: http://bit.ly/api-v1-myquran
// Library: https://bit.ly/telegram-lib-v2
// --- SESUAIKAN ISI VARIABLE DIBAWAH INI ---
// seting telegram
// masukkan token bot yang di dapat dari botfather
var token = 'TOKENBOT'
// masukkan ID User/Tujuan Bot akan membroadcast jadwal sholat
// ID User/Grup/Channel
var tujuanID = -1234567891;
// masukkan ID user kamu, untuk mendapatkan notif jika bot terjadi error
let adminBot = 1234567890;
// inisiasi bot, biarkan yang ini gak usah diubah
var tg = new telegram.daftar(token);
var user = new telegram.user();
// sesuaikan zona waktu kalian masing-masing ya.
// sesuaikan zona waktu kalian masing-masing ya.
let zonaTime = 'GMT+7'
// aktifkan jika ingin mencobanya
// jangan lupa di set false, sesudah selesai mencoba
// (jika tak mengerti, biarkan saja false)
let waktuTest = false
// Ganti lokasi ini dengan lokasi kota / kabupaten yang akan dicari
let lokasi = 'kediri'
// sesuikan ID lokasi (kota/kabupaten)
// untuk mendapatkannya, jalankan dulu fungsi cariIDLokasi()
// Contoh berikut ini adalah untuk kabupaten Kediri
let idLokasi = 1609;
// aktifkan notif reminder untuk waktu-waktu berikut ini
// jika aktif = true, dinonaktifkan = false
let aktif = {
imsak: true,
subuh: true,
terbit: false,
dhuha: true,
dzuhur: true,
ashar: true,
maghrib: true,
isya: true
}
// format pesan, silakan dihapus atau disesuaikan dengan kebutuhan
// template tersedia {lokasi} {daerah} {hariTanggal} {waktu} {jadwal} {jadwalSemua}
// menggunakan format HTML untuk tebal, miring, garis bawah, dan monospace
// detail format silakan baca: https://bit.ly/gas2_format_text
// diapit dengan petik 1 kebalik
let templatePesan = `š Pukul <code>{waktu}</code> WIB, waktunya <b>{jadwal}</b> untuk {lokasi}, {daerah} dan sekitarnya.
š Jadwal Imsyakiyah hari ini <b>{hariTanggal}</b> :
<code>{jadwalSemua}</code>
š <u>Sumber</u>: Kemenag RI`
// quote random
// silakan diisi sendiri, jika diperlukan.
let dataQuote = [
'Kunci bahagia ada 3: sabar, syukur dan ikhlas.\n<b>Sabar</b> jika sedang susah, ber- <b>syukur</b> jika bahagia. Dan <b>ikhlas</b> di semua keadaan.',
'Jangan lupa tersenyum, untuk cinta dan persahabatan. Karena itu sedekah yang paling mudah ^^',
'Tak ada yang abadi, kecuali Dia yang sempurna.',
'Perbanyak mengingat kematian, karena itu kepastian dan pengingat kita akan kembali.'
]
let quoteRandom = tg.util.random(dataQuote)
// template custom
// untuk membuat pengingat yang beda pada jadwal waktu tertentu
// jika tidak ingin di custom, kasih aja false yang berarti pakai templatePesan di atas
// berikut ini contoh-contohnya:
let customPesan = {
imsak: 'ā ļø Pukul <code>{waktu}</code> WIB, waktunya <b>{jadwal}</b> untuk {lokasi} dan sekitarnya.. Shubuh 10 menit lagi! <i>Siap-siap yak.</i>',
subuh: false,
terbit: false,
dhuha: "š„ Sudah masuk waktu {jadwal}. Sunnah tunaikan sholat {jadwal} yaa.",
dzuhur: false,
ashar: templatePesan + "\n\n" + quoteRandom,
maghrib: templatePesan + "\n\n š Waktunya tadarus dan setor hapalan.",
isya: 'š Pukul <code>{waktu}</code> WIB, waktunya <b>{jadwal}</b> untuk {lokasi}, {daerah} dan sekitarnya.'
}
// --- //-// --- //
// --- UNTUK PEMULA: cukup diatas itu saja yang diubah ---
// --- //-// --- //
// base URL
let base_url_api = 'https://api.myquran.com/v1'
let fetchAPI = new tg.fetch(base_url_api)
// jalankan untuk mendapatkan ID lokasi
function cariIDLokasi() {
let data = fetchAPI.get('/sholat/kota/cari/' + lokasi)
Logger.log(tg.util.outToJSON(data, 1))
return data;
}
function deleteJadwalSholat() {
user.delete('sholat');
}
function getAPISholat() {
try {
let waktu = Utilities.formatDate(new Date(), zonaTime, "yyyy-MM")
let pecah = waktu.split('-')
let tahun = pecah[0]
let bulan = pecah[1]
// dapatkan jadwal langsung 1 bulan
var hasil = fetchAPI.get('/sholat/jadwal/' + idLokasi + '/' + tahun + '/' + bulan)
if (!hasil.status) return hasil;
hasil.data.bulan = bulan
user.setValue('sholat', JSON.stringify(hasil))
let data = hasil.data;
Logger.log(`${data.id}\n\n${data.lokasi}\n${data.daerah}` + '\n\nMendapatkan ' + data.jadwal.length + ' jadwal data.')
} catch (e) {
var hasil = { status: false, message: e.message }
}
return hasil;
}
function getDBholat() {
let sholat = user.getValue('sholat')
if (!sholat) return { status: false, message: 'Tidak ada data.' };
sholat = JSON.parse(sholat)
let bulan = Utilities.formatDate(new Date(), zonaTime, "MM")
if (!sholat.data.bulan) return { status: false, message: 'Tidak ada field bulan' };
if (!sholat.data.bulan == bulan) return { status: false, message: 'Tidak terdapat data bulan ' + bulan };
var hasil = sholat
let data = hasil.data;
Logger.log(`getDBholat: ${data.id}\n\n${data.lokasi}\n${data.daerah}` + '\n\nTerdapat ' + data.jadwal.length + ' jadwal data.')
// Logger.log(`sample: ${tg.util.outToJSON(data.jadwal[0])}`)
return hasil;
}
function tampilkanJadwal() {
let infoSholat = getDBholat()
let jadwal = ''
if (!infoSholat.status) {
let ret = getAPISholat()
return tg.sendMessage(adminBot, `š« ${infoSholat.message ? infoSholat.message : '-'}\nā³ Proses mendapatkan data API Sholat.\nš Hasil: ${ret.status ? 'ā
sukses.' : 'š ' + ret.message}`)
}
let date = new Date()
let waktuSekarang = Utilities.formatDate(date, zonaTime, "HH:mm")
let tanggalSekarang = Utilities.formatDate(date, zonaTime, "dd")
let index = parseInt(tanggalSekarang) - 1
let data = infoSholat.data
// variable pengganti template
let lokasi = data.lokasi
let daerah = data.daerah
let hariTanggal = data.jadwal[index].tanggal
let waktu = waktuSekarang;
let jadwalSemua = ''
let pesan = templatePesan
let kirim = false;
// test case untuk versi develop
aktif.test = waktuTest
data.jadwal[index].test = waktuSekarang
customPesan.test = templatePesan + '\n\n š¬ ini adalah quote test\n\n' + quoteRandom
if (!waktuTest) {
delete aktif.test;
delete data.jadwal[index].test;
}
tg.util.forEach(data.jadwal[index], (data, kunci) => {
if (aktif[kunci]) {
if (data == waktuSekarang) {
jadwalSemua += `\n -> ${kunci.padStart(7, ' ')}: ${data}`;
jadwal = kunci.charAt(0).toUpperCase() + kunci.slice(1)
if (customPesan[kunci]) pesan = customPesan[kunci]
kirim = true
} else {
jadwalSemua += `\n ${kunci.padStart(10, ' ')}: ${data}`;
}
}
})
jadwalSemua = jadwalSemua.replace('\n', '');
//Logger.log(`${lokasi}, ${daerah} - ${waktu}\n${jadwal}`)
pesan = pesan
.replace(/{lokasi}/gi, lokasi)
.replace(/{daerah}/gi, daerah)
.replace(/{waktu}/gi, waktu)
.replace(/{hariTanggal}/gi, hariTanggal)
.replace(/{jadwal}/gi, jadwal)
.replace(/{jadwalSemua}/gi, jadwalSemua)
Logger.log(pesan);
if (kirim) {
try {
tg.sendMessage(tujuanID, pesan, 'HTML')
} catch (e) {
tg.sendMessage(adminBot, e.message)
}
}
}
Setelah di copas, jangan lupa klik tombol simpan. Atau tekan Ctrl+S
Terdapat juga di Github - Source Code Reminder Waktu Sholat
Edit Setingan
Setelah copas, edit script di atas. INGAT, edit dan disesuaikan dulu. Jangan buru-buru melangkah ke step berikutnya ya.
Ini lah yang harus di EDIT
Token Bot
Ubah token. Token bisa di dapatkan di bot father. Bisa periksa di Youtube
Atau bisa dibaca juga pada materi Bot Father
Setelah bot jadi, jangan lupa bot nya di klik
START
biar bot ada akses ke kita sebagai admin.
ID Tujuan & AdminBot
Jika ingin broadcast ke grup, ID Tujuan bisa diganti ke ID Grup.
Untuk mendapatkan ID Grup, masukkan @strukturbot ke grup. Maka akan diberitau ID mu sekaligus ID Grupnya.
ID Grup diisi untuk tujuanID
sedangkan ID kamu diisikan pada adminBot
.
Zona Waktu
Sesuikan Zona Waktunya, untuk Waktu Indonesia Barat menggunakan GMT+7
.
Lokasi
Variable lokasi
ini adalah variable untuk membantu menemukan ID kota.
Isikan sesuai kota yang disediakan oleh kemenag.
IDLokasi
ID Lokasi isikan kode 4 digit angka, sesuai yang di dapatkan pada pencarian lokasi.
Cari ID Lokasi
Untuk mendapatkan ID Lokasi, perlu kita jalankan fungsi
Pilih fungsi cariIDLokasi
kemudian baru klik Jalankan
.
Untuk pertama kali, jika baru menjalankan script maka akan meminta perizinan akses.
Kasih saja hak akses, dengan cara ikuti saja sesuai di screenshot ya.
Jika semua berjalan lancar. Maka akan keluar seperti berikut :
Dari situ kita bisa membaca, kode ID Lokasi mana yang akan kita pakai atau butuhkan untuk kemudian diisikan pada variable idLokasi
.
Jika terjadi error atau kesalahan, perbaiki kata kunci lokasi nya.
Trigger / Pemicu
Langkah terakhir, kita buat pemicu.
- Pilih fungsi yang ingin dijalankan :
tampilkanJadwal
- Pilih sumber acara:
Dipicu oleh waktu
- Jenis pemicu berdasarkan waktu:
Timer menit
- Interval Menit:
Setiap menit
Kemudian pilih Simpan
.
Jika semua sudah benar, 1 menit lagi kamu akan mendapatkan notifikasi dari bot seperti berikut :
Dan saat waktu-waktu sholat akan mendapatkan notifikasi sesuai jadwalnya, insyaAllah.
Tambahan
Memilih reminder waktu mana saja yang akan di aktifkan / di non aktifkan.
Cukup dikasih false atau true saja ya dibagian code ini:
// aktifkan notif reminder untuk waktu-waktu berikut ini
// jika aktif = true, dinonaktifkan = false
let aktif = {
imsak: true,
subuh: true,
terbit: false,
dhuha: true,
dzuhur: true,
ashar: true,
maghrib: true,
isya: true
}
Jika false
maka tidak aktif. Setingan berikutnya tidak akan dipergunakan lagi.
Parse Mode
Format text di dalam reminder ini menggunakan HTML. Tidak semua tag HTML dapat dipergunakan.
Berhati-hati jika menggunakan tag yang terbuka, maka akan terjadi error.
Untuk selengkapnya tentang parse mode, bisa dilanjutkan dibaca Format Text / Parse Mode
Template
Dilengkapi dengan template pesan.
Silakan dimasukkan ke dalam pesan.
{lokasi}
untuk informasi lokasi kota atau kabupaten. Misal:Kota Kediri
{daerah}
untuk informasi wilayah atau daerah kota atau kabupaten tersebut. Yakni, level propinsi. Misal:Jawa Timur
{hariTanggal}
format waktu yang disediakan di API, yakni hari dan tanggal. Misal:Rabu, 24/03/2021
{waktu}
waktu event pada API akan dimunculkan. Contoh05:10
{jadwal}
nama event nya. Misal:Dhuha
{jadwalSemua}
susunan jadwal semuanya. Posisi aktif saat ini ditanda dengan tanda panah.
Video
Silakan disimak di video nya jika bingung atau ingin lebih jelas dalam prosesnya.
Referensi
Sebagai referensi dan tambahan bacaan dan materi, silakan diperiksa sebagai berikut:
- Materi Helo Bot
- Welcome Bot Lib V2
- Library GAS Telegram Versi 2
- Bot API Telegram
- Format Text / Parse Mode
- API myQuran
- Github - Source Code Reminder Waktu Sholat
Penutup
Jika ada pertanyaan silakan bergabung ke grup Telegram @botIndonesia bersama para coder lainnya kita saling sapa, diskusi, sharing dan silaturrahim.
Buat muslim indonesia, bisa bergabung di Selasa - Komunitas Muslim Indonesia
Mohon maaf jika ada salah-salah kata ada khilaf, dan semoga bermanfaat.