微信自动消息转发器

背景介绍

在某些场景下,我们希望能够自动转发微信中的某些特定消息,以便及时处理。例如在客户服务过程中,可以将客服消息自动转发给专门负责的团队成员,或将含有特定关键词的消息转发给指定联系人。本工具可以帮助实现这样的自动化需求,并可自定义监控发送者和关键词,实现灵活的消息转发。

项目实现

一、功能概览

该代码实现了以下主要功能:

  1. 自动读取配置:通过一个配置文件(config.txt)读取配置信息,方便用户修改转发条件。
  2. 监控消息发送者:根据配置中的监控列表,只对特定发送者的消息进行转发。
  3. 关键词匹配:对非监控列表的发送者消息进行关键词匹配,匹配成功则转发。
  4. 定时清空缓存:每日清空已处理的消息缓存,以避免重复处理同一消息。
  5. 格式化消息:将转发的消息按指定格式进行包装后发送。
二、完整代码
import time
from datetime import datetime, timedelta
from wxauto import WeChat

# 从配置文件中读取设置信息
def load_config():
    config = {}
    with open("config.txt", "r", encoding="utf-8") as file:
        for line in file:
            line = line.strip()
            if line and not line.startswith("#"):
                key, value = line.split("=", 1)
                config[key.strip()] = value.strip()
    return config

# 初始化 WeChat
wx = WeChat()
config = load_config()

# 获取配置项
target_contact = config["send_to"]
switch_back_to = config["switch_back_to"]
format_message = config["format_message"]
interval_seconds = int(config.get("interval_seconds", 5))

# 监控联系人集合
monitor_senders = set(config["monitor_senders"].split(","))

# 关键词列表,用于非监控联系人匹配
keywords = set(config["keywords"].split(","))

# 记录程序启动时间
start_time = datetime.now()
reset_time = start_time + timedelta(days=1)  # 每天清空缓存

# 已处理消息记录,设置最大容量为 100
processed_messages = set()
MAX_PROCESSED_MESSAGES = 100

while True:
    # 每天清空缓存
    if datetime.now() >= reset_time:
        processed_messages.clear()
        reset_time = datetime.now() + timedelta(days=1)
        print("缓存已清空。重置下一次清空时间。")

    # 获取当前聊天窗口消息
    msgs = wx.GetAllMessage()

    # 输出并处理消息内容
    for msg in msgs:
        # 过滤程序启动前的历史消息
        if hasattr(msg, 'timestamp') and datetime.fromtimestamp(msg.timestamp) < start_time:
            continue

        # 生成消息ID,使用发送者+内容组合
        msg_id = f"{msg.sender}_{msg.content}"

        # 检查消息是否已处理过
        if msg_id in processed_messages:
            continue

        # 处理 friend 类型消息
        if msg.type == 'friend':
            # 如果是监控列表中的联系人,直接转发
            if msg.sender in monitor_senders:
                # 按格式转发消息内容
                formatted_message = format_message.format(sender=msg.sender, content=msg.content)
                wx.ChatWith(target_contact)
                wx.SendMsg(formatted_message)
                wx.ChatWith(switch_back_to)  # 切回原窗口
                print(f"已转发来自 {msg.sender} 的消息给 {target_contact}{formatted_message}")

            # 如果是非监控列表的联系人,进行关键词匹配
            else:
                if any(keyword in msg.content for keyword in keywords):
                    # 按格式转发消息内容
                    formatted_message = format_message.format(sender=msg.sender, content=msg.content)
                    wx.ChatWith(target_contact)
                    wx.SendMsg(formatted_message)
                    wx.ChatWith(switch_back_to)  # 切回原窗口
                    print(f"已转发来自 {msg.sender} 的消息给 {target_contact}{formatted_message}")

            # 记录已处理的消息
            processed_messages.add(msg_id)

            # 检查是否需要释放内存
            if len(processed_messages) > MAX_PROCESSED_MESSAGES:
                processed_messages.clear()  # 清除已处理消息记录
                start_time = datetime.now()  # 更新启动时间,避免重复处理早期消息

    # 每隔配置的时间间隔循环一次
    time.sleep(interval_seconds)
三、使用方法
  1. 配置文件示例 config.txt

    send_to=TargetContact
    switch_back_to=ChatWindow
    format_message={sender}: {content}
    interval_seconds=10
    monitor_senders=Friend1,Friend2
    keywords=urgent,important
    
    • send_to:目标联系人名称,指定消息转发的联系人。
    • switch_back_to:原聊天窗口,转发后会自动切回。
    • format_message:转发消息的格式,可以包含{sender}{content}占位符。
    • interval_seconds:每次循环的时间间隔(单位:秒)。
    • monitor_senders:监控的联系人列表,以逗号分隔。
    • keywords:关键词列表,以逗号分隔。
  2. 运行代码
    确保配置文件在同一目录下后,直接运行代码即可。

Logo

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

更多推荐