You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Bot Framework(Node.js) Webchat渲染HTML标签问题求助

如何在Microsoft Bot Framework(Node.js)的Webchat中渲染HTML标签?

我之前也踩过这个坑——Webchat默认会把HTML标签转义成纯文本(比如显示成<br> bla bla <br>),要让它正常渲染HTML,得从Bot端和Webchat客户端两边配合调整,下面是亲测有效的实现步骤:

一、Bot端(Node.js):发送HTML格式的消息

首先,Bot在发送消息时,要明确指定消息的文本格式为html,而不是默认的plain。这样Webchat才会识别到这是需要渲染的HTML内容,代码示例如下:

async onTurn(context) {
    if (context.activity.type === ActivityTypes.Message) {
        // 构造包含HTML的消息
        const htmlActivity = {
            type: ActivityTypes.Message,
            text: "<br> bla bla <br><strong>这是一段加粗的示例文本</strong>",
            textFormat: "html" // 关键配置:告诉Webchat这是HTML格式
        };
        await context.sendActivity(htmlActivity);
    }
}

二、Webchat客户端:自定义渲染逻辑

Webchat出于安全考虑,默认会过滤HTML内容,所以需要我们自定义活动渲染器,来处理HTML格式的消息。这里分两种场景给出代码:

场景1:使用React版Webchat(npm包)

如果你的Webchat是通过npm引入的React组件,可以自定义renderActivity函数来渲染HTML:

import React from 'react';
import ReactDOM from 'react-dom';
import { createDirectLine, WebChat } from 'botframework-webchat';

// 替换成你的Direct Line Token
const directLine = createDirectLine({ token: 'YOUR_DIRECT_LINE_TOKEN' });

// 自定义活动渲染器
const renderCustomActivity = (props) => {
    const { activity } = props;
    // 判断消息是否为HTML格式
    if (activity.textFormat === 'html') {
        // 使用dangerouslySetInnerHTML插入HTML内容
        return <div dangerouslySetInnerHTML={{ __html: activity.text }} />;
    }
    // 非HTML消息用默认渲染逻辑
    return WebChat.renderActivity(props);
};

ReactDOM.render(
    <WebChat
        directLine={directLine}
        renderActivity={renderCustomActivity}
    />,
    document.getElementById('webchat')
);

场景2:使用CDN版Webchat

如果是直接通过CDN引入Webchat的静态页面,代码可以这样写:

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
</head>
<body>
    <div id="webchat" role="main"></div>
    <script>
        // 替换成你的Direct Line Token
        const directLine = window.WebChat.createDirectLine({ token: 'YOUR_DIRECT_LINE_TOKEN' });

        const renderActivity = (props) => {
            const { activity } = props;
            if (activity.textFormat === 'html') {
                const divElement = document.createElement('div');
                divElement.innerHTML = activity.text;
                return divElement;
            }
            // 其他消息用默认渲染
            return window.WebChat.renderActivity(props);
        };

        window.WebChat.renderWebChat(
            {
                directLine: directLine,
                renderActivity: renderActivity
            },
            document.getElementById('webchat')
        );
    </script>
</body>
</html>

重要安全提醒

直接渲染HTML存在XSS攻击风险,所以一定要:

  • 只渲染可信的HTML内容:确保Bot发送的HTML是你自己控制的,不要包含来自用户输入的未过滤内容。
  • 如果需要处理用户输入的HTML:一定要用专门的库(比如DOMPurify)对HTML进行清理,只保留安全的标签和属性。

内容的提问来源于stack exchange,提问作者Sahar Ben-Shushan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:43:11