main
 1#!/usr/bin/env python
 2# -*- coding: utf-8 -*-
 3
 4from glom import glom
 5from loguru import logger
 6from pyrogram.client import Client
 7from pyrogram.types import Message
 8
 9from config import GOOGLE_SEARCH_GL, NUM_GOOGLE_SEARCH_RESULTS, PREFIX, PROXY, TOKEN
10from messages.parser import parse_msg
11from messages.sender import send2tg
12from messages.utils import equal_prefix, startswith_prefix
13from networking import hx_req
14from utils import number_to_emoji
15
16HELP = f"""🔍**搜索Google**
17`{PREFIX.SEARCH_GOOGLE}` + 关键词
18"""
19
20
21async def search_google(client: Client, message: Message, **kwargs):
22    """Search Google."""
23    # send docs if message == "/ytb", without reply
24    if equal_prefix(message.text, prefix=[PREFIX.SEARCH_GOOGLE]) and not message.reply_to_message:
25        await send2tg(client, message, texts=HELP, **kwargs)
26        return
27
28    info = parse_msg(message, silent=True)
29    if not startswith_prefix(info["text"], prefix=[PREFIX.SEARCH_GOOGLE]):
30        return
31    query = info["text"].removeprefix(PREFIX.SEARCH_GOOGLE).strip()
32    if not query:
33        return
34
35    res = await query_google(query)
36    if not res:
37        await send2tg(client, message, texts="❌查询Google失败", **kwargs)
38        return
39    msg = ""
40    for idx, item in enumerate(res):
41        msg += f"{number_to_emoji(idx + 1)}[{item['title']}]({item['link']})\n"
42        msg += f"{item['snippet']}\n\n"
43    await send2tg(client, message, texts=msg, **kwargs)
44
45
46async def query_google(query: str) -> list[dict]:
47    if not (TOKEN.GOOGLE_SEARCH_API_KEY and TOKEN.GOOGLE_SEARCH_CX):
48        return []
49    try:
50        api = "https://www.googleapis.com/customsearch/v1"
51        params = {
52            "key": TOKEN.GOOGLE_SEARCH_API_KEY,
53            "cx": TOKEN.GOOGLE_SEARCH_CX,
54            "q": query,
55            "num": min(NUM_GOOGLE_SEARCH_RESULTS, 10),
56            "safe": "off",
57            "gl": GOOGLE_SEARCH_GL,
58        }
59        response = await hx_req(api, proxy=PROXY.GOOGLE, params=params, check_keys=["items"], max_retry=0)
60        return glom(response, "items", default=[]) or []
61    except Exception as e:
62        logger.error(e)
63    return []