Catatan Harian Mas Andri

Silahkan digunakan dengan bijaksana

back

pendakBot Bot Telegram Hitung Selamatan Orang Meninggal

22 Mei 2024 || 14:52:14 WIB || ClassyID

pendakBot Telegram menggunakan webhook GAS (google apps script) dan melakukan grabbing data pada website https://pendak.nizamkomputer.com/
Dalam membuat bot telegram / whatsapp idealnya sumber datanya berupa api dalam format json, agar mudah dalam input dan output datanya.

Website diatas tidak menyediakan API, maka kita lakukan teknik grabbing dengan cara scraping :

Dengan membuat script scrapping dan output data berupa data json, kita bisa mengintegrasikan didalam Bot

Dibawah ini GAS (google apps script) dalam teknik scraping, input menggunakan get, output berupa data json :


function doGet(e) {
  // Mendefinisikan tanggal, bulan, dan tahun
  var nama = e.parameter.nama || '';
  var tgl = e.parameter.tgl || '';


  // URL target
  var url = 'https://pendak.nizamkomputer.com/ajax.php';


  // Data yang akan dikirimkan dalam request
  var data = {
    'nama': nama,
    'tanggal-meninggal': tgl
  };


  // Konversi data ke format URL-encoded
  var dataString = [];
  for (var key in data) {
    dataString.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
  }
  dataString = dataString.join('&');


  // Set opsi request
  var options = {
    'method': 'post',
    'payload': dataString,
    'muteHttpExceptions': true
  };


  // Eksekusi request dan simpan respon
  var response = UrlFetchApp.fetch(url, options).getContentText();


  // Parsing respon untuk mendapatkan informasi yang diinginkan
  var regex = /Almarhum (.*?)<\/span> sampai saat ini sudah meninggal selama (.*?)<\/span> hari./s;
  var matches = response.match(regex);

  var regex2 = /(.*?)<\/th>\s+(.*?)<\/td>\s+(.*?)<\/td>\s+(?:(Lewat)<\/del>|(Belum))<\/td>/g;
  var matches2 = [];
  var match;
  while ((match = regex2.exec(response)) !== null) {
    matches2.push(match);
  }

  var regex3 = /]*>([^<]+)<\/th>\s+([^<]+)<\/td>\s+([^<]+)<\/td>\s+(?:(Lewat)<\/del>|(Belum))<\/td>/g;
  var matches3 = [];
  while ((match = regex3.exec(response)) !== null) {
    matches3.push(match);
  }


  // Struktur data hasil parsing
  var result = {
    'nama': matches ? matches[1] : '',
    'jumlah_hari_meninggal': matches ? matches[2] : '',
    'ritual': []
  };


  // Proses data pengulangan ritual dari matches2
  matches2.forEach(function(match) {
    var hari_meninggal = match[3];
    var status = match[4] ? match[4] : match[5]; // Tentukan status berdasarkan hasil regex
    result['ritual'].push({
      'selamatan': match[1],
      'pasaran': match[2],
      'tanggal': hari_meninggal,
      'status': status
    });
  });


  // Proses data pengulangan ritual dari matches3
  matches3.forEach(function(match) {
    var hari_meninggal = match[3];
    var status = match[4] ? match[4] : match[5]; // Tentukan status berdasarkan hasil regex
    result['ritual'].push({
      'selamatan': match[1],
      'pasaran': match[2],
      'tanggal': hari_meninggal,
      'status': status
    });
  });


  // Mengambil hanya 8 entri pertama dari array 'ritual'
  result['ritual'] = result['ritual'].slice(0, 8);


  // Konversi hasil ke format JSON
  var jsonResult = JSON.stringify(result);


  // Tampilkan hasil
  return ContentService.createTextOutput(jsonResult).setMimeType(ContentService.MimeType.JSON);
}

Tampilannya seperti ini jika dilakukan get data 

https://script.google.com/macros/s/AKfycbynFZdB5nNwmOWTj2qfVufh3lhX1VHSzLyDlaPXNIfKMYlM7hBNPh89wXvmo-J4s2tP/exec?nama=puguh&tgl=2021-7-26

Selanjutnya kita buat GAS (google apps script) mengkonekkan Bot Telegram ke API yang sudah kita buat tadi

const BOT_TOKEN = '';
const SHEET_ID = '';  // Replace with your Google Sheet ID

// Function to send a message
function sendMessage(chatId, text, replyMarkup = null, replyToMessageId = null) {
  const url = 'https://api.telegram.org/bot' + BOT_TOKEN + '/sendMessage';
  const data = {
    chat_id: chatId,
    text: text
  };
  if (replyMarkup) {
    data.reply_markup = replyMarkup;
  }
  if (replyToMessageId) {
    data.reply_to_message_id = replyToMessageId;
  }

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(data)
  };

  UrlFetchApp.fetch(url, options);
}

// Function to save log to Google Sheets sheet chat_pendak)
function saveLog(chatId, message) {
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('chat_pendak');
  sheet.appendRow([new Date(), chatId, message]);
}

// Function to handle commands
function handleCommand(update) {
  const message = update.message;
  const chatId = message.chat.id;
  const text = message.text;
  const messageId = message.message_id;

  // Save log to Google Sheets
  saveLog(chatId, text);

  // Check command
  if (text === '/start') {
    const replyMarkup = JSON.stringify({
      keyboard: [
        ['PETUNJUK'],        
        ['pendak#Puguh Hendarto#2021-7-26']       
      ],
      resize_keyboard: true
    });
    sendMessage(chatId, 'Silakan pilih opsi di bawah ini:', replyMarkup, messageId);
  } else if (text === 'PETUNJUK') {
    sendMessage(chatId, 'PETUNJUK \n\npendak#Puguh Hendarto#2021-7-26 \n\nSetelah menerima perintah, bot akan mengirimkan balasan yang berisi informasi yang ditemukan, seperti 3 hari, 40 hari dan detail informasi lainnya.', null, messageId);
  }  else if (text.startsWith('pendak#')) {
    const keyword = text.substring(7);
    const keywordParts = keyword.split('#');
    if (keywordParts.length === 2) {
      const nama = encodeURIComponent(keywordParts[0].trim());
      const tglMeninggal = encodeURIComponent(keywordParts[1].trim());
      const jsonUrl = `https://script.google.com/macros/s/AKfycbynFZdB5nNwmOWTj2qfVufh3lhX1VHSzLyDlaPXNIfKMYlM7hBNPh89wXvmo-J4s2tP/exec?nama=${nama}&tgl=${tglMeninggal}`;
      const responseData = UrlFetchApp.fetch(jsonUrl).getContentText();
      const decodedData = JSON.parse(responseData);

      if (decodedData) {
        let responseText = `Halo ${chatId} \n\nalm/almh *${decodedData.nama}*, \nsampai saat ini sudah meninggal selama \`${decodedData.jumlah_hari_meninggal}\` hari.\n\n`;
        decodedData.ritual.forEach(ritual => {
          responseText += `Selamatan: \`${ritual.selamatan}\`\nPasaran: ${ritual.pasaran}\nTanggal: ${ritual.tanggal}\nStatus: *${ritual.status}*\n\n`;
        });
        sendMessage(chatId, responseText, null, messageId);
      } else {
        sendMessage(chatId, 'Maaf, ada masalah dengan data yang diterima atau data tidak tersedia.', null, messageId);
      }
    } else {
      sendMessage(chatId, "Format keyword tidak valid. Pastikan formatnya adalah 'nama#tgl_meninggal'. Contoh: pendak#Puguh Hendaro#2021-7-26", null, messageId);
    }
  }
}

// Utility function to check if a date is valid
function isValidDate(d, m, y) {
  const date = new Date(y, m - 1, d);
  return date.getFullYear() === parseInt(y) && date.getMonth() + 1 === parseInt(m) && date.getDate() === parseInt(d);
}

// Main function to handle the webhook
function doPost(e) {
  const update = JSON.parse(e.postData.contents);
  if (update) {
    handleCommand(update);
  }

  // Log the incoming messages
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('telegram_log');
  sheet.appendRow([new Date(), JSON.stringify(update)]);
}

Dibawah ini script GAS melalui browser

Selanjutnya melakukan deploy bot telegram, seperti mengaktifkan link webhook 
Dibawah ini Bot yang sudah kita uji coba menggunakan 2 script GAS diatas 

Bagi kawan-kawan butuh bantuan dalam membuat bot telegram dengan harga terjangkau, bisa kontak kita melalui whatsapp 081241314446