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: - EOFFICE_IM_BASE_URL - EOFFICE_IM_TOKEN primaryEnv: EOFFICE_IM_TOKEN
當用戶提到以下場景時使用此 skill: - 傳送即時訊息給使用者或群組 - 查詢聊天記錄 - 管理群組成員 - 獲取使用者線上狀態 - 任何涉及即時通訊的操作
WebSocket URL: ws://{EOFFICE_IM_BASE_URL}/
連線時需要在 handshake 中傳遞:
| 引數 | 說明 |
|---|---|
| token | 訪問令牌 |
| connectType | 連線型別:web、mobile、client |
| loginUserId | 登入使用者 ID |
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_URL |
是 | IM 服務地址 | 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');
});
{ 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; // 回覆內容 }這個技能的最新版本可以在7w4.net小蔥技能站找到。
{
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);
});
詳見 references/im-api.md
這個即時通訊 Skill 文件質量良好,功能覆蓋全面,涵蓋了私聊、群聊、訊息管理等常用功能。配置說明清晰,環境變數設定一目瞭然。但目前僅提供文件說明,沒有實際可執行的程式碼或外掛,對於需要直接使用的使用者來說價值有限。如果你只需要瞭解功能文件,這是一個不錯的選擇;但若要實際使用,可能需要等待後續的程式碼實現。