cat > /opt/wecom-bot/server_app.py << 'ENDOFFILE'
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'

def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    data = resp.json()
    return data.get('access_token')

def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')

def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {
        'touser': to_user,
        'msgtype': 'text',
        'agentid': 1000002,
        'text': {'content': content}
    }
    requests.post(url, json=payload)

@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: signature={msg_signature}, timestamp={timestamp}, nonce={nonce}')
    return echostr

@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILEfrom flask import Flask, request, jsonify
import requests

app = Flask(__name__)

CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'

def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    data = resp.json()
    return data.get('access_token')

def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')

def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {
        'touser': to_user,
        'msgtype': 'text',
        'agentid': 1000002,
        'text': {'content': content}
    }
    requests.post(url, json=payload)

@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: signature={msg_signature}, timestamp={timestamp}, nonce={nonce}')
    return echostr

@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILEfrom flask import Flask, request, jsonify
import requests

app = Flask(__name__)

CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'

def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    data = resp.json()
    return data.get('access_token')

def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')

def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {
        'touser': to_user,
        'msgtype': 'text',
        'agentid': 1000002,
        'text': {'content': content}
    }
    requests.post(url, json=payload)

@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: signature={msg_signature}, timestamp={timestamp}, nonce={nonce}')
    return echostr

@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILEfrom flask import Flask, request, jsonify
import requests

app = Flask(__name__)

CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'

def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    data = resp.json()
    return data.get('access_token')

def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')

def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {
        'touser': to_user,
        'msgtype': 'text',
        'agentid': 1000002,
        'text': {'content': content}
    }
    requests.post(url, json=payload)

@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: signature={msg_signature}, timestamp={timestamp}, nonce={nonce}')
    return echostr

@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILEfrom flask import Flask, request, jsonify
import requests

app = Flask(__name__)

CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'

def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    data = resp.json()
    return data.get('access_token')

def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')

def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {
        'touser': to_user,
        'msgtype': 'text',
        'agentid': 1000002,
        'text': {'content': content}
    }
    requests.post(url, json=payload)

@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: signature={msg_signature}, timestamp={timestamp}, nonce={nonce}')
    return echostr

@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILE

ENDOFFILE
apt update && apt upgrade -y
apt install python3 python3-pip python3-venv nginx -y
mkdir -p /opt/wecom-bot && cd /opt/wecom-bot && python3 -m venv venv && source venv/bin/activate && pip install flask requests
nano /opt/wecom-bot/server_app.py
cd /opt/wecom-bot && cat > server_app.py << 'EOF'
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')
    echostr = request.args.get('echostr')
    print(f'验证请求: {msg_signature}, {timestamp}, {nonce}')
    return echostr
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

cat server_app.py
pip3 install pycryptodome
cat > /etc/systemd/system/wecom-bot.service << 'EOF'
[Unit]
Description=WeChat Work Bot Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/wecom-bot
Environment="PATH=/opt/wecom-bot/venv/bin"
ExecStart=/opt/wecom-bot/venv/bin/python3 /opt/wecom-bot/server_app.py
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload && systemctl enable wecom-bot && systemctl start wecom-bot
systemctl status wecom-bot
cat > /etc/nginx/sites-available/wecom-bot << 'EOF'
server {
    listen 80;
    server_name api.hnllyy.cn;
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

ln -s /etc/nginx/sites-available/wecom-bot /etc/nginx/sites-enabled/ && rm -f /etc/nginx/sites-enabled/default && systemctl restart nginx
apt install certbot python3-certbot-nginx -y
certbot --nginx -d api.hnllyy.cn --non-interactive --agree-tos --register-unsafely-without-email
curl -I https://api.hnllyy.cn/wecom/callback
systemctl status wecom-bot
cat > /opt/wecom-bot/server_app.py << 'EOF'
from flask import Flask, request
import requests
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
@app.route('/wecom/callback', methods=['GET'])
def verify():
    echostr = request.args.get('echostr', '')
    if echostr:
        return echostr
    return 'Verification endpoint ready'
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

systemctl restart wecom-bot
cat > /opt/wecom-bot/server_app.py << 'ENDOFFILE'
from flask import Flask, request
import requests
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
@app.route('/wecom/callback', methods=['GET'])
def verify():
    echostr = request.args.get('echostr', '')
    if echostr:
        return echostr
    return 'Verification endpoint ready'
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
ENDOFFILE

nano /opt/wecom-bot/server_app.py
cd /opt/wecom-bot && python3 -c "
content = '''from flask import Flask, request
import requests
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f\"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}\"
    resp = requests.get(url)
    return resp.json().get(\"access_token\")
def call_coze_api(message):
    headers = {\"Authorization\": f\"Bearer {COZE_TOKEN}\", \"Content-Type\": \"application/json\"}
    payload = {\"user_id\": \"wecom_user\", \"input\": message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get(\"output\", \"抱歉，暂时无法回复。\")
def send_message(to_user, content):
    access_token = get_access_token()
    url = f\"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}\"
    payload = {\"touser\": to_user, \"msgtype\": \"text\", \"agentid\": 1000002, \"text\": {\"content\": content}}
    requests.post(url, json=payload)
@app.route(\"/wecom/callback\", methods=[\"GET\"])
def verify():
    echostr = request.args.get(\"echostr\", \"\")
    if echostr:
        return echostr
    return \"Verification endpoint ready\"
@app.route(\"/wecom/callback\", methods=[\"POST\"])
def receive():
    data = request.data.decode(\"utf-8\")
    print(f\"收到消息: {data}\")
    return \"success\"
if __name__ == \"__main__\":
    app.run(host=\"0.0.0.0\", port=5000)
'''
with open('server_app.py', 'w') as f:
    f.write(content)
print('文件创建成功')
" && systemctl restart wecom-bot && echo "服务已重启"
curl -I https://api.hnllyy.cn/wecom/callback
journalctl -u wecom-bot -n 20 --no-pager
cd /opt/wecom-bot && python3 -c "
content = '''from flask import Flask, request
import requests
import hashlib
import base64
from Crypto.Cipher import AES
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'SEA9Dic0q3IE56VfdwXnq6qGSqNy'
ENCODING_AES_KEY = '57P2VJo7MoUYCqWpBVrJFfSUDNRQ0i7ifQVqP6mqhLU'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
def verify_signature(token, signature, timestamp, nonce, echostr):
    tmp_list = [token, timestamp, nonce]
    tmp_list.sort()
    tmp_str = ''.join(tmp_list)
    tmp_str = tmp_str.encode('utf-8')
    sha1 = hashlib.sha1(tmp_str).hexdigest()
    return sha1 == signature
@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    echostr = request.args.get('echostr', '')
    if verify_signature(TOKEN, msg_signature, timestamp, nonce, echostr):
        return echostr
    return 'Verification failed', 403
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
'''
with open('server_app.py', 'w') as f:
    f.write(content)
print('文件更新成功')
" && systemctl restart wecom-bot && echo "服务已重启"
cd /opt/wecom-bot && python3 -c "
content = '''from flask import Flask, request
import requests
import hashlib
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'cX5yHZaJ7Hldu'
ENCODING_AES_KEY = 'PzrtypATxkE6l8JVc4TMR2lxKoN7MvMpnbMx7k7Daju'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
def verify_signature(token, signature, timestamp, nonce, echostr):
    tmp_list = sorted([token, timestamp, nonce, echostr])
    tmp_str = ''.join(tmp_list).encode('utf-8')
    sha1 = hashlib.sha1(tmp_str).hexdigest()
    return sha1 == signature
@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    echostr = request.args.get('echostr', '')
    if verify_signature(TOKEN, msg_signature, timestamp, nonce, echostr):
        return echostr
    return 'Verification failed', 403
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
'''
with open('server_app.py', 'w') as f:
    f.write(content)
print('文件更新成功')
" && systemctl restart wecom-bot && echo "服务已重启"
journalctl -u wecom-bot -n 10 --no-pager
cd /opt/wecom-bot && python3 -c "
content = '''from flask import Flask, request
import requests
import hashlib
import base64
from Crypto.Cipher import AES
app = Flask(__name__)
CORPID = 'ww8588eec592e63697'
AGENT_SECRET = 'P-Q6r6qyRIMyUlLutY7PO0PQm63yTYxEk5ZiLjpCpiA'
TOKEN = 'cX5yHZaJ7Hldu'
ENCODING_AES_KEY = 'PzrtypATxkE6l8JVc4TMR2lxKoN7MvMpnbMx7k7Daju'
COZE_API_URL = 'https://3b3xc3znmd.coze.site/run'
COZE_TOKEN = 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxZjc5NDVmLTJhMDAtNDgwYi1hYjkxLTU4ODk5Y2QyMDhkMyJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbInlXQlgzcHpjaWxFZko0YzJydUFmYk0wRUdJa2xMUnNyIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzg1MTM5MzE5LCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjY3MDg1NzM1NjEwMDIzOTU1Iiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjY3MTE0OTk2ODk5MjUwMjI4In0.Oy1XII5Gjg5mshKfzOnqFboemjvjecAb1RAA5_JRg_BFE-IUc0qN7BTgkDgxGZFCcz3ux3sKSXYNR83NIQ2pLp8_hQE6yFlc6u0IrEzT-gdLGBxj_nts2r1jgxegGgt3F6jF3t6N-DoJVQREExjgUkHcgA0nLFcQ092WUC33ldqtpoqMXCmc7ZBSz7QCj52b_sQ95MCv1tn3Ub70nxFm4IMVkvuXHwa8duF2eOAjO1kkVd4bDuBVvDBKid2cHf8ncsTTX035MtlGdhPVhyrM3o_xwM0uKD5pjOhf8-Bpl1PNy5IH0UEsHrNaC2mY8LNSLpa0Fs3mrIgAfFfiT9sXFQ'
def get_access_token():
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={AGENT_SECRET}'
    resp = requests.get(url)
    return resp.json().get('access_token')
def call_coze_api(message):
    headers = {'Authorization': f'Bearer {COZE_TOKEN}', 'Content-Type': 'application/json'}
    payload = {'user_id': 'wecom_user', 'input': message}
    resp = requests.post(COZE_API_URL, headers=headers, json=payload)
    return resp.json().get('output', '抱歉，暂时无法回复。')
def send_message(to_user, content):
    access_token = get_access_token()
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    payload = {'touser': to_user, 'msgtype': 'text', 'agentid': 1000002, 'text': {'content': content}}
    requests.post(url, json=payload)
def decrypt_aes(key, content):
    key = base64.b64decode(key + '=')
    iv = key[:16]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    content = base64.b64decode(content)
    result = cipher.decrypt(content)
    result = result.decode('utf-8')
    result = result[20:]  # 去掉16位random + 4位长度
    result_len = int(result[:4])
    result = result[4:4+result_len]
    return result
def verify_signature(token, signature, timestamp, nonce, echostr):
    tmp_list = sorted([token, timestamp, nonce, echostr])
    tmp_str = ''.join(tmp_list).encode('utf-8')
    sha1 = hashlib.sha1(tmp_str).hexdigest()
    return sha1 == signature
@app.route('/wecom/callback', methods=['GET'])
def verify():
    msg_signature = request.args.get('msg_signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    echostr = request.args.get('echostr', '')
    if verify_signature(TOKEN, msg_signature, timestamp, nonce, echostr):
        return decrypt_aes(ENCODING_AES_KEY, echostr)
    return 'Verification failed', 403
@app.route('/wecom/callback', methods=['POST'])
def receive():
    data = request.data.decode('utf-8')
    print(f'收到消息: {data}')
    return 'success'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
'''
with open('server_app.py', 'w') as f:
    f.write(content)
print('文件更新成功')
" && systemctl restart wecom-bot && echo "服务已重启"
