微信注记管理

发布于 3 天前  94 次阅读


📖 工具简介

本工具基于Python开发,通过监听微信文件传输助手实现消息的增删管理,支持实时统计和数据持久化存储。无需数据库即可完成消息归档,是个人碎片化备忘录注记管理的轻量级解决方案。

🛠️ 环境准备

1. 微信版本要求

  • 必须使用微信PC版3.9.11.17​(点击下载)
  • 登录微信并保持窗口处于打开状态

⚠️ 注意:新版微信可能不兼容,请严格使用指定版本

🚀 快速启动

  1. 下载程序文件 微信注记管理系统.exe
  2. 启动程序:
     进入--微信注记管理系统.exe--点击启动监听按钮
  1. 主界面功能分区:
    • 控制面板:启动/停止监听
    • 统计面板:实时显示消息总量/当前记录/删除数
    • 日志窗口:显示操作记录和系统状态

✨ 核心功能

1. 添加消息记录

向文件传输助手发送:

+你的消息内容

示例:

+项目会议纪要2024 @重要
+客户张经理电话13812345678

2. 删除消息记录

发送指定格式删除:

-消息ID

示例:

-1024  # 删除ID为1024的记录

3. 数据统计

  • 自动计算总消息量
  • 实时显示有效记录数
  • 跟踪已删除记录数

🔧 高级配置

存储路径

"和微信注记管理系统.exe同级目录/msg_data.txt"

⚡ 性能

🐛 常见问题

Q1: 消息发送后无反应

✅ 检查步骤:

  1. 确认微信版本正确
  2. 程序窗口是否显示"监听中"
  3. 消息是否以+-开头

🌟 使用场景

个人注记备忘管理

  • 临时信息归档
  • 重要事项提醒
  • 联系人信息保存

📊 下载

微信注记管理系统.exe 密码:2288

"""
微信消息管理系统 by PySimpleGUI
功能:监听微信文件助手消息,实现消息增删管理,支持数据统计和持久化存储
日期:2025-03-12
版本:2.1
"""

# 导入模块
import PySimpleGUI as sg  # GUI框架[2,3](@ref)
import time  # 时间控制
import os  # 文件操作
import re  # 正则表达式
from threading import Thread, Event  # 多线程支持
from wxauto import WeChat
import pythoncom  # 新增导入
import threading

# ================== 全局配置 ==================
RECORD_FILE = "wechat_msg.txt"  # 消息存储文件路径[3](@ref)
STATS = {"total": 0, "current": 0, "deleted": 0}  # 统计计数器
RUNNING_FLAG = Event()  # 线程运行控制标志[2](@ref)


# ================== 文件管理模块 ==================
def init_files():
    """初始化消息记录文件
    1. 检查文件是否存在,不存在则创建
    2. 加载初始统计信息[3](@ref)
    """
    if not os.path.exists(RECORD_FILE):
        with open(RECORD_FILE, 'w') as f:
            f.write("")  # 创建空文件
    load_stats()


def load_stats():
    """加载统计数据
    1. 读取有效消息行数作为当前记录
    2. 计算最大ID作为历史总量
    3. 计算已删除数[3](@ref)
    """
    if os.path.exists(RECORD_FILE):
        with open(RECORD_FILE, 'r') as f:
            valid_lines = [line for line in f if line.strip()]
            STATS["current"] = len(valid_lines)
            max_id = max(int(line.split(':')[0]) for line in valid_lines) if valid_lines else 0
            STATS["total"] = max_id  # 历史最大ID即为总记录数
            STATS["deleted"] = STATS["total"] - STATS["current"]


# ================== 核心业务逻辑 ==================
def process_message(msg):
    """消息处理引擎
    参数:
        msg: 接收的原始消息文本
    返回:
        处理后的消息记录或None[3](@ref)
    """
    # 添加消息逻辑
    """消息处理引擎(修复版本)"""
    if msg.startswith('+'):
        # 生成ID时加锁(新增代码)
        with threading.Lock():
            new_id = STATS["total"] + 1
            STATS["total"] = new_id
            STATS["current"] += 1

        new_record = f"{new_id}: {msg[1:].strip()}\n"

        # 原子化写入(优化代码)
        with open(RECORD_FILE, 'a') as f:
            f.write(new_record)

        # 返回最新记录(新增代码)
        with open(RECORD_FILE, 'r') as f:
            return f.read()

    # 删除消息逻辑
    elif msg.startswith('-') and msg[1:].isdigit():
        target = int(msg[1:])  # 解析目标ID
        updated_lines = []  # 新内容缓冲区

        # 读写模式原子化操作
        with open(RECORD_FILE, 'r+') as f:
            for line in f:  # 逐行扫描
                if line.startswith(f"{target}:"):
                    STATS["deleted"] += 1
                    STATS["current"] -= 1
                else:
                    updated_lines.append(line)
            # 覆盖写入过滤后的内容
            f.seek(0)
            f.writelines(updated_lines)
            f.truncate()

        # 返回更新后完整记录
        with open(RECORD_FILE, 'r') as f:
            return ''.join(f.readlines())

    return None  # 未识别的消息类型


# ================== 监听线程模块 ==================
def wechat_listener(window):
    """基于wxauto的微信消息监听线程"""
    pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED)  # 新增关键代码[3](@ref)
    # 初始化微信实例(网页1/3/7)
    wx = WeChat()
    wx.AddListenChat("文件传输助手")  # 核心监听配置(网页2/8)

    while RUNNING_FLAG.is_set():
        try:
            # 实时获取监听消息(网页4/7关键API)
            msgs = wx.GetListenMessage()

            for chat_win, msg_list in msgs.items():
                for msg in msg_list:
                    # 过滤非文本消息(网页5/9优化点)
                    if (msg.type not in ['friend', 'group', 'self']) or (not msg.content.strip()) or (not msg.content.startswith(('+', '-'))):
                        continue

                    # 消息处理流水线
                    response = process_message(msg.content)

                    # 在消息处理部分添加:
                    if response:
                        # 发送完整记录(网页3建议反馈操作结果)
                        chat_win.SendMsg(f"更新后的注记:\n{response}")

                    window.write_event_value('-STATUS-', STATS.copy())

            time.sleep(0.8)  # 优化轮询间隔(网页1防封建议)

        except Exception as e:
            print(f"监听异常: {str(e)}")
            wx = WeChat()  # 自动重连(网页8容错机制)
            wx.AddListenChat("文件传输助手")

# ================== GUI界面模块 ==================
def main_window():
    """主窗口布局
    使用LightBlue2主题,包含:
    - 操作按钮区
    - 数据统计区
    - 日志显示区[2,3](@ref)
    """
    sg.theme('LightBlue2')  # 设置主题[5](@ref)

    # 新增提示信息板块
    help_text = [
        "操作指南:",
        "1. 启动前请确保微信PC版已登录且版本为3.9.11.17",
        "2. 追加词条:给文件传输助手发送 +注记内容 (例:+购买服务器)",
        "3. 删除词条:给文件传输助手发送 -注记ID   (例:-123)"
    ]

    # 界面布局结构
    layout = [
        # 标题行
        [sg.Text("微信注记管理系统", font=('微软雅黑', 16), pad=10, expand_x=True)],

        # 新增版本提示行(带超链接)
        [sg.Frame("环境准备", [
            [sg.Text("▷ 微信版本要求:", font=('微软雅黑', 10)),
             sg.Text("3.9.11.17",
                     enable_events=True,
                     tooltip="点击下载指定版本",
                     font=('微软雅黑', 10, 'underline'),
                     text_color='blue',
                     key='-VERSION_LINK-')],
            [sg.Text("▷ by baivbai:", font=('微软雅黑', 10)),
             sg.Text("ziyunchu.com",
                     enable_events=True,
                     tooltip="点击进入博客",
                     font=('微软雅黑', 10, 'underline'),
                     text_color='blue',
                     key='-ZIYUNCHU_LINK-')]
        ], pad=10, title_color='#2B579A')],

        # 新增帮助说明板块
        [sg.Frame("使用说明", [
            [sg.Text('\n'.join(help_text),
                     font=('宋体', 10),
                     text_color='#444444')]
        ], pad=10, title_color='#2B579A')],

        # 操作面板
        [sg.Frame("操作面板", [
            [sg.Button("启动监听", key='-START-', button_color=('white', '#2B579A')),
             sg.Button("停止", key='-EXIT-', button_color=('white', '#8C8C8C'))]
        ], pad=10)],

        # 数据统计区
        [sg.Frame("数据统计", [
            [sg.Column([
                [sg.Text("当前记录:", size=10), sg.Text("0", key='-CURRENT-', size=15)],
                [sg.Text("历史总量:", size=10), sg.Text("0", key='-TOTAL-', size=15)],
                [sg.Text("已删除数:", size=10), sg.Text("0", key='-DELETED-', size=15)]
            ])]
        ], pad=10)],

        # 日志显示区
        [sg.Multiline("等待消息...\n", key='-LOG-', size=(50, 15), autoscroll=True)]
    ]

    # 创建窗口对象
    return sg.Window('微信注记管理',
                     layout,
                     resizable=True,  # 允许窗口缩放
                     finalize=True,  # 立即渲染
                     element_justification='center')  # 元素居中


# ================== 主程序入口 ==================
def main():
    """程序入口函数
    1. 初始化文件系统
    2. 创建GUI窗口
    3. 事件循环处理[2,3](@ref)
    """
    init_files()  # 初始化文件
    window = main_window()  # 创建窗口
    window.set_min_size((800, 600))  # 设置最小尺寸

    try:
        # 主事件循环
        while True:
            event, values = window.read(timeout=100)  # 非阻塞读取

            # 退出事件处理
            if event in (sg.WIN_CLOSED, '-EXIT-'):
                RUNNING_FLAG.clear()  # 停止线程
                break

            # 启动监听事件
            elif event == '-START-':
                RUNNING_FLAG.set()  # 设置运行标志
                Thread(target=wechat_listener, args=(window,), daemon=True).start()
                window['-START-'].update(disabled=True)  # 禁用启动按钮

            # 状态更新事件
            elif event == '-STATUS-':
                # 实时更新统计显示
                window['-CURRENT-'].update(STATS["current"])
                window['-TOTAL-'].update(STATS["total"])
                window['-DELETED-'].update(STATS["deleted"])
                # 追加日志信息
                window['-LOG-'].update(f"记录已更新:\n{values[event]}\n", append=True)

            # 在主事件循环中新增:
            if event == '-VERSION_LINK-':
                import webbrowser
                webbrowser.open(
                    'https://github.com/tom-snow/wechat-windows-versions/releases/download/v3.9.11.17/WeChatSetup-3.9.11.17.exe')

            # 在主事件循环中新增:
            if event == '-ZIYUNCHU_LINK-':
                import webbrowser
                webbrowser.open(
                    'https://ziyunchu.com')

    except Exception as e:
        sg.popup_error(f"程序异常: {str(e)}")  # 错误弹窗[3](@ref)
    finally:
        window.close()  # 确保窗口关闭


if __name__ == "__main__":
    main()

走过的路,都会留下痕迹,以供借鉴。