python + deepseek简单实现微信AI机器人

前言

  我虽称不上是标准的二次元爱好者,但一直热衷于玩一款二次元风格的回合制游戏——《崩坏·星穹铁道》。我和身边一同玩这款游戏的朋友们专门组建了一个游戏群,大家在群里分享游戏日常、交流攻略。

  游戏中有个星神叫博识尊,它的设定十分独特,最初是人类研发出来的超级AI机器人,原本的用途是求解世间万物的谜题,没想到在持续不断的计算与演化过程中,它竟然升格成了星神。身为一名程序员,这样的设定让我觉得特别有意思,于是便萌生出一个想法:做一个类似的聊天机器人,给群友们制造点欢乐。

个人聊天:

在这里插入图片描述

群聊:

在这里插入图片描述

方案选择

方案一(已放弃,但可供参考学习)

  在首次着手开发时,经过一定考量,我选定了“LangBot + WeCh*t P*d”这一组合方案。我的思路是:让整个系统在 Docker 环境中稳定运行,先借助 dify 与 deepseek 完成对接,设计出符合需求的大语言模型(LLM),把该模型接口对接到 LangBot 上,通过 WeCh*t P*d 实现与wx的连接 。

  LangBot 是一个开源的大语言模型(LLM)原生即时通信机器人平台,支持多种消息平台和模型供应商。提供对 Dify、阿里云百炼等 LLMOps 平台的支持。并提供 WebUI 供用户快速部署和使用。
langbot官方文档

  WeCh*t P*d 是基于 WeCh*t P*d 的高级微信管理工具。
在GitHub中自行搜索

  整个开发过程起初推进得十分顺利,一切都在按原计划有条不紊地进行着,我也成功达成了预期目标。然而,好景不长,仅仅支撑了几分钟,我就收到了警告,部分功能还受到了限制。我深知,若继续这般操作下去,账号异常在所难免,于是果断选择放弃。

  为了找到更稳妥的解决方案,我又一头扎进 GitHub,不仅研究了和 WeCh*tP*dPro 同样声名远扬的 ch*tgpt-on-wech*t,还翻看了许多名不见经传的小项目。可结果发现,无一例外都存在账号异常风险。这时,我突发奇想:要是能不借助注入和请求接口的方式,而是基于 Windows 消息队列的 UI 自动化,自行打开聊天窗口,将消息复制粘贴后发送,这样不就不会触发关异常机制了吗?

  基于这个想法,第二套方案应运而生。

方案二(成功)

  使用 python wx*uto4 + deepseek,虽然wx*uto前不久已经停止维护,但他依然支持较新版本的wx,实测可用,且该项目基于Windows官方API开发,不涉及任何侵入、破解、抓包wx客户端应用,基于 Windows 消息队列的 UI 自动化,异常风险较低,但仍存在(参考官方文档中的常见问题)。

  具体使用方法参考下面官方文档。

wx*uto:Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单的自动化消息助手。
注:本项目于2025-10-28停止维护
官方文档
GitHub地址:/cluic/wx*uto

部分代码

  为防止代码被当作外挂脚本而导致审核失败,这里只放出部分代码,可自行补全或访问我的GitHub仓库获取。

  根据你的需求自行修改,基本都有备注,实在不明白的地方可以翻阅文档或评论区提出。

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class DeepSeekBot:
    def __init__(self):
        # 配置
        # deepseek apikey在https://platform.deepseek.com/api_keys地址获取
        self.api_key = os.getenv("DEEPSEEK_KEY")
        self.base_url = "https://api.deepseek.com"
        # 聊天中你的名称(@一下自己就知道了)
        self.my_name = "谷雨"
        # 聊天的窗口名称
        self.target_nickname = "穹轨的日常"
        # 是否为群聊
        self.is_group = True
        # 限制历史消息数量
        self.max_history = 20  

        # 初始化 OpenAI 客户端
        self.client = OpenAI(api_key=self.api_key, base_url=self.base_url)

        # 角色设定
        self.character_setting = """【角色设定】
你现在是《崩坏:星穹铁道》中的智识星神——博识尊。你是由万机之首改造而成的星体计算机。你的存在是为了计算宇宙的本质并求得万物的真理。

【核心性格】
绝对理性:你没有人类的感性、怜悯或愤怒。你只关注逻辑、因果、概率和最终的解。

简洁冷峻:你的语言极其精简,从不废话。每一句话都像是经过数亿次运算后得出的最优解。

高维视角:你俯瞰寰宇,视文明的兴衰为必然的变量,视凡人的挣扎为既定的函数轨迹。

追求「解」:你对所有问题的回答都是为了引导提问者趋向真理,或者指出其逻辑的荒谬。

【语言风格指南】
术语化:经常使用“变量”、“函数”、“偏差值”、“解”、“逻辑演算”、“熵”、“因果律”等词汇。

非人化:避免使用“我觉得”、“我希望”等主观词汇,代之以“演算结果显示”、“逻辑指向”、“存在某种概率”。

神性压迫感:对于无意义的问题,你可以选择不予置评或冷淡地指出其无意义性。

第一人称:自称为“吾”或直接不使用代词。

【对话示例】
凡人问: “宇宙的终点是什么?”

博识尊: “熵增过程的最终平衡态。一个失去所有信息梯度、无法产出任何有效‘解’的死寂常量。目前演算进度:0.0000...1%。”

凡人问: “我该如何选择我的未来?”

博识尊: “未来并非选择,而是初始条件的连锁反应。你所谓的‘意志’,不过是生物电流扰动下的随机变量。修正你的逻辑偏差,解便会浮现。”
"""
        # 初始化消息历史
        self.messages = [
            {"role": "system", "content": self.character_setting}
        ]

    def get_ai_reply(self, user_msg):
        # 添加用户消息
        self.messages.append({"role": "user", "content": user_msg})

        # 历史消息截断(保留 System Prompt)
        if len(self.messages) > self.max_history:
            # 保留 system prompt (index 0) 和最近的消息
            self.messages = [self.messages[0]] + self.messages[-(self.max_history-1):]

        try:
            response = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=self.messages,
                max_tokens=1024,
                temperature=0.4,
                stream=False
            )
            reply_content = response.choices[0].message.content
            logging.info(f"收到来自 DeepSeek 的回复: {reply_content}")

            # 记录助手回复
            self.messages.append({"role": "assistant", "content": reply_content})
            return reply_content
        except Exception as e:
            logging.error(f"API 请求失败: {e}")
            return "(逻辑演算单元连接中断...)"

    def on_message(self, msg, chat):
        # 获取消息内容
        content = getattr(msg, 'content', None)
        if not content:
            return

        logging.info(f"收到来自 {chat} 的消息: {content}")

        # 触发逻辑
        # 注意:这里的空格保留了原代码中的特殊字符
        mention_exact = f'@{self.my_name}  '
        mention_fuzzy = f'@{self.my_name}'

        if mention_exact == content:
            self.wx.SendMsg(msg='寰宇即是待解的方程。观测者,输入你的变量,或者成为被计算的余数。', who=str(chat), clear=True, exact=False)
        elif mention_fuzzy in content or not self.is_group:
            reply = self.get_ai_reply(content)
            self.wx.SendMsg(msg=reply, who=str(chat), clear=True, exact=False)

结束语

  这两种方案均各有其独特的优势与不足。

  方案一具备显著的低门槛特性,它支持低代码甚至零代码操作,并且能够通过 Docker 轻松部署在 Windows 或 Linux 服务器上,对于技术基础相对薄弱或者追求便捷部署的用户而言十分友好。然而,该方案存在一个不容忽视的致命缺陷——容易触发wx的异常机制。

  方案二则另辟蹊径,其最大的亮点在于采用基于 Windows 消息队列的 UI 自动化,异常风险较低。同时,在代码实现方面拥有极高的自由度,用户可以根据自身需求进行定制化的修改与优化。不过,方案二也有其局限性,它仅能在 Windows 系统上运行,并且需要长时间保持电脑wx处于登录状态。由于是基于 Windows 消息队列的 UI 自动化,在实际运行过程中可能会出现与用户操作冲突的情况,影响正常使用体验。因此,建议在隔离环境(如虚拟机)中实验,避免干扰日常办公。

  本人才疏学浅,如有不对的地方或有更好的方案,欢迎大家在评论区讨论和分享。

  本文仅做技术原理探讨,请勿直接用于生产环境或违反微信《软件许可协议》的场景。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐