import os
import uuid
from html import escape
import requests
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.constants import ParseMode
from telegram.ext import CallbackContext, CommandHandler
from Mikobot import dispatcher
ENDPOINT = "https://sasta-api.vercel.app/googleImageSearch"
# Define strings
class STRINGS:
REPLY_TO_MEDIA = "ℹ️ Please reply to a message that contains one of the supported media types, such as a photo, sticker, or image file."
UNSUPPORTED_MEDIA_TYPE = "⚠️ Unsupported media type!\nℹ️ Please reply with a supported media type: image, sticker, or image file."
REQUESTING_API_SERVER = "🫧"
DOWNLOADING_MEDIA = "🔍"
UPLOADING_TO_API_SERVER = "📤"
PARSING_RESULT = "📥"
EXCEPTION_OCCURRED = "❌Exception occurred!\n\nException: {}"
RESULT = """
Query: {query}
Google Page: Link
"""
OPEN_SEARCH_PAGE = "OPEN LINK"
# Define command handlers
async def reverse_image_search(update: Update, context: CallbackContext):
message = update.message
if len(message.text.split()) > 1:
image_url = message.text.split()[1]
params = {"image_url": image_url}
status_msg = await message.reply_text(STRINGS.REQUESTING_API_SERVER)
response = await requests.get(ENDPOINT, params=params)
elif message.reply_to_message:
reply = message.reply_to_message
if reply.photo or reply.sticker or reply.document:
status_msg = await message.reply_text(STRINGS.DOWNLOADING_MEDIA)
file_path = f"temp/{uuid.uuid4()}"
try:
file_id = (
reply.photo[-1].file_id
if reply.photo
else (
reply.sticker.file_id
if reply.sticker
else reply.document.file_id
)
)
file = await context.bot.get_file(file_id)
os.makedirs(
os.path.dirname(file_path), exist_ok=True
) # Ensure directory exists
await file.download_to_drive(
file_path
) # Use download instead of download_to_drive
except Exception as exc:
text = STRINGS.EXCEPTION_OCCURRED.format(exc)
await message.reply_text(text)
return
with open(file_path, "rb") as image_file:
files = {"file": image_file}
await status_msg.edit_text(STRINGS.UPLOADING_TO_API_SERVER)
response = requests.post(ENDPOINT, files=files)
os.remove(file_path) # Remove the file after it's been used
if response.status_code == 404:
text = STRINGS.EXCEPTION_OCCURRED.format(response.json()["error"])
await message.reply_text(text)
await status_msg.delete()
return
elif response.status_code != 200:
text = STRINGS.EXCEPTION_OCCURRED.format(response.text)
await message.reply_text(text)
await status_msg.delete()
return
await status_msg.edit_text(STRINGS.PARSING_RESULT)
response_json = response.json()
query = response_json["query"]
search_url = response_json["search_url"]
# Escape HTML tags in query to prevent them from being interpreted as markup
escaped_query = escape(query)
text = STRINGS.RESULT.format(
query=(
f"{escaped_query}
"
if escaped_query
else "Name not found"
),
search_url=search_url,
)
buttons = [[InlineKeyboardButton(STRINGS.OPEN_SEARCH_PAGE, url=search_url)]]
await message.reply_text(
text,
disable_web_page_preview=True,
reply_markup=InlineKeyboardMarkup(buttons),
parse_mode=ParseMode.HTML, # Specify parse_mode as 'HTML' to interpret HTML tags
)
await status_msg.delete()
dispatcher.add_handler(
CommandHandler(["reverse", "pp", "p", "grs", "sauce"], reverse_image_search)
)