找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2328

积分

1

好友

321

主题
发表于 2025-12-31 02:49:49 | 查看: 22| 回复: 0

Jared 是一个用 Swift 编写的开源 iMessage 聊天机器人框架,由 Zeke Snider 开发。它能够绕过苹果对 iMessage 的封闭性,让任何 iMessage 会话支持机器人功能,是探索 开源实战 的一个有趣案例。

项目自 2018 年起开发,最初为挑战苹果无公开 API 的限制而生,后来演变为支持插件、Webhook 和 REST API 的可扩展工具。虽然最近更新停留在 2023 年,但其核心机制在当前 macOS(截至 2025 年 12 月)仍可运行(需注意权限和数据库兼容性)。

Jared 的独特之处在于不依赖官方钩子,而是直接操作 Messages 数据库和 AppleScript,实现可靠的收发控制,适合个人自动化、AI 集成或趣味应用。

https://github.com/ZekeSnider/Jared

核心功能特点

Jared 的设计核心围绕 iMessage 的收发机制,并且提供了以下的功能特性。

消息接收

通过定时轮询 macOS Messages 的 SQLite 数据库(chat.db,位于 ~/Library/Messages/)检测新消息,避免依赖已废弃的 AppleScript 钩子。这种数据库查询方式可靠,支持多线程处理多个会话。

消息发送

利用 AppleScript 模拟用户操作,向指定联系人或群组发送回复,支持文本、定时消息等。

内置命令

开箱即用 /help/ping/schedule 等命令,便于测试收发。

扩展支持

插件系统(Swift .bundle)、Webhook(实时通知外部服务器)和 REST API(外部程序主动发送),便于集成 AI 或自定义逻辑。

多线程与配置

支持并发处理,配置文件(config.json)灵活调整轮询间隔、Webhook URL 等。

兼容性

适用于 macOS Catalina 及更高版本,社区反馈显示在最新系统上需正确授予权限即可运行。

以下是 Jared 的架构图,清晰展示收发流程:
Jared 工作流程图
图1:Jared 应用工作流程图,展示了从 Messages.app 到核心处理逻辑的完整路径。

接下来一起实现具体的收发流程。

使用方式

下载安装

Jared 安装简单,运行后作为后台进程控制 iMessage 收发:

https://github.com/ZekeSnider/Jared/releases

从上面的仓库中下载主程序:

Jared 项目发布页
图2:GitHub Releases 页面,可下载预编译的应用或源码。

解压后得到一个 Jared 的程序,拖拽到应用程序中:

macOS 应用程序中的 Jared
图3:将 Jared.app 拖入“应用程序”文件夹完成安装。

运行授权

第一次打开的界面是没有任何授权的,需要在主界面进行授权:

Jared 插件管理授权界面
图4:首次运行需在此界面依次点击右侧按钮授权并启用服务。

依次点击右侧的四个按钮,进行授权和开启,等左侧所有的图标为绿色时,表示服务已经正常启动了。测试环境为 macOS Sequoia 15.2 版本,运行一切正常。

命令调试

当服务全部正常运行时,只需要使用另外一个账号给运行服务的那个机器上的 AppleID 发送个 iMessage 消息,例如发送 /ping 则会收到下面的回复:

iMessage 中发送 /ping 命令并收到回复
图5:通过 iMessage 发送内置命令 /ping,成功收到 “Pong!” 回复。

当你的情况跟我一致时,就可以正常的使用这个服务了。

调用API发送消息

在主程序启用 REST API 服务:

Jared REST API 启用界面
图6:在 Jared 设置中启用 REST API 功能。

启动后会监听 3005 端口,也可以在下面路径的配置文件中修改:

~/Library/Application Support/Jared/config.json

修改 webServer.port 参数:

Jared 配置文件中的端口设置
图7:可通过编辑 config.json 文件修改 REST API 服务监听的端口号。

一个简单的发送方式:

curl --location --request POST 'http://127.0.0.1:3005/message' \
--header 'Content-Type: application/json' \
--data-raw '{
  "body": {
    "message": "我!秦始皇!打钱!"
  },
  "recipient": {
    "handle": "对方手机号或AppleId"
  }
}'

当然也可以发送图片信息,只需要在消息体的 JSON 参数中增加 attachments

{
  "body": {
    "message": "我!秦始皇!打钱!"
  },
  "attachments": [
    {
      "filePath": "~/Pictures/秦始皇自拍.jpeg"
    }
  ],
  "recipient": {
    "handle": "对方手机号或AppleId"
  }
}

如果要给某个群组发送消息,就相对比较麻烦了,需要去数据库中:

~/Library/Messages/chat.db

找到对应的群组 GUID,然后构建 JSON:

{
  "body": {
    "message": "满朝文武,为何支支吾吾不发一言?"
  },
  "recipient": {
    "handle": "iMessage;+;chat100000000000",
  }
}

接收消息

当收到消息时,Jared 提供了 webhook 的方式,将消息推送到自己负责处理消息的接口中,还是需要在之前的 config.json 中配置 webhooks 的服务器:

Jared 配置文件中的 Webhook 设置
图8:配置 webhooks 部分,指定接收消息推送的服务器地址。

当收到任何短信时,都会推送到这个接口中。当然也可以根据指定的消息触发推送:

"webhooks": [
  {
    # hook地址
    "url": "http://webhook.route.com",
    # 触发规则
    "routes": [
      {
        # 规则名称唯一
        "name": "/hello",
        # 规则描述
        "description": "a test route",
        # 路由参数语法
        "parameterSyntax": "/hello",
         "comparisons": {
          # 以/hello开头的消息
          "startsWith": ["/hello"]
        }
      }
    ]
  }
],

收到的消息格式大致如下:

{
  "sendStyle": "regular",
  "date": "2025-12-25T06:45:27.000Z",
  "body": {
    "message": "123"
  },
  "sender": {
    "handle": "发送人的联系方式",
    "givenName": "发送人昵称",
    "isMe": false
  },
  "attachments": [],
  "guid": "41246071-F054-4F4E-8C64-DC8981A2817C",
  "recipient": {
    "handle": "mailto:发送人联系方式",
    "isMe": true
  }
}

根据上面的 JSON 去解析数据即可。社区常将 Jared 与 ChatGPT 集成 —— Webhook 接收消息 → 调用 OpenAI API 生成回复 → 返回 Jared 发送,实现智能 auto-reply。

你是否尝试过类似的系统自动化方案?欢迎在 云栈社区 分享你的想法与实践。




上一篇:分层RL智能体框架CoDA解决上下文爆炸,刷新多跳问答SOTA
下一篇:WebUploader 0.1.5 文件上传漏洞分析:为何全网POC都错了?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 18:32 , Processed in 0.241026 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表