跳到主要内容

开发指南

addMessageBlockedListenerremoveMessageBlockedListener 方法从 SDK 1.3.0 版本开始支持。

默认情况下,消息发送方无法感知消息是否已被融云审核服务拦截。如果 App 希望在消息因触发审核规则而无法下发时通知消息发送方,可开通使用敏感信息拦截回调服务。

融云的内容审核服务(包括消息敏感词、IM 审核服务、消息回调服务),可能在以下情况下拦截消息:

  • 文本消息内容命中了融云内置的消息敏感词,导致消息不下发给接收方。
  • 文本消息内容命中了您自定义的消息敏感词(屏蔽敏感词),导致消息不下发给接收方。
  • 消息命中了 IM 审核服务,或消息回调服务设置的审核规则,导致消息不下发给接收方。

开通服务

您可以在融云控制台,在 IM 服务>功能配置>安全&审核>含敏感词消息屏蔽状态回调发送端,开启此功能。

添加和移除敏感信息拦截监听器

您可以通过 addMessageBlockedListener 方法添加敏感词拦截监听器,监听到被拦截的消息以及拦截原因。

提示
  • 您需要将监听器设置的时机放在调用 IMLib SDK 连接接口之前,初始化 IMLib SDK 之后,保证与融云服务端建立 IM 连接后的第一时间获取到拦截回调。
  • 建议将监听器设置给单例对象,保证整个 App 生命周期内监听器的设置都是有效的。

MessageBlockedListener 接口定义

TypeScript
interface MessageBlockedListener {
onMessageBlocked: (blockInfo: MessageBlockInfo) => void;
}

接口原型

TypeScript
public addMessageBlockedListener(listener: MessageBlockedListener): void

public removeMessageBlockedListener(listener: MessageBlockedListener): void
注意
  • addMessageBlockedListenerremoveMessageBlockedListener 需要配合使用,避免内存泄露。
  • 重复 add 同一个 Listener 对象,只有第一个 Listener 会被 add。

敏感信息拦截监听器说明

在发出的消息被拦截时,SDK 会触发 MessageBlockedListener.onMessageBlocked 方法,回调参数为 MessageBlockInfo 对象。

MessageBlockInfo 里包含了被拦截消息的相关信息,您可以通过下表列出的属性访问:

参数说明

属性名称类型说明
conversationTypeConversationType被拦截消息所在会话的会话类型
targetIdstring被拦截消息所在的会话 Id
messageUidstring被拦截消息的唯一 Id
blockTypeMessageBlockType消息被拦截的原因,详见下方 MessageBlockType 说明
extrastring被拦截消息的附加信息
sourceTypeMessageBlockSourceType被拦截的超级群消息的源类型。0:原始消息触发了拦截(默认)。1:消息扩展触发了拦截。2:修改消息后的消息内容触发了拦截(仅支持超级群)。
sourceContentstring被拦截的超级群消息或扩展的内容 JSON 字符串。sourceType 字段为 1 时表示扩展内容。sourceType 为 2 时表示修改后的消息内容。详见下方 sourceContent 说明(仅支持超级群)。
  • MessageBlockType 说明

    TypeScript
    enum MessageBlockType {
    /**
    * 未知类型
    */
    None = 0,

    /**
    * 全局敏感词:命中了融云内置的全局敏感词
    */
    BlockGlobal = 1,

    /**
    * 自定义敏感词拦截:命中了客户在融云自定义的敏感词
    */
    BlockCustom = 2,

    /**
    * 第三方审核拦截:命中了第三方(数美)或消息回调服务(原模板路由服务)决定不下发的状态
    */
    BlockThirdParty = 3,
    }
  • MessageBlockSourceType 说明

    TypeScript
    enum MessageBlockSourceType {
    /**
    * 默认,原始消息内容被拦截
    */
    Default = 0,

    /**
    * 消息扩展被拦截
    */
    Extension = 1,

    /**
    * 修改的消息内容被拦截
    */
    Modification = 2,
    }
  • sourceContent 说明

    • sourceType0 时,sourceContent 为空。
    • sourceType1 时,sourceContent 是消息扩展内容,示例 {"mid":"xxx-xxx-xxx-xxx","put":{"key":"敏感词"}}。mid 为通知信息的 ID。
    • sourceType2 时,sourceContent 是修改后的消息内容,示例 {"content":"含有敏感信息的文字"}。内置消息类型的消息内容格式消息类型概述

示例代码

添加监听器

TypeScript
hilog.info(0x0000, 'IM-App', 'addMessageBlockedListener start');
let blockedListener: MessageBlockedListener = {
onMessageBlocked: (blockInfo: MessageBlockInfo): void => {
hilog.info(0x0000, 'IM-App', 'addMessageBlockedListener result blockInfo:%{public}s', JSON.stringify(blockInfo));

// 处理被拦截的消息
// 可以根据 blockInfo.blockType 判断拦截原因
// 可以根据 blockInfo.messageUid 获取原消息内容

// 拦截后获取原消息内容并设置消息发送状态
IMEngine.getInstance().getMessageByUid(blockInfo.messageUid).then(result => {
if (EngineError.Success !== result.code) {
// 获取本地消息失败
return;
}
if (!result.data) {
// 消息不存在
return;
}
// 获取本地消息成功
let message = result.data as Message;

// 设置消息发送状态为失败
// 注意:您需要根据 SDK 提供的 SentStatus 枚举设置消息的发送状态,并自行处理 UI 刷新
});
}
};
IMEngine.getInstance().addMessageBlockedListener(blockedListener);

// 移除监听器(在不需要时调用,避免内存泄露)
// IMEngine.getInstance().removeMessageBlockedListener(blockedListener);