PagerMaid_Plugins_Pyro/jikipedia/main.py

142 lines
4.9 KiB
Python
Raw Normal View History

2022-07-26 05:41:11 +00:00
from typing import List, Dict, Optional
from pagermaid.enums import Message
from pagermaid.listener import listener
from pagermaid.services import client as httpx
class JIKIPediaDefinition:
plaintext: str
tags: List[Optional[str]]
title: str
item_id: int
image: Optional[str]
2023-07-01 12:18:58 +00:00
def __init__(
self,
plaintext: str,
tags: List[Dict],
title: str,
item_id: int,
image: Optional[str],
):
2022-07-26 05:41:11 +00:00
self.plaintext = plaintext
self.tags = []
for i in tags:
if name := i.get("name"):
self.tags.append(name)
self.title = title
self.item_id = item_id
self.image = image
def format(self):
plaintext = self.plaintext.replace("\u200b", "").replace("\u200c", "")
2023-07-01 12:18:58 +00:00
tags = (
" ".join([f"#{x}" for x in list(self.tags)]) if self.tags else "该词条还没有Tag哦"
)
2022-07-26 05:41:11 +00:00
text = f"词条:【{self.title}\n\n"
text += f"{plaintext}\n\n"
text += f"Tags{tags}\n"
text += f"原文https://jikipedia.com/definition/{self.item_id}"
return text
class JIKIPedia:
url = "https://api.jikipedia.com/go/search_entities"
headers = {
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh-TW;q=0.9,zh;q=0.8",
"Client": "web",
"Client-Version": "2.7.2g",
"Connection": "keep-alive",
"Host": "api.jikipedia.com",
"Origin": "https://jikipedia.com",
"Referer": "https://jikipedia.com/",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-site",
"Token": "",
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36",
"XID": "uNo5bL1nyNCp/Gm7lJAHQ91220HLbMT8jqk9IJYhtHA4ofP+zgxwM6lSDIKiYoppP2k1IW/1Vxc2vOVGxOOVReebsLmWPHhTs7NCRygfDkE=",
"sec-ch-ua": '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"',
"sec-ch-ua-mobile": "?1",
"sec-ch-ua-platform": '"Android"',
}
def __init__(self, key: str):
self.definitions = []
self.message = None
self.data = None
self.key = key
async def search(self):
2023-07-01 12:18:58 +00:00
req = await httpx.post(
url=self.url,
headers=self.headers,
json={"phrase": self.key, "page": 1, "size": 60},
)
2022-07-26 05:41:11 +00:00
return self.parse(**req.json())
def parse(self, **kwargs):
self.data = kwargs.get("data")
2022-07-26 05:41:11 +00:00
self.definitions = []
if self.data:
for i in self.data:
if definitions := i.get("definitions", None):
for j in definitions:
plaintext = j.get("plaintext", "")
tags = j.get("tags", [])
title = j.get("term", {}).get("title", "")
if not title:
continue
item_id = j.get("id", 0)
images = j.get("images", [])
image = ""
if len(images) > 0:
image = images[0].get("full", {}).get("path", "")
2023-07-01 12:18:58 +00:00
self.definitions.append(
JIKIPediaDefinition(plaintext, tags, title, item_id, image)
)
self.message = kwargs.get("message")
2022-07-26 05:41:11 +00:00
if issubclass(type(self.message), dict):
self.message = self.message.get("title", None)
2023-07-01 12:18:58 +00:00
@listener(command="jikipedia", parameters="[关键词]", description="梗查询")
2022-07-26 05:41:11 +00:00
async def jikipedia(message: Message):
if not message.arguments:
return await message.edit("请输入关键词")
data = JIKIPedia(message.arguments)
await data.search()
if not data.definitions:
return await message.edit("没有找到相关结果")
text = data.definitions[0].format()
image = data.definitions[0].image
if len(data.definitions) > 1:
text += "\n\n"
text += "你是否还想找这些:"
suggester = []
for i in range(1, len(data.definitions)):
if data.definitions[i].title not in suggester:
suggester.append(data.definitions[i].title)
if len(suggester) == 5:
break
for i in suggester:
text += f"{i}"
if not image:
await message.edit(text, disable_web_page_preview=True)
else:
try:
2022-11-21 11:38:51 +00:00
await message.reply_photo(
image,
quote=False,
caption=text,
2024-02-04 07:56:06 +00:00
message_thread_id=message.message_thread_id,
2022-11-21 11:38:51 +00:00
)
await message.safe_delete()
except Exception:
await message.edit(text, disable_web_page_preview=True)
2022-07-26 05:41:11 +00:00
await message.safe_delete()