开源一个网页版钉钉:dingtalk-im
平时工作离不开钉钉,但桌面端又重又常驻后台。我把自己用的一个小工具整理开源了:dingtalk-im,一行命令在浏览器里聊钉钉。
项目地址: github.com/jianzhangg/…
NPM: www.npmjs.com/package/din…
它有什么用
- 浏览器里看会话列表、未读数、@、免打扰折叠,和客户端核心体验对齐
- 发文字、真 @ 人、引用回复、撤回自己的消息、表情回应、发表情包
- 发图片、发文件,粘贴截图直接发
- 点开会话自动标已读,实时收新消息,不用来回切客户端
- 零依赖,Node 自带,不装 Electron、不占常驻进程
怎么启动
要求 Node.js >= 18,一行就行:
npx dingtalk-im
第一次会自动做两件事:没装 dws(钉钉官方 workspace CLI)就帮你装上;没登录就弹浏览器扫码登录一次。之后打开:
http://127.0.0.1:3777
常用参数:
npx dingtalk-im --no-open # 不自动弹浏览器
npx dingtalk-im --port 8080 # 换端口
npx dingtalk-im --data-dir <path> # 换本地缓存目录
嫌黑窗口碍眼,后台跑:
Start-Process cmd -ArgumentList "/c npx -y dingtalk-im --no-open" -WindowStyle Hidden
不用时在任务管理器结束 node 进程即可。聊天记录和图片缓存在 ~/.dingtalk-im/data,删目录即清。
怎么使用
- 左侧是会话:未读数、@ 标记、免打扰的自动收进折叠文件夹,点开即标已读
- 输入框回车发送,
@唤起成员列表,选人就是真 @(对方客户端能收到提醒) - 鼠标移到消息上,气泡旁边出快捷条:表情回应、引用回复、撤回(仅自己的)
- 输入栏四个按钮:emoji、表情包(点即发送)、图片、文件;截图粘贴进输入框直接发
- 历史消息上滑翻旧页,收到新消息自动贴底,有"新消息"气泡可点
注意事项
- 只绑
127.0.0.1,不要反向代理到公网:所有接口都以你的个人钉钉身份在跑,暴露出去等于把钉钉账号挂网上 - 好友头像显示的是首字 fallback:官方接口没给头像 URL,不是 bug
- 图片消息以文件形式发出,对方能正常查看和下载
- 这是个人效率工具,不是机器人框架,别拿它做群发和自动化,会触发风控
原理
核心思路很简单:不碰私有协议,全部走官方 dws CLI 做后端聚合,Node 只做一层薄转发 + 本地缓存,前端是零构建的单页。
- 侧栏一次成型:
GET /api/sidebar把会话列表、逐会话未读数、免打扰标记、@ 列表四路结果合并完再吐给前端,前端只管渲染 - 单聊 ID 坑:单聊传的是对端 ID,很多接口要的是
openConversationId,后端调一次会话详情解析后缓存住 - 图片和文件:
resource-url换直链后走本地/api/res代理,顺手落盘缓存,刷新不重复拉 - 实时消息:
dws event consume接钉钉 Stream,SSE 推到前端,前端按会话增量合并 - 已读、撤回、引用、表情回应都是一一对应的 CLI 透调,不自己发明状态
总结
dingtalk-im 的定位就是一个轻量的本地钉钉 Web 壳:
- 一行命令启动,零依赖
- 只跑本机,数据不出内网
- 覆盖看、发、撤回、引用、表情、文件这些日常高频操作
- 全部基于官方 CLI,不碰灰色接口
如果你也觉得钉钉客户端太重,或者想在浏览器侧边栏挂一个随时可查的工作会话,可以试试。
GitHub: github.com/jianzhangg/…