Pendahuluan

Pada artikel kami sebelumnya, yaitu Menambahkan Fitur Membaca Data dari File JSON Menggunakan Python pada Bot Telegram, memiliki fitur pencarian data tunggal. Pada artikel ini kami akan memberikan fitur pencarian data masal pada file json menggunakan python dan library pyTelegramBotApi.

Persiapan

1. Buka aplikasi Telegram Anda, jika Anda belum memiliki akun Telegram, silahkan Membuat Akun Bot Telegram lalu hubungkan ke VPS Anda atau silakan baca artikel kami Mempersiapkan VPS sebagai Hosting untuk Bot Telegram

2. Lakukan update VPS Anda:

apt update

3. Lakukan upgrade VPS Anda:

apt upgrade -y

4. Pasang pip:

apt install python3-pip -y

5. Pasang pyTelegramBotApi:

pip install pyTelegramBotApi

6. Unduh nodejs v.18:

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash

7. Pasang nodejs v.18:

apt install nodejs

8. Perbarui npm:

npm install -g npm@latest

9. Pasang pm2:

npm install -g pm2

10. Siapkan file quran.json. Pada kode berikut, kami mencontohkan Surah Al-Fatihah:

[
  {
    "ID": "1:1",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "1. Dengan nama Allah Yang Maha Pengasih, Maha Penyayang."
  },
  {
    "ID": "1:2",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "2. Segala puji bagi Allah, Tuhan seluruh alam."
  },
  {
    "ID": "1:3",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "3. Yang Maha Pengasih, Maha Penyayang."
  },
  {
    "ID": "1:4",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "4. Pemilik hari pembalasan.*(1)"
  },
  {
    "ID": "1:5",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "5. Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah kami mohon pertolongan."
  },
  {
    "ID": "1:6",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "6. Tunjukilah kami jalan yang lurus.*(2)"
  },
  {
    "ID": "1:7",
    "Surah": "1. Al-Fatihah",
    "Terjemah": "7. (Yaitu) jalan orang-orang yang telah Engkau beri nikmat kepadanya; bukan (jalan) mereka yang dimurkai, dan bukan (pula jalan) mereka yang sesat.*(3)"
  }
]

11. Buat file python baru, misalnya main.py dan tuliskan kode berikut:

from telebot import *
from telebot import types
import json

TOKEN = 'TOKEN_API' # ganti dengan TOKEN_API Anda

bot = telebot.TeleBot(TOKEN)

# Ambil data dari quran.json
with open('quran.json', 'r') as file:
		data = json.load(file)

# Fungsi pencarian
def search_in_quran(word, page=1, page_size=5):
		results = []
		for item in data:
				if word.lower() in item['Surah'].lower() or word.lower() in item['Terjemah'].lower():
						results.append(item)
		start = (page - 1) * page_size
		end = start + page_size
		return results[start:end], len(results)

# Handler untuk perintah /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
	bot.send_message(message.chat.id, f'Assalamu Alaikum, {message.from_user.first_name}')
	bot.send_message(message.chat.id, f"Silakan ketik kata yang ingin Anda cari?")

# Handler untuk pesan teks yang menerima input dari pengguna
@bot.message_handler(func=lambda message: True)
def echo_all(message):
		word = message.text
		page = 1
		page_size = 5
		results, total_results = search_in_quran(word, page, page_size)
		if results:
				wait_message = bot.send_message(message.chat.id, f'{message.from_user.first_name}, mohon tunggu ...')
				response = f"Ditemukan {total_results} hasil untuk '{word}'\n\nHalaman: {page} dari {int((total_results - 1) / page_size) + 1}\n\n"
				for i, result in enumerate(results, start=(page-1)*page_size+1):
						response += f"{i}. Surah: {result['Surah']}\nAyat: {result['Terjemah']}\n\n"
				markup = types.InlineKeyboardMarkup()
				buttons = []
				if page > 1:
						prev_page_button = types.InlineKeyboardButton(text="Sebelumnya", callback_data=f"prev_{word}_{page-1}")
						buttons.append(prev_page_button)
				if page * page_size < total_results:
						next_page_button = types.InlineKeyboardButton(text="Selanjutnya", callback_data=f"next_{word}_{page+1}")
						buttons.append(next_page_button)
				markup.row(*buttons)
				bot.send_chat_action(chat_id=message.chat.id, action="typing")
				bot.delete_message(wait_message.chat.id, wait_message.message_id)
				bot.send_message(message.chat.id, response, reply_markup=markup, parse_mode="HTML")
		else:
				bot.send_message(message.chat.id, f"Mohon maaf, kami tidak dapat menemukan kata '{word}'. Silakan coba kembali menggunakan kata yang berbeda.\n\nGunakanlah kata baku sesuai Kamus Besar Bahasa Indonesia (KBBI) untuk memudahkan Anda menemukan kata yang Anda cari.", parse_mode="HTML")

# Handler untuk tombol paginasi "Sebelumnya"
@bot.callback_query_handler(func=lambda call: call.data.startswith('prev_'))
def handle_prev_query(call):
		_, word, page = call.data.split('_')
		page = int(page)
		page_size = 5
		results, total_results = search_in_quran(word, page, page_size)
		response = f"Ditemukan {total_results} hasil untuk '{word}'\n\nHalaman: {page} dari {int((total_results - 1) / page_size) + 1}\n\n"
		for i, result in enumerate(results, start=(page-1)*page_size+1):
				response += f"{i}. Surah: {result['Surah']}\nAyat: {result['Terjemah']}\n\n"
		markup = types.InlineKeyboardMarkup()
		buttons = []
		if page > 1:
				prev_page_button = types.InlineKeyboardButton(text="Sebelumnya", callback_data=f"prev_{word}_{page-1}")
				buttons.append(prev_page_button)
		if page * page_size < total_results:
				next_page_button = types.InlineKeyboardButton(text="Selanjutnya", callback_data=f"next_{word}_{page+1}")
				buttons.append(next_page_button)
		markup.row(*buttons)
		bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=response, reply_markup=markup, parse_mode="HTML")

# Handler untuk tombol paginasi "Selanjutnya"
@bot.callback_query_handler(func=lambda call: call.data.startswith('next_'))
def handle_next_query(call):
		_, word, page = call.data.split('_')
		page = int(page)
		page_size = 5
		results, total_results = search_in_quran(word, page, page_size)
		response = f"Ditemukan {total_results} hasil untuk '{word}'\n\nHalaman: {page} dari {int((total_results - 1) / page_size) + 1}\n\n"
		for i, result in enumerate(results, start=(page-1)*page_size+1):
				response += f"{i}. Surah: {result['Surah']}\nAyat: {result['Terjemah']}\n\n"
		markup = types.InlineKeyboardMarkup()
		buttons = []
		if page > 1:
				prev_page_button = types.InlineKeyboardButton(text="Sebelumnya", callback_data=f"prev_{word}_{page-1}")
				buttons.append(prev_page_button)
		if page * page_size < total_results:
				next_page_button = types.InlineKeyboardButton(text="Selanjutnya", callback_data=f"next_{word}_{page+1}")
				buttons.append(next_page_button)
		markup.row(*buttons)
		bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=response, reply_markup=markup, parse_mode="HTML")

# Bot aktif
print('Bot sudah aktif')

# Polling
bot.polling()

12. Unggah main.py dan quran.json dalam folder root atau folder yang sama menggunakan aplikasi SSH yang Anda gunakan. Berikut contoh strukturnya:

root/
├── main.py
└── quran.json

13. Jalankan kode bot Telegram Anda:

python3 main.py

14. Jika tidak ada kesalahan pada kode Anda, silakan putuskan koneksi ke VPS Anda

15. Hubungkan kembali ke VPS Anda

16. Jalankan kode bot Telegram Anda menggunakan pm2 agar bot selalu aktif 24 jam:

pm2 start main.py
pm2 startup
pm2 save

17. Setiap Anda melakukan perubahan kode pada file Anda, unggah kembali file ke VPS. Lalu, jalankan kembali kode Anda:

pm2 restart main

18. Untuk melihat kode yang dijalankan oleh pm2:

pm2 ls

Penutup

Anda dapat menambahkan fitur-fitur lain pada Bot Telegram Anda agar lebih menarik bagi pengguna Anda. Selain itu, Anda juga dapat memanfaatkan bot Anda sebagai asisten pribadi Anda.