Эх сурвалжийг харах

更新国内用户云存视频存储到国内存储桶

lang 4 жил өмнө
parent
commit
5d77651e67
2 өөрчлөгдсөн 128 нэмэгдсэн , 236 устгасан
  1. 5 0
      Ansjer/config.py
  2. 123 236
      Controller/CloudStorage.py

+ 5 - 0
Ansjer/config.py

@@ -68,6 +68,11 @@ OSS_STS_ACCESS_KEY = 'LTAIyMkGfEdogyL9'
 OSS_STS_ACCESS_SECRET = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
 OSS_ROLE_ARN = 'acs:ram::1901342792446414:role/stsoss'
 
+# aws api key
+AWS_ACCESS_KEY_ID = ['AKIA2MMWBR4D2H35G766','AKIA2E67UIMD45Y3HL53']  #0国内, 1国外
+AWS_SECRET_ACCESS_KEY = ['o5LeNneyTaMuihWxfo1rw5cc7aNzYor7BboHbt/t','ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw']
+AWS_ARN = ['arn:aws-cn:s3','arn:aws:s3']
+
 # 不同环境配置
 if SERVER_TYPE == 'Ansjer.local_settings':
     from Ansjer.config_local import *

+ 123 - 236
Controller/CloudStorage.py

@@ -29,7 +29,7 @@ from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
-    SERVER_DOMAIN_SSL
+    SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User
 from Object.AliPayObject import AliPayObject
@@ -329,142 +329,77 @@ class CloudStorageView(View):
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                           "bucket__region", "endTime").order_by('addTime')[:1]
         if ubqs.exists():
-            if ubqs[0]["bucket__mold"] == 0:
-                # 阿里云 oss sts
-                oc_qs = OssCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if oc_qs.exists():
-                    endTime = int(oc_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(oc_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
+            # 亚马逊 s3 sts
+            sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
+                values("addTime", "data")
+            if sts_qs.exists():
+                endTime = int(sts_qs[0]["addTime"]) + 3500
+                if endTime > now_time:
+                    print(endTime)
+                    print(now_time)
+                    res = json.loads(sts_qs[0]["data"])
+                    return JsonResponse(status=200, data=res)
                 # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                access_key_id = OSS_STS_ACCESS_KEY
-                access_key_secret = OSS_STS_ACCESS_SECRET
-                region_id = ubqs[0]['bucket__region']
-                role_arn = OSS_ROLE_ARN
-                clt = client.AcsClient(access_key_id, access_key_secret, region_id)
-                req = AssumeRoleRequest.AssumeRoleRequest()
-                # 设置返回值格式为JSON。
-                req.set_accept_format('json')
-                req.set_RoleArn(role_arn)
-                req.set_RoleSessionName(uid + '_' + channel)
-                req.set_DurationSeconds(3600)
-                Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*". \
-                    format(bucket_name=bucket_name, uid_channel=storage)
-                print(Resource_access)
-                policys = {
-                    "Version": "1",
-                    "Statement": [
-                        {
-                            "Action": ["oss:PutObject", "oss:DeleteObject", ],
-                            "Resource": [Resource_access],
-                            "Effect": "Allow",
-                            "Condition": {
-                                "IpAddress": {"acs:SourceIp": ip}
-                                # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
-                                # "IpAddress": {"acs:SourceIp": "*"}
-                            }
-                        }
-                    ]
-                }
-                req.set_Policy(Policy=json.dumps(policys))
-                body = clt.do_action(req)
-                # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
-                token = json.loads(body.decode('utf-8'))
-                print(token)
-                res = {
-                    'AccessKeyId': token['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': token['Credentials']['AccessKeySecret'],
-                    'SecurityToken': token['Credentials']['SecurityToken'],
-                    'Expiration': token['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': token['AssumedRoleUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip}
-                if oc_qs.exists():
-                    oc_qs.update(data=json.dumps(res), addTime=now_time)
-                else:
-                    OssCrdModel.objects.create \
-                        (uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
-                return JsonResponse(status=200, data=res)
-            elif ubqs[0]["bucket__mold"] == 1:
-                # 亚马逊 s3 sts
-                sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
-                    values("addTime", "data")
-                if sts_qs.exists():
-                    endTime = int(sts_qs[0]["addTime"]) + 3500
-                    if endTime > now_time:
-                        print(endTime)
-                        print(now_time)
-                        res = json.loads(sts_qs[0]["data"])
-                        return JsonResponse(status=200, data=res)
-                    # 套餐id
-                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
-                bucket_name = ubqs[0]['bucket__bucket']
-                endpoint = ubqs[0]['bucket__endpoint']
-                region_id = ubqs[0]['bucket__region']
-
-                ###############
-                REGION_NAME = region_id
-                boto3_sts = boto3.client(
-                    'sts',
-                    aws_access_key_id='AKIA2E67UIMD45Y3HL53',
-                    aws_secret_access_key='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',
-                    region_name=REGION_NAME
-                )
-                print('--------2--test')
-                print(REGION_NAME)
-                Policy = {
-                    "Version": "2012-10-17",
-                    "Statement": [
-                        {
-                            "Effect": "Allow",
-                            "Action": "s3:*",
-                            "Resource": ["arn:aws:s3:::{bucket_name}/{uid_channel}*".
-                                             format(bucket_name=bucket_name, uid_channel=storage)]
-                        }
-                    ]
-                }
-                print(Policy)
-                response = boto3_sts.get_federation_token(
-                    Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
-                    Policy=json.dumps(Policy),
-                    DurationSeconds=7200
-                )
-                ###############
-                res = {
-                    'AccessKeyId': response['Credentials']['AccessKeyId'],
-                    'AccessKeySecret': response['Credentials']['SecretAccessKey'],
-                    'SessionToken': response['Credentials']['SessionToken'],
-                    'Expiration': response['Credentials']['Expiration'],
-                    'expire': '3600',
-                    'endpoint': endpoint,
-                    'bucket_name': bucket_name,
-                    'arn': response['FederatedUser']['Arn'],
-                    'code': 0,
-                    'storage': storage,
-                    'endTime': ubqs[0]['endTime'],
-                    'ip': ip,
-                }
-                if sts_qs.exists():
-                    sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
-                else:
-                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
-                                               addTime=now_time, type=1)
-                return JsonResponse(status=200, data=res)
-            else:
-                res = {'code': 404, 'msg': 'data not exists!'}
+            storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+            bucket_name = ubqs[0]['bucket__bucket']
+            endpoint = ubqs[0]['bucket__endpoint']
+            region_id = ubqs[0]['bucket__region']
+
+            try:
+                aws_access_key_id = AWS_ACCESS_KEY_ID[ubqs[0]["bucket__mold"]]
+                aws_secret_access_key = AWS_SECRET_ACCESS_KEY[ubqs[0]["bucket__mold"]]
+                aws_arn = AWS_ARN[ubqs[0]["bucket__mold"]]
+            except:
+                res = {'code': 404, 'msg': 'mold not exists!'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+
+            ###############
+            boto3_sts = boto3.client(
+                'sts',
+                aws_access_key_id=aws_access_key_id,
+                aws_secret_access_key=aws_secret_access_key,
+                region_name=region_id
+            )
+            Policy = {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Action": "s3:*",
+                        "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                    }
+                ]
+            }
+            response = boto3_sts.get_federation_token(
+                Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
+                Policy=json.dumps(Policy),
+                DurationSeconds=7200
+            )
+            ##############
+            res = {
+                'AccessKeyId': response['Credentials']['AccessKeyId'],
+                'AccessKeySecret': response['Credentials']['SecretAccessKey'],
+                'SessionToken': response['Credentials']['SessionToken'],
+                'Expiration': response['Credentials']['Expiration'],
+                'expire': '3600',
+                'endpoint': endpoint,
+                'bucket_name': bucket_name,
+                'arn': response['FederatedUser']['Arn'],
+                'code': 0,
+                'storage': storage,
+                'endTime': ubqs[0]['endTime'],
+                'ip': ip,
+            }
+            if sts_qs.exists():
+                sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
+            else:
+                StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
+                                           addTime=now_time, type=1)
+            return JsonResponse(status=200, data=res)
+            # else:
+            #     res = {'code': 404, 'msg': 'data not exists!'}
+            #     return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
         res = {'code': 405, 'msg': 'Not purchased or expired!'}
         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
 
@@ -476,21 +411,22 @@ class CloudStorageView(View):
 
         dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False).values('vodPrimaryUserID',
                                                                                             'vodPrimaryMaster')
-        if not dv_qs.exists():
-            return response.json(12)
-        if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
-            return response.json(10034)
+        # if not dv_qs.exists():
+        #     return response.json(12)
+        # if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
+        #     return response.json(10034)
         now_time = int(time.time())
-        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).order_by('addTime')
+        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).values('bucket_id').order_by('addTime')
         if not bv_qs.exists():
             return response.json(10030)
         vh_qs = VodHlsModel.objects.filter \
-            (uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \
+            (uid=uid, channel=channel, endTime__gte=now_time,time__range=(startTime, endTime), bucket_id=bv_qs[0]['bucket_id']). \
             values("id", "time", "sec", "bucket__bucket", "fg", "bucket__endpoint", "bucket__region", "bucket__mold")
         vod_play_list = []
-
-        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-        aws_secret_access_key = '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'
+        if not vh_qs.exists():
+            return response.json(0, vod_play_list)
+        aws_access_key_id = AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]]
+        aws_secret_access_key = AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]]
         session = Session(
             aws_access_key_id=aws_access_key_id,
             aws_secret_access_key=aws_secret_access_key,
@@ -502,57 +438,29 @@ class CloudStorageView(View):
             bucket__mold = vod["bucket__mold"]
             bucket_name = vod["bucket__bucket"]
             endpoint = vod["bucket__endpoint"]
-            # bucket__region = vod["bucket__region"]
-            if bucket__mold == 0:
-                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
-                bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
-                urllst = url.split('?')
-                url_start = urllib.parse.unquote(urllst[0])
-                url_end = urllst[1]
-                vod_play_url = '{url_start}?{url_end}'. \
-                    format(url_start=url_start, url_end=url_end)
-                thumb = bucket.sign_url('GET', ts, 3600,
-                                        params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
-                vod_play_list.append({'name': vod['time'], 'sign_url': vod_play_url,
-                                      'thumb': thumb, 'sec': vod['sec'], 'vod_id': vod['id']})
-            elif bucket__mold == 1:
-
-                # aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
-                # aws_secret_access_key = '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'
-                # session = Session(
-                #     aws_access_key_id=aws_access_key_id,
-                #     aws_secret_access_key=aws_secret_access_key,
-                #     region_name=bucket__region
-                # )
-                # conn = session.client('s3')
-
-                thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
-                    format(uid=uid, channel=channel, time=vod['time'])
-                response_url = conn.generate_presigned_url(
-                    'get_object',
-                    Params={
-                        'Bucket': bucket_name,
-                        'Key': thumbspng
-                    },
-                    ExpiresIn=3600
-                )
-                vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
-                          'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
-                    format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
-                ts_num = int(vod['fg']) & 0xf
-                vod_play_list.append({
-                    'name': vod['time'],
-                    'sign_url': vod_url,
-                    'thumb': response_url,
-                    'sec': vod['sec'],
-                    'ts_num': ts_num,
-                    'vod_id': vod['id']
-                }),
+            bucket__region = vod["bucket__region"]
+            thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
+                format(uid=uid, channel=channel, time=vod['time'])
+            response_url = conn.generate_presigned_url(
+                'get_object',
+                Params={
+                    'Bucket': bucket_name,
+                    'Key': thumbspng
+                },
+                ExpiresIn=3600
+            )
+            vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
+                      'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
+                format(server_domain=SERVER_DOMAIN, uid=uid, channel=channel, time=vod['time'])
+            ts_num = int(vod['fg']) & 0xf
+            vod_play_list.append({
+                'name': vod['time'],
+                'sign_url': vod_url,
+                'thumb': response_url,
+                'sec': vod['sec'],
+                'ts_num': ts_num,
+                'vod_id': vod['id']
+            }),
         return response.json(0, vod_play_list)
 
     def do_store_playlist(self, request_dict, response):
@@ -582,44 +490,25 @@ class CloudStorageView(View):
             bucket_id = ub_qs_data['bucket__id']
             end_time = int(storeTime) + store_day * 86400
             if ub_qs_data['status'] == 1:
-                if ub_qs_data["bucket__mold"] == 0:
-                    oss_crd_qs = OssCrdModel.objects.filter(uid=UID, channel=channel)
-                    if oss_crd_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                elif ub_qs_data['bucket__mold'] == 1:
-                    sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
-                        values("addTime", "data")
-                    if sts_qs.exists():
-                        VodHlsModel.objects.create(
-                            uid=UID,
-                            channel=channel,
-                            time=storeTime,
-                            endTime=end_time,
-                            bucket_id=bucket_id,
-                            fg=fg,
-                            sec=sec,
-                        )
-                        res = {'code': 0, 'msg': '存储成功'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
-                    else:
-                        res = {'code': 404, 'msg': '设备未购买'}
-                        return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                            content_type="application/json,charset=utf-8")
+                sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
+                    values("addTime", "data")
+                if sts_qs.exists():
+                    VodHlsModel.objects.create(
+                        uid=UID,
+                        channel=channel,
+                        time=storeTime,
+                        endTime=end_time,
+                        bucket_id=bucket_id,
+                        fg=fg,
+                        sec=sec,
+                    )
+                    res = {'code': 0, 'msg': '存储成功'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
+                else:
+                    res = {'code': 404, 'msg': '设备未购买'}
+                    return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                        content_type="application/json,charset=utf-8")
             else:
                 res = {'code': 404, 'msg': '设备未开启'}
                 return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
@@ -1365,9 +1254,7 @@ class CloudStorageView(View):
         if switch_commodity_id:
             # 切换设备套餐关联
             using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
-                                                                                                        "endTime",
-                                                                                                        "bucket__content").order_by(
-                'addTime')
+                                                                        "endTime","bucket__content").order_by('addTime')
 
             if not using_uid_bucket.exists():
                 return response.json(10030)