【发布时间】:2017-09-17 14:35:52
【问题描述】:
我正在尝试从嵌入式网络聊天发送和接收事件,该网络聊天遵循本示例 https://github.com/ryanvolum/backChannelBot 中的网站代码,机器人实现 Bot framework get the ServiceUrl of embedded chat control page 中的代码,由 ezequiel 回答
这是我的设置中的所有内容 index.html
<!DOCTYPE html>
<!--
NOTE: This sample requires a bot which can send and receive specific event messages. Follow the instructions on
https://github.com/ryanvolum/backChannelBot to deploy such a bot.
This is a sample HTML file which shows how to embed an instance of WebChat which listens for event activities. For the sake
of demonstration it specifically listens for events of name "changeBackground". Using the backChannelBot sample
our page can listen for events of name "changeBackground" and send events of name "buttonClicked". This
highlights the ability for a bot to communicate with a page that embeds the bot through WebChat.
1. Build the project: "npm run build"
2. Start a web server: "npm run start"
3. Aim your browser at "http://localhost:8000/samples/backchannel?[parameters as listed below]"
For ease of testing, several parameters can be set in the query string:
* s = Direct Line secret, or
* t = Direct Line token (obtained by calling Direct Line's Generate Token)
* domain = optionally, the URL of an alternate Direct Line endpoint
* webSocket = set to 'true' to use WebSocket to receive messages (currently defaults to false)
* userid, username = id (and optionally name) of bot user
* botid, botname = id (and optionally name) of bot
-->
<html>
<head>
<meta charset="UTF-8" />
<title>Bot Chat</title>
<link href="../../botchat.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
.wc-chatview-panel {
width: 320px;
height: 500px;
position: relative;
}
.h2{
font-family: Segoe UI;
}
</style>
</head>
<body>
<h2 style="font-family:Segoe UI;">Type a color into the WebChat!</h2>
<div id="BotChatGoesHere" class="wc-narrow"></div>
<button onclick="postButtonMessage()" style="width:120px;height:60px;padding:20px;margin-left:80px;margin-top:20px;">Click Me!</button>
<script src="../../botchat.js"></script>
<script>
var params = BotChat.queryParams(location.search);
var user = {
id: params['me'] || 'userid',
name: params["tester"] || 'username'
};
var bot = {
id: params['somebot'] || 'botid',
name: params["somebot"] || 'botname'
};
window['botchatDebug'] = params['debug'] && params['debug'] === "true";
var botConnection = new BotChat.DirectLine({
secret: params['mysecret'],
token: params['t'],
domain: params['ngroktunneledurl.com/api/messages'],
webSocket: params['webSocket'] && params['webSocket'] === "true" // defaults to true
});
BotChat.App({
botConnection: botConnection,
user: user,
bot: bot
}, document.getElementById("BotChatGoesHere"));
botConnection.activity$
.filter(activity => activity.type === "event" && activity.name === "changeBackground")
.subscribe(activity => changeBackgroundColor(activity.value))
const changeBackgroundColor = (newColor) => {
document.body.style.backgroundColor = newColor;
}
const postButtonMessage = () => {
botConnection
.postActivity({type: "event", value: "", from: {id: "me" }, name: "buttonClicked"})
.subscribe(id => console.log("success"));
}
</script>
</body>
</html>
还有机器人文件 MessagesController.cs
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using Kaseya_AI_Kbot.LuisDialog;
[BotAuthentication]
public class MessagesController : ApiController
{
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Event &&
string.Equals(activity.Name, "buttonClicked", StringComparison.InvariantCultureIgnoreCase))
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
Activity reply = activity.CreateReply("I see that you just pushed that button");
await connector.Conversations.ReplyToActivityAsync(reply);
}
if (activity.Type == ActivityTypes.Message)
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
var reply = activity.CreateReply();
reply.Type = ActivityTypes.Event;
reply.Name = "changeBackground";
reply.Value = activity.Text;
await connector.Conversations.ReplyToActivityAsync(reply);
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
private async Task HandleSystemMessage(Activity message)
{
if (message.Type == ActivityTypes.DeleteUserData)
{
// Implement user deletion here
// If we handle user deletion, return a real message
}
else if (message.Type == ActivityTypes.ConversationUpdate)
{
if (message.MembersAdded.Any(o => o.Id == message.Recipient.Id))
{
ConnectorClient client = new ConnectorClient(new Uri(message.ServiceUrl));
var reply = message.CreateReply();
reply.Text = "Welcome to the bot!";
await client.Conversations.ReplyToActivityAsync(reply);
}
}
else if (message.Type == ActivityTypes.ContactRelationUpdate)
{
// Handle add/remove from contact lists
// Activity.From + Activity.Action represent what happened
}
else if (message.Type == ActivityTypes.Typing)
{
// Handle knowing tha the user is typing
}
else if (message.Type == ActivityTypes.Ping)
{
}
}
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Event &&
string.Equals(activity.Name, "buttonClicked", StringComparison.InvariantCultureIgnoreCase))
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
Activity reply = activity.CreateReply("I see that you just pushed that button");
await connector.Conversations.ReplyToActivityAsync(reply);
}
if (activity.Type == ActivityTypes.Message)
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
var reply = activity.CreateReply();
reply.Type = ActivityTypes.Event;
reply.Name = "changeBackground";
reply.Value = activity.Text;
await connector.Conversations.ReplyToActivityAsync(reply);
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
}
}
我已经测试了发送消息活动,它工作正常,但是在收到消息后尝试将事件从机器人发送到网页或从网页发送到机器人没有任何作用。
网页上说两者都没有定义 BotChat,但我不知道为什么
var params = BotChat.queryParams(location.search);
和
var botConnection = new BotChat.DirectLine({
在 index.html 中
我的所有应用程序机密/ID 和直连机密都已添加。我觉得问题可能是我如何在 index.html 中添加我的秘密和网址,但我不确定如何设置它
【问题讨论】:
-
您是否尝试过暂时对您的秘密和令牌进行硬编码,而不是依赖参数? (直到你让它工作,然后添加参数)
-
我试图像这个 var
botConnection = new BotChat.DirectLine({ secret: "My_DirectLine_Secret_Here", domain: "https://xxxxxxxx.ngrok.io/api/messages" });那样对我的秘密和域进行硬编码,但这似乎不起作用。我不确定是不是因为我添加错了(对 JS 来说很新) -
域是指定一个不同的直线端点:github.com/Microsoft/… ...不是你的机器人消息的端点。请尝试删除“域:等”
-
好的,所以我刚刚将其更改为
var botConnection = new BotChat.DirectLine({ secret: "My_directLine_Secret", });每当我在本地运行 index.html 时,它都会说 BotChat 未使用 chrome 控制台定义。我是否必须向 web 文件夹添加一些依赖项? -
在本地运行时,最简单的方法是将 .css 和 .js 文件放在同一目录中。我对此进行了测试,它可以按您的预期工作:github.com/EricDahlvang/BackChannelEventTest/tree/master/…
标签: javascript c# html botframework direct-line-botframework