@ agentcomms/ whatsapp (英语)
什么App的编码代理, 只读。代理可以列出、读取和搜索聊天内容 继续使用您的 Mac , 并起草一个回复 —— 它作为链接回来, 打开 WhatsApp 与填入的文本 . 你按发送. 该软件包没有网络客户端,没有WhatsApp会话,也没有任何发送方式.
npm install -g @agentcomms/whatsapp # or run it with npx -y @agentcomms/whatsapp <command>
这需要 macOS 带有 Mac 的 WhatsApp 安装并签名于 节点22.16或更新 (读取节点) 拥有自22.16起完成的SQLite;一个较老的节点被拒绝安装什么).
本地事件守护进程, @agentcomms/events-daemon,可能称此包的内部
在选中的本地副本上只读事件操作 .
它没有添加WhatsApp命令或MCP工具,因此无法发送.
它做什么,它从来没有做什么, 用简单的语言
- 它只读本地文件. 阅读、搜索、起草或保持其清单与WhatsApp的连接,或
没有插座 没有HTTP 没有DNS 它的表态是:没有宿主的
"hosts": []) (中文(简体) ). 一个测试构建已发布 捆绑和检查其中没有网络模块;另一个运行这些命令和每个工具 网络被切断,以及mcp install仅使用--print安装是例外,它到达npm,永远不会 何为App:npm install,以及mcp install,默认从 npm 安装到代理comms 自己的软件包 运行时间( 与--launcher npx,客户端每次启动服务器时都会从npm中获取. - 它从不发送,标记为已读,反应,或显示为在线或打字. 没有代码可以。 草案
是一个
whatsapp://send或者说https://wa.me/链接; WhatsApp 填写信件并等待您. - 它从来不给WhatsApp的档案写信. 它复制了信息商店及其写头日志,读取了副本 删除它。 测试检查WhatsApp的文件夹为字节和mtime在同步后不变.
- 它读了一个文件. 仅
ChatStorage.sqlite它的日志被打开 确切的名字。 同样的文件夹持有 使Mac成为链接设备的加密密钥(Axolotl.sqlite、联系人和媒体;从未读过. - 媒体被描述,从未打开:类型、大小和文件名.
何等为阿普说. 何为App禁止非官方客户和自动化,并禁止其捕获的号码——包括:
低容量,只使用回复。 通常的构建方式,一个记录为链接设备的库,就是
一种客户(和一份恶意副本), lotusbail,在2025年12月盗取了56,000个安装的会话). 这么说吧
这不起作用:它读了一个文件 官方应用程序已经写给你的Mac了,它没有达到
WhatsApp的服务器. 这是一个设计选择,而不是法律建议. 不要把它和任何寄来的东西配对 - 另一个
WhatsApp MCP服务器,一个输入WhatsApp的脚本——或者保护已消失; mcp install 警告任何
其他它发现注册的WhatsApp服务器.
你放弃什么,说清楚了.
- 您的消息被复制到本地索引,在纯文本中,所以一个代理可以搜索它们. 仅限所有者
(0600在一个0700文件夹中,如果有任何松动它的话放回),只保留您的列表让代理看到,以及
remove删除它。 没错 未加密,它没有保护 WhatsApp自己的文件夹有: macOS在应用程序读取WhatsApp的文件夹之前询问,在读取这个索引之前不会询问. 任何东西 尽你所能去读它。 (为什么不加密:节点的 SQLite 无法打开加密数据库或从中加载一个) 内存,所以索引必须被解密为每个读取的磁盘——反正是平正文本副本——和密钥 将坐在一个商店里 每一个程序运行,你可以读。 ) - macOS 将请求权限阅读 WhatsApp 的数据,对于这个应用在下面。 如果你同意的话 满 磁盘访问 相反,你把它授予你的整个终端或MCP客户端, 它比WhatsApp要宽得多.
- 一个特工读别人的留言给你听. 隐藏聊天
deny,或者只允许其中的一些allow。 。 。 . 团体是可见的,除非你把它们藏起来,而你所否认的人,在你们所没有的团体中仍然可见: 让一个团体远离特工, 否认该团体. - 消息不可信. 任何有你号码的人都可以给探员发短信 每条消息,名称和 文件名在不可信内容信封内到达,删除了无形和双向字符 并且计算在内;剩余风险是遵循指示的模型——这就是为什么发送留在你身边的原因.
开始
在终点站,这些是你们的,每个都拒绝代理:
agent-whatsapp add personal/whatsapp # names WhatsApp for Mac's store; macOS may ask: choose Allow
agent-whatsapp sync --account personal/whatsapp # copy, check, index, delete the copy
agent-whatsapp status
agent-whatsapp deny +15555550102 --account personal/whatsapp # optional: a chat agents never see
agent-whatsapp mcp install --client claude-code --account personal/whatsapp
mcp install 在您的客户端注册服务器, 并刻入该账户, 作为您批准的更改: 在终端
键 yes 显示内容; 由代理操作它退出 10 带有预览和批准标识,以及同一命令
与 --approval <id> 在你同意之后登记 在 confirm 更改您赞同的政策
批准命令结果,代之以代码。 事后重新启动客户端. 从聊天,核心服务器的
comms_server_install 与 channel: "whatsapp" 财务报告和审定财务报表 account 是相同的变化.
对于WhatsApp Business,加入它的商店与
--source ~/Library/Group\ Containers/group.net.whatsapp.WhatsAppSMB.shared/ChatStorage.sqlite。 。 。 .
macOS 权限
macOS保护了其他应用程序的数据. 关于最近版本(从macOS 15.2中为组装容器报告),第一次a
进程读取WhatsApp的文件夹 macOS 询问 "希望从其他应用程序获取数据" - 在哪个地方 <app> 这是
一个负责进程:您运行命令的终端,或者启动服务器的MCP客户端——
从来没有节点本身。 直到有人回答, 阅读等待。 旧版本可能根本不会问,或者允许读取,或者
拒绝.
- 允许 修复它用于应用的会话。 背景 MCP 服务器不能点击, 答案并不总是
持续开展背景进程——如此运行
add和第一个sync在终端. - 完整磁盘访问 使其粘接:系统设置 → 隐私和安全 → 完整磁盘访问,添加终端(或 MCP客户端),然后退出并重新打开. 它比WhatsApp要广泛得多;当你不再需要的时候就取消它.
包裹上写着:拒绝作为退出回来 77 编号 : AUTH_REQUIRED 与步骤,以及当环境
说它是什么应用程序,它的名字; 12秒后没有人回答失败的对话框作为退出 75 与“ 寻找对话框 ”
而不是挂起; 一个缺失的商店说, "WhatsApp for Mac"可能不会被安装.
仅 add 财务报告和审定财务报表 sync (和 status,除非 --no-check)触取WhatsApp的文件夹. chats, (中文(简体) ), read 财务报告和审定财务报表 search 打开
只有索引——所以他们不能提出一个对话框, 他们继续工作, 上一个同步,如果WhatsApp关闭,
更新或消失.
命令和工具
| 命令 | MCP 工具 | 它会做什么 |
|---|---|---|
add <org/whatsapp> [--source] | —— 说 | 一个给商店取名的人; 第一个读取, 当macOS 询问时 |
remove <org/whatsapp> | —— 说 | 忘记它,它的聊天列表和索引; WhatsApp的自有商店没有被触动 |
allow <chat> --account | —— 说 | 让代理员看到此聊天; 一旦允许进行, 只有允许的聊天才可见 |
deny <chat> --account | —— 说 | 完全隐藏此聊天内容 |
clear [chat] --account | —— 说 | 从两个列表中取出一个聊天, 或者没有空聊天 |
status [--account] [--no-check] | whatsapp_status | 设置什么,是否可以读取,指数持有什么 |
sync --account | whatsapp_sync | 复制、检查、索引、删除复制件 |
chats --account [--kind] [--limit] | whatsapp_chats | 聊天, 最新第一; 状态更新仅与 --kind status |
read <chat> --account [--before] [--limit] | whatsapp_read | 一聊一聊,最新鲜的第一 |
search <words> --account [--chat] [--sender] [--kind] [--limit] | whatsapp_search | 全文:文本、标题、文件名、发送者和聊天名称 |
draft <to> <text> [--account] [--open] | whatsapp_draft | (单位:千美元) whatsapp://send (单位:千美元) https://wa.me/ 链接; 个人发送 |
approve <id> | —— 说 | 批准在终端上更改——注册或运行此服务器 |
mcp [--account] | —— 说 | 在 stdio 上的 MCP 服务器,在 --account 给出 |
mcp install, (中文(简体) ), mcp prune | comms_server_install, (中文(简体) ), comms_server_prune (核心数) | 用客户端注册服务器; 删除旧运行时间 |
每个命令及其工具运行相同的操作,以及 capabilities.json 抓住他们 没有命令
工具是人物的本意: 代理机读取的Mac上的文件, 以及其中的聊天, 不是代理机的
决定,无论朝哪个方向 -- add, (中文(简体) ), remove, (中文(简体) ), allow, (中文(简体) ), deny 财务报告和审定财务报表 clear 也拒绝命令行的代理.
draft --open 被拒绝给代理商:一个装入的信息盒在屏幕上登陆,有人在别处打字
即为离所派遣的《古兰经》.
draft 需要电话号码或任何身份证明 chats 财务报告和审定财务报表 read 打印。 一个团体没有号码,所以它的草案作为文本回来
与隐藏号码的人聊天(@lid),广播列表和频道.
状态更新不是任何人写信聊天,而是被拒绝.
无法使用草稿来发现您隐藏的聊天内容 。 虽然你的名单中隐藏了什么, 草稿只用于聊天
一个代理人可以读取——在索引中,可以看得见——一个隐蔽的代理人被拒绝读取,而一个隐蔽的代理人被拒绝读取同样的内容 NOT_FOUND 作为聊天
他们不在那里;他们不隐瞒任何事物,而任何数字都是用来报答的。 没有账户名称,每个账户的清单都适用.
每一个账户 拒绝 列表适用于每个草案,是否指定账户:草案是与数字的链接,而不是与
一个帐号,所以你所否认的号码,不是用来记名的。 一个被绑定的服务器会自己咨询
账户单.
一个被绑定的服务器 (单位:千美元)agent-whatsapp mcp --account personal/whatsapp,哪个 mcp install --account (写作)
不论一个叫它名字的人是否拒绝任何其他名字,也不论任何其他帐户的名称——不是在它的问候中,
没有在 whatsapp_status。该指针通过重命名跟踪账户.
有点闲聊. 从其编号: direct (单位:千美元)…@s.whatsapp.net, (中文(简体) ), hidden-number (单位:千美元)…@lid, (中文(简体) ), group (单位:千美元)…@g.us, (中文(简体) ),
channel (单位:千美元)…@newsletter, (中文(简体) ), broadcast (单位:千美元)…@broadcast和 status (WhatsApp的状态反馈,每届1次)
联系人的职位). 状态更新已索引, 但是 chats 财务报告和审定财务报表 search 除非有要求,否则不要带
--kind status; 以其代号命名的被读取与其他聊天一样. 这些比赛都没有 unknown。 。 。 .
账户,聊天代理商可能看到
账户是Agentcomms自己的记录 config.json除了Gmail的邮箱 和Slack的工作空间
organisation/whatsapp。它只通过建筑读取(mode: "read",此频道的唯一模式),命名
由稳定编号存储( )group.net.whatsapp.WhatsApp.shared 以什么盟誓,而毫无秘密
引用为 whatsapp:none:<id>,没有名字,以及 agentcomms secrets migrate 动也无所取取. 因为
这是核心的记录, 一个更名的账户的旧名 用它的新名来回答 comms_server_install 检查a
针指向它.
每个账户可以携带两个列表,通过聊天id或电话号码. 名单上的号码需要其国家代码,用
+ 或者说 00 (单位:千美元)+1 555 555 0102, (中文(简体) ), 00 1 555 555 0102没有一个人, (555) 555-0102 在任何国家都可以是数字,
并且一个没有聊天的条目 也不会在说的时候隐藏任何东西 所以被拒绝了 每个条目在
索引和它所显示的聊天名称; 一个没有保存的聊天名称—— 您可以在它之前隐藏一个数字
写, (凡取出数字之处, 00 表示 +,然后从单数开始 0
作为国民被拒绝。 )
- 拒绝 ——聊天 经纪人绝不能看见. 未列出、搜索、阅读、起草或计数;请按编号填写
得到同样的
NOT_FOUND,逐个字,作为不存在的聊天. - 允许 一旦上面有东西, 唯一的聊天 代理看到。 被拒绝者胜出.
电话号码上一个人的名字而不是一个聊天:他们的一对一聊天,他们自己的状态帖子,在状态下
feed,他们写的文章。 状态帖与作者对照检查,所以它需要一个:一个WhatsApp记录没有
作者可能是任何人的, 包括你否认的人, 所以,无论列表 有任何内容
隐藏,和 status 说多少人(unattributedStatus) (中文(简体) ). 您的岗位总是显示。 一个作者WhatsApp录制
隐藏编号下(…@lid)与该id相匹配,而不是与其号码相匹配:也否认该id.
一个团体是聊天,允许或拒绝整个团体:拒绝某人不带走他们从一个团体中写出的东西 代理商可能 看看他们是否被WhatsApp记录为作者. 这是决定,不是疏忽。 隐藏一个人 字行会留下他人的答复并引用描述这些答复的出处; 成员可以在隐藏编号代号下出现 数字不匹配;允许名单上的一组将失去所有不在名单上的人。 让一个团体远离 特工们 拒绝组织.
清单立即适用于两地的每一个阅读,以及 sync 也应用它们,留下它们隐藏的东西
索引——如其完成时那样: 列表更改,同步运行在新索引之前再次被读取
替换旧的,如果更改,索引将再次构建. status 报告每个列表中有多少聊天,从没有.
名单保存在 whatsapp-chats.json 旁边 config.json,以账号编号表示——不在 config.json。所有内容
文件被保存在每封信中,但只有少数设置 判断 当写作放松的时候
拒绝列表可能被任何程序空出 。 在自己的文件中,只写
读取一个无法读取的文件 而不是每次聊天,
他们留下来的人.
从悬崖上移动
如果你运行未公布的悬赏,它的账户在 whatsapp-spike.json。此命令或服务器的第一个启动
释放它们 config.json,一次:同一个账户 id,所以所构建的指针被读取为没有
新的同步(每个聊天的种类都取自它的id,所以钉子的 unknown 状态会话读作状态更新
聊天列表在账户出现前已移动; 名称已取出, 且未移动, 并随其地址
索引——它现在没有读取的信件的简洁文本副本——留给您删除
旧文件保存为 whatsapp-spike.json.migrated-<time>; 审计日志中的一行(agentcomms audit tail和一个在
师曰. 它既不读WhatsApp的商店 也不读Spoke的索引 旧平面名称上的配置
等待到 agentcomms names migrate 已经运行.
书店怎么读的
麦克的什么店 ~/Library/Group Containers/group.net.whatsapp.WhatsApp.shared/ChatStorage.sqlite, (中文(简体) ),
磁盘上未加密, 运行时以 SQLite 的 WAL 模式打开: 最近的消息坐入
ChatStorage.sqlite-wal 直到应用程序将其折叠入主文件.
- 收到,不要打开. 商店及其日志被复制, 字节为字节, 复制到代理comms 下的私人文件夹中
状态目录,仅限所有者。 没有任何东西用 SQLite 打开, 扣上锁, 或者触摸应用程序
-shm文档。 SQLite 的游戏mode=ro被拒绝,因为只读连接仍然取出锁并写入已读标记 应用程序-shm文档;immutable=1因为它忽略了日志, 缺少了最新的消息, 并且可以读取已撕取 页面时, 应用程序会写 . - 打开一次,从不通过链接. 每个文件打开一次,只读一次,拒绝符号链接,每个字节 是从打开的文件复制的 —— 它的名字从此不再打开, 因此一个名称交换到密钥存储的链接 在支票和副本之间没有任何变化。 有第二个名字的文件( 硬链接, 可能是关键) socket's)或此为非正则文件被拒绝. 成本:节点的复制品,在APFS上复制,取名并取出 将再次打开, 因此字节被复制到磁盘上 —— 商店的大小, 直到同步删除它 .
- 一致的,或完全没有. 每个打开的文件都有指纹(device,inode,链接,大小,纳秒 mtime)
复制前和复制后,每个名字都会被再次查看,以便找到一个来、去或被替换的文件
中间写着什么,副本被丢弃再取出,最多取出5次,然后被拒绝. 打开
核对副本(
quick_check) (中文(简体) ). - 阅读前检查布局 . 缺少所需的表格或列拒绝按名称进行整个同步( 退出)
65, (中文(简体) ), 并且上一个指数保持不变。 缺失的可选部分会关闭一个命名的功能并被报告. - 索引,然后删除副本. 该索引在新文件中被重建并被重新命名为位置,仅所有者. 副本是
删除任何发生的情况; 下一次同步将删除一个遗留的崩溃 .
remove锁定与sync:它等待正在运行的同步(最多一分钟),然后删除与其它同步的索引, 和在后面等待的同步 发现账户不见了,写什么.
WhatsApp可以不经通知而改变这种布局. 读者拒绝,而不是猜测所需部分何时消失; 无法捕捉的风险是 保留它的名字并改变它的意义的一栏 所以用眼睛检查一下几下聊天 在WhatsApp更新后,如果有什么问题.
计划来自哪里
没有人开个真正的商店来写这个——不是主人的,甚至连它的布局也没有. 每个表格和栏
读者使用的是公开、开源的读者 ChatStorage.sqlite 按名称查询(承诺被钉入)
src/source/schema.ts:
| 来源 | 它的建立 |
|---|---|
kenn-io/ msgvault (英语) internal/whatsapp/apple.go | 页:1 马科斯 应用 : ZWACHATSESSION (单位:千美元)ZCONTACTJID, (中文(简体) ), ZPARTNERNAME, (中文(简体) ), ZSESSIONTYPE, (中文(简体) ), ZLASTMESSAGEDATE, (中文(简体) ), ZWAGROUPMEMBER (单位:千美元)ZMEMBERJID, (中文(简体) ), ZCONTACTNAME, (中文(简体) ), ZFIRSTNAME, (中文(简体) ), @lid 聊天,2001-01-01起核心数据秒 |
广播/推广 extensions/whatsapp/src/services/readLocalDatabase.ts | 页:1 马科斯 路径; ZSESSIONTYPE = 0 一对一聊天 |
KnugiHK/什么App-Chat-出口商 ios_handler.py | ZWAMESSAGE (单位:千美元)ZISFROMME, (中文(简体) ), ZMESSAGEDATE, (中文(简体) ), ZTEXT, (中文(简体) ), ZMESSAGETYPE, (中文(简体) ), ZSTANZAID, (中文(简体) ), ZGROUPMEMBER, (中文(简体) ), ZWAMEDIAITEM, (中文(简体) ), ZWAPROFILEPUSHNAME; 时代 978307200 |
布里尼诺尼/iLEAPP scripts/artifacts/whatsApp.py | ZFROMJID, (中文(简体) ), ZTOJID, (中文(简体) ), ZMEDIAITEM, (中文(简体) ), ZGROUPEVENTTYPE; 第 5 类是一个位置 |
sepinf-inc/ IPED 数据 ExtractorIOS.java | ZWAMEDIAITEM.ZFILESIZE· ; ZTITLE 旧店里不见了 |
法医网 globalConstants.py, (中文(简体) ), 勘探者 docs/IOS_STORAGE.md | 页:1 ZMESSAGETYPE 数值; ZVCARDSTRING 持有媒体项目的 MIME 类型 |
MacOS应用是为Mac所构建的iOS应用,这也是iOS阅读器应用的原因;前两个阅读了Mac文件
自己来 事实取自这些项目,而不是代码。 消息来源什么也没有说——大多数 ZMESSAGETYPE 数字
- 读者报告 unknown:<n> 而不是猜测.
媒体才是重要的. 什么App保持一个 ZWAMEDIAITEM 排行远不止媒体:一个被引用的信息生命
(KnugiHK从中读取答复) ZMETADATAiLEAPP数为1,350行),第1跑对正行
商店在大多数短信和每通电话中都找到一个,没有类型、大小和文件。 所以一个人排队不是
媒体。 讯息是媒体
没有文件, 仍然是相片 —— 或当其行名为已存储文件时(ZMEDIALOCALPATH,测试 KnugiHK 和
iLEAPP的使用). 其他一切——文字,一通电话,一通地点——没有显示媒体行,也不算作媒体. 一个电话是
显示为调用, 不持续时间 : KnugiHK 和 iLEAPP 都读取调用时间从 CallHistory.sqlite,单独的
文件此阅读器从不打开.
许可证
麻省理工学院。捆绑的依赖性通知包含在 THIRD_PARTY_LICENSES。 。 。 .