一、项目概述

1.1 功能描述

  • 用户在微信公众号发送消息

  • 系统自动调用 DeepSeek API 进行处理

  • 将处理结果返回给用户

1.2 技术架构

用户 -> 微信公众号 -> 云服务器(IPv4) -> FRP转发 -> 本地服务器(IPv6) -> DeepSeek API

用户
微信公众号
云服务器
(IPv4)
FRP转发
本地服务器
(IPv6)
DeepSeek API

1.3 所需资源

  • 微信公众号(个人订阅号)

  • DeepSeek API Key(DeepSeek 开放平台

  • 云服务器(用于转发)

  • 本地服务器(虚拟机)

  • 域名(用于配置访问)

二、详细步骤

2.1 创建项目目录(虚拟机上)

# 创建项目目录
mkdir -p /opt/wechat-bot
cd /opt/wechat-bot

# 创建虚拟环境
apt update
apt install -y python3-venv
python3 -m venv venv
source venv/bin/activate

# 创建项目结构
mkdir -p config logs

2.2 配置文件

# config/config.py
# DeepSeek 配置
DEEPSEEK_API_KEY = "your_deepseek_api_key"        # deepseek创建的api key

# 微信配置
WECHAT_TOKEN = "XXXXXX"                           # 自定义token
WECHAT_APPID = "XXXXXX"                           # 微信公众号后台的开发者ID(appid)
WECHAT_SECRET = "XXXXXXXXXXXX"                    # 微信公众号后台的开发者密码(appsecret)

# 服务配置
HOST = "127.0.0.1"
PORT = 6666                                       # 自定义虚拟机上的未被占用的端口,例如:6666

2.3 主程序代码(wechat-bot.py)

# 在虚拟机上创建 wechat_bot.py
from flask import Flask, request
import requests
import xml.etree.ElementTree as ET
import time
import hashlib

app = Flask(__name__)

# 配置信息
DEEPSEEK_API_KEY = "your_deepseek_api_key"          # 替换为你的 DeepSeek API Key
WECHAT_TOKEN = "XXXXXXXX"                           # 自定义的 Token,记住这个值
WECHAT_APPID = "xxxxxxxxxx"                         # 微信开发者后台进入后,开发者ID
WECHAT_SECRET = "XXXXXXXXX"                         # 微信开发者后台进入后,开发者密码

@app.route('/wechat', methods=['GET', 'POST'])
def wechat():
    # 处理微信服务器的验证请求
    if request.method == 'GET':
        signature = request.args.get('signature', '')
        timestamp = request.args.get('timestamp', '')
        nonce = request.args.get('nonce', '')
        echostr = request.args.get('echostr', '')
        
        # 验证签名
        if check_signature(signature, timestamp, nonce):
            return echostr
        return 'Invalid signature'

    # 处理用户消息
    if request.method == 'POST':
        xml_data = request.data
        msg = parse_xml(xml_data)
        
        # 如果是文本消息
        if msg['MsgType'] == 'text':
            # 调用 DeepSeek API
            response = call_deepseek_api(msg['Content'])
            # 构建回复消息
            reply = build_reply(msg, response)
            return reply
    
    return 'success'

def check_signature(signature, timestamp, nonce):
    # 微信签名验证
    token = WECHAT_TOKEN
    temp_list = [token, timestamp, nonce]
    temp_list.sort()
    temp_str = ''.join(temp_list)
    hash_obj = hashlib.sha1(temp_str.encode('utf-8'))
    return hash_obj.hexdigest() == signature

def parse_xml(xml_data):
    # 解析微信发来的XML消息
    root = ET.fromstring(xml_data)
    msg = {}
    for child in root:
        msg[child.tag] = child.text
    return msg

def call_deepseek_api(text):
    # 调用 DeepSeek API
    headers = {
        "Authorization": f"Bearer {DEEPSEEK_API_KEY}",
        "Content-Type": "application/json"
    }
    
    data = {
        "messages": [{"role": "user", "content": text}],
        "model": "deepseek-chat",
        "temperature": 0.7
    }
    
    response = requests.post(
        "https://api.deepseek.com/v1/chat/completions",
        json=data,
        headers=headers
    )
    
    if response.status_code == 200:
        return response.json()['choices'][0]['message']['content']
    return "抱歉,我现在无法回答这个问题。"

def build_reply(msg, content):
    # 构建回复消息的XML
    reply_xml = f"""
    <xml>
    <ToUserName><![CDATA[{msg['FromUserName']}]]></ToUserName>
    <FromUserName><![CDATA[{msg['ToUserName']}]]></FromUserName>
    <CreateTime>{int(time.time())}</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[{content}]]></Content>
    </xml>
    """
    return reply_xml

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=6666)       # 端口可以自定义为未被虚拟机上的服务占用的端口,例如:6666

2.4 服务配置

# 创建启动脚本 run.sh
#!/bin/bash
source venv/bin/activate
python wechat_bot.py

# 设置权限
chmod +x run.sh

# 创建系统服务
vim /etc/systemd/system/wechat-bot.service
[Unit]
Description=WeChat Bot Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/wechat-bot
ExecStart=/opt/wechat-bot/run.sh
Restart=always

[Install]
WantedBy=multi-user.target

2.5 FRP 配置

# /etc/frp/frpc.ini 添加
[[proxies]]
name = "wechat"
type = "http"
localIP = "127.0.0.1"
localPort = 6666                   #wechat-bot.py最后自定义的端口号
customDomains = ["wechat.A.com"]   #创建一个子域名的网站,例如:wechat.A.com

这里也可以通过1panel面板,打开FRP之后,直接在可视化页面配置,完成后点击upload

2.6 启动服务

# 安装依赖
pip install flask requests

# 启动服务
systemctl daemon-reload
systemctl start wechat-bot
systemctl enable wechat-bot

2.7 微信公众号配置

1. 登录微信公众平台

2. 进入"设置与开发" -> "基本配置"

3. 配置服务器:

  • URL:https://wechat.A.com/wechat (wechat.A.com 替换为自定义的网站二级域名)

  • Token:XXXX (wechat-bot.py和config.py设置的token)

  • 加密方式:明文模式

三、维护指南

3.1 常用命令

# 查看服务状态
systemctl status wechat-bot

# 查看日志
journalctl -u wechat-bot -f

# 重启服务
systemctl restart wechat-bot

3.2 重要文件位置

  • 配置文件:/opt/wechat-bot/config/config.py

  • 主程序:/opt/wechat-bot/wechat_bot.py

  • 服务配置:/etc/systemd/system/wechat-bot.service

  • FRP配置:/etc/frp/frpc.ini

路径可能会因每个人服务器情况而不一样