消息服务.ym 48 KB

目录

私聊、群聊等 IM 服务,以及各种实时协作功能,是当今应用系统的基础需求。 易度的每个工作平台站点,自动会部署一个配套的消息中心。

1   为什么需要消息服务

IM 和实时系统构建技术难度大,主要表现在:

  • 如何支撑大量用户的连接
  • 网络不稳定,如何确保不丢消息
  • 海量消息历史的可扩展存储
  • 消息历史的快速全文搜索
  • 多端(手机、电脑)通知使用,聊天状态同步
  • 多端消息提醒
  • 用户系统如何集成

消息服务功能:

  • 群聊、私聊、自定义消息
  • 全套开放 API
  • 全套 JS SDK,快速嵌入聊天到您的应用
  • 提供各种底层通讯 SDK
  • 桌面消息提醒

2   API 说明与约定

  • 本文档中列出的所有接口都是通过 HTTP POST 方式访问,响应格式均为 JSON

  • 文档只列出的 API 路径,实际调用请在前面加上 Message API 的服务器地址作为基准

  • 所有接口都需要通过如下方式携带认证信息,传递如下额外参数:

    • access_token : 访问 token
  • 标记有 JSON序列化 字样的参数,在传递时需要做 JSON 序列化

  • 所有接口的 account 与 instance 参数都对应易度内容库的账号和站点概念,参考 《开放 API 概览》 。

  • 所有 API 响应,统一使用以下 JSON 格式来区分成功与失败:

    {
        "errcode": 401,
        "errmsg": "Token error"
    }
    

    其中, errcode 是错误码,为 0 时表示调用成功。如果出现错误, errmsg 是此错误的描述信息。同时,错误响应的 HTTP 状态码也可以作为错误判断的一部分。

3   消息接口

3.1   申请建立连接 /api/v1/message/connect

要建立实时连接用于接收推送消息时,需要先调用这个接口来申请实时连接所需的信息。

参数:

  • account: 要连接的站点所属的账户
  • instances: JSON序列化 列表 指定要连接的站点实例名称,例如 ["default"] ,目前只支持单个站点连接

响应:

{
    "errcode": 0,
    "client_id": "1243rewr32432qw2343t54r8iu",
    "topics": {
        "default": "account-instance-username-123123123sef"
    },
    "io_bridge": "http://socket.io.bridge.address.com:1234",
    "broker": "http://broker.example.com:9001",
    "tcp_broker": "http://broker.example.com:1883"
    "use_ssl": false,
    "exceeded_instances": [],
    "expired_instances": []
}

响应 JSON 字段含义:

  • client_id: 本次连接 ID,客户端必须使用这个 ID 进行连接
  • topics: 包含请求的各个 instance 对应的 topic,客户端必须订阅指定 topic,否则无法收到消息推送。以上例子中的 topic 是 account-instance-username-123123123sef 
  • broker: 支持 Websockets 连接的 MQTT 服务器地址,可供浏览器中 Javascript 使用。推荐所有支持 Websockets 的客户端都使用这个地址。
  • io_bridge: 用于兼容低版本 IE 的 Socket.io 桥接服务器地址。仅供 IE 使用。
  • tcp_broker: 支持 TCP 连接的 MQTT 服务器地址,用于普通 MQTT 客户端连接。起始的 http:// 等协议标识可以忽略。不推荐使用,仅用于不支持 Websockets 的客户端。
  • use_ssl: 指定是否应当使用 SSL 加密连接,客户端必须服从服务器指定的值。
  • exceeded_instances: 如果申请连接的站点使用并发连接许可,且当前在线用户数(不是在线客户端数)超出限制,将被列入此字段,并暂时禁止连接。
  • expired_instances: 如果申请连接的站点许可已经过期,将被列入此字段,并暂时禁止连接。

3.2   建立长连接

消息客户端需要与服务器之间建立长连接,才能够收到实时消息推送。本节内容描述建立长连接的方式。

在申请成功之后,客户端应当在 60 秒内使用 MQTT 协议连接到服务器,并完成以下操作:

  • 订阅服务器指定的频道。在上例中,这个频道是 account-instance-username-123123123sef 

  •  msgcenter 这个系统频道发送一条 MQTT 消息,表明自己已上线。payload 的格式是:

    {
        "event_name": "connection",
        "account": "zopen",
        "client_id": "1243rewr32432qw2343t54r8iu",
        "user_id": "users.admin",
        "instance": "default",
        "event_data": {
            'status': "online",
            'instances': ["default"],
            'timestamp': 143244221.21,
            'appname': 'Test client'
        }
    }
    

    其中

    • account、instance、instances、user_id 是申请连接时使用的信息
    • client_id 是客户端的 ID,即服务器指定的客户端 ID。在上例中,client_id 是 1243rewr32432qw2343t54r8iu 
    • appname 指明客户端的名称,这个名称由客户端自行指定。部分在线客户端会以“您在XXX中登录上线”的形式向用户展示这个字段值。
    • status 值必须是 online 
    • timestamp 是当前的时间戳。

完成这些操作,服务器将通过客户端订阅的频道发送一条响应消息,如果消息 status  online ,则客户端上线成功。例如:

{
    "event_name": "connection",
    "account": "zopen",
    "client_id": "1243rewr32432qw2343t54r8iu",
    "user_id": "users.admin",
    "instance": "default",
    "event_data": {
        'status': "online",
        'instances': ["default"],
        'timestamp': 143244221.21,
        'appname': 'Test client'
    }
}

如果没有及时完成以上操作,申请的凭证(client_id 和 topic 等)将失效,客户端不能使用这些过期的信息进行连接,需要重新申请。

在实时客户端在线的过程中,服务器可能因为各种原因要求客户端断开连接(例如服务端进行了维护操作并重新启动)。 当客户端收到 event_name  connection 并且指定 status  offline 的消息时,客户端应当断开连接并重新申请凭证再行连接。

注意:当前 MQTT 服务器支持的 QoS 是 1,最大心跳间隔为 60 秒。您需要在使用 MQTT 库时,指定 keepalive 为小于 60 秒的值。

3.3   消息数据格式

消息事件是JSON序列化的对象,基本格式如下:

{
    "from": {
        "name": "admin",
        "id": "users.admin"
    },
    "subject": "消息标题",
    "body":"消息正文",
    "action": "动作",
    "context": {
        "uid": "uid",
        "title": "title",
        "url": "url",
        "thumbnail_url": "thumbnail_url",
        "object_types": ["DataItem"]
    },
    "attachments": [
        {
            "uid": "uid",
            "title": "title",
            "url": "url",
            "thumbnail_url": "thumbnail_url",
            "object_types": ["File"]
        }
    ]
}

各字段含义如下:

  • from: 一个包含 name  id 的对象,用于接收端显示发送消息的用户名。 id 字段必须与 access_token 的所有者ID一致。
  • subject: 消息的主题,可选。在消息的详情界面会展示。
  • body: 消息的文字内容,可选
  • action: 消息动作,必选
  • context: 可选,一个对象。指示这条消息与站点的哪个对象关联,并存放对象的一些基本信息。一条消息最多只能与一个对象关联。其各个字段含义为:
    • uid: 关联对象的 uid。
    • title: 关联对象的标题,用于显示。
    • url: 关联对象的**永久地址**。注意:应当总是使用 uid URL。
    • thumbnail_url: 如果关联对象是一个图片文件,可以提供缩略图的URL,供某些客户端快速展示。
    • object_types: 对象的 object_types,用于指示客户端以合适的方式来展示这个对象。
  • attachments: 可选,一个数组。指示这条消息包含哪些附件。一条消息可以有任意多个附件。其中每个对象的字段,与 context 的字段含义一致。

通过在消息中包含 attachments ,即可实现发送附件的功能。

3.4   触发通知频道事件 /api/v2/message/trigger_notify_event

在用户的通知频道中,触发通知事件。

通知频道为系统到人的通讯频道。每个用户有 8 个通知频道分别是:

  • comment: 评论信息的频道
  • sendme: 文件、表单分享的频道
  • subscribe: 订阅内容的更新,推送到这个频道
  • workflow: 流程运转的通知推送到这个频道
  • mentioned: 其他用户“提到我”(@ 功能)的提醒,推送到这个频道
  • command: 联机脚本发送到这个频道。特别地,这个频道的内容现在不在任何界面上显示。
  • announcement: 公告频道,在 v6.4.4 及之后版本可用。
  • default: 默认频道,所有未归类的消息推送到这个频道

参数

  • account: 账户

  • instance: 站点实例的名称

  • event_name: 可选 事件名称,默认是 notify

  • event_type: 可选 事件类型,允许的值有:

    • persistent: 默认 事件会被存储,并进入未读标记
    • transient: 只发送给在线用户,不会保存
  • category: 可选 消息分类;目前就是频道名称的一部分。不传递默认为 default

  • to: JSON序列化 列表 要发送给哪些用户和组,例如 ["users.panjunyong", "groups.tree.default"] ,v7.0.0 新增

  • exclude: JSON序列化 列表 可选 排除哪些用户和组,例如 ["users.zhangsan"] ,v7.0.0 新增

  • event_data: JSON序列化 事件数据:

    {
        "from": {
            "name": "admin",
            "id": "users.admin"
        },
        "subject": "消息标题",
        "body":"消息正文",
        "action": "动作",
        "context": {
            "uid": "uid",
            "title": "title",
            "url": "url",
            "thumbnail_url": "thumbnail_url",
            "object_types": ["object_type"]
        },
        "attachments": [
            {
                "uid": "uid",
                "title": "title",
                "url": "url",
                "thumbnail_url": "thumbnail_url",
                "object_types": ["object_type"]
            }
        ]
    }
    

其中 action 是操作名称,可选值有:

  • share: 分享
  • new : 新建
  • edit: 编辑
  • upload:上传
  • comment: 评论
  • new_revision: 更新版本
  • fix_revision: 定版
  • workflow_sign : 触发流程
  • workflow_resign : 更改流程
  • remind: 催办
  • mentioned: 提到我

响应:

{
    "errcode": 0,
    "timestamp": 1378234.3545,
    "id": "fsdhjkYUIHBf83h_hjf"
}

响应中 timestamp 是消息的时间戳,id 是消息的 ID。如果要精准查询此条消息,请使用这个 ID。 注意:只有 persistent 类型的消息会返回 ID。

3.5   触发私有频道事件 /api/v2/message/trigger_private_event

在通知频道中触发指定事件。

系统为授权的任意两个用户之间,建立了通信频道。 特殊的,自己和自己也存在通信频道,方便进行跨设备通讯。

参数

  • account: 账户

  • instance: 站点实例名称

  • event_name: 可选 事件名称,默认是 chat: 聊天

  • event_type: 可选 事件类型,允许的值有:

    • persistent: 默认。事件会被存储,并进入未读标记
    • transient: 只发送给在线用户,不会保存
  • to: 要发送给哪个用户,例如 users.panjunyong 。v7.0.0 新增

  • from_user: 可选 来自哪个用户,值为用户 ID,例如 users.admin ,v7.0.0 新增。注意:如果不传则自动从请求的 access_token 中获取当前用户 ID;传入则必须保证与 access_token 的用户一致。

  • event_data: JSON序列化 事件数据,示例:

    {
        "from": {
            "name": "admin",
            "id": "users.admin"
        },
        "subject": "消息标题",
        "body":"消息正文",
        "action": "动作",
        "context": {
            "uid": "uid",
            "title": "title",
            "url": "url",
            "thumbnail_url": "thumbnail_url",
            "object_types": ["object_type"]
        },
        "attachments": [
            {
                "uid": "uid",
                "title": "title",
                "url": "url",
                "thumbnail_url": "thumbnail_url",
                "object_types": ["object_type"]
            }
        ]
    }
    

响应:

{
    "errcode": 0,
    "timestamp": 1378234.3545,
    "id": "fsdhjkYUIHBf83h_hjf"
}

响应中 timestamp 是消息的时间戳,id 是消息的 ID。如果要精准查询此条消息,请使用这个 ID。 注意:只有 persistent 类型的消息会返回 ID。

3.6   触发群组频道事件 /api/v2/message/trigger_group_event

在一个群组频道中,触发指定事件。

群组频道需要预先在工作平台中创建,并将群组人员同步到消息系统。

参数

  • account: 账户

  • instance: 站点实例的名称

  • group_id: 群组的 ID,目前约定是工作平台中群组对象的 UID

  • event_name: 可选 事件名称,默认是 chat: 聊天

  • event_type: 可选 事件类型,允许的值有:

    • persistent:默认 事件会被存储,并进入未读标记
    • transient:只发送给在线用户,不会保存
  • exclude: JSON序列化 列表 可选 排除哪些用户和组,例如 ["users.zhangsan"] ,v7.0.0 新增

  • event_data: JSON序列化 事件数据,示例:

    {
         "to": ["users.panjunyong", "groups.tree.default"],
         "from": {
             "name": "admin",
             "id": "users.admin"
         },
         "subject": "消息标题",
         "body":"消息正文",
         "action": "动作",
         "context": {
             "uid": "uid",
             "title": "title",
             "url": "url",
             "thumbnail_url": "thumbnail_url",
             "object_types": ["object_type"]
         },
         "attachments": [
             {
                 "uid": "uid",
                 "title": "title",
                 "url": "url",
                 "thumbnail_url": "thumbnail_url",
                 "object_types": ["object_type"]
             }
         ]
     }
    
     其中,to 字段值是一个列表,包含这条消息所特别提到的群组成员。在群聊中,通常是这条消息 @ 了某些群组成员。
    

响应:

{
    "errcode": 0,
    "timestamp": 1378234.3545,
    "id": "fsdhjkYUIHBf83h_hjf"
}

响应中 timestamp 是消息的时间戳,id 是消息的 ID。如果要精准查询此条消息,请使用这个 ID。 注意:只有 persistent 类型的消息会返回 ID。

3.7   消息历史查询 /api/v1/message/query

参数

  • account: 账户
  • instance: 消息区的实例号
  • time_start: 可选 起始时间戳;默认为第一条未读的时间戳
  • time_end: 可选 最末一条消息时间戳;默认为收到请求的时间戳
  • id: 可选 按此 ID 精确查询消息内容;注意:如果指定了 id,time_start 和 time_end 将不生效,并且只会查询指定的这一条消息;此参数在 v6.4.4 及之后版本支持; 注意:v7.2.5 及之后版本,推荐使用 ``/api/v1/message/get`` 来通过ID查询单条消息
  • limit: 可选 消息数量限制,默认 50
  • event_name: 事件名称
  • channel_type: 频道类型
  • channel_name: 频道名,不同类型的频道,频道名命名是不同的:
    • notify: 通知频道,格式 CATEGORY,USERID 比如 sendme,users.panjunyong
    • private: 私有频道,格式 USER1,USER2 比如 users.panjunyong,users.zhangsan
    • group: 群组频道,格式 GROUP_ID 比如 3214333

响应:

[
    {
        "body": "\u4fdd\u5b58\u65b0\u7248\u672c",
        "channel_type": "notify",
        "from": {
            "id": "users.tester1",
            "name": "\u6d4b\u8bd5\u54581"
        },
        "attachments": [],
        "to": ["users.admin"],
        "event_name": "notify",
        "timestamp": 1488534767.20252,
        "instance_id": "message.default.zopen",
        "channel_name": "subscribe<>users.admin",
        "context": {
            "url": "http://192.168.1.211:80/default/desks/users.admin/files/1.xls",
            "title": "1.xls",
            "thumbnail_url": "",
            "uid": 1019908807,
            "object_types": ["File", "Item"]
        },
        "action": "new",
        "id": "XlDMx-CISZmpOzAkZaXwMQ",
        "subject": null
    }
]

3.8   通过消息ID精确查询单条消息 /api/v1/message/get

参数

  • account: 账户
  • instance: 消息区的实例号
  • id: 要查询的消息ID

响应:

{
    "errcode": 0,
    "data": {
        "body": "\u4fdd\u5b58\u65b0\u7248\u672c",
        "channel_type": "notify",
        "from": {
            "id": "users.tester1",
            "name": "\u6d4b\u8bd5\u54581"
        },
        "attachments": [],
        "to": ["users.admin"],
        "event_name": "notify",
        "timestamp": 1488534767.20252,
        "instance_id": "message.default.zopen",
        "channel_name": "subscribe<>users.admin",
        "context": {
            "url": "http://192.168.1.211:80/default/desks/users.admin/files/1.xls",
            "title": "1.xls",
            "thumbnail_url": "",
            "uid": 1019908807,
            "object_types": ["File", "Item"]
        },
        "action": "new",
        "id": "XlDMx-CISZmpOzAkZaXwMQ",
        "subject": null
    }
}

注意:如果找不到这条消息,响应中将包含错误码 30003。

3.9   消息历史数量 /api/v1/message/query_count

这个用于消息历史的分页。

参数

  • account: 账户
  • instance: 消息区的实例号
  • time_start: 可选 起始的消息时间戳;默认为第一条未读消息时间戳
  • time_end: 可选 最末一条消息时间戳;不传时默认为到收到请求的时间为止
  • event_name 指定消息类型
  • channel_type 频道类型
  • channel_name 指定消息频道

响应:

{
    "errcode": 0,
    "count": 200
}

3.10   频道未读消息 /api/v1/message/unread_stat

查看各个频道起始未读的 persistent 类型的消息数据

参数:

  • account: 账户
  • instance: 消息区的实例号

响应 JSON 内容的 key 是 CHANNEL_TYPE:CHANNEL_NAME 组合的字符串。

响应:

{
    "errcode": 0,
    "private:users.panjy<>users.zhangsan": {"count": 6, "time_start": 14354564.09},
    "notify:workflow<>users.panjunyong": {"count": 1, "time_start": 12312435.12},
    "group:12345": {"count": 3, "time_start": 1243543.12}
}

注意:如果您使用 edo_client 进行 API 调用,调用成功后会自动将响应中的 errcode 字段移除,避免对响应的 key 做处理时遇到意外情况,保持与旧版本兼容。

3.11   标记已读 /api/v1/message/mark_read

标记某个时间之前的所有消息为已读(包括该时间点的消息)

参数:

  • account: 账户
  • instance: 消息区的实例号
  • channel_type: 可以为 group、private 或 notify
  • timestamp: 时间戳
  • group_id: 在 channel_type 为 group 时需要,群组的 ID
  • category: 在 channel_type 为 notify 时需要,通知的分类
  • to_user: 在 channel_type 为 private 时需要,私聊的对方用户 ID

响应:

{
    "errcode": 0,
    "timestamp": 123
}

响应 JSON 字段含义:

  • timestamp: 传入的参数中的 timestamp 值

4   密匙管理接口

消息中心为每个实例可以设置自己的密匙,方便和第三方的用户系统集成。

4.1   /api/v1/admin/get_secret

获取查看密匙。注意:这个密匙普通用户无法得到,只有账户管理员才能得到。

传入参数:

  • account: 账户
  • instance: 消息区的实例号

输出密匙:

{
    "errcode": 0,
    "secret_key": "adfkdwe231jxwdw@asfas2d"
}

4.2   /api/v1/admin/refresh_secret

更新查看密匙, 得到一个新密匙

传入参数:

  • account: 账户
  • instance: 消息区的实例号

输出新的密匙:

{
    "errcode": 0,
    "secret": "xxx"
}

5   会话管理接口

5.1   查询站点的在线用户 /api/v1/session/online_users

参数:

  • account: 账户
  • instance: 消息区的实例号
  • count_only: 可选 bool 值 是否只返回在线用户数;默认 true;传入 false 即同时返回所有在线用户 ID

响应:

{
    "errcode": 0,
    "count": 2,
    "users": ["users.admin", "users.zhang3"]
}

当传入 count_only 值为 true 时,响应中不会带有 users 字段。

5.2   查询连接数(在线客户端总数) /api/v1/session/connections

查询站点当前的连接总数(在线客户端总数)。

参数:

  • account: 账户
  • instance: 消息区的实例号

响应:

{
    "errcode": 0,
    "count": 36
}

5.3   查询用户状态 /api/v1/session/user_state

查询指定一组用户的在线状态

参数:

  • account: 账户
  • instance: 消息区的实例号
  • users: JSON序列化 列表 要查询的用户 ID 列表

响应:

{
    "errcode": 0,
    "online": ["users.admin", "users.user2"],
    "offline": ["users.user1", "users.user3"]
}

响应 JSON 字段含义:

  • online: 包含指定用户列表中所有在线用户的 ID
  • offline: 包含指定用户列表中所有离线用户的 ID

5.4   过时 查询指定一个用户的详细连接信息 /api/v1/session/detail

查询指定用户的详细连接情况,包含所有在线客户端的信息。

注意:此接口从 v7.2.0 版本开始不推荐使用,并可能在后续版本中移除。 如果您使用其他工具 / 库进行 API 调用,请适时调整。 如果您使用 edo_client 进行 API 调用,则无需做任何处理:新版本的 edo_client 将自动使用新接口。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • user_id: 要查询的用户 ID

响应:

[
    {
        "ip": "120.120.2.34",
        "ua": "Chrome/Gecko Like",
        "app": "Web (Javascript)",
        "connected": 1490870877,
        "client_id": "xxxx"
    }
]

响应 JSON 内容中每一项的字段含义:

  • ip: 此连接的初始 IP 地址
  • ua: 此连接申请时的 HTTP User-Agent 信息
  • app: 此连接申请时的客户端名称
  • connected: 此连接成功建立的时间戳
  • client_id: 此连接的客户端 ID

5.5   查询指定一个用户的详细连接信息 /api/v2/session/detail

查询指定用户的详细连接情况,包含所有在线客户端的信息。

注意:此接口从 v7.2.0 版本开始支持。与旧版接口相比,主要修改是增加了 errcode 字段。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • user_id: 要查询的用户 ID

响应:

{
    "errcode": 0,
    "connections": [
        {
            "ip": "120.120.2.34",
            "ua": "Chrome/Gecko Like",
            "app": "Web (Javascript)",
            "connected": 1490870877,
            "client_id": "xxxx"
        }
    ]
}

响应 JSON 内容中, connections 字段包含了此用户所有在线连接的详细信息,其中每一项的字段含义:

  • ip: 此连接的初始 IP 地址
  • ua: 此连接申请时的 HTTP User-Agent 信息
  • app: 此连接申请时的客户端名称
  • connected: 此连接成功建立的时间戳
  • client_id: 此连接的客户端 ID

5.6   断开指定的连接 /api/v1/session/kill_connection

切断指定用户特定客户端的连接,使其进入离线状态。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • user_id: 用户的 ID
  • client_id: 客户端 ID

响应:

{"errcode": 0}

5.7   断开指定用户的所有连接 /api/v1/session/kill_user

切断指定用户的所有客户端连接,使这个用户进入离线状态。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • user_id: 用户 ID

响应:

{"errcode": 0}

6   群组管理接口

6.1   更新群组信息 / 创建群组 /api/v1/group/update

如果群组不存在,将会创建这个群组;如果群组已经存在,将会更新此群组的信息。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • group_id: 群组的 ID
  • group_title: 群组标题
  • members: JSON序列化 列表 群组成员列表,不能为空列表

响应:

{"errcode": 0}

6.2   删除群组 /api/v1/group/remove

参数:

  • account: 账户
  • instance: 消息区的实例号
  • group_id: 群组的 ID

响应:

{"errcode": 0}

6.3   将用户加入群组 /api/v1/group/join

如果群组不存在,将会创建这个群组,此时群组标题为空。

参数:

  • account: 账户
  • instance: 消息区的实例号
  • group_id: 群组的ID
  • members: JSON序列化 列表 要加入群组的用户ID的列表

响应:

{"errcode": 0}

6.4   将用户移出群组 /api/v1/group/leave

参数:

  • account: 账户
  • instance: 消息区的实例号
  • group_id: 群组的ID
  • members: JSON序列化 列表 要移出群组的用户ID的列表

响应:

{"errcode": 0}

7   消息网关接口

7.1   更新消息网关路由表 /api/v3/gateway/update_routes

参数:

  • account: 账户
  • instance: 实例号
  • routes: 新的路由表

路由表的数据结构如下:

{
    "site-id": {
        "endpoint": "https://easydo.cn/_message/api/v3/send?account=zopen&instance=default",
        "token": "example",
    },
    ...
}

7.2   发送一个来自外部网关的消息 /api/v3/gateway/send

参数:

  • account: 账户
  • instance: 实例号
  • msg_type: 消息类型,可选值有`private`,`group`,`notify`,分别表示私聊、群聊和通知消息。
  • sender: 发信人的ID,例如`users.admin`。
  • event_type: 事件类型,参见上文`trigger_*_event`的`event_type`参数。
  • event_name: 事件名,参见上文`trigger_*_event`的`event_name`参数。
  • event_data: 事件数据,参见上文的`trigger_*_event`的`event_data`参数。
  • token: 外部网关的token,您可以在站点设置>消息设置里添加新的外部网关并设置token。
  • group_id: 群组id。当您要发送一个群组消息时,应带上收信群组的id。只有在`msg_type`是`group`的时候才有用。参考上文`trigger_group_event`。
  • category: 通知类型。当您要发送一个通知消息时,应带上通知的类型。只有在`msg_type`是`notify`的时候才有用。参考上文`trigger_notify_event`。
  • to: 收信人id列表。您可以在私聊消息和群聊消息的`to`字段指定收信人,请参考`trigger_private_event`和`trigger_group_event`。

响应内容是这条消息的发送时间:

{
    "timestamp": <时间戳>,
}

8   API 错误码速查

参考 《API返回码》

9   接口变更清单

9.1   消息 ID

在 v6.4.4 及之后版本支持使用消息ID来精确查找单条消息。

  • 消息查询接口(/api/v1/message/query)增加新的可选参数 id 
  • 按任何条件进行查询时,消息查询接口(/api/v1/message/query)返回的每条消息都会携带各自的 ID;
  • 发送消息的接口,在响应时,除了消息时间戳(timestamp),也会返回消息的 ID,具体包括以下接口:
    • /api/v1/message/trigger_notify_event
    • /api/v1/message/trigger_private_event
    • /api/v1/message/trigger_group_event

在 v7.2.5 及之后版本中,使用消息ID来精确查找单条消息的功能,分离为单独的接口 /api/v1/message/get 。原有通过 /api/v1/message/query 来查询单条消息的用法仍然兼容,但可能会在后续版本中移除。请适时更新客户端代码。

9.2   通知的公告频道

在 v6.4.4 及之后版本中,通知消息增加了一个频道用于支持发送公告,此频道的 category 是 announcement

9.3   to  exclude 参数

在 v7.0.0 及之后版本,以下接口中原来处于 event_data 参数值内部的字段 to 和/或 exclude 被提升为整个 API 的参数。

  • /api/v1/message/trigger_notify_event
  • /api/v1/message/trigger_private_event
  • /api/v1/message/trigger_group_event

9.4   API 返回值

在 v7.2.0 及之后版本,除响应直接是列表类型的 API 外,其他所有 API 的响应都带有 errcode 字段。如果出现 errcode 不为 0 的情况,说明调用出现问题,在 errmsg 中含有错误的简略说明。

9.5   /api/v1/session/detail 接口

从 v7.2.0 开始,实现并推荐使用 /api/v2/session/detail 接口。