TOP

操作微信发送消息

安装

pip install wxauto
pip install flask

 

原理

需要 windows 环境下, 登录微信后

启动脚本服务, flask web 接受 post 的 发送信息请求操作 微信客户端进行发送

不需要解析微信协议,操作方式较为安全

脚本

服务脚本

from wxauto import WeChat
import win32gui
import os
from flask import Flask, request, jsonify


# 动态匹配微信窗口类名并获取句柄
def find_wechat_window():
    class_names = ["WeChatMainWndForPC", "WeChatMainWndForStore"]
    for name in class_names:
        hwnd = win32gui.FindWindow(name, None)
        if hwnd != 0:
            print(f"找到微信窗口句柄: {hwnd}")
            return hwnd
    print("未找到微信窗口,请检查窗口状态或类名")
    return None


# 初始化微信操作对象
wechat_hwnd = find_wechat_window()
if wechat_hwnd is None:
    raise RuntimeError("未能找到微信窗口,程序终止")

wx = WeChat()

# 创建Flask应用
app = Flask(__name__)


@app.route('/api/sendmsg', methods=['POST'])
def send_message():
    """
    接收外部POST请求并发送消息到指定联系人。
    请求必须为JSON格式,包含'message'和'name'字段。
    """
    if 'name' not in request.form:
        return jsonify({'error': 'No name part'}), 400
    if 'message' not in request.form:
        return jsonify({'error': 'No message part'}), 400

    name = request.form['name']
    message = request.form['message']

    try:
        # 发送消息
        wx.SendMsg(msg=message, who=name)
        return jsonify({
            "status": "success"
        }), 200
    except Exception as e:
        # 捕获异常并返回错误信息
        return jsonify({
            "error": "send message failed",
            "details": str(e)
        }), 500


@app.route('/api/sendfile', methods=['POST'])
def send_file():
    """
    接收文件上传并发送到指定微信联系人
    请求格式:multipart/form-data
    参数:
    - files: 文件列表(必须)
    - name: 目标联系人(必须)
    """
    # 验证必填参数
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'}), 400

    if 'name' not in request.form:
        return jsonify({'error': 'No name part'}), 400

    name = request.form['name']
    # 获取上传的文件
    file = request.files.get('file')
    file_path = receive_wechat_file(file)

    try:
        wx.SendFiles(filepath=file_path, who=name)
        return jsonify({
            "status": "success",
        }), 200
    except Exception as e:
        # 清理已上传文件
        os.remove(file_path)
        return jsonify({"error": "send file failed", "details": str(e)}), 500


def receive_wechat_file(file):
    if file:
        # 下载文件
        dir = 'files'
        filename = file.filename
        filename = filename.replace('/', '_')  # 将斜杠替换为下划线
        filename = filename.replace('\\', '_')  # 将反斜杠替换为下划线
        filename = filename.replace('..', '_')  # 将连续的点号替换为下划线
        # filename = filename.replace('.', '_')  # 将点号替换为下划线

        if not os.path.exists(dir):
            os.makedirs(dir)

        file_path = os.path.join(dir, filename)

        print(file_path)

        file.save(file_path)
        return file_path

    return False


if __name__ == '__main__':
    # 启动Flask服务,监听所有网络接口
    app.run(host='0.0.0.0', port=80)

 

发送信息脚本

import requests


def send_message(name, message):
    """发送消息到指定API"""
    url = "http://127.0.0.1/api/sendmsg"
    data = {"message": message, "name": name}

    try:
        response = requests.post(url, data=data)
        if response.status_code == 200:
            print("请求成功,返回数据:", response.json())
        else:
            print(f"请求失败,状态码:{response.status_code},错误信息:{response.text}")
    except Exception as e:
        print(f"网络请求异常:{str(e)}")


if __name__ == '__main__':
    send_message("要发送的人民或者群聊名称", "要发送的内容")

 

posted @ 2025-06-17 15:27  羊驼之歌  阅读(107)  评论(0)    收藏  举报