首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从amazon连接通过websocket进行通信

无法从amazon连接通过websocket进行通信
EN

Stack Overflow用户
提问于 2022-11-28 15:34:42
回答 1查看 39关注 0票数 1

我正在集成亚马逊连接平台,在我们自己的聊天机器人中维护双向流通信,客户将是我们平台中的用户,代理将在亚马逊连接平台上进行通信。我现在正在使用websockets进行通信,但这给我带来了禁止的错误。详情如下:

最初,我使用了 aws 库来与aws建立连接,然后使用多个sdk来进一步发送消息。

  1. startChatContact ->使用AWS库与AWS建立连接,然后使用它检索参与token
  2. createParticipantConnection ->,使用参与令牌从该sdk检索连接令牌,使用类型:'CONNECTION_CREDENTIALS‘
  3. sendEvent ->使用连接令牌,ContentType:'application/vnd.amazonaws.connect.event.connection.acknowledged’在发送事件后发送event
  4. sendMessage ->,发送带有连接令牌的消息和ContentType:'text/plain'

代码语言:javascript
复制
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方法获得的。下面是密码。

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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”:“.”}

它是以错误或信息的形式抛出禁止的。请告诉我,如果我还有什么东西需要执行,或者我在这里做了什么错事。此外,请让我知道,如果有人有解决问题的第二个方法,或如果有任何其他方法来检索代理消息以及。

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 00:43:29

调用CreateParticipantConnection之后,您需要发送一条订阅消息。然后,您将开始接收websocket上的消息和事件。

来自https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipantConnection.html

用于聊天,您需要在已建立的websocket连接上发布以下内容:

{“主题”:“aws/订阅”,"content":{"topics":"aws/chat"}}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74602962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档