From ebd40af69eb0d9197756bc3fdc1ab98099b12f84 Mon Sep 17 00:00:00 2001 From: oldpear <1453599706@qq.com> Date: Wed, 9 Jul 2025 12:47:02 +0800 Subject: [PATCH] first commit --- .gitignore | 5 + config.toml | 30 ++++ control/__init__.py | 0 control/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 153 bytes control/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 125 bytes control/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 119 bytes control/__pycache__/control.cpython-311.pyc | Bin 0 -> 4374 bytes control/__pycache__/control.cpython-312.pyc | Bin 0 -> 5368 bytes control/__pycache__/control.cpython-38.pyc | Bin 0 -> 2099 bytes control/__pycache__/group.cpython-311.pyc | Bin 0 -> 5551 bytes control/__pycache__/notice.cpython-311.pyc | Bin 0 -> 4115 bytes control/__pycache__/private.cpython-311.pyc | Bin 0 -> 5105 bytes control/__pycache__/request.cpython-311.pyc | Bin 0 -> 2743 bytes control/group.py | 97 +++++++++++++ control/notice.py | 63 ++++++++ control/private.py | 85 +++++++++++ control/request.py | 42 ++++++ main.py | 83 +++++++++++ model/AiCat.py | 144 +++++++++++++++++++ model/Clear.py | 56 ++++++++ model/__init__.py | 0 model/__pycache__/AiCat.cpython-311.pyc | Bin 0 -> 6946 bytes model/__pycache__/AiCat.cpython-312.pyc | Bin 0 -> 2445 bytes model/__pycache__/AiCat.cpython-38.pyc | Bin 0 -> 3182 bytes model/__pycache__/Clear.cpython-311.pyc | Bin 0 -> 3844 bytes model/__pycache__/McBind.cpython-312.pyc | Bin 0 -> 1806 bytes model/__pycache__/McBind.cpython-38.pyc | Bin 0 -> 1243 bytes model/__pycache__/McFind.cpython-312.pyc | Bin 0 -> 2227 bytes model/__pycache__/McFind.cpython-38.pyc | Bin 0 -> 1457 bytes model/__pycache__/McHh.cpython-312.pyc | Bin 0 -> 1650 bytes model/__pycache__/McHh.cpython-38.pyc | Bin 0 -> 1519 bytes model/__pycache__/McList.cpython-312.pyc | Bin 0 -> 3843 bytes model/__pycache__/McList.cpython-38.pyc | Bin 0 -> 2312 bytes model/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 151 bytes model/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 123 bytes model/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 117 bytes uuid.db | Bin 0 -> 16384 bytes 37 files changed, 605 insertions(+) create mode 100644 .gitignore create mode 100644 config.toml create mode 100644 control/__init__.py create mode 100644 control/__pycache__/__init__.cpython-311.pyc create mode 100644 control/__pycache__/__init__.cpython-312.pyc create mode 100644 control/__pycache__/__init__.cpython-38.pyc create mode 100644 control/__pycache__/control.cpython-311.pyc create mode 100644 control/__pycache__/control.cpython-312.pyc create mode 100644 control/__pycache__/control.cpython-38.pyc create mode 100644 control/__pycache__/group.cpython-311.pyc create mode 100644 control/__pycache__/notice.cpython-311.pyc create mode 100644 control/__pycache__/private.cpython-311.pyc create mode 100644 control/__pycache__/request.cpython-311.pyc create mode 100644 control/group.py create mode 100644 control/notice.py create mode 100644 control/private.py create mode 100644 control/request.py create mode 100644 main.py create mode 100644 model/AiCat.py create mode 100644 model/Clear.py create mode 100644 model/__init__.py create mode 100644 model/__pycache__/AiCat.cpython-311.pyc create mode 100644 model/__pycache__/AiCat.cpython-312.pyc create mode 100644 model/__pycache__/AiCat.cpython-38.pyc create mode 100644 model/__pycache__/Clear.cpython-311.pyc create mode 100644 model/__pycache__/McBind.cpython-312.pyc create mode 100644 model/__pycache__/McBind.cpython-38.pyc create mode 100644 model/__pycache__/McFind.cpython-312.pyc create mode 100644 model/__pycache__/McFind.cpython-38.pyc create mode 100644 model/__pycache__/McHh.cpython-312.pyc create mode 100644 model/__pycache__/McHh.cpython-38.pyc create mode 100644 model/__pycache__/McList.cpython-312.pyc create mode 100644 model/__pycache__/McList.cpython-38.pyc create mode 100644 model/__pycache__/__init__.cpython-311.pyc create mode 100644 model/__pycache__/__init__.cpython-312.pyc create mode 100644 model/__pycache__/__init__.cpython-38.pyc create mode 100644 uuid.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d22ea15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +napcat/ +.idea +.venv +data/ +logs/ diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..1f412ec --- /dev/null +++ b/config.toml @@ -0,0 +1,30 @@ +#napcat配置 +bot_qq = 123456 #机器人q号 +root_qq = 1234567 # 管理员q号 +ws_uri = "loacalhost:3001" # ws 地址, 可自定义端口, 默认 3001 +webui_uri = "loacalhost:6099" # webui 地址, 可自定义端口, 默认 6099 +webui_token = "napcat" # webui 令牌, 默认 napcat +ws_token = "" # ws_uri 令牌, 默认留空 +ws_listen_ip = "localhost" # ws_uri 监听 ip, 默认 localhost 监听本机,监听全部则配置 0.0.0.0 +remote_mode = false # 是否远程模式, 即 NapCat 服务不在本机运行 ps:ncatbot官方已废弃该参数 + +# 功能配置 +allowed_groups = "all" # 授权群聊,all为全部,eg:[123456789, 987654321] +allowed_users = "all" # 授权用户,all为全部,eg:[123456789, 987654321] +ai_service = "xyit" # ai平台 支持 “dify” “xyit" +friend_auto = false # 好友自动同意 +group_auto = true +group_welcome = false # 入群欢迎 +group_welcome_message = "!at 欢迎加入本群,使用@bot /help获取此bot帮助" # 入群消息 !at 为@加群用户 +group_leave = false # 退群提醒 +group_leave_message = "用户{userid}退群了" # 退群消息 ,{userid}为退群用户id + +# dify配置 ai_service选择dify时需配置 +dify_ip= "" # ip:端口 +dify_token = "" # token + +# xyit配置 ai_service选择xyit时需配置 +xyit_ip = "ai.openapi.xyit.net" # ip 此项一般不需用修改 +xyit_appID = "" # appID +xyit_appKEY = "" # appKEY +xyit_model = "maoniang" # 模型名称 \ No newline at end of file diff --git a/control/__init__.py b/control/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/control/__pycache__/__init__.cpython-311.pyc b/control/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957d928ccc8c7fad19ceb5b5586d68b39821b178 GIT binary patch literal 153 zcmZ3^%ge<81e_TU(?RrO5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn1{hJq3={(ZioYU- literal 0 HcmV?d00001 diff --git a/control/__pycache__/__init__.cpython-312.pyc b/control/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0edfeb601dd16de953531ed170a8df90f0199aae GIT binary patch literal 125 zcmX@j%ge<81e_TU(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!l5w$$2~g`k0?v$w=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2D8#VRIHAt}Ek oCOJQ^q$ocpCO$qhFS8^*Uaz3?7Kcr4eoARhsvStzXCP((044SpdjJ3c literal 0 HcmV?d00001 diff --git a/control/__pycache__/control.cpython-311.pyc b/control/__pycache__/control.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4019147a3ed4da2d88b00dbccb0181845a55ad0b GIT binary patch literal 4374 zcmcH+TWk|o_Rhm`{366o2yqfJ0RnjQDyw#(YygEoclk(K1PCf9 ziNY3ILjxE#A_2@|b^{IKQM9Gounn;EtDkmc32UURB5lSAUv))SLVWGHGx69Cu&P$t zJ2Us5d+xdC+{by%=O&XLLHX_Afu64n2>lCpGKF3Qo;3q7ide)FZq$KW(oJ~C4w6uC zR0l<(Um=z{hFJPKiO@~>l+r=7#9n06JjLC18zE|1T&)hFb8%R1h{evcbpVVaC+Z+r z)IqYuG1Nh^B-Au!-JxM=s0&yPFf0(Yoj$L?`P`kVESQa93chFmlvxFdUTBpPMD`4b z0G|f*voO(%xyl9bS(xa}oDt@eg^6BG4t*9TdJA&!S(xb6=HRn1(OZ~< zS78>x5fJS*ov8KmPR{OP#lmjR=kLRi-s9wXN4FEh#tbZc)aMipoTJ~qh!G2TrB z;NoRu+Qz<*#6r8><#h>mdtmwEXk!M0H_mrJHH4C7){)?qP9A!n2&Sdyh~(bs|Erh30`p#efrdkE!d2XP%{-&8pakU=t^y)I*AoV+f zBiTZX{b{ppy7qvnu?bYA%hlZ|_&jcr-~t-I(ABUR{6?YE+v#In-fnT3!|nFr3lsDAk4ld&d_Oh3@Wt2j6Q`u`Y3Y+wPlqmx6wLCk!=$&zL4oJK zIW9#exX$_UhtlxhQ=_AElb_8$9A7wkQkoh{jXbpJMcUWr^nx+qmC$aVgB7W6ry%Nf z9qDxT2`-;k)Vh7$-FQhFC&&3Xk>UkT)VO%NL*Vd<*)-g8Xhfn*EKv5vt(5yt9=ikv z7tV|^w8!D{28Pv$(r?_TmNj0)i+Om5U*)T)UEJu+Iy z_D>sD#|*2Jma@?;=eC?}9%+sltCObU;X~2JnCT68lNLZV&*l;EZ^Lo@!Q4`YM(SD& z)FUH6j}3H7k@j&Bg<&&+VT%lx>35i@$2B!O3aM`kH2~-N34Ar!lAj%e!yjGZC6?My zt`7nISN*|Ky4#5~1vUJ!@;KZ8~}d1c|_2Xm9Bq}yX)-He`Dc=$)@__d}Ur@N0yUAZyHwWE~!l z!^?|)j$?7WsFz0e~jWELp6kEw8qfhqk&_Ap#TQ=B}`Ru?W%-!RZP1osb7}R zTc7A_r}ee5b**>byw?nk^2YT$6Z)NLq%ABUU3;OjSaoyx(n% zm$oHJ+rD!oO5Y1@nlUU77oXTXyg9Ua##}yHf3AK^h#rWW8xrP*n4uwQT%IsiJ~6JJ zHm;9t*m-x~y@SvwZ``;mVceBQ6bLkLkD0g6npcF^awV{fyd+CCkP=YjQMmpnP`q5& zB_R^R0ST({I_jm$9so*JiE_EKG^@#1xB*hYYg#NpGT&@i&4;q7aPJ05R+ClzSBLBT zpf*4SDQ=^nhBXMP6d0i@4PezM@>2&0&^fbm(z_)lHlPVYJ}av_gyGkojy8W!i=p*( zXQ_LMT90`Tk*r}a%3W8G_FtXM8_rt9)^Ox?WPG3`u5r^3E8`3Aor91bf zQ(sDFz5qK_EVQA4SvdW*bmqKbq!?hZ>gc9OhCglLFS1CLBntx zK#;#3s<{Wzxv8nS`=?WXy_$-gNSz7KJ-n3q_)F>Ba4K{b#Lr(mwkZDmSAz^lNkylm zsWabCU6eUB!;Gh+cNCIsfx^rp{D**fLqo&-@J(rAjM=l}-F?v0Gjc-AEIbM?Tpdo` z{);p@2`uMNgi?`PTbQ3WzQOcyPQZM7gIV~~srl14Qs+OFhR-uWCN&zB?mm!0mr}>h zw6*SUZw-)4livnXQp2CleKW2)GMvt29a*j)^S}2$ZTP?6hpmvS1GZc}R3hbuBuE2^ zjjNBt(TT%9CvtYf;cUuQAp1qG5z}h=uoo4Lojnf0j@_ZtD~J@_j#%LE^8HSZ$HpS3 zJxbogH9$Wn?Ey!N8SzD6`0#6BFh4O=O&hAldg6xl3B&p{TB)-pE$*1boivp^F;!2S zs-xPtX+y%aA&pk(tg|H*qiyHfq8lb!;w6oVlE%=knId!etrLOaz*x)4!O&o`dTn%1 z z3)z#Fu9&4uGM9~Mqb1{&AlVZ)Hz&-^q1KsF>qtkGI%^-Xhu%qA%0q3k8*YcV1;15Z zhsSBRi+a1=<75493>)qC!+wWb8R0B&i1PKwp-DdF8%XA$1T5^o5Ce|*iT Hyo~<<6SPm% literal 0 HcmV?d00001 diff --git a/control/__pycache__/control.cpython-312.pyc b/control/__pycache__/control.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49be8e518bc7e2aba74b07ccd0636469ff32b604 GIT binary patch literal 5368 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 jk#2irD)!hA0W_^8M<4F5O#YVQp4Rz^HKL?nv literal 0 HcmV?d00001 diff --git a/control/__pycache__/group.cpython-311.pyc b/control/__pycache__/group.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3705f52cdbbe5236bdda1ae2b3967e5475fb5311 GIT binary patch literal 5551 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 literal 0 HcmV?d00001 diff --git a/control/__pycache__/request.cpython-311.pyc b/control/__pycache__/request.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46bc33f4b368b2bb15f6120a463fd98cf86550c4 GIT binary patch literal 2743 zcmdT_U2NM_6u#GX{+hI1x~^&3H0^#E3($@sP5WuLsS^w)LxAF5T`iq@yXRK$2fNCQM)cy3W1f<+}H{h=)wD-P@?)X4g?K<0=iHJ5OV7HSJu)Cb*oM>QoIn7~Ivw_{^G-sCs zM~bnLahbE-a8NUBOU zsbu<<_5~xJF zX5Rr4s>FKBv1g`*vOiks?4A#St=T1xmqY9T(}C&0Iu=%R@{Sb+uMWwhbqQLNcpdvOm!Pj#|O49Rh&L1Y66&*n{_tj}L<#OD2Z$z2 za2NQqWP(z1mQd&=DDiHhV?}Fi4`I6|1wCkw;k}%FA$d!}4e|;1a88URkxAiQLGs}T zLpDJth?ObfAK7dk*bmB0XEOu3TF4ueZF-7&y8rMkYWQU(rAk>P!#W`2-`xOrZ{PX- zfY?NySH!u_09EDw|s`6j>`&cK#U~h)ud$bAO$1v!iAJP zu4h%n@a5G^20|JhnK6|mJeELc+VEPhVdgTZtlrwoV2V^Z zUm&^`-Z7&tXkWgu5=DZJ`i)pBGBuxwGV(Tbw2bGj6<4}~ogyYS(k0W48> zG#2$>V^Oapj;zLymg7e)RS%*-EkIQdqN?j`?ySpds(!?4i>f9}&9E?} zVi5%V7h(MXw}^R8SpO{oS`qN7oyt>Cee6}v@9C)$2imCXSCA*Ri08>AuUs8uaMxB*{i}{3K<`T M`)GU6V8TrGFTv|)S^xk5 literal 0 HcmV?d00001 diff --git a/control/group.py b/control/group.py new file mode 100644 index 0000000..98fea49 --- /dev/null +++ b/control/group.py @@ -0,0 +1,97 @@ +import logging +from model.AiCat import AiCat +from model.Clear import Clear +import toml + +class group: + def __init__(self, msg): + self.user_id = msg.user_id + self.group_id = msg.group_id + self.message_id = msg.message_id + self.message_type = msg.message_type + self.raw_message = msg.raw_message + self.sender = msg.sender + self.message = msg.message + self.self_id = msg.self_id + self.time = msg.time + + def main(self): + is_at = self.is_at() + if is_at is None: + return None + else: + permission = self.check_permission() + if permission is None: + return "服务器繁忙,请稍后再逝" + elif permission: + return self.menu(is_at) + else: + return "此bot未在该群启用" + + def is_at(self): + for seg in self.message: + if seg['type'] == 'at' and seg['data'].get('qq') == str(self.self_id): + texts = [s['data']['text'].strip() for s in self.message if s['type'] == 'text'] + full_text = ' '.join(texts).strip() + return full_text + + return None + + def check_permission(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + allowed_groups = config.get("allowed_groups", []) + except Exception as e: + logging.error(str(e)) + return None + + # 检查当前群是否在允许列表中 + if allowed_groups == "all": + return True + elif self.group_id in allowed_groups: + return True + else: + return False + + def menu(self,command): + if command.startswith("/help"): + return " 直接输入聊天内容即可 \n /help -- 获取帮助 \n /clear [群号 / private:Q号] (all 为全部,不填为本 群/用户) \n /status -- 查看bot状态 " + elif command.startswith("/cat"):# 留此指令接口为了方便通过审核 + # 排除 " /cat "" /cat"未传参情况 + parts = command.split("/cat ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + cat = AiCat(chat_content, self.user_id,self.group_id) + answer = AiCat.main(cat) + return answer + else: + return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + else: + return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + elif command.startswith("/clear"): + parts = command.split("/clear ", 1) + if len(parts) > 1: + group_id = parts[1].strip() + if group_id: + clear = Clear(self.user_id,group_id) + return clear.main() + else: + clear = Clear(self.user_id, self.group_id) + return clear.main() + else: + clear = Clear(self.user_id, self.group_id) + return clear.main() + elif command.startswith("/status"): + return "---猫娘 QBOT---\n Q bot 运行正常 \n 版本: 2.0 pre \n © 融玩文化 | 无尽创意MCUNC" + elif command.startswith("/"): + return "指令不存在,输入/help查看帮助" + elif command == "": + return "你似乎没有提供想和我聊的内容喵~ \n 直接输入聊天内容即可" + elif command is None: + return "你似乎没有提供想和我聊的内容喵~ \n 直接输入聊天内容即可" + else: + cat = AiCat(command, self.user_id,self.group_id) + answer = AiCat.main(cat) + return answer \ No newline at end of file diff --git a/control/notice.py b/control/notice.py new file mode 100644 index 0000000..687d7f2 --- /dev/null +++ b/control/notice.py @@ -0,0 +1,63 @@ +import toml +import logging + +class notice: + def __init__(self,msg): + print(msg) + if msg["notice_type"] == "group_increase" or msg["notice_type"] == "group_decrease": + self.time = msg["time"] + self.self_id = msg["self_id"] + self.post_type = msg["post_type"] + self.notice_type = msg["notice_type"] + self.sub_type = msg["sub_type"] + self.group_id = msg["group_id"] + self.operator_id = msg["operator_id"] + self.user_id = msg["user_id"] + else: + pass + + def main(self): + if self.notice_type == "group_increase": + return self.group_increase() + elif self.notice_type == "group_decrease": + return self.group_decrease() + else: + return None + + def group_increase(self): + print(1) + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + group_welcome = config.get("group_welcome") + print(group_welcome) + group_welcome_message = config.get("group_welcome_message") + print(group_welcome_message) + if group_welcome: + if "!at" in group_welcome_message: + return group_welcome_message.replace("!at", f"[CQ:at,qq={self.user_id}]") + else: + return group_welcome_message + else: + return None + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return None + + def group_decrease(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + group_leave = config.get("group_leave") + group_leave_message = config.get("group_leave_message") + print(group_leave_message) + if group_leave: + if "{userid}" in group_leave_message: + return group_leave_message.replace("{userid}", str(self.user_id)) + else: + return group_leave_message + else: + return None + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return None \ No newline at end of file diff --git a/control/private.py b/control/private.py new file mode 100644 index 0000000..746dd10 --- /dev/null +++ b/control/private.py @@ -0,0 +1,85 @@ +import logging +from model.AiCat import AiCat +from model.Clear import Clear +import toml + +class private: + def __init__(self, msg): + self.user_id = msg.user_id + self.message_id = msg.message_id + self.message_type = msg.message_type + self.raw_message = msg.raw_message + self.sender = msg.sender + self.message = msg.message + self.self_id = msg.self_id + self.time = msg.time + + def main(self): + texts = [seg['data']['text'].strip() for seg in self.message if seg['type'] == 'text'] + full_text = ' '.join(texts).strip() + permission = self.check_permission() + if permission is None: + return "服务器繁忙,请稍后再逝" + elif permission: + return self.menu(full_text) + else: + return "此bot未在该群启用" + + def check_permission(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + allowed_users = config.get("allowed_users", []) + except Exception as e: + logging.error(str(e)) + return None + + # 检查当前群是否在允许列表中 + if allowed_users == "all": + return True + elif self.user_id in allowed_users: + return True + else: + return False + + def menu(self,command): + if command.startswith("/help"): + return " 直接输入聊天内容即可 \n /help -- 获取帮助 \n /clear [群号 / private:Q号] (all 为全部,不填为本 群/用户) \n /status -- 查看bot状态 " + elif command.startswith(" /cat"):# 留此指令接口为了方便通过审核 + # 排除 " /cat "" /cat"未传参情况 + parts = command.split(" /cat ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + cat = AiCat(chat_content,self.user_id , f"private:{self.user_id}") + answer = AiCat.main(cat) + return answer + else: + return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + else: + return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + elif command.startswith("/clear"): + parts = command.split("/clear ", 1) + if len(parts) > 1: + group_id = parts[1].strip() + if group_id: + clear = Clear(self.user_id,group_id) + return clear.main() + else: + clear = Clear(self.user_id, f"private:{self.user_id}") + return clear.main() + else: + clear = Clear(self.user_id, f"private:{self.user_id}") + return clear.main() + elif command.startswith(" /status"): + return "---猫娘 QBOT---\n Q bot 运行正常 \n 版本: 2.0 pre \n © 融玩文化 | 无尽创意MCUNC" + elif command.startswith(" /"): + return "指令不存在,输入/help查看帮助" + elif command == "": + return "你似乎没有提供想和我聊的内容喵~ \n 直接输入聊天内容即可" + elif command is None: + return "你似乎没有提供想和我聊的内容喵~ \n 直接输入聊天内容即可" + else: + cat = AiCat(command, self.user_id,f"private:{self.user_id}") + answer = AiCat.main(cat) + return answer \ No newline at end of file diff --git a/control/request.py b/control/request.py new file mode 100644 index 0000000..0a8608f --- /dev/null +++ b/control/request.py @@ -0,0 +1,42 @@ +import logging +import toml + +class request: + def __init__(self,msg): + self.time = msg.time + self.self_id = msg.self_id + self.request_type = msg.request_type + self.sub_type = msg.sub_type + self.group_id = msg.group_id + self.user_id = msg.user_id + self.comment = msg.comment + self.flag = msg.flag + + def main(self): + if self.request_type == "friend": + friend_auto = self.get_info() + if friend_auto: + return True + else: + return False + + + def get_info(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + friend_auto = config.get("friend_auto") + return friend_auto + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return False + + def get_allow_group(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + allow_group = config.get("allowed_groups") + return allow_group + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return [] diff --git a/main.py b/main.py new file mode 100644 index 0000000..25bff22 --- /dev/null +++ b/main.py @@ -0,0 +1,83 @@ +from ncatbot.core.notice import NoticeMessage +from ncatbot.core import BotClient, Request +import logging +import asyncio +from control.group import group +from control.private import private +from control.request import request +from control.notice import notice +import toml + + +with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + bt_uin = config.get("bot_qq") + root = config.get("root_qq") + ws_uri = config.get("ws_uri") + web_uri = config.get("web_uri") + webui_token = config.get("webui_token") + ws_token = config.get("ws_token") + ws_listen_ip = config.get("ws_listen_ip") + remote_mode = config.get("remote_mode") + +bot = BotClient() +api = bot.run_blocking(bt_uin=bt_uin, root=root, ws_uri=ws_uri, web_uri=web_uri, webui_token=webui_token, ws_token=ws_token, ws_listen_ip=ws_listen_ip, remote_mode=remote_mode) + +@bot.group_event() +async def on_group_message(msg): + logging.info(f"收到消息:{msg.raw_message},来自{msg.group_id}群聊{msg.user_id}用户") + if msg.user_id == 2854196310: # qq管家,防止刷屏。bot大战请看 + pass + else: + ctrl = group(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_group_msg(group_id=msg.group_id, text=return_message, reply=msg.message_id) + +@bot.private_event() +async def on_private_message(msg): + logging.info(f"收到消息:{msg.raw_message},来自{msg.user_id}用户") + if msg.user_id == 2854196310: # qq管家,防止刷屏。 + pass + else: + ctrl = private(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_private_msg(user_id=msg.user_id, text=return_message, reply=msg.message_id) + + +@bot.request_event() +async def on_request_event(msg: Request): + logging.info(f"收到request事件:{msg.request_type},来自{msg.group_id}群聊,{msg.user_id}用户,验证消息:{msg.comment}") + ctrl = request(msg) + accept_friend_application = ctrl.main() + if accept_friend_application is True: + await msg.reply(True, comment="请求已通过") + logging.info("请求已通过") + else: + await msg.reply(False, comment="请求被拒绝") + logging.info("请求被拒绝") + + + +@bot.notice_event() +async def on_notice_event(msg: NoticeMessage): + logging.info(f"收到notice事件:{msg['notice_type']},来自{msg['user_id']}用户") + ctrl = notice(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_group_msg(group_id=msg["group_id"], text=return_message) + + + + +asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/model/AiCat.py b/model/AiCat.py new file mode 100644 index 0000000..9e3a21b --- /dev/null +++ b/model/AiCat.py @@ -0,0 +1,144 @@ +import requests +import json +import logging +import toml +import sqlite3 + +class AiCat: + def __init__(self,message,qid,group_openid): + self.message = message + self.qid = qid + self.group_openid = group_openid + self.query = f"{self.qid}{self.message}" + + + + def main(self): + with open('./config.toml', 'r', encoding='utf-8') as f: + config = toml.load(f) + + # 获取所需字段 + ai_service = config.get("ai_service") + # dify + dify_ip = config.get("dify_ip") + dify_token = config.get("dify_token") + # xyit + xyit_ip = config.get("xyit_ip") + xyit_appID = config.get("xyit_appID") + xyit_appKEY = config.get("xyit_appKEY") + xyit_model = config.get("xyit_model") + + self.init_db() + + uuid = self.get_uuid() + + if uuid == "": + logging.info("未找到 UUID") + else: + logging.info(f"找到 UUID: {uuid}") + + if ai_service == "dify": + # API URL + url = f"https://{dify_ip}/v1/chat-messages" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": dify_token # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "query": self.query, # 用户输入/提问内容 + "inputs": {}, # App 定义的变量值(默认为空) + "response_mode": "blocking", # 流式模式或阻塞模式 + "user": "QBotAPI", # 用户标识,需保证唯一性 + "conversation_id": uuid, # (选填)会话 ID,继续对话时需要传入 + "files": [], # 文件列表(选填),适用于文件结合文本理解 + "auto_generate_name": True # (选填)自动生成标题,默认为 True + } + + logging.info("请求平台:dify") + + elif ai_service == "xyit": + url = f"http://{xyit_ip}/{xyit_model}/" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "appID": xyit_appID , # 替换为你的 API 密钥 + "appKEY": xyit_appKEY + } + + # 请求体 + payload = { + "query": self.query, # 用户输入/提问内容 + "conversation_id": uuid, # (选填)会话 ID,继续对话时需要传入 + } + + logging.info("请求平台:xyit") + + else: + logging.error("未配置ai平台") + return "服务器繁忙,请稍后再逝" + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # 检查响应状态码 + if response.status_code == 200: + logging.info("请求成功!返回结果:") + response_data = response.json() + print(response_data) # test + # 存储uuid + if uuid == "": + try: + with sqlite3.connect("uuid.db") as conn: + cursor = conn.cursor() + cursor.execute("INSERT INTO groups (group_openid, uuid) VALUES (?, ?)", + (self.group_openid, response_data.get("conversation_id"))) + except sqlite3.Error as e: + logging.error(f"数据库插入错误: {e}") + + # 提取 answer 值 + answer = response_data.get("answer","服务器繁忙,请稍后再逝") + return answer + else: + logging.info(f"请求失败!状态码: {response.status_code}") + logging.info(f"错误信息: {response.text}") # 打印错误信息 + return "服务器繁忙,请稍后再逝" + + except Exception as e: + logging.info(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" + + + def get_uuid(self): + try: + with sqlite3.connect("uuid.db") as conn: + cursor = conn.cursor() + cursor.execute("SELECT uuid FROM groups WHERE group_openid = ?", (self.group_openid,)) + result = cursor.fetchone() + return result[0] if result else "" + except sqlite3.Error as e: + logging.error(f"数据库查询错误: {e}") + return "" + + def init_db(self): + try: + with sqlite3.connect("uuid.db") as conn: + cursor = conn.cursor() + cursor.execute(''' + CREATE TABLE IF NOT EXISTS groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + group_openid TEXT UNIQUE NOT NULL, + uuid TEXT NOT NULL + ) + ''') + conn.commit() + except sqlite3.Error as e: + logging.error(f"数据库初始化失败: {e}") + + + diff --git a/model/Clear.py b/model/Clear.py new file mode 100644 index 0000000..f4e8d39 --- /dev/null +++ b/model/Clear.py @@ -0,0 +1,56 @@ +import logging +import toml +import sqlite3 + + +class Clear: + def __init__(self, user_id,group_id): + self.user_id = user_id + self.group_id = group_id + + def main(self): + if self.is_root(): + if self.group_id == "all": + try: + with sqlite3.connect("uuid.db") as conn: + cursor = conn.cursor() + # 清空表中所有数据 + cursor.execute("DELETE FROM groups;") # 假设表名为 uuid_table,请根据实际表名修改 + conn.commit() + logging.info("✅ 数据库表已成功清空") + return "✅ 已清空所有群组数据" + except sqlite3.Error as e: + if 'conn' in locals(): + conn.close() + logging.error(f"❌ 数据库操作失败: {e}") + return "❌ 数据库操作失败" + else: + try: + with sqlite3.connect("uuid.db") as conn: + cursor = conn.cursor() + # 删除指定 group_id 对应的数据行 + cursor.execute("DELETE FROM groups WHERE group_openid = ?", (self.group_id,)) + conn.commit() + if cursor.rowcount > 0: + logging.info(f"✅ 已成功删除 group_id = {self.group_id} 的数据") + return f"✅ 已成功删除 group_id = {self.group_id} 的数据" + else: + logging.info(f"⚠️ 没有找到 group_id = {self.group_id} 的数据") + return f"⚠️ 没有找到 group_id = {self.group_id} 的数据" + except sqlite3.Error as e: + if 'conn' in locals(): + conn.close() + logging.error(f"❌ 数据库操作失败: {e}") + return "❌ 数据库操作失败" + + else: + return "你不是管理员哦喵~" + + def is_root(self): + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + root = config.get("root_qq") + if self.user_id == root: + return True + else: + return False diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/model/__pycache__/AiCat.cpython-311.pyc b/model/__pycache__/AiCat.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df47b4b3a0b081cf838915aba9fb1aec20e3de34 GIT binary patch literal 6946 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℘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 aY*GY4+()|mNb?&q{6!xlEL#Xza_7JAytm>2 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McBind.cpython-38.pyc b/model/__pycache__/McBind.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55d43f2d7108e4d82fb154ef4100e04055f6f5cb GIT binary patch literal 1243 zcmZuw(Q6z<7@wJ)-Md^a&DjT$su1zTeekYH+B6;_t&NC?ff~j12wgTe+ho(d-M!se zX_kxh+G0cWLO~IO2~9*HK9sZ|8cQJHlYhg!n!QV&imyJDezTXfdFU+j?R?+&o8Nr% z&G&uY*Ox;uhR^;tQ&$oCS1QMc0?K)qVG#sF3_GaO{o@J-oj9bXR1}OpL`-4yHe&P^ zsZfR|kgguU9yG3Fp*h~nj1^R+etZy6&ch5}17RV_SRo8EavN2YE+25Iz@-W8lj{4n z%c?S>qaoLl<08zk0HT2#$UqGO61ZR=9@mLb>NXR!>M=`K1Pv|cYCr)Tz=hFoD9FI? z|5wJ!Q?5-Jm$2KEmu z7+!#D$t$gr1qg2r!Ng1jO^IDj<`f8>aJsHGlnu6Ms5#X?Xg=s7~ViMbG7y%isQN-nT^G zg^163fgPv2bf}|x{iCt;ncx*OvzE!MAQY6D+&qw3jbxtNi+7Wyd-ivb|L9ezFE6&& zZgtk1d)uw#{*TG(W_$66{oOn5)qBw?@b7Q^*?xF4`Q_pM@4r6YX?B+WXy0f8ygU${ z0QbT7EBjkpd%GL$<`$UVkc_LXWN9N=+3ft)OmIurN>s<7FaJ_2zGO4;2$lD7g3Y;J>R~g@&cRZ6x{?PZ_&=S~6tGg?* zDOt_5U0IspTObgjlwk5i%TP?8Xd1yUD> zvkXJz3x}Km1_yhSO$6}DZ7RW#X*}Jj<(~ipGEKM!C8uUx=OCW>_ d?dZ>^Nl2Y9;t|<*yT`vL`!AF!0WzE?PXSU@QtAKz literal 0 HcmV?d00001 diff --git a/model/__pycache__/McFind.cpython-312.pyc b/model/__pycache__/McFind.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e67b6634a052991d5b0559118f3e066519b1d4 GIT binary patch literal 2227 zcmai0eQZ-z6u=dyLlZwY(3YOKUbl zWT3+liDfciM2#f_2MKD$CBul3#D9t`VLmV+aj)I}Vz56n_>cF#_HBX)H|e>*d+s^E zbMCqC-rHZSRuh12`nvngH+2B~fd*P53t(ay1WCXE1`C6xe2+C@aEyoX7NUv301jRU z3~>-JWFMaQY9eEpn;Jud1~(?_!ja}?mJj47^AalzCL9nX0Sgdk6V6}#^JXpUe?_H2)253D2m0H|u9uUXV$~FZ#!>!v#unpcw7{Hhbwnwxdfq za^~JZ`{>|t<>cwy_aA3Z_uL!!bPOGpwa{G$lY$Xs3(E--&(eM&5Ddz?2p0}=tW*ZA z^3bJRNM^tKdL-ScTsWchq-34I@_SicHOa%rO{AI78=B^>4Bi{~FnhQS;%rZ+a^$Si zoq{pI;ii`~^%pcjTLFTYIjzz1Ah6b2fIod$hlQWbkaZy&tNc zhpI`!+;{EDU^ff|IdZ8^rR%8je&<-*DQWg3@95y6T^S=aPwIiQdMG3$Bqrn|?4|_ugFDI8?r+lJ>rRotdvh1Uf-KYZ@&Ka(5%KG`>e{Qm%*>6M(v5dDZOWLLS(PcR8Yv_& z$Cq~8s;R$GQ=joQWM*v|vcFl#;RKi3+P~x6j?|_?mgTj7jo2Iy01j7bDgJ1~;SHG? z-ZXYm$T(gZvaGmMQvLTh1t%X0FT(OASA)7m;73Ohk_%Rmu)DU%xTc)Aw%oC%nE0uf zg1Es=q1O$)i8L*nXc|6!QW#+iP4AKX;rtAb-U}YFo&&rYVYER!r3nNC3ls;z1018A z6T117H*bih+!SAqOr2236ntT$G4(sk6S&dTB&lpzkEpm6rLH6z0PLSrYVh3`B6A768USDh804s3gv)^R0>MEie$Mvlf)gWn@5o5P@Z4>X=2IB@y+xJs~I{zDEM~iT-^4t=#yt4= zQA&>jJWZfT5-2rVR_d5(Ri#49bXsMpt3=cSt(IbX9b;6cHKmR!sfeqR!%(vDdx9cTbnzAG&zz%DLezDP_*PPQabuwGU=I9(9}xgDF>7r6ek8GxR() z#ZAVAA5mro=I(FMpzvi_cGiDtJiOWXbRnMqW^Z$DXX|dfbiet_myP?&dz<%m& zfn>bU_em^XTP)acQOG^<%|E4Oz-AWp#v5vb*24^tE zU8IwA;VztpwG)@x_iwdi8Of^h>dObiFru_!z`GFIQqCC0wa~O%9-%`XArJUaE%K!h zvLGSfOSwZ|{zf|1mBf-&#c}C90ZXL9qvOpaN0m7Lk0;XKXr+HszB9h$2Qr)?{{ZlL Bu+#tm literal 0 HcmV?d00001 diff --git a/model/__pycache__/McHh.cpython-312.pyc b/model/__pycache__/McHh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..124c6b65ce236c4cd347b9a19bfde0756320615b GIT binary patch literal 1650 zcmah}Z%kWN6u<8u{ZH$dw3&ldSk$MH0wc6kG$J!@Au#9mVQW}k-um8XYyUjnAE8Za zU?HyJm?JT%#4R$T2@4unViXMt*)(y9UpggOeZ#~=O5xKOe9+7<-uoWKK}>c&oO}M< z^SkGsd(QpYW-|jwPab{H_ZtbopGYYa)HT{{flCf>fWx97ps!c}gE}6?V?=}63`v3S(z*W3_8U`MNVTKrcb^$|mCq~jz59Gb&T?c_!m!TemYfV!-F;2s7 z&QR}CNsGP?U;|)~I1L6c+SZeDhh$msdpym}jSbC*ni`r~S{uBreqW=n$@5Oo6AGmq ztRO_gK~@eY;+}|>degY!nKv*8EASM1z#B}j$SKHOqISHE-p;mpT7t( zN>gLS%a@Apjjat`Rcf|zR~IgnraoAn`>J^1`_iS^;{5sI+??M{TmG9B)hP1)3NOhp zOCcf2DyiL^;*^*msTN6QWkq6waC}76R4N&cpG&Bu%n!<{>Gi=NFQ9VK6(VX*l~BZ} z_ym#+0-KB`SPtP!LLx5lD#lCb_HZyEiKvBDGRB7EDU&vYNJK_y9^&`lhQBt=L^mQ%Z}=tW!#dl_075NwsqfW>(2Xn^81f1I^JB; zT_4A%PR*RTerD=eet-L-2-5BXZG{h(=1RhD@d4 zHz*{vN7MlhBG)#kYHZhYctv~$I?z`lp|5QJh2R=8Dr8c#l z9cNNw=ejO9Y%K3kGdCvEb-UAC({;P4)Ej_xE=9AMNYz zJ2udLd>}R0JJ{FrL8d30Ew&l1o3k z5PUTEq{>>FP$)i*YFcUG%28>y~j;_)-$nrBWG zOrJrST*qfz4ok1lLf!=tGcPeNSvKQ}=M-$pqidBioQbB;kpF5h)*--N(c-sBPA%s4jn)2-u(E3BIq@IY^{Il9Yic~v8$59<4&V~)#}nW@(a}Ut3fl}| pkV8pQ@eT>?VIW+A4&_dVH4Bwbi^H|on(0r#IU`?GQEVtq{s*d%v9tgH literal 0 HcmV?d00001 diff --git a/model/__pycache__/McList.cpython-312.pyc b/model/__pycache__/McList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5472f35fb0472c85529b81e8ac3373bba06b5d9a GIT binary patch literal 3843 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 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McList.cpython-38.pyc b/model/__pycache__/McList.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b7ac1a4dde61375f33cdaf38c55e85d54b9c766 GIT binary patch literal 2312 zcmb6aU2has^xiwOvtP4qDIbMW>LU2C4{V_jz@`!is1Ir*q7>JX$#n0~Zo50X+?heT znKhK6eCXCD5D;mxYcwe)P)P);*7Vi*6UM|BI=k%?n)qORK+m1+7w8LjGUwiN?)kju z+;iWFL_!G0)j$61`Bg^fAxBmY0g(Oh8*u;>QJhAJ>WmW@aFQk&At7M&Dxv}v&mk%f zk%UO`5ft;ygAD43VMj`5dwMjMmk)GFj`T+I z^^{>IxkrnGuepwc@EdgiY-}S1*#scy0y*4qi#U>@u~Qmz#GKlr#RNw*wDbw)1AZm} zxP@2%roY!8YU?^2?arEAnJm@PT~&ke+<+5Ml$4$_6@{}KA^?OXoUdKrSlmrwzOyiD zVdiJ+`PK_wQe1$@cvPdL03P-s_%ZbXCXA4L$RvFN_)ko6+-D0VOr@ew5N)wfqW*p| zg4yq;e>^|~C5(|Rj*BH!@NtSM_W5id4bl(|7eNkoed9qY(@2RFByU|qYhms8)^&6h ztONOVW{BG#!iAt6r1cG`5b8vFn~2PCe~A5tQ6Y>`zR9z>+7919V}$GOMDL<6rA|cG z9DzD0gg*!$1By*w$Af^4Q=32-#~Qzn9vEDjv(7# zkilwu)hfhz^x5s&0gCzqAj>>oH*ha$V707mT)z|FP{@cFS|p~kM^v3cHX;rUxUJCCvzC^ai7fQ!|W4b$h&Z=Z^S}UAyCZcDL=_zIR8y6v9-p)&lfJAKxjnre$$n}Mx7T68a!-0KsS?+4wP>yM^C0h!7~(H$9fKPt|j z8Dm`8{68=(XtK-va0nLf5z(a}to4A-4L@){y;>Q*<=(mPUbr?_nsC3mJNMn!4svkl zi6+AvAU{Qe|62jr=y+2XDPU+Y&;T3wWrLOiDuWW+xHTnUK13Ng!0V`O)#UT^muzZn^e=rzW5Te zwHCPDpDw!>i%ZAket5S$deMr&&g|4T)i~kMLU}P7ioR#@faXj0S{4__twx|!(@;GK zsHMuK`{gr(mGMEyK@AtUa(!-ca(1Rv9-M58#%h<_yAxm<6ue4?169Urwa zIl~DXrfOP-l7yDe_*>$LDg8v&5qdP!5mHcueVSbQu=B3>uR zID`Yu^52q9i(EKK^{_ zYDQBOC!{FwwpwYvmKEisrKYPpj9&w`jRXD`uK?U}#!HpI*IwCyM}kL*`PfFj%Ugrv hgNHje;HA*pT%p3#=oN9Gy=s0RzmNuh&3Sk-`4>P{wCAAY(d13PUi1CZpdg`kg1nrE=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DC#VRIHAt}Ek lCO1DNH76!MJ~J<~BtBlRpz;=n4N$B!C)Ez5=Q9v9000@27V-c9 literal 0 HcmV?d00001 diff --git a/uuid.db b/uuid.db new file mode 100644 index 0000000000000000000000000000000000000000..77665493e3cd64bc91be25ece043df5041f95306 GIT binary patch literal 16384 zcmeI(O>YuG7zgm#E~%zTJH}WDy>yOk=rl9C!|rS^ie_Vol(x8}_C%I_QIZyD3yoLf z$%_}iQ!l0;!NkvCJa}{{(!?rvWB*SWh8gC0*!}HZ7{begMsJj{d~kLWkC;my5X&M@ z7$byin^rJw7M6K&dpvt@UcXJYFFq{OAH-hyNLIem&!$5_00Izz00bZa0SG_<0uX?} zofp`*7fY3jbu@~*$JzPmvH5D+InPeVSwFcwEIez4wJ2m!?P()qx7Kd-R4h3OpISYmUcm$G^@3ZI89w%@An)>=pGMR>$&?P#yw zG^KXKX0$ao`?`E*FwFX$?=pntLmB}0e0uX=z1Rwwb2tWV= z5P$##AaI8T*}u5O7J-GW3IB;=Q>qB&sE?AJH-N#?crJPA|7Qs zj$75r@nls9H`aMjO?VpkK36Jrc-I%2J6gDzaMGmfIC`}}_)V@9p6B|$o4AS8A{RUl z63JDX2RzV$;wl#+2$VSn*OhCNBMdy{2US;!*z0Dgu6o=NsacpvkH?Pmxnrs+?WH1( z#ge(8HoYYD8~s8r>D3*+zBqLVKmY;|fB*y_009U<00Izzz`rW6Y_D5pN1|v;>(9-G z;v<{iOwaZaRwpSpTLf#9-~TQ8otOs#0uX=z1Rwwb2tWV=5P$##AOL~?NMOmb%hvRN H0Bb)1$*8;F literal 0 HcmV?d00001