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 的架构图,清晰展示收发流程:

图1:Jared 应用工作流程图,展示了从 Messages.app 到核心处理逻辑的完整路径。
接下来一起实现具体的收发流程。
使用方式
下载安装
Jared 安装简单,运行后作为后台进程控制 iMessage 收发:
https://github.com/ZekeSnider/Jared/releases
从上面的仓库中下载主程序:

图2:GitHub Releases 页面,可下载预编译的应用或源码。
解压后得到一个 Jared 的程序,拖拽到应用程序中:

图3:将 Jared.app 拖入“应用程序”文件夹完成安装。
运行授权
第一次打开的界面是没有任何授权的,需要在主界面进行授权:

图4:首次运行需在此界面依次点击右侧按钮授权并启用服务。
依次点击右侧的四个按钮,进行授权和开启,等左侧所有的图标为绿色时,表示服务已经正常启动了。测试环境为 macOS Sequoia 15.2 版本,运行一切正常。
命令调试
当服务全部正常运行时,只需要使用另外一个账号给运行服务的那个机器上的 AppleID 发送个 iMessage 消息,例如发送 /ping 则会收到下面的回复:

图5:通过 iMessage 发送内置命令 /ping,成功收到 “Pong!” 回复。
当你的情况跟我一致时,就可以正常的使用这个服务了。
调用API发送消息
在主程序启用 REST API 服务:

图6:在 Jared 设置中启用 REST API 功能。
启动后会监听 3005 端口,也可以在下面路径的配置文件中修改:
~/Library/Application Support/Jared/config.json
修改 webServer.port 参数:

图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 的服务器:

图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。
你是否尝试过类似的系统自动化方案?欢迎在 云栈社区 分享你的想法与实践。