我正在集成亚马逊连接平台,在我们自己的聊天机器人中维护双向流通信,客户将是我们平台中的用户,代理将在亚马逊连接平台上进行通信。我现在正在使用websockets进行通信,但这给我带来了禁止的错误。详情如下:
最初,我使用了 aws 和库来与aws建立连接,然后使用多个sdk来进一步发送消息。
import * as AWS from 'aws-sdk';
import * as AWSConnectParticipant from "@aws-sdk/client-connectparticipant";
private messageText = "";
private connectionToken = "";
private connectParticipant = new AWSConnectParticipant.ConnectParticipant({
credentials: {
accessKeyId: '...',
secretAccessKey: '...'
},
region: '...'
});
// It will get called when user sends a message on the chat window
public sendMessage(text: string): void {
this.messageText = text || "";
if (this.connectionToken) {
this.sendEventOnAWSConnect();
} else {
this.startChatContact();
}
}
startChatContact() {
const connect = new AWS.Connect({
accessKeyId: '...',
secretAccessKey: '...',
region: '...'
});
const params = {
ContactFlowId: '...',
InstanceId: '...',
ParticipantDetails: {
DisplayName: 'Customer'
}
};
connect.startChatContact(params, (err: any, data: any) => {
if (data) {
this.createParticipantConnection(data);
}
});
}
createParticipantConnection(startChatContactRes: any) {
const params = {
ParticipantToken: startChatContactRes.ParticipantToken,
Type: [ 'CONNECTION_CREDENTIALS' ]
};
this.connectParticipant.createParticipantConnection(params, (err: any, data: any) => {
if (data) {
this.connectionToken = data.ConnectionCredentials.ConnectionToken;
this.sendEventOnAWSConnect();
this.checkAgentMessage(data.Websocket.Url);
}
});
}
sendEventOnAWSConnect() {
const params = {
ConnectionToken: this.connectionToken,
ContentType: 'application/vnd.amazonaws.connect.event.connection.acknowledged'
};
this.connectParticipant.sendEvent(params, (err: any, data: any) => {
if (data) {
this.sendMessageOnAWSConnect();
}
});
}
sendMessageOnAWSConnect() {
const params = {
ConnectionToken: this.connectionToken,
Content: this.messageText,
ContentType: 'text/plain'
};
this.connectParticipant.sendMessage(params, (err: any, data: any) => {
if (data) {
console.log("Agent connected");
}
});
}它正如预期的那样运转良好。我能够用下面的代码在amazon连接上发送消息。但我在回复代理信息方面遇到了一些问题。我有搜索任何事件,我可以触发在我的一端或任何网络钩子,但找不到任何东西在同一。
关于第一种方法的问题:不是一个好的方法。寻找更好的解决方案
因此,我使用了轮询技术,在这里我使用了@aws/客户端连接参与者的getTranscript SDK,并且每隔2秒调用api来检查任何新的代理消息,但是我现在正在寻找一个更好的方法。
第二个方法的问题:将connect.core.getWebSocketManager()获取为未定义的
在研究之后,我还发现存在一个amazon-connect-streams onMessage事件,在创建代理会话之后,可以使用connect.core.getWebSocketManager()和amazon-connect-chatjs库触发该事件,但是connect.core.getWebSocketManager()是未定义的。另外,connect.contact之后的代码没有被执行,所以我也对此进行了评论。我也创建了类似的客户会话,但是也没有触发**onMessage **事件。由于我在checkAgentMessage方法中使用了联系人id、参与者id和参与者令牌,所以我在createParticipantConnection方法获得响应后调用它的方法,即checkAgentMessage方法,这是从createParticipantConnection方法获得的。下面是密码。
import "amazon-connect-streams";
import "amazon-connect-chatjs";
createParticipantConnection(startChatContactRes: any) {
const params = {
ParticipantToken: startChatContactRes.ParticipantToken,
Type: [ 'CONNECTION_CREDENTIALS' ]
};
this.connectParticipant.createParticipantConnection(params, (err: any, data: any) => {
if (data) {
this.connectionToken = data.ConnectionCredentials.ConnectionToken;
this.sendEventOnAWSConnect();
this.checkAgentMessage(data);
}
});
}
checkAgentMessage(startChatContactRes: any): void {
// for type customer
// const customerChatSession = connect.ChatSession.create({
// chatDetails: {
// contactId: startChatContactRes.ContactId,
// participantId: startChatContactRes.ParticipantId,
// participantToken: startChatContactRes.ParticipantToken,
// },
// type: connect.ChatSession.SessionTypes.CUSTOMER
// });
// for type agent
// connect.contact(contact => {
// if (contact.getType() !== connect.ContactType.CHAT) {
// // applies only to CHAT contacts
// return;
// }
// alternative: if you want control over the args of `connect.ChatSession.setGlobalConfig()` and `connect.ChatSession.create()`
// contact.onAccepted(() => {
const agentChatSession = connect.ChatSession.create({
chatDetails: {
contactId: startChatContactRes.ContactId,
participantId: startChatContactRes.ParticipantId,
participantToken: startChatContactRes.ParticipantToken,
},
options: { // REQUIRED
region: "...", // REQUIRED, must match the value provided to `connect.core.initCCP()`
},
type: connect.ChatSession.SessionTypes.AGENT, // REQUIRED
websocketManager: connect.core.getWebSocketManager() // REQUIRED
})
agentChatSession.onMessage(event => {
console.log("event", event);
});
// });
// });
}我检查了是否可以从某个地方设置connect.core.getWebSocketManager(),但是没有得到任何帮助。
关于第三种方法的问题:获取错误或消息
我还遇到了另一个解决方案,那就是来自网络套接字。因此,我实现的是相同的,但在这里,我得到了错误,因为禁止
我已经用如下内容更改了我的createParticipantConnection函数:
createParticipantConnection(startChatContactRes: any) {
const params = {
ParticipantToken: startChatContactRes.ParticipantToken,
Type: [ 'WEBSOCKET' ]
};
this.connectParticipant.createParticipantConnection(params, (err: any, data: any) => {
if (data) {
let socket = new WebSocket(data.Websocket.Url);
socket.onopen = function(e) {
console.log("[open] Connection established");
console.log("Sending to server");
socket.send("My name is John");
};
socket.onmessage = function(event) {
console.log("event", event);
console.log(`[message] Data received from server: ${event.data}`);
};
socket.onclose = function(event) {
if (event.wasClean) {
console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
// e.g. server process killed or network down
// event.code is usually 1006 in this case
console.log('[close] Connection died');
}
};
socket.onerror = function(error) {
console.log(`[error]`);
};
// this.connectionToken = data.ConnectionCredentials.ConnectionToken;
// this.sendEventOnAWSConnect();
// this.checkAgentMessage(data);
}
});
}将类型从CONNECTION_CREDENTIALS更改为 websocket 以检索websocket url。获得与以下相同的输出:
打开连接,将从服务器接收到的消息数据发送到服务器事件MessageEvent{.}:{" message ":“For禁忌”,“connectionId”:“.”,“requestId”:“.”}
它是以错误或信息的形式抛出禁止的。请告诉我,如果我还有什么东西需要执行,或者我在这里做了什么错事。此外,请让我知道,如果有人有解决问题的第二个方法,或如果有任何其他方法来检索代理消息以及。
发布于 2022-12-02 00:43:29
调用CreateParticipantConnection之后,您需要发送一条订阅消息。然后,您将开始接收websocket上的消息和事件。
用于聊天,您需要在已建立的websocket连接上发布以下内容:
{“主题”:“aws/订阅”,"content":{"topics":"aws/chat"}}
https://stackoverflow.com/questions/74602962
复制相似问题