# █▀▀ ▄▀█ █▀▄▀█ █▀█ █▀▄ █▀
# █▀░ █▀█ █░▀░█ █▄█ █▄▀ ▄█
# https://t.me/famods
# 🔒 Licensed under the GNU AGPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# ---------------------------------------------------------------------------------
# Name: Gsearch
# Description: Поиск в Google
# meta developer: @FAmods
# meta banner: https://github.com/FajoX1/FAmods/blob/main/assets/banners/gsearch.png?raw=true
# requires: aiohttp google BeautifulSoup4
# ---------------------------------------------------------------------------------
import time
import asyncio
import logging
import aiohttp
from bs4 import BeautifulSoup
from googlesearch import search
from urllib.parse import unquote
from .. import loader, utils
logger = logging.getLogger(__name__)
@loader.tds
class Gsearch(loader.Module):
"""Поиск в Google"""
strings = {
"name": "Gsearch",
"no_q": "❌ Должно быть {}gsearch [запрос]",
"no_result": "😕 Ничего не нашёл по этому запросу",
"searching": "🔄 Поиск в google.com...",
"searched": """
🔎 Результаты поиска
🔎 Запрос: {}
{}
{} результатов за {} сек
""",
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"results",
5,
lambda: "Количество результатов",
),
loader.ConfigValue(
"safe_search",
False,
lambda: "Безопастный поиск",
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"lang",
"ru",
lambda: "Язык результатов",
),
loader.ConfigValue(
"emoji",
"▪️",
lambda: "Эмодзи в результатах поиска",
),
loader.ConfigValue(
"user_agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
lambda: "Ваш User-Agent"
),
loader.ConfigValue(
"show_title",
True,
lambda: "Заголовки в результате",
validator=loader.validators.Boolean()
)
)
async def client_ready(self, client, db):
self.db = db
self._client = client
@loader.command()
async def gsearch(self, message):
"""Поиск в Google"""
q = utils.get_args_raw(message)
if not q:
return await utils.answer(message, self.strings["no_q"].format(self.get_prefix()))
await utils.answer(message, self.strings['searching'])
safe_s = "off"
if self.config["safe_search"]:
safe_s = "on"
count_s = 0
start_time = time.time()
searched_result = ""
emojii = self.config["emoji"]
for url in search(q, stop=self.config["results"], lang=self.config["safe_search"], safe=safe_s):
if self.config['show_title']:
try:
async with aiohttp.ClientSession() as session:
async with session.get(url, headers={"User-Agent": self.config['user_agent']}) as response:
html = await response.read()
soup = BeautifulSoup(html, 'html.parser')
title = soup.find('title').text
searched_result += f"\n{emojii} {title}"
except:
searched_result += f"\n{emojii} {unquote(url)}"
else:
searched_result += f"\n{emojii} {unquote(url)}"
count_s += 1
end_time = time.time()
execution_time = end_time - start_time
if count_s == 0:
return await utils.answer(message, self.strings['no_result'])
return await utils.answer(message, self.strings['searched'].format(q, searched_result, count_s, execution_time))