mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
modified: basic_plugins/admin_bot_manage/admin_config.py modified: basic_plugins/admin_bot_manage/custom_welcome_message.py modified: basic_plugins/admin_bot_manage/timing_task.py modified: basic_plugins/apscheduler/__init__.py modified: basic_plugins/ban/__init__.py modified: basic_plugins/ban/data_source.py modified: basic_plugins/chat_history/chat_message.py modified: basic_plugins/chat_history/chat_message_handle.py modified: basic_plugins/group_handle/__init__.py modified: basic_plugins/hooks/_utils.py modified: basic_plugins/hooks/ban_hook.py modified: basic_plugins/hooks/chkdsk_hook.py modified: basic_plugins/init_plugin_config/__init__.py deleted: basic_plugins/init_plugin_config/init_group_manager.py modified: basic_plugins/invite_manager/__init__.py new file: basic_plugins/invite_manager/utils.py modified: basic_plugins/nickname.py modified: basic_plugins/plugin_shop/__init__.py modified: basic_plugins/plugin_shop/data_source.py modified: basic_plugins/scripts.py modified: basic_plugins/shop/__init__.py modified: basic_plugins/shop/buy.py modified: basic_plugins/shop/gold.py modified: basic_plugins/shop/my_props/__init__.py deleted: basic_plugins/shop/reset_today_gold.py modified: basic_plugins/shop/shop_handle/__init__.py modified: basic_plugins/shop/shop_handle/data_source.py modified: basic_plugins/shop/use/__init__.py modified: basic_plugins/shop/use/data_source.py modified: basic_plugins/super_cmd/__init__.py modified: basic_plugins/super_cmd/bot_friend_group.py modified: basic_plugins/super_cmd/clear_data.py modified: basic_plugins/super_cmd/exec_sql.py modified: basic_plugins/super_cmd/manager_group.py modified: basic_plugins/super_cmd/reload_setting.py modified: basic_plugins/super_cmd/set_admin_permissions.py deleted: basic_plugins/super_cmd/super_task_switch.py modified: basic_plugins/super_cmd/update_friend_group_info.py modified: basic_plugins/super_help/__init__.py modified: basic_plugins/update_info.py modified: configs/config.py modified: configs/utils/__init__.py modified: models/bag_user.py modified: models/ban_user.py modified: models/chat_history.py modified: models/friend_user.py modified: models/goods_info.py modified: models/group_info.py modified: models/group_member_info.py modified: models/level_user.py modified: models/sign_group_user.py modified: models/user_shop_gold_log.py modified: plugins/aconfig/__init__.py modified: plugins/ai/__init__.py modified: plugins/ai/data_source.py modified: plugins/bilibili_sub/__init__.py modified: plugins/bilibili_sub/data_source.py modified: plugins/bilibili_sub/model.py modified: plugins/black_word/__init__.py modified: plugins/black_word/model.py modified: plugins/black_word/utils.py modified: plugins/bt/data_source.py modified: plugins/genshin/almanac/__init__.py modified: plugins/genshin/material_remind/__init__.py modified: plugins/genshin/query_user/_models/__init__.py modified: plugins/genshin/query_user/_utils/__init__.py modified: plugins/genshin/query_user/bind/__init__.py modified: plugins/genshin/query_user/genshin_sign/__init__.py modified: plugins/genshin/query_user/genshin_sign/data_source.py modified: plugins/genshin/query_user/genshin_sign/init_task.py modified: plugins/genshin/query_user/mihoyobbs_sign/__init__.py modified: plugins/genshin/query_user/query_memo/__init__.py modified: plugins/genshin/query_user/query_memo/data_source.py modified: plugins/genshin/query_user/query_role/__init__.py modified: plugins/genshin/query_user/query_role/data_source.py modified: plugins/genshin/query_user/reset_today_query_user_data/__init__.py modified: plugins/genshin/query_user/resin_remind/__init__.py modified: plugins/genshin/query_user/resin_remind/init_task.py modified: plugins/gold_redbag/model.py modified: plugins/image_management/send_image/__init__.py modified: plugins/my_info/__init__.py modified: plugins/open_cases/models/buff_prices.py modified: plugins/open_cases/models/open_cases_user.py modified: plugins/open_cases/open_cases_c.py modified: plugins/open_cases/utils.py modified: plugins/parse_bilibili_json.py modified: plugins/pid_search.py modified: plugins/pix_gallery/__init__.py modified: plugins/pix_gallery/_data_source.py modified: plugins/pix_gallery/_model/omega_pixiv_illusts.py modified: plugins/pix_gallery/_model/pixiv.py modified: plugins/pix_gallery/_model/pixiv_keyword_user.py modified: plugins/pix_gallery/pix_add_keyword.py modified: plugins/pix_gallery/pix_pass_del_keyword.py modified: plugins/pix_gallery/pix_show_info.py modified: plugins/pix_gallery/pix_update.py modified: plugins/pixiv_rank_search/data_source.py modified: plugins/poke/__init__.py modified: plugins/russian/__init__.py modified: plugins/russian/data_source.py modified: plugins/russian/model.py modified: plugins/send_dinggong_voice/__init__.py modified: plugins/send_setu_/_model.py modified: plugins/send_setu_/send_setu/__init__.py modified: plugins/send_setu_/send_setu/data_source.py modified: plugins/send_setu_/update_setu/data_source.py modified: plugins/sign_in/goods_register.py modified: plugins/sign_in/group_user_checkin.py modified: plugins/sign_in/random_event.py modified: plugins/sign_in/utils.py modified: plugins/statistics/_model.py modified: plugins/statistics/statistics_handle.py modified: plugins/statistics/statistics_hook.py modified: plugins/update_picture.py modified: plugins/web_ui/api/request.py modified: plugins/word_bank/_model.py deleted: plugins/word_bank/_old_model.py modified: plugins/word_bank/_rule.py modified: plugins/word_bank/word_handle.py modified: plugins/word_clouds/data_source.py modified: resources/image/sign/sign_res/bar.png modified: resources/image/sign/sign_res/bar_white.png modified: services/db_context.py modified: services/log.py modified: utils/browser.py modified: utils/data_utils.py modified: utils/depends/__init__.py modified: utils/http_utils.py modified: utils/image_utils.py modified: utils/manager/admin_manager.py modified: utils/message_builder.py modified: utils/utils.py
223 lines
6.9 KiB
Python
Executable File
223 lines
6.9 KiB
Python
Executable File
import os
|
||
import random
|
||
import re
|
||
|
||
from configs.config import NICKNAME, Config
|
||
from configs.path_config import DATA_PATH, IMAGE_PATH
|
||
from services.log import logger
|
||
from utils.http_utils import AsyncHttpx
|
||
from utils.message_builder import face, image
|
||
|
||
from .utils import ai_message_manager
|
||
|
||
try:
|
||
import ujson as json
|
||
except ModuleNotFoundError:
|
||
import json
|
||
|
||
|
||
url = "http://openapi.tuling123.com/openapi/api/v2"
|
||
|
||
check_url = "https://v2.alapi.cn/api/censor/text"
|
||
|
||
index = 0
|
||
|
||
anime_data = json.load(open(DATA_PATH / "anime.json", "r", encoding="utf8"))
|
||
|
||
|
||
async def get_chat_result(text: str, img_url: str, user_id: int, nickname: str) -> str:
|
||
"""
|
||
获取 AI 返回值,顺序: 特殊回复 -> 图灵 -> 青云客
|
||
:param text: 问题
|
||
:param img_url: 图片链接
|
||
:param user_id: 用户id
|
||
:param nickname: 用户昵称
|
||
:return: 回答
|
||
"""
|
||
global index
|
||
ai_message_manager.add_message(user_id, text)
|
||
special_rst = await ai_message_manager.get_result(user_id, nickname)
|
||
if special_rst:
|
||
ai_message_manager.add_result(user_id, special_rst)
|
||
return special_rst
|
||
if index == 5:
|
||
index = 0
|
||
if len(text) < 6 and random.random() < 0.6:
|
||
keys = anime_data.keys()
|
||
for key in keys:
|
||
if text.find(key) != -1:
|
||
return random.choice(anime_data[key]).replace("你", nickname)
|
||
rst = await tu_ling(text, img_url, user_id)
|
||
if not rst:
|
||
rst = await xie_ai(text)
|
||
if not rst:
|
||
return no_result()
|
||
if nickname:
|
||
if len(nickname) < 5:
|
||
if random.random() < 0.5:
|
||
nickname = "~".join(nickname) + "~"
|
||
if random.random() < 0.2:
|
||
if nickname.find("大人") == -1:
|
||
nickname += "大~人~"
|
||
rst = str(rst).replace("小主人", nickname).replace("小朋友", nickname)
|
||
ai_message_manager.add_result(user_id, rst)
|
||
return rst
|
||
|
||
|
||
# 图灵接口
|
||
async def tu_ling(text: str, img_url: str, user_id: int) -> str:
|
||
"""
|
||
获取图灵接口的回复
|
||
:param text: 问题
|
||
:param img_url: 图片链接
|
||
:param user_id: 用户id
|
||
:return: 图灵回复
|
||
"""
|
||
global index
|
||
TL_KEY = Config.get_config("ai", "TL_KEY")
|
||
req = None
|
||
if not TL_KEY:
|
||
return ""
|
||
try:
|
||
if text:
|
||
req = {
|
||
"perception": {
|
||
"inputText": {"text": text},
|
||
"selfInfo": {
|
||
"location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
|
||
},
|
||
},
|
||
"userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
|
||
}
|
||
elif img_url:
|
||
req = {
|
||
"reqType": 1,
|
||
"perception": {
|
||
"inputImage": {"url": img_url},
|
||
"selfInfo": {
|
||
"location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
|
||
},
|
||
},
|
||
"userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
|
||
}
|
||
except IndexError:
|
||
index = 0
|
||
return ""
|
||
text = ""
|
||
response = await AsyncHttpx.post(url, json=req)
|
||
if response.status_code != 200:
|
||
return no_result()
|
||
resp_payload = json.loads(response.text)
|
||
if int(resp_payload["intent"]["code"]) in [4003]:
|
||
return ""
|
||
if resp_payload["results"]:
|
||
for result in resp_payload["results"]:
|
||
if result["resultType"] == "text":
|
||
text = result["values"]["text"]
|
||
if "请求次数超过" in text:
|
||
text = ""
|
||
return text
|
||
|
||
|
||
# 屑 AI
|
||
async def xie_ai(text: str) -> str:
|
||
"""
|
||
获取青云客回复
|
||
:param text: 问题
|
||
:return: 青云可回复
|
||
"""
|
||
res = await AsyncHttpx.get(
|
||
f"http://api.qingyunke.com/api.php?key=free&appid=0&msg={text}"
|
||
)
|
||
content = ""
|
||
try:
|
||
data = json.loads(res.text)
|
||
if data["result"] == 0:
|
||
content = data["content"]
|
||
if "菲菲" in content:
|
||
content = content.replace("菲菲", NICKNAME)
|
||
if "艳儿" in content:
|
||
content = content.replace("艳儿", NICKNAME)
|
||
if "公众号" in content:
|
||
content = ""
|
||
if "{br}" in content:
|
||
content = content.replace("{br}", "\n")
|
||
if "提示" in content:
|
||
content = content[: content.find("提示")]
|
||
if "淘宝" in content or "taobao.com" in content:
|
||
return ""
|
||
while True:
|
||
r = re.search("{face:(.*)}", content)
|
||
if r:
|
||
id_ = r.group(1)
|
||
content = content.replace(
|
||
"{" + f"face:{id_}" + "}", str(face(int(id_)))
|
||
)
|
||
else:
|
||
break
|
||
return (
|
||
content
|
||
if not content and not Config.get_config("ai", "ALAPI_AI_CHECK")
|
||
else await check_text(content)
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Ai xie_ai 发生错误 {type(e)}:{e}")
|
||
return ""
|
||
|
||
|
||
def hello() -> str:
|
||
"""
|
||
一些打招呼的内容
|
||
"""
|
||
result = random.choice(
|
||
(
|
||
"哦豁?!",
|
||
"你好!Ov<",
|
||
f"库库库,呼唤{NICKNAME}做什么呢",
|
||
"我在呢!",
|
||
"呼呼,叫俺干嘛",
|
||
)
|
||
)
|
||
img = random.choice(os.listdir(IMAGE_PATH / "zai"))
|
||
if img[-4:] == ".gif":
|
||
result += image(IMAGE_PATH / "zai" / img)
|
||
else:
|
||
result += image(IMAGE_PATH / "zai" / img)
|
||
return result
|
||
|
||
|
||
# 没有回答时回复内容
|
||
def no_result() -> str:
|
||
"""
|
||
没有回答时的回复
|
||
"""
|
||
return random.choice(
|
||
[
|
||
"你在说啥子?",
|
||
f"纯洁的{NICKNAME}没听懂",
|
||
"下次再告诉你(下次一定)",
|
||
"你觉得我听懂了吗?嗯?",
|
||
"我!不!知!道!",
|
||
]
|
||
) + image(
|
||
IMAGE_PATH / "noresult" / random.choice(os.listdir(IMAGE_PATH / "noresult"))
|
||
)
|
||
|
||
|
||
async def check_text(text: str) -> str:
|
||
"""
|
||
ALAPI文本检测,主要针对青云客API,检测为恶俗文本改为无回复的回答
|
||
:param text: 回复
|
||
"""
|
||
if not Config.get_config("alapi", "ALAPI_TOKEN"):
|
||
return text
|
||
params = {"token": Config.get_config("alapi", "ALAPI_TOKEN"), "text": text}
|
||
try:
|
||
data = (await AsyncHttpx.get(check_url, timeout=2, params=params)).json()
|
||
if data["code"] == 200:
|
||
if data["data"]["conclusion_type"] == 2:
|
||
return ""
|
||
except Exception as e:
|
||
logger.error(f"检测违规文本错误...{type(e)}:{e}")
|
||
return text
|