mirror of
https://github.com/LiteyukiStudio/nonebot-plugin-marshoai.git
synced 2025-08-01 19:49:59 +00:00
🎨 更新 Python 依赖版本至 3.10,新增 pre-commit 工作流及配置文件
This commit is contained in:
@ -1,22 +1,26 @@
|
||||
import httpx
|
||||
import traceback
|
||||
|
||||
import httpx
|
||||
|
||||
|
||||
async def fetch_calendar():
|
||||
url = 'https://api.bgm.tv/calendar'
|
||||
url = "https://api.bgm.tv/calendar"
|
||||
headers = {
|
||||
'User-Agent': 'LiteyukiStudio/nonebot-plugin-marshoai (https://github.com/LiteyukiStudio/nonebot-plugin-marshoai)'
|
||||
"User-Agent": "LiteyukiStudio/nonebot-plugin-marshoai (https://github.com/LiteyukiStudio/nonebot-plugin-marshoai)"
|
||||
}
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.get(url, headers=headers)
|
||||
#print(response.text)
|
||||
# print(response.text)
|
||||
return response.json()
|
||||
|
||||
|
||||
async def get_bangumi_news():
|
||||
result = await fetch_calendar()
|
||||
info = ""
|
||||
try:
|
||||
for i in result:
|
||||
weekday = i["weekday"]["cn"]
|
||||
#print(weekday)
|
||||
# print(weekday)
|
||||
info += f"{weekday}:"
|
||||
items = i["items"]
|
||||
for item in items:
|
||||
@ -26,4 +30,4 @@ async def get_bangumi_news():
|
||||
return info
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return ""
|
||||
return ""
|
||||
|
@ -6,4 +6,4 @@
|
||||
"description": "获取今天的新番(动漫)列表,在调用之前,你需要知道今天星期几。"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -1,4 +1,5 @@
|
||||
import os
|
||||
|
||||
from zhDateTime import DateTime
|
||||
|
||||
|
||||
|
@ -6,4 +6,4 @@
|
||||
"description": "获取现在的日期,时间和星期。"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -4,7 +4,7 @@
|
||||
"function": {
|
||||
"name": "marshoai-basic__get_weather",
|
||||
"description": "当你想查询指定城市的天气时非常有用。",
|
||||
"parameters": {
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"location": {
|
||||
@ -23,7 +23,7 @@
|
||||
"function": {
|
||||
"name": "marshoai-basic__get_current_env",
|
||||
"description": "获取当前的运行环境。",
|
||||
"parameters": {
|
||||
"parameters": {
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -32,8 +32,8 @@
|
||||
"function": {
|
||||
"name": "marshoai-basic__get_current_time",
|
||||
"description": "获取现在的时间。",
|
||||
"parameters": {
|
||||
"parameters": {
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -1,37 +1,41 @@
|
||||
from . import mk_Common, mk_Info, mk_MorseCode, mk_NyaCode
|
||||
|
||||
from . import mk_Info
|
||||
from . import mk_Common
|
||||
from . import mk_MorseCode
|
||||
from . import mk_NyaCode
|
||||
|
||||
# Twisuki
|
||||
async def twisuki():
|
||||
return str(await mk_Info.twisuki())
|
||||
|
||||
|
||||
# MegaKits
|
||||
async def megakits():
|
||||
return str(await mk_Info.megakits())
|
||||
|
||||
|
||||
# Random Turntable
|
||||
async def random_turntable(upper: int, lower: int = 0):
|
||||
return str(await mk_Common.random_turntable(upper, lower))
|
||||
|
||||
|
||||
# Number Calc
|
||||
async def number_calc(a: str, b: str, op: str):
|
||||
return str(await mk_Common.number_calc(a, b, op))
|
||||
|
||||
|
||||
# MorseCode Encrypt
|
||||
async def morse_encrypt(msg: str):
|
||||
return str(await mk_MorseCode.morse_encrypt(msg))
|
||||
|
||||
|
||||
# MorseCode Decrypt
|
||||
async def morse_decrypt(msg: str):
|
||||
return str(await mk_MorseCode.morse_decrypt(msg))
|
||||
|
||||
|
||||
# NyaCode Encrypt
|
||||
async def nya_encode(msg: str):
|
||||
return str(await mk_NyaCode.nya_encode(msg))
|
||||
|
||||
|
||||
# NyaCode Decrypt
|
||||
async def nya_decode(msg: str):
|
||||
return str(await mk_NyaCode.nya_decode(msg))
|
||||
|
@ -1,9 +1,11 @@
|
||||
import random
|
||||
|
||||
|
||||
# Random Turntable
|
||||
async def random_turntable(upper: int, lower: int):
|
||||
return random.randint(lower, upper)
|
||||
|
||||
|
||||
# Number Calc
|
||||
async def number_calc(a: str, b: str, op: str):
|
||||
a, b = float(a), float(b)
|
||||
@ -17,8 +19,8 @@ async def number_calc(a: str, b: str, op: str):
|
||||
case "/":
|
||||
return str(a / b)
|
||||
case "**":
|
||||
return str(a ** b)
|
||||
return str(a**b)
|
||||
case "%":
|
||||
return str(a % b)
|
||||
case _:
|
||||
return "未知运算符"
|
||||
return "未知运算符"
|
||||
|
@ -1,7 +1,8 @@
|
||||
# Twisuki
|
||||
async def twisuki():
|
||||
return "Twiuski(苏阳)是megakits插件作者, Github : \"https://github.com/Twisuki\""
|
||||
return 'Twiuski(苏阳)是megakits插件作者, Github : "https://github.com/Twisuki"'
|
||||
|
||||
|
||||
# MegaKits
|
||||
async def megakits():
|
||||
return "MegaKits插件是一个功能混杂的MarshoAI插件, 由Twisuki(Github : \"https://github.com/Twisuki\")开发, 插件仓库 : \"https://github.com/LiteyukiStudio/marsho-toolsets/tree/main/Twisuki/marshoai-megakits\""
|
||||
return 'MegaKits插件是一个功能混杂的MarshoAI插件, 由Twisuki(Github : "https://github.com/Twisuki")开发, 插件仓库 : "https://github.com/LiteyukiStudio/marsho-toolsets/tree/main/Twisuki/marshoai-megakits"'
|
||||
|
@ -1,17 +1,59 @@
|
||||
# MorseCode
|
||||
MorseEncode = {
|
||||
"A": ".-", "B": "-...", "C": "-.-.", "D": "-..", "E": ".", "F": "..-.",
|
||||
"G": "--.", "H": "....", "I": "..", "J": ".---", "K": "-.-", "L": ".-..",
|
||||
"M": "--", "N": "-.", "O": "---", "P": ".--.", "Q": "--.-", "R": ".-.",
|
||||
"S": "...", "T": "-", "U": "..-", "V": "...-", "W": ".--", "X": "-..-",
|
||||
"Y": "-.--", "Z": "--..",
|
||||
"1": ".----", "2": "..---", "3": "...--", "4": "....-", "5": ".....",
|
||||
"6": "-....", "7": "--...", "8": "---..", "9": "----.", "0": "-----",
|
||||
".": ".-.-.-", ":": "---...", ",": "--..--", ";": "-.-.-.",
|
||||
"?": "..--..", "=": "-...-", "\'": ".----.", "/": "-..-.",
|
||||
"!": "-.-.--", "-": "-....-", "_": "..--.-", "\"": ".-..-.",
|
||||
"(": "-.--.", ")": "-.--.-", "$": "...-..-", "&": "....",
|
||||
"@": ".--.-.", " ": " "
|
||||
"A": ".-",
|
||||
"B": "-...",
|
||||
"C": "-.-.",
|
||||
"D": "-..",
|
||||
"E": ".",
|
||||
"F": "..-.",
|
||||
"G": "--.",
|
||||
"H": "....",
|
||||
"I": "..",
|
||||
"J": ".---",
|
||||
"K": "-.-",
|
||||
"L": ".-..",
|
||||
"M": "--",
|
||||
"N": "-.",
|
||||
"O": "---",
|
||||
"P": ".--.",
|
||||
"Q": "--.-",
|
||||
"R": ".-.",
|
||||
"S": "...",
|
||||
"T": "-",
|
||||
"U": "..-",
|
||||
"V": "...-",
|
||||
"W": ".--",
|
||||
"X": "-..-",
|
||||
"Y": "-.--",
|
||||
"Z": "--..",
|
||||
"1": ".----",
|
||||
"2": "..---",
|
||||
"3": "...--",
|
||||
"4": "....-",
|
||||
"5": ".....",
|
||||
"6": "-....",
|
||||
"7": "--...",
|
||||
"8": "---..",
|
||||
"9": "----.",
|
||||
"0": "-----",
|
||||
".": ".-.-.-",
|
||||
":": "---...",
|
||||
",": "--..--",
|
||||
";": "-.-.-.",
|
||||
"?": "..--..",
|
||||
"=": "-...-",
|
||||
"'": ".----.",
|
||||
"/": "-..-.",
|
||||
"!": "-.-.--",
|
||||
"-": "-....-",
|
||||
"_": "..--.-",
|
||||
'"': ".-..-.",
|
||||
"(": "-.--.",
|
||||
")": "-.--.-",
|
||||
"$": "...-..-",
|
||||
"&": "....",
|
||||
"@": ".--.-.",
|
||||
" ": " ",
|
||||
}
|
||||
MorseDecode = {value: key for key, value in MorseEncode.items()}
|
||||
|
||||
|
@ -1,18 +1,23 @@
|
||||
import random
|
||||
import base64
|
||||
import random
|
||||
|
||||
# NyaCode
|
||||
NyaCodeCharset = [
|
||||
"喵", "呜", "?", "~"
|
||||
]
|
||||
NyaCodeSpecialCharset = [
|
||||
"唔", "!", "...", ".."
|
||||
]
|
||||
NyaCodeCharset = ["喵", "呜", "?", "~"]
|
||||
NyaCodeSpecialCharset = ["唔", "!", "...", ".."]
|
||||
NyaCodeEncode = {}
|
||||
for i in range(64):
|
||||
triplet = "".join(NyaCodeCharset[(i // (4 ** j)) % 4] for j in range(3))
|
||||
NyaCodeEncode[chr(65 + i if i < 26 else 97 + (i - 26) if i < 52 else 48 + (i - 52) if i < 62 else (
|
||||
43 if i == 62 else 47))] = triplet
|
||||
triplet = "".join(NyaCodeCharset[(i // (4**j)) % 4] for j in range(3))
|
||||
NyaCodeEncode[
|
||||
chr(
|
||||
65 + i
|
||||
if i < 26
|
||||
else (
|
||||
97 + (i - 26)
|
||||
if i < 52
|
||||
else 48 + (i - 52) if i < 62 else (43 if i == 62 else 47)
|
||||
)
|
||||
)
|
||||
] = triplet
|
||||
NyaCodeDecode = {value: key for key, value in NyaCodeEncode.items()}
|
||||
|
||||
|
||||
@ -22,7 +27,7 @@ async def nya_encode(msg: str):
|
||||
msg_nyastr = "".join(NyaCodeEncode[base64_char] for base64_char in msg_b64str)
|
||||
result = ""
|
||||
for char in msg_nyastr:
|
||||
if char == "呜" and random.random() < 0.5:
|
||||
if char == "呜" and random.random() < 0.5:
|
||||
result += "!"
|
||||
|
||||
if random.random() < 0.25:
|
||||
@ -37,7 +42,7 @@ async def nya_decode(msg: str):
|
||||
msg = msg.replace("唔", "").replace("!", "").replace(".", "")
|
||||
msg_nyastr = []
|
||||
i = 0
|
||||
if len(msg) % 3 != 0 :
|
||||
if len(msg) % 3 != 0:
|
||||
return "这句话不是正确的猫语"
|
||||
while i < len(msg):
|
||||
nyachar = msg[i : i + 3]
|
||||
|
@ -139,4 +139,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -1,16 +1,16 @@
|
||||
from . import mg_Info, mg_Introduce, mg_Search
|
||||
|
||||
from . import mg_Info
|
||||
from . import mg_Search
|
||||
from . import mg_Introduce
|
||||
|
||||
# meogirl
|
||||
async def meogirl () :
|
||||
async def meogirl():
|
||||
return mg_Info.meogirl()
|
||||
|
||||
|
||||
# Search
|
||||
async def search (msg : str, num : int = 3) :
|
||||
async def search(msg: str, num: int = 3):
|
||||
return str(await mg_Search.search(msg, num))
|
||||
|
||||
|
||||
# Show
|
||||
async def introduce (msg : str) :
|
||||
async def introduce(msg: str):
|
||||
return str(await mg_Introduce.introduce(msg))
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
# Meogirl
|
||||
def meogirl():
|
||||
return "Meogirl指的是\"萌娘百科\"(https://zh.moegirl.org.cn/ , 简称\"萌百\"), 是一个\"万物皆可萌的百科全书!\"; 同时, MarshoTools也配有\"Meogirl\"插件, 可调用萌百的api"
|
||||
return 'Meogirl指的是"萌娘百科"(https://zh.moegirl.org.cn/ , 简称"萌百"), 是一个"万物皆可萌的百科全书!"; 同时, MarshoTools也配有"Meogirl"插件, 可调用萌百的api'
|
||||
|
@ -1,36 +1,38 @@
|
||||
from nonebot.log import logger
|
||||
|
||||
import re
|
||||
import httpx
|
||||
import urllib.parse
|
||||
|
||||
import httpx
|
||||
from bs4 import BeautifulSoup
|
||||
from nonebot.log import logger
|
||||
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
|
||||
async def get_async_data (url) :
|
||||
async with httpx.AsyncClient(timeout = None) as client:
|
||||
return await client.get(url, headers = headers)
|
||||
|
||||
async def introduce (msg : str) :
|
||||
logger.info(f"介绍 : \"{msg}\" ...")
|
||||
async def get_async_data(url):
|
||||
async with httpx.AsyncClient(timeout=None) as client:
|
||||
return await client.get(url, headers=headers)
|
||||
|
||||
|
||||
async def introduce(msg: str):
|
||||
logger.info(f'介绍 : "{msg}" ...')
|
||||
result = ""
|
||||
|
||||
url = "https://mzh.moegirl.org.cn/" + urllib.parse.quote_plus(msg)
|
||||
response = await get_async_data(url)
|
||||
logger.success(f"连接\"{url}\"完成, 状态码 : {response.status_code}")
|
||||
logger.success(f'连接"{url}"完成, 状态码 : {response.status_code}')
|
||||
|
||||
soup = BeautifulSoup(response.text, "html.parser")
|
||||
|
||||
# 正常页
|
||||
if response.status_code == 200 :
|
||||
if response.status_code == 200:
|
||||
"""
|
||||
萌娘百科页面结构
|
||||
div#mw-content-text
|
||||
└── div#404search # 空白页面出现
|
||||
└── div.mw-parser-output # 正常页面
|
||||
└── div, p, table ... # 大量的解释项
|
||||
萌娘百科页面结构
|
||||
div#mw-content-text
|
||||
└── div#404search # 空白页面出现
|
||||
└── div.mw-parser-output # 正常页面
|
||||
└── div, p, table ... # 大量的解释项
|
||||
"""
|
||||
result += msg + "\n"
|
||||
|
||||
@ -44,7 +46,9 @@ async def introduce (msg : str) :
|
||||
num = 0
|
||||
for p_tag in p_tags:
|
||||
p = str(p_tag)
|
||||
p = re.sub(r"<script.*?</script>|<style.*?</style>", "", p, flags=re.DOTALL)
|
||||
p = re.sub(
|
||||
r"<script.*?</script>|<style.*?</style>", "", p, flags=re.DOTALL
|
||||
)
|
||||
p = re.sub(r"<.*?>", "", p, flags=re.DOTALL)
|
||||
p = re.sub(r"\[.*?]", "", p, flags=re.DOTALL)
|
||||
|
||||
@ -57,20 +61,21 @@ async def introduce (msg : str) :
|
||||
return result
|
||||
|
||||
# 空白页
|
||||
elif response.status_code == 404 :
|
||||
logger.info(f"未找到\"{msg}\", 进行搜索")
|
||||
elif response.status_code == 404:
|
||||
logger.info(f'未找到"{msg}", 进行搜索')
|
||||
|
||||
from . import mg_Search
|
||||
context = await mg_Search.search(msg, 1)
|
||||
keyword = re.search(r".*?\n", context, flags = re.DOTALL).group()[: -1]
|
||||
|
||||
logger.success(f"搜索完成, 打开\"{keyword}\"")
|
||||
context = await mg_Search.search(msg, 1)
|
||||
keyword = re.search(r".*?\n", context, flags=re.DOTALL).group()[:-1]
|
||||
|
||||
logger.success(f'搜索完成, 打开"{keyword}"')
|
||||
return await introduce(keyword)
|
||||
|
||||
# 搜索失败
|
||||
elif response.status_code == 301 :
|
||||
elif response.status_code == 301:
|
||||
return f"未找到{msg}"
|
||||
|
||||
else :
|
||||
else:
|
||||
logger.error(f"网络错误, 状态码 : {response.status_code}")
|
||||
return f"网络错误, 状态码 : {response.status_code}"
|
||||
|
@ -1,76 +1,85 @@
|
||||
from nonebot.log import logger
|
||||
import urllib.parse
|
||||
|
||||
import httpx
|
||||
import urllib.parse
|
||||
from bs4 import BeautifulSoup
|
||||
from nonebot.log import logger
|
||||
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
|
||||
async def get_async_data (url) :
|
||||
async with httpx.AsyncClient(timeout = None) as client:
|
||||
return await client.get(url, headers = headers)
|
||||
|
||||
async def search (msg : str, num : int) :
|
||||
logger.info(f"搜索 : \"{msg}\" ...")
|
||||
async def get_async_data(url):
|
||||
async with httpx.AsyncClient(timeout=None) as client:
|
||||
return await client.get(url, headers=headers)
|
||||
|
||||
|
||||
async def search(msg: str, num: int):
|
||||
logger.info(f'搜索 : "{msg}" ...')
|
||||
result = ""
|
||||
|
||||
url = "https://mzh.moegirl.org.cn/index.php?search=" + urllib.parse.quote_plus(msg)
|
||||
response = await get_async_data(url)
|
||||
logger.success(f"连接\"{url}\"完成, 状态码 : {response.status_code}")
|
||||
logger.success(f'连接"{url}"完成, 状态码 : {response.status_code}')
|
||||
|
||||
# 正常搜索
|
||||
if response.status_code == 200 :
|
||||
if response.status_code == 200:
|
||||
"""
|
||||
萌娘百科搜索页面结构
|
||||
div.searchresults
|
||||
└── p ...
|
||||
└── ul.mw-search-results # 若无, 证明无搜索结果
|
||||
└── li # 一个搜索结果
|
||||
└── div.mw-search-result-heading > a # 标题
|
||||
└── div.mw-searchresult # 内容
|
||||
└── div.mw-search-result-data
|
||||
└── li ...
|
||||
└── li ...
|
||||
萌娘百科搜索页面结构
|
||||
div.searchresults
|
||||
└── p ...
|
||||
└── ul.mw-search-results # 若无, 证明无搜索结果
|
||||
└── li # 一个搜索结果
|
||||
└── div.mw-search-result-heading > a # 标题
|
||||
└── div.mw-searchresult # 内容
|
||||
└── div.mw-search-result-data
|
||||
└── li ...
|
||||
└── li ...
|
||||
"""
|
||||
soup = BeautifulSoup(response.text, "html.parser")
|
||||
|
||||
# 检测ul.mw-search-results, 是否有结果
|
||||
ul_tag = soup.find("ul", class_ = "mw-search-results")
|
||||
if ul_tag :
|
||||
ul_tag = soup.find("ul", class_="mw-search-results")
|
||||
if ul_tag:
|
||||
li_tags = ul_tag.find_all("li")
|
||||
for li_tag in li_tags :
|
||||
for li_tag in li_tags:
|
||||
|
||||
div_heading = li_tag.find("div", class_ = "mw-search-result-heading")
|
||||
if div_heading :
|
||||
div_heading = li_tag.find("div", class_="mw-search-result-heading")
|
||||
if div_heading:
|
||||
a_tag = div_heading.find("a")
|
||||
result += a_tag["title"] + "\n"
|
||||
logger.info(f"搜索到 : \"{a_tag["title"]}\"")
|
||||
logger.info(f'搜索到 : "{a_tag["title"]}"')
|
||||
|
||||
div_result = li_tag.find("div", class_="searchresult")
|
||||
if div_result :
|
||||
content = str(div_result).replace("<div class=\"searchresult\">", "").replace("</div>", "")
|
||||
content = content.replace("<span class=\"searchmatch\">", "").replace("</span>", "")
|
||||
if div_result:
|
||||
content = (
|
||||
str(div_result)
|
||||
.replace('<div class="searchresult">', "")
|
||||
.replace("</div>", "")
|
||||
)
|
||||
content = content.replace('<span class="searchmatch">', "").replace(
|
||||
"</span>", ""
|
||||
)
|
||||
result += content + "\n"
|
||||
|
||||
num -= 1
|
||||
if num == 0 :
|
||||
if num == 0:
|
||||
break
|
||||
return result
|
||||
|
||||
# 无ul.mw-search-results, 无结果
|
||||
else :
|
||||
else:
|
||||
logger.info("无结果")
|
||||
return "无结果"
|
||||
|
||||
# 重定向
|
||||
elif response.status_code == 302 :
|
||||
logger.info(f"\"{msg}\"已被重定向至\"{response.headers.get("location")}\"")
|
||||
elif response.status_code == 302:
|
||||
logger.info(f'"{msg}"已被重定向至"{response.headers.get("location")}"')
|
||||
# 读取重定向结果
|
||||
from . import mg_Introduce
|
||||
|
||||
return await mg_Introduce.introduce(msg)
|
||||
|
||||
else :
|
||||
else:
|
||||
logger.error(f"网络错误, 状态码 : {response.status_code}")
|
||||
return f"网络错误, 状态码 : {response.status_code}"
|
||||
|
@ -48,4 +48,4 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
Reference in New Issue
Block a user