zoukankan      html  css  js  c++  java
  • 阿里云实时音视频

    实时音视频为客户端创建令牌
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkrtc.request.v20180111 import CreateChannelRequest
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    import aliyunsdkcore.profile.region_provider as rtc_user_config
    import aliyunsdkcore.request as rtc_request
    import aliyunsdkcore.http.protocol_type as rtc_protocol_type
    import json, uuid
    
    
    # 频道认证
    class ChannelAuth:
        def __init__(self):
            self.app_id = None
            self.channel_id = None
            self.nonce = None
            self.timestamp = None
            self.channel_key = None
            self.recovered = None
            self.request_id = None
    
    
    # 恢复错误
    def recover_for_error(ex, app_id, channel_id):
        fatal = False
        request_id = ""
        if isinstance(ex, ServerException):
            request_id = ex.get_request_id()
            code = ex.get_error_code()
            if code == "IllegalOperationApp":
                fatal = True
            elif code.startswith("InvalidAccessKeyId"):
                fatal = True
            elif code == "SignatureDoesNotMatch":
                fatal = True
        if fatal:
            raise ex
        recovered = "RCV-%s" % str(uuid.uuid4())
        print("Recover from %s, recovered=%s" % (ex, recovered))
        auth = ChannelAuth()
        auth.app_id = app_id
        auth.channel_id = channel_id
        auth.nonce = recovered
        auth.timestamp = 0
        auth.channel_key = recovered
        auth.request_id = request_id
        auth.recovered = True
        return auth
    
    
    # 创建频道
    def create_channel(app_id, channel_id,
                       access_key_id, access_key_secret, region_id, endpoint
                       ):
        try:
            client = AcsClient(access_key_id, access_key_secret, region_id)
            request = CreateChannelRequest.CreateChannelRequest()
            request.set_AppId(app_id)
            request.set_ChannelId(channel_id)
    
            # Use HTTP, x3 times faster than HTTPS.
            rtc_request.set_default_protocol_type(rtc_protocol_type.HTTP)
    
            response = client.do_action_with_exception(request)
            obj = json.loads(response)
    
            auth = ChannelAuth()
            auth.app_id = app_id
            auth.channel_id = channel_id
            auth.nonce = obj['Nonce']
            auth.timestamp = obj['Timestamp']
            auth.channel_key = obj['ChannelKey']
            auth.request_id = obj['RequestId']
            auth.recovered = False
            return auth
        except Exception as ex:
            return recover_for_error(ex, app_id, channel_id)
    
    
    region_id = "cn-hangzhou"  # 地域
    endpoint = "rtc.aliyuncs.com"  # 节点
    
    app_id = 'sj17fi'
    channel_id = str(uuid.uuid4())
    access_key_id = 'LTAIT0dog7'
    access_key_secret = '8LOt6GqvvvvvvvPdvPcBXl'
    
    auth = create_channel(app_id, channel_id,
                          access_key_id, access_key_secret, region_id, endpoint
                          )
    
    # print(r1)
    # print(auth.channel_key)
    # print(auth.nonce)
    # print(auth.timestamp)
    
    # 为客户端创建令牌
    import uuid, hashlib
    
    
    def create_user_id():
        return str(uuid.uuid4())
    
    
    def create_token(channel_id, channel_key, app_id, user_id, nonce, timestamp):
        channel_id = channel_id.encode('utf-8')
        channel_key = channel_key.encode('utf-8')
        app_id = app_id.encode('utf-8')
        user_id = user_id.encode('utf-8')
        nonce = nonce.encode('utf-8')
        timestamp = str(timestamp).encode('utf-8')
    
        h = hashlib.sha256()
        h.update(channel_id)
        h.update(channel_key)
        h.update(app_id)
        h.update(user_id)
        h.update(nonce)
        h.update(timestamp)
        token = h.hexdigest()
        return token
    
    
    userid = create_user_id()
    token = create_token(channel_id, auth.channel_key, app_id,
                         userid, auth.nonce, auth.timestamp)
    
    channels = {}
    
    channels['AppID'] = app_id
    channels['channel_id'] = channel_id
    channels['userid'] = userid
    channels['Nonce'] = auth.nonce
    channels['Timestamp'] = auth.timestamp
    channels['Token'] = channel_id
    channels['GSLB'] = 'https://rgslb.rtc.aliyuncs.com'
    
    print(channels)
    
    # { # 'AppID': 'sj1fu7fi', 'channel_id': '02da1070-ec2a-4ebd-829f-4653e385b4a2', # 'userid': '9072b3d7-e954-4fd4-b807-aa60bf1d83c3', 'Nonce': '844bba6b89b5f9956f6a2a6fc33efde8', 'Timestamp': 1555379321, # 'Token': '02da1070-ec2a-4ebd-829f-4653e385b4a2', 'GSLB': 'https://rgslb.rtc.aliyuncs.com' # }













  • 相关阅读:
    怎么能让json_decode解析带斜杠的字符串
    **PHP转义Json里的特殊字符的函数
    sql中exists,not exists的用法
    **mysql数据库中实现内连接、左连接、右连接
    **PHP foreach 如何判断为数组最后一个最高效?
    mysql sql语句中用括号处理or和and的运算顺序
    iOS图片缓存
    linux regulator之浅见【转】
    Linux中THIS_MODULE宏定义详解
    likely()与unlikely()
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/11685034.html
Copyright © 2011-2022 走看看