Wechat智能机器人

# !/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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值