开源一个网页版钉钉:dingtalk-im

0 阅读3分钟

开源一个网页版钉钉: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/…

NPM: www.npmjs.com/package/din…