Pengingat waktu Sholat menggunakan Bot Telegram (GAS II-12)

11 menit saja |

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.

Screenshot Reminder

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.

Proyek Baru

Akan terbuka halaman baru:

Halaman Baru

  • Ganti proyek tak berjudul menjadi nama proyekmu, misalnya di saya nama botnya Bot 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.

Add Library

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

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.

Start Bot

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

cari Lokasi

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.

Peninjauan Izin Akses Pilih Akun Email

Lanjutkan

Lanjutkan

Izinkan

Jika semua berjalan lancar. Maka akan keluar seperti berikut :

Kode Lokasi

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.

EDIT

Trigger / Pemicu

Langkah terakhir, kita buat pemicu.

Trigger

Trigger

Trigger

  • 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 :

Trigger

Dan saat waktu-waktu sholat akan mendapatkan notifikasi sesuai jadwalnya, insyaAllah.

Screenshot Reminder

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. Contoh 05: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:

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

Selasar KMI

Mohon maaf jika ada salah-salah kata ada khilaf, dan semoga bermanfaat.