Bot 获取频道数据
Bot Get Channel Data
团队,
我使用机器人框架 SDK4 开发了一个机器人。
我正在使用 Directline 通道与我的机器人进行通信。
我的要求基于 'requestWelcomeDialog' 消息上的频道数据,我必须显示欢迎消息。
来自我的机器人客户端的代码:
BotChat.App({
botConnection: botConnection,
user: userOption,
bot: { id: model.botId, name: model.botName },
resize: 'window',
speechOptions: speechOptions,
locale: 'en',
sendTypingIndicator: true,
}, document.getElementById('BotChatElement'));
PostBotConfiguration();
botConnection
.postActivity({
from: user,
name: 'requestWelcomeDialog',
type: 'event',
value: { 'BotType': 'abcd' }
})
.subscribe(function (id) {
setWCScreenChatPosition();
model.botRender = true;
console.log('"trigger requestWelcomeDialog" sent');
});
在上面的代码中,我将 BotType 作为 'abcd' 发送。
我正在尝试从我的机器人中读取这个值。
我在机器人中的代码。
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
Utility util = new Utility();
try
{
foreach (var member in membersAdded)
{
if (member.Id != turnContext.Activity.Recipient.Id)
{
BotChannelData cdata = new BotChannelData();
turnContext.Activity.TryGetChannelData(out cdata);
}
}
}
catch
{
}
}
在此我总是得到空引用异常。
请问我遗漏了什么?
第一个问题是您使用的是 Bot Chat。 Bot Chat 是 Web Chat v3,已弃用。您应该按照 the repo.
中的说明使用 Web Chat v4
第二个问题是您正尝试使用 OnMembersAddedAsync
响应自定义事件,该事件仅由对话更新活动触发。您可以按照 this issue and this sample 中的说明查看如何发送和响应欢迎事件。 C# 等效项如下所示:
if (turnContext.Activity.Name == "webchat/join")
{
await turnContext.SendActivityAsync("Back Channel Welcome Message!");
}
如果您使用 Direct Line 渠道,则应使用 Web Chat v4。因为 Web Chat v3 现已弃用。
您可以从 this official sample.
获取发送欢迎消息代码
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Web Chat: Send welcome event</title>
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<style>
html, body { height: 100% }
body { margin: 0 }
#webchat {
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div id="webchat"></div>
<script>
(async function () {
const res = await fetch('https://webchat-mockbot.azurewebsites.net/directline/token', { method: 'POST' });
const { token } = await res.json();
const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'webchat/join',
value: { language: window.navigator.language }
}
});
}
return next(action);
});
window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ token }),
store
}, document.getElementById('webchat'));
document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));
</script>
</body>
</html>
团队, 我使用机器人框架 SDK4 开发了一个机器人。 我正在使用 Directline 通道与我的机器人进行通信。 我的要求基于 'requestWelcomeDialog' 消息上的频道数据,我必须显示欢迎消息。
来自我的机器人客户端的代码:
BotChat.App({
botConnection: botConnection,
user: userOption,
bot: { id: model.botId, name: model.botName },
resize: 'window',
speechOptions: speechOptions,
locale: 'en',
sendTypingIndicator: true,
}, document.getElementById('BotChatElement'));
PostBotConfiguration();
botConnection
.postActivity({
from: user,
name: 'requestWelcomeDialog',
type: 'event',
value: { 'BotType': 'abcd' }
})
.subscribe(function (id) {
setWCScreenChatPosition();
model.botRender = true;
console.log('"trigger requestWelcomeDialog" sent');
});
在上面的代码中,我将 BotType 作为 'abcd' 发送。 我正在尝试从我的机器人中读取这个值。
我在机器人中的代码。
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
Utility util = new Utility();
try
{
foreach (var member in membersAdded)
{
if (member.Id != turnContext.Activity.Recipient.Id)
{
BotChannelData cdata = new BotChannelData();
turnContext.Activity.TryGetChannelData(out cdata);
}
}
}
catch
{
}
}
在此我总是得到空引用异常。
请问我遗漏了什么?
第一个问题是您使用的是 Bot Chat。 Bot Chat 是 Web Chat v3,已弃用。您应该按照 the repo.
中的说明使用 Web Chat v4第二个问题是您正尝试使用 OnMembersAddedAsync
响应自定义事件,该事件仅由对话更新活动触发。您可以按照 this issue and this sample 中的说明查看如何发送和响应欢迎事件。 C# 等效项如下所示:
if (turnContext.Activity.Name == "webchat/join")
{
await turnContext.SendActivityAsync("Back Channel Welcome Message!");
}
如果您使用 Direct Line 渠道,则应使用 Web Chat v4。因为 Web Chat v3 现已弃用。 您可以从 this official sample.
获取发送欢迎消息代码<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Web Chat: Send welcome event</title>
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<style>
html, body { height: 100% }
body { margin: 0 }
#webchat {
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div id="webchat"></div>
<script>
(async function () {
const res = await fetch('https://webchat-mockbot.azurewebsites.net/directline/token', { method: 'POST' });
const { token } = await res.json();
const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'webchat/join',
value: { language: window.navigator.language }
}
});
}
return next(action);
});
window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ token }),
store
}, document.getElementById('webchat'));
document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));
</script>
</body>
</html>