Token导航 LogoToken导航TokenDH.com
开发需要联网clawhub未标认证来源可访问clear审计提醒

eoffice-im电子办公即时通讯

Agent Skill

eoffice-im 用于补充开发相关能力,适合在 OpenClaw 中需要让 Agent 承接开发相关任务时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

4,039

周安装

170

GitHub Stars

公开资料未说明

下载量

1,414
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:eoffice-im(电子办公即时通讯)
来源仓库:https://github.com/quanruxiaohong/eoffice-im
安装命令:
openclaw skills install eoffice-im
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install eoffice-im

简介

提供微泛 e-office 即时通讯(IM)WebSocket API 支持,涵盖私聊与群聊功能。

  • 适合在 OpenClaw 中扩展内部通信或协作开发能力。
  • 通过 OpenClaw 的 clawhub 安装,调用前需确认网络权限和认证机制。
  • 涉及用户数据时应遵守隐私保护规范,避免越权访问。
  • 建议查阅仓库文档了解 API 版本和兼容性要求。

SKILL.md

name
eoffice-im
description
泛微 e-office 即时通讯(IM)WebSocket API - 私聊、群聊等
version
1.0.0
homepage
https://github.com/yourname/eoffice-im-skill
metadata
emoji
💬
requires
env
primaryEnv
EOFFICE_IM_TOKEN

e-office 即时通讯(IM)Skill

当用户提到以下场景时使用此 skill:

  • 发送即时消息给用户或群组
  • 查询聊天记录
  • 管理群组成员
  • 获取用户在线状态
  • 任何涉及即时通讯的操作

连接方式

WebSocket 连接

WebSocket URL: ws://{EOFFICE_IM_BASE_URL}/

连接参数

连接时需要在 handshake 中传递:

参数说明
token访问令牌
connectType连接类型:webmobileclient
loginUserId登录用户 ID

连接示例(JavaScript)

import { io } from 'socket.io-client';

const socket = io('http://localhost:3000', {
  auth: {
    token: 'your-token-here'
  },
  query: {
    connectType: 'web',
    loginUserId: 'admin'
  }
});

socket.on('connect', () => {
  console.log('Connected to IM server');
});

socket.on('private message', (msg) => {
  console.log('Received message:', msg);
});

环境配置

变量必填说明示例
EOFFICE_IM_BASE_URLIM 服务地址http://localhost:3000
EOFFICE_IM_TOKEN访问令牌从 OA 登录获取

发送消息

发送私聊消息

socket.emit('send message', {
  type: 'user',
  message_id: Date.now(),
  message_content: '消息内容(AES加密)',
  text_message_content: '消息内容(原文)',
  message_type: 1,  // 1=text, 2=image, 3=file
  sender: 'user_id',
  chat_object_id: 'room_id',
  to: 'receiver_user_id',
  sender_name: '发送者姓名'
});

响应:服务器返回相同的消息对象(包含 send_time

发送群聊消息

socket.emit('send message', {
  type: 'personal_group',  // 或 'public_group'
  message_id: Date.now(),
  message_content: '消息内容(AES加密)',
  text_message_content: '消息内容(原文)',
  message_type: 1,
  sender: 'user_id',
  room_id: 'room_id',
  members: ['user1', 'user2'],
  group_name: '群名称',
  sender_name: '发送者姓名',
  at_list: [{user_id: 'xxx', user_name: 'xxx'}]  // @人员
});

响应:服务器推送到 group message 事件

消息类型

type 值说明
user私聊消息
personal_group私人群聊
public_group公共群
message_type 值说明
1文本消息
2图片消息
3文件消息

接收消息

监听私聊消息

socket.on('private message', (msg) => {
  console.log('私聊消息:', msg);
});

监听群聊消息

socket.on('group message', (msg) => {
  console.log('群聊消息:', msg);
});

消息操作

消息已读 - 私聊

socket.emit('user readed', {
  chat_id: 'chat_object_id',
  toUserId: 'sender_user_id'
});

接收已读通知

socket.on('message have read', (data) => {
  // { type: 'user', chat_id: 'xxx', read_time: timestamp, user_id: 'xxx' }
});

消息已读 - 群聊

socket.emit('group readed', {
  chat_id: 'room_id',
  toUserId: '群ID'
});

撤回消息

socket.emit('withdraw msg', {
  chat_id: 'room_id',
  message_id: 'message_id',
  type: 'user',  // 或 'group'
  toUserId: 'user_id',
  at_list: []
});

删除消息

socket.emit('delete msg', {
  chat_id: 'room_id',
  message_id: 'message_id'
});

群组管理

创建群组

socket.emit('create group', {
  room_id: 'room_id',
  members: ['user1', 'user2']  // 不包含创建者
});

添加群成员

socket.emit('user add group', {
  room_id: 'room_id',
  members: ['user3', 'user4']
});

接收通知

socket.on('user add group', (data) => {
  // { room_id: 'xxx', members: ['user3', 'user4'] }
});

删除群成员

socket.emit('group delete user', {
  room_id: 'room_id',
  members: ['user_id']
});

解散群组

socket.emit('delete group', {
  room_id: 'room_id',
  members: ['user1', 'user2']
});

在线状态

获取在线用户

socket.emit('user onlineUsers', {}, (res) => {
  console.log(res);
  // {
  //   onlineUsers: ['user1', 'user2'],
  //   webUsers: [...],
  //   mobileUsers: [...],
  //   clientUsers: [...]
  // }
});

监听在线状态变化

socket.on('online user change', (data) => {
  // {
  //   online: { webUsers: [...], mobileUsers: [...], clientUsers: [...] },
  //   offline: { webUsers: [...], mobileUsers: [...], clientUsers: [...] }
  // }
});

修改工作状态

socket.emit('change work status', {
  userId: 'user_id',
  workStatus: 1  // 0=离线, 1=在线, 2=忙碌等
});

离线消息

获取离线消息

socket.emit('get offline info');

接收响应

// 私聊离线消息
socket.on('user offline info', (messages, callback) => {
  console.log('离线私聊消息:', messages);
  callback('success');  // 确认已接收
});

// 群聊离线消息
socket.on('group offline info', (messages, callback) => {
  console.log('离线群聊消息:', messages);
  callback('success');
});

消息格式

PersonalMessage 结构

{
  message_id: string | number;    // 消息ID
  reply_message_id?: string;        // 回复消息ID
  message_content: string;          // 加密后的消息内容
  text_message_content: string;    // 原文消息内容
  message_type: number;           // 消息类型
  sender: string;                  // 发送者ID
  send_time: number;               // 发送时间
  chat_object_id: string;         // 私聊房间ID
  withdraw: number;               // 是否撤回
  delete_user_id?: string;        // 删除消息的用户ID
  type: string;                    // 'user'
  sendType?: string;               // 发送状态
  to: string;                      // 接收者ID
  sender_name?: string;            // 发送者姓名
  reply?: any;                     // 回复内容
}

GroupMessage 结构

{
  message_id: string | number;    // 消息ID
  reply_message_id?: string;      // 回复消息ID
  message_content: string;        // 加密后的消息内容
  text_message_content: string;   // 原文消息内容
  message_type: number;          // 消息类型
  sender: string;                 // 发送者ID
  send_time: number;             // 发送时间
  withdraw: number;              // 是否撤回
  type: string;                  // 'personal_group' | 'public_group'
  sendType?: string;
  room_id?: string;              // 群房间ID
  members?: string[];            // 群成员列表
  sender_name?: string;          // 发送者姓名
  group_name?: string;           // 群名称
  at_list?: Array<{              // @人员列表
    user_id: string;
    user_name: string;
  }>;
}

连接管理

同步聊天列表

socket.emit('sync chat list');

页面通信(跨端同步)

socket.emit('page communication', {
  key: 'value'  // 任意数据
});

错误处理

监听错误事件:

socket.on('error', (error) => {
  console.error('Socket error:', error);
});

socket.on('connect_error', (error) => {
  console.error('Connection error:', error.message);
});

注意事项

  1. 消息加密:发送的消息内容需要使用 AES 加密(使用连接时提供的 crypto key)
  2. 离线消息:用户离线时,消息会存储在 Redis 中,用户上线后自动推送
  3. 多端同步:同一账号可以在 web、mobile、client 多端同时登录
  4. Token 有效期:注意处理 token 过期的情况

完整 API 文档

详见 references/im-api.md

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

78.51%
按下载量换算1,110

安全审计

VirusTotal

通过

ClawScan

可疑

Static analysis

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills