Skip to content

基于 WeChat-PyRobot 简单封装的一个机器人骨架

License

Notifications You must be signed in to change notification settings

Fromsko/Wechat-Hook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Wechat-Hook

基于 WeChat-PyRobot 简单封装的一个机器人骨架

📑 已实现

  • Hook 消息 on_message | on_command
  • 回调函数 decorator
  • 防撤回并记录 msg_id
  • 可选重载 or 直接启动

🔗 数据定义

消息体 Event

  • 定义
    class Message(BaseModel):
        """
        消息模型。
    
        属性:
        - `localid`: 本地ID
        - `msgid`: 消息ID
        - `msg_type`: 消息类型
        - `is_self_msg`: 是否自己发送的消息
        - `timestamp`: 时间戳
        - `sender`: 发送者
        - `content`: 消息内容
        - `room_sender`: 房间发送者
        - `sign`: 签名
        - `thumb_path`: 缩略图路径,可以是字符串或者 None
        - `file_path`: 文件路径,可以是字符串或者 None
        """
        localid: Optional[int]
        msgid: Optional[int]
        msg_type: Optional[int]
        is_self_msg: Optional[int]
        timestamp: Optional[int]
        sender: Optional[str]
        content: Optional[str]
        room_sender: Optional[str]
        sign: Optional[str]
        thumb_path: Optional[Union[str, None]]
        file_path: Optional[Union[str, None]]
    
    
    class Event(BaseModel):
        Msg: Message
        MsgType: MessageType
        CMD: Optional[Tuple[str, Dict]]

消息类型 MessageType

  • 定义
    class MessageType(Enum):
        """
        消息类型枚举。
    
        枚举值:
        - `TEXT`: 文本消息
        - `IMAGE`: 图片消息
        - `XML`: XML卡片消息
        - `NOTIFY`: 事件通知消息
        - `LOCAL`: 位置信息
        - `CUSTOM_TYPE`: 自定义消息
        """
        TEXT = 1
        IMAGE = 3
        XML = 49
        NOTIFY = 1000
        LOCAL = 48
        CUSTOM_TYPE = 200  # 自定义的消息类型

消息事件 on_message

函数原型
def handle_message(self, msg_type: MessageType) -> Callable:
    """
    消息处理装饰器。

    参数:
    - `msg_type`: 消息类型

    返回:
    - `Callable`: 装饰器函数
    """

使用案例

  1. 文本消息

    @on_message(MessageType.TEXT)
    def handle_public_message(event: Event) -> None:
        """处理文本消息逻辑"""
        log.info(
            "文本消息: {sender}",
            sender=event.Msg.sender,
        )
  2. 图片消息

    @on_message(MessageType.IMAGE)
    def handle_image_message(event: Event) -> None:
        """处理图片消息逻辑"""
        log.info(
            "图片消息: {sender}",
            sender=event.Msg.sender,
        )

命令事件 on_command

函数原型
def handle_command(self, command_name: str, priority: int = 0) -> Callable:
    """
    命令处理装饰器。

    参数:
    - `command_name`: 命令名称
    - `priority`: 命令优先级

    返回:
    - `Callable`: 装饰器函数
    """

三种固定格式

  1. 触发条件: #聊天 xxx

    @on_command('聊天', priority=1)
    def handle_chat_command(event: Event) -> None:
        """处理 聊天 命令逻辑"""
  2. 触发条件: 当 Bot 被用户 @

    @on_command('at', priority=2)
    def handle_at_command(event: Event) -> None:
        """处理被用户 at 命令逻辑"""
  3. 触发条件: Bot自身响应

    @on_command('bot', priority=2)
    def handle_bot_command(event: Event) -> None:
        """处理机器人自身的信息"""

自定义

修改: libs.bot.event: command_parser

函数原型
def command_parser(event: Event) -> None:
    """
    命令解析

    参数:
        - `event`: 消息体
    """
    try:
        if event.Msg.content.startswith("#"):
            command = event.Msg.content[:3].split("#")[1]
            arg = event.Msg.content[3:]
            event.CMD = ("#", {command: arg})
            MsgHandler.process_command(command, event=event)
        elif event.Msg.content.startswith("@"):
            event_msg = event.Msg.content.split("\u2005")
            command = event_msg[0]  # 调用者
            arg = event_msg[1]  # 内容
            event.CMD = ("at", {command: arg})
            MsgHandler.process_command("at", event=event)
        elif event.Msg.is_self_msg:
            MsgHandler.process_command("bot", event=event)
        else:
            MsgHandler.process_message(event.MsgType, event=event)

    except (IndexError, ParameterError) as err:
        log.error(f"command_parser err: {err}")

🙏 鸣谢

感谢以下开源项目,它们为本项目的开发提供了重要支持:

  • Pillow: 🖼️ 用于图像处理的 Python 库。
  • WeChat-PyRobot 💉 注入Python到微信实现微信机器人

©️ 许可

本项目基于 MIT 许可证,请查阅 LICENSE 文件以获取更多信息。

About

基于 WeChat-PyRobot 简单封装的一个机器人骨架

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages