# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: JHC000abc@gmail.com
@file: test.py
@time: 2023/7/10 20:21
@desc:
"""
import re
import json
import requests
from datetime import datetime
from wcferry import Wcf
from cup.util import ThreadPool
# 监控回复的群列表
ALLOW_ROOM_LISTS = ["45294489680@chatroom","18913766801@chatroom","30396277157@chatroom"]
# 机器人自己的wxid 不正确配置会导致管理命令不好使
BOT_WX_ID = "wxid_i7pj9ncrywgw02"
class ChatBotSelf():
def __init__(self):
self.pool = ThreadPool(minthreads=3,maxthreads=10,daemon_threads=True)
self.pool.start()
def get_user_status(self, user_map, user_id):
"""
:param user_map:
:param user_id:
:return:0:正常接收,1:不回复
"""
if user_map.get(user_id) is None:
user_map[user_id] = 0
return user_map.get(user_id)
def set_user_status(self, user_map, user_id, status):
"""
:param user_map:
:param user_id:
:param status:0:正常回复,1:不回复
:return:
"""
user_map[user_id] = status
def get_result(self, args):
"""
获取回复内容 这里自定义接入大模型获取回复内容
:param args:
:return:
"""
headers = {
"authority": "api.binjie.fun",
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"content-type": "application/json",
"dnt": "1",
"origin": "https://chat.jinshutuan.com",
"pragma": "no-cache",
"referer": "https://chat.jinshutuan.com/",
"sec-ch-ua": "\"Chromium\";v=\"112\", \"Google Chrome\";v=\"112\", \"Not:A-Brand\";v=\"99\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
url = "https://api.binjie.fun/api/generateStream"
data = {
"prompt": "{}".format(args),
"userId": "#/chat/1683173371474",
"network": True,
"system": "",
"withoutContext": True,
"stream": True
}
data = json.dumps(data, separators=(',', ':'))
try:
response = requests.post(
url, headers=headers, data=data, timeout=10)
response.encoding = "utf-8"
if response.status_code == 200:
return response.text
except BaseException:
return "查询失败"
def get_friends_map(self, wcf):
"""
获取微信所有联系人,群信息
:param wcf:
:return:
"""
friends_map = {}
friends_list = wcf.get_contacts()
for args in friends_list:
name = args["name"]
remark = args["remark"]
wxid = args["wxid"]
friends_map[wxid] = "{} ({})".format(name, remark)
with open("friends.json","w",encoding="utf-8")as fp:
json.dump(friends_map,fp,indent=4,ensure_ascii=False)
return friends_map
def get_sender_msg(self, msg):
"""
解析收到的消息
:param msg:
:return:
"""
# print("msg",msg)
wx_id_sender = "wxid_" + re.findall("wxid_(.*?)\[", msg)[0]
roomid = re.findall("\[(.*?)\]:", msg)[0]
wx_id_msg = re.sub("\[|\]|@","",re.findall("/msgsource>\n(.*)", msg)[0].strip())
return wx_id_sender, wx_id_msg,roomid
def recode_info(self, history_map, wx_id, question, answer):
"""
记录历史信息
:param history_map:
:param wx_id:
:param msg:
:return:
"""
max_chat = 10
if history_map.get(wx_id) is not None:
if len(history_map[wx_id]) >= max_chat:
history_map[wx_id].pop(0)
history_map[wx_id].append(
self._recode_info_get_args(
question, answer))
else:
history_map[wx_id] = [self._recode_info_get_args(question, answer)]
print("history_map",history_map)
return history_map
def _recode_info_get_args(self, question, answer):
"""
:param question:
:param answer:
:return:
"""
return {
"question": question,
"answer": answer,
"times": 1,
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
def solve_msg(self,wcf,msg,user_map,history_map,friends_map):
try:
wx_id_sender, wx_id_msg, roomid = self.get_sender_msg(msg)
print("wx_id_sender, wx_id_msg,roomid", wx_id_sender, wx_id_msg, roomid)
# 回复别人
if not msg.startswith("自己发的"):
username = friends_map.get(wx_id_sender, None)
print("username",username)
# 用户已添加好友
if username:
# 获取用户状态 0 激活,1 暂停
status = self.get_user_status(user_map, wx_id_sender)
print("status",status)
if status == 0:
# 预回复
temp_msg = "您的问题:[{}]正在查询中,请稍后……".format(wx_id_msg)
self.check_group_or_single(temp_msg, roomid, wcf, wx_id_msg, wx_id_sender,msg)
# 生成正式回复
# answer = "测试回复"
answer = self.get_result(args=wx_id_msg)
_msg = "您好,{}\n【下面是问题:[ {} ]的回复】\n{}".format(username, wx_id_msg, answer)
self.check_group_or_single(_msg, roomid, wcf, wx_id_msg, wx_id_sender,msg)
else:
temp_msg = "您当前用户状态异常,请私信机器人解封"
self.check_group_or_single(temp_msg, roomid, wcf, wx_id_msg, wx_id_sender,msg)
else:
_msg = "您不在机器人好友列表中,不支持智能回复,添加好友后,次日0时生效"
self.check_group_or_single(_msg, roomid, wcf, wx_id_msg, wx_id_sender,msg)
# 机器人自己触发特殊指令
else:
used_user_id = wx_id_msg.replace("#pause ", "").strip()
if "#pause " in wx_id_msg:
self.set_user_status(user_map, used_user_id, 1)
print("已暂停用户 {} 智能回复功能".format(used_user_id))
elif "#start " in wx_id_msg:
self.set_user_status(user_map, used_user_id, 0)
print("已开启用户 {} 智能回复功能".format(used_user_id))
elif "#history " in wx_id_msg:
self.check_group_or_single(str(history_map.get(used_user_id,None)), roomid, wcf, wx_id_msg, wx_id_sender,msg)
elif "#clear " in wx_id_msg:
history_map[used_user_id].clear()
_msg = "用户 {} 提问记录已清空".format(used_user_id)
self.check_group_or_single(_msg, roomid, wcf, wx_id_msg, wx_id_sender,msg)
else:
pass
except Exception as e:
print("遇到问题{}-----{}".format(e.__traceback__.tb_lineno,e))
def check_group_or_single(self, _msg, roomid, wcf, wx_id_msg, wx_id_sender,msg):
if roomid:
if roomid in ALLOW_ROOM_LISTS:
if "@ㅤ " in msg:
wcf.send_text(_msg, roomid, wx_id_sender)
else:
if wx_id_sender and wx_id_msg:
wcf.send_text(_msg, wx_id_sender)
def process(self):
"""
:return:
"""
wcf = Wcf()
# wcf.is_login()
friends_map = self.get_friends_map(wcf)
print("friends_map",friends_map)
# 把机器人加进去
friends_map[BOT_WX_ID] = "智能机器人"
history_map = {}
user_map = {}
recv_status = wcf.enable_receiving_msg()
while recv_status:
while not wcf.msgQ.qsize():
continue
msg = str(wcf.get_msg())
# self.solve_msg(wcf,msg,user_map,history_map,friends_map)
self.pool.add_1job(self.solve_msg,
wcf,msg,user_map,history_map,friends_map)
self.pool.stop()
if __name__ == '__main__':
cbs = ChatBotSelf()
cbs.process()
Wechat智能机器人
最新推荐文章于 2024-07-18 16:05:52 发布