AWS 使用ivs chat 实现直播聊天功能

什么是IVS Chat Rooms

Amazon IVS Chat 是一种可扩展的流式聊天功能,具​​有内置的审核选项,旨在伴随实时流式视频。通过 IVS Chat,观众可以通过提问和参与讨论来建立社区关系。IVS Chat 提供房间资源管理和用于发送、接收和审核聊天消息的消息传递 API。

原理图
在这里插入图片描述

需求介绍

1. ivs chat 直播聊天功能
2. 聊天内容审查机制,提供给lambda的自定义处理方案

我们今天就配合ivs chat 来实现带有审核机制的直播聊天室,话不多说先上这块的架构图
在这里插入图片描述

IVS Chat: 是IVS的聊天室功能,IVS Chat 提供了wws用于我们使用websocket 去send聊天信息
Check IVS Chat Lambda:用于check 聊天室是否有非法字符和一些相关聊天信息的缓存逻辑
DynamoDb:非关系型数据库,是aws提供的NoSQL,可以实现无缝扩展和高可用。
Web Lambda: 直播web应用程序
api gateway: api 网关用于 client 请求weblambda的一个中间层。
redis:是用来缓存ivs chat token信息和其他数据的

由于我们是在做实验所以我们先手动创建一个IVS Chat Rooms

创建一个lambda并绑定一个role

在这里插入图片描述

给role添加ivs chat 的策略

在这里插入图片描述

创建一个IVS Chat Rooms

在这里插入图片描述

我们创建一个ivs chat rooms 输入聊天室名称和开启审核处理程序,很显然审核处理程序的业务逻辑需要我们自己实现,我们的框架设计也是这样实现的。

在这里插入图片描述

创建完成后我们可以看到几个数据:
 1.arn: 是我们在调用ivs chat rooms的aws boto3的api的时候我们会用到这个,用于标识我们在操作的是那个chat rooms
 2.Messaging endpoint:消息传递端点是需要我们发送信息的时候需要用websocket 建立连接的时候使用的。
 3.Chat tokens: 我们在连接websocket的时候需要用的token认证,这个token可以创建很多个,但是token是有生命周期的,我们需要将token缓存的redis里面用于发送给前端在建立连接的时候使用。

好我们构建聊天室的前置工作都做完了

如何使用python实现websocket send message

上代码

#client.py
from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL)
s_url = "这里是Messaging endpoint"
chat_client_token = "这里是Chat tokens 在业务代码里面是从redis里面获取的"
import uuid
import json, time
import websocket
import threading
def run(ws):
    while True:
        message = input()
        print(message,1111)
        payload = {
    
     
            "Action": "SEND_MESSAGE",
            "RequestId": str(uuid.uuid1()),
            "Content": message,
            "Attributes": {
    
    
                "CustomMetadata": "test metadata"
            }
        }
        ws.send(json.dumps(payload))

def open(wsapp):
    thread = threading.Thread(target=run,args=(wsapp,))
    thread.start()
   
def on_message(wsapp, message):
    print(message)

def on_error(wsapp, err):
  print("EXAMPLE error encountered: ", err)

def on_cont_message(wsapp,):
    message = input()
    print(message,1111)
    payload = {
    
     
        "Action": "SEND_MESSAGE",
        "RequestId": str(uuid.uuid1()),
        "Content": message,
        "Attributes": {
    
    
            "CustomMetadata": "test metadata"
        }
    }
    ws.send(json.dumps(payload))
protocol_str = "Sec-WebSocket-Protocol: " + chat_client_token
    
ws = websocket.WebSocketApp(url = s_url, header=[protocol_str], on_message=on_message, on_error=on_error, on_open=open)
ws.run_forever()

# check ivs lambda
import json
import boto3

def lambda_handler(event, context):
    # TODO implement
    print(event)
    client = boto3.client('ivschat')
    if event.get('Content') == "www":
        response = client.delete_message(
            id=event.get("MessageId"),
            reason='ceshi',
            roomIdentifier=event.get("RoomArn")
        )
    print(response)
    return {
    
    
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

代码逻辑

1. 我们使用的websocket中的WebSocketApp,WebSocketApp对websocket做了进一步的封装并提供了几种回调方案,例如:on_message, on_open, on_error, on_close
    url: websocket的地址。
    header: 客户发送websocket握手请求的请求头,{'head1:value1','head2:value2'}。
	on_message: 这个对象在接收到服务器返回的消息时调用。有两个参数,一个是该类本身,一个是我们从服务器获取的字符串(utf-8格式)。
	on_open: 在建立Websocket握手时调用的可调用对象,这个方法只有一个参数,就是该类本身。
	on_error: 这个对象在遇到错误时调用,有两个参数,第一个是该类本身,第二个是异常对象。
	on_close: 在遇到连接关闭的情况时调用,参数只有一个,就是该类本身。
	on_cont_message:这个对象在接收到连续帧数据时被调用,有三个参数,分别是:类本身,从服务器接受的字符串(utf-8),连续标志。
	on_data:当从服务器接收到消息时被调用,有四个参数,分别是:该类本身,接收到的字符串(utf-8),数据类型,连续标志。
	run_forever:用于做websocket长连接的,可以通过源码我们可以看到她在不停的 
2.我使用ws.run_forever()简历了长链接,因为我们首次建立连接websocket 会回调on_open函数,这时候我们开一个线程来做send message的动作,
将我们要发送的消息投送到IVS Chat 的server里面去,这时候IVS Chat 会触发lambda函数从而进行对消息的check,看是否是合法的和将聊天信息存入
到数据库里面。
3. check ivs lambda 这是一个测试代码,这段代码主要是我们遇到www的信息就删除它,我们来看一下效果。

当我们使用发送别的信息的时候,我们可以看到type是message 说明我们发送成功了
在这里插入图片描述
当我们发送www的时候我们可以看到多了一条type为event的回调消息,Eventname是DETETE_MESSAGE,说明我们已经将这条消息删除了,前端小朋友只要收到这条消息就可以将消息删除掉了。
在这里插入图片描述
好了这就是我们这次IVS Chat 实现聊天功能的实验代码,具体的功能还需要按照项目需求去精心的打磨

猜你喜欢

转载自blog.csdn.net/wujiesunlirong/article/details/126539067
今日推荐