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'
# }