chenjunkai 6 жил өмнө
parent
commit
4b7250039d

+ 0 - 4
Ansjer/test/oss.py

@@ -53,7 +53,3 @@ publish_url = channel.publish_url
 signed_publish_url = bucket.sign_rtmp_url("vod", "playlist.m3u8", 3600)
 signed_publish_url = bucket.sign_rtmp_url("vod", "playlist.m3u8", 3600)
 print(signed_publish_url)
 print(signed_publish_url)
 
 
-'''
-直播录制转为媒体文件
-https://help.aliyun.com/document_detail/64997.html?spm=a2c4g.11186623.2.11.78274c07rvcHUR
-'''

+ 7 - 7
Ansjer/test/osstest.py

@@ -3,11 +3,11 @@ import oss2
 from var_dump import var_dump
 from var_dump import var_dump
 # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
 # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
 host = "oss-cn-shenzhen.aliyuncs.com"  # just for example
 host = "oss-cn-shenzhen.aliyuncs.com"  # just for example
-# accessid = 'LTAIpezLGJWqmrwR'
-# accesskey = 'S6vx8nZQw8pwoX07qMMnLdA61TMvX5'
-access_key_id = 'LTAIyMkGfEdogyL9'
-access_key_secret = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
-bucket_name = "cloudvod1"
+access_key_id = 'LTAIpezLGJWqmrwR'
+access_key_secret = 'S6vx8nZQw8pwoX07qMMnLdA61TMvX5'
+# access_key_id = 'LTAIyMkGfEdogyL9'
+# access_key_secret = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
+bucket_name = "cnvod1"
 auth = oss2.Auth(access_key_id, access_key_secret)
 auth = oss2.Auth(access_key_id, access_key_secret)
 # Endpoint以杭州为例,其它Region请按实际情况填写。
 # Endpoint以杭州为例,其它Region请按实际情况填写。
 bucket = oss2.Bucket(auth, host, bucket_name)
 bucket = oss2.Bucket(auth, host, bucket_name)
@@ -15,12 +15,12 @@ bucket = oss2.Bucket(auth, host, bucket_name)
 # 设置Delimiter参数为正斜线(/)。
 # 设置Delimiter参数为正斜线(/)。
 # for obj in oss2.ObjectIterator(bucket, delimiter='/',prefix='vod/'):
 # for obj in oss2.ObjectIterator(bucket, delimiter='/',prefix='vod/'):
 # for obj in oss2.ObjectIterator(bucket, prefix='FTSLL8HM437Z38WU111A/vod4/',delimiter='/'):
 # for obj in oss2.ObjectIterator(bucket, prefix='FTSLL8HM437Z38WU111A/vod4/',delimiter='/'):
-res=bucket.list_objects(prefix='vod/1543902584/',delimiter='/',max_keys=5)
+res=bucket.list_objects(prefix='/',delimiter='/',max_keys=5)
 # var_dump()
 # var_dump()
 var_dump(res.object_list)
 var_dump(res.object_list)
 exit()
 exit()
 
 
-for obj in oss2.ObjectIterator(bucket, prefix='vod/1543902584/',delimiter='/',max_keys=50):
+for obj in oss2.ObjectIterator(bucket, prefix='/',delimiter='/',max_keys=50):
     # 通过is_prefix方法判断obj是否为文件夹。
     # 通过is_prefix方法判断obj是否为文件夹。
     if obj.is_prefix():  # 文件夹
     if obj.is_prefix():  # 文件夹
         print('directory: ' + obj.key)
         print('directory: ' + obj.key)

+ 32 - 15
Ansjer/test/util/testss.py

@@ -1,17 +1,34 @@
-import time
+import json
+from aliyunsdkmts.request.v20140618 import QueryMediaListByURLRequest
+from aliyunsdkcore import client
+import urllib
 
 
-tmstm = '2018121810'
-timeArray = time.strptime(tmstm, "%Y%m%d%H")
-# print(timeArray)
-print(int(time.mktime(timeArray)))
+host = "oss-cn-shenzhen.aliyuncs.com"  # just for example
 
 
-import datetime,time
-nowutcdatetime = datetime.datetime.utcnow()
-un_time = time.mktime(nowutcdatetime.timetuple())
-print(un_time)
-# utc时间
-# print(datetime.datetime.fromtimestamp(1545868858))
-# dtimeArray = time.strftime(nowutc)
-# utc转换时间
-# timenow = (datetime.datetime.utcnow() + datetime.timedelta(hours=8))
-# print(timenow)
+# accessid = 'LTAIyMkGfEdogyL9'
+# accesskey = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
+accessid = 'LTAIpezLGJWqmrwR'
+accesskey = 'S6vx8nZQw8pwoX07qMMnLdA61TMvX5'
+
+bucket_name = "cnvod1"
+region = 'cn-shenzhen'
+
+def queryMediaListByURL():
+    global client
+    client = client.AcsClient(accessid, accesskey, region)
+    request = QueryMediaListByURLRequest.QueryMediaListByURLRequest()
+    # ossDomain = 'http://<input-bucket>.<region>.aliyuncs.com/';
+    ossDomain = 'http://cnvod1.oss-cn-shenzhen.aliyuncs.com/'
+    #对ossObject进行encode
+    ossObject = encodeByRFC3986("5ZBU8UD6RHMZJ5JW111A/vod1/2018122416/1545639357/ts0.ts")
+    print(ossObject)
+    request.set_FileURLs(ossDomain + ossObject)
+    # response = client.do_action_with_exception(request);
+    response = client.do_action_with_exception(request);
+    json_response = json.loads(response)
+    print(json_response)
+def encodeByRFC3986(ossObject):
+    return urllib.parse.quote(ossObject)
+    # return urllib.quote(ossObject)
+if __name__ == "__main__":
+    queryMediaListByURL()

+ 101 - 8
Controller/CloudVod.py

@@ -20,7 +20,7 @@ import oss2
 import paypalrestsdk
 import paypalrestsdk
 from aliyunsdkcore import client
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
-from django.http import JsonResponse,HttpResponseRedirect,HttpResponse
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 from django.views.generic.base import View
@@ -110,9 +110,103 @@ class CloudVodView(View):
                 return self.do_change_status(request_dict, userID, response)
                 return self.do_change_status(request_dict, userID, response)
             elif operation == 'playlist':
             elif operation == 'playlist':
                 return self.do_get_playlist(request_dict, userID, response)
                 return self.do_get_playlist(request_dict, userID, response)
+            elif operation == 'appSts':
+                return self.do_get_appSts(request_dict, userID, response)
+            elif operation == 'details':
+                return self.do_get_details(request_dict, userID, response)
             else:
             else:
                 return response.json(414)
                 return response.json(414)
 
 
+    def do_get_details(self, request_dict, userID, response):
+        did = request_dict.get('did', None)
+        dvqs = Device_Info.objects.filter(id=did).values('UID')
+        if not dvqs.exists():
+            return response.json(10, '设备不存在')
+        UID = dvqs[0]['UID']
+        ubqs = UID_Bucket.objects.filter(uid=UID). \
+            values('bucket__content', 'status', 'channel', 'endTime', 'uid')
+        res = []
+        if ubqs.exists():
+            res = list(ubqs)
+        return response.json(0, res)
+
+    def do_get_appSts(self, request_dict, userID, response):
+        did = request_dict.get('id')
+        channel = request_dict.get('channel')
+        dvqs = Device_Info.objects.filter(userID_id=userID, id=did).values('UID')
+        if not dvqs.exists():
+            return response.json(10, '设备不属于')
+        UID = dvqs[0]['UID']
+        ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1).values('channel', 'bucket__bucket',
+                                                                                    'bucket__endpoint',
+                                                                                    'bucket__region', 'endTime')
+        now_time = CommonService.get_utc()
+        if not ubqs.exists():
+            return response.json(10, '未购买')
+        elif now_time > ubqs[0]['endTime']:
+            return response.json(10, '过期')
+        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:
+                res = json.loads(oc_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)
+        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}
+        # '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)
+
     def do_pay_error(self):
     def do_pay_error(self):
         response = HttpResponse()
         response = HttpResponse()
         response.content = '''
         response.content = '''
@@ -248,14 +342,12 @@ class CloudVodView(View):
         ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1).values('channel', 'bucket__bucket',
         ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1).values('channel', 'bucket__bucket',
                                                                                     'bucket__endpoint',
                                                                                     'bucket__endpoint',
                                                                                     'bucket__region', 'endTime')
                                                                                     'bucket__region', 'endTime')
-        if not ubqs.exists():
-            res = {'code': 403}
-            return JsonResponse(status=200, data=res)
-            # return response.json(10, '设备未购买')
         now_time = CommonService.get_utc()
         now_time = CommonService.get_utc()
-        if now_time > ubqs[0]['endTime']:
-            res = {'code': 403}
+        if not ubqs.exists():
+            res = {'code': 403, 'msg': '未购买'}
             return JsonResponse(status=200, data=res)
             return JsonResponse(status=200, data=res)
+        elif ubqs[0]['endTime'] < now_time:
+            return JsonResponse(status=200, data={'code': 403, 'msg': '过期'})
         now_time_stamp = CommonService.get_utc()
         now_time_stamp = CommonService.get_utc()
         oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
         oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
         if oc_qs.exists():
         if oc_qs.exists():
@@ -438,7 +530,6 @@ class CloudVodView(View):
         red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
         red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
         return HttpResponseRedirect(red_url)
         return HttpResponseRedirect(red_url)
 
 
-
     def do_change_status(self, request_dict, userID, response):
     def do_change_status(self, request_dict, userID, response):
         did = request_dict.get('did', None)
         did = request_dict.get('did', None)
         status = request_dict.get('status', None)
         status = request_dict.get('status', None)
@@ -456,6 +547,8 @@ class CloudVodView(View):
         if now_time > ubqs[0].endTime:
         if now_time > ubqs[0].endTime:
             return response.json(10, '已过期')
             return response.json(10, '已过期')
         ubqs.update(status=status)
         ubqs.update(status=status)
+        if status == 0:
+            return response.json(0)
         utko = UidTokenObject()
         utko = UidTokenObject()
         utko.generate(data={'uid': UID, 'channel': channel})
         utko.generate(data={'uid': UID, 'channel': channel})
         uidTkUrl = "{SERVER_DOMAIN}cloudVod/getSts?uidToken={uidToken}". \
         uidTkUrl = "{SERVER_DOMAIN}cloudVod/getSts?uidToken={uidToken}". \

+ 5 - 3
Controller/UserController.py

@@ -520,10 +520,12 @@ class v2authCodeView(TemplateView):
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
         lang = request.POST.get('lang', None)
         lang = request.POST.get('lang', None)
         response = ResponseObject(lang)
         response = ResponseObject(lang)
-        was_limited = getattr(request, 'limited', False)
-        if was_limited is True:
-            return response.json(5)
         request_dict = request.POST
         request_dict = request.POST
+        phone = request_dict.get('phone', None)
+        if phone is not None:
+            was_limited = getattr(request, 'limited', False)
+            if was_limited is True:
+                return response.json(5)
         return self.ValidationError(request_dict, response)
         return self.ValidationError(request_dict, response)
 
 
     @ratelimit(key='ip', rate='2/m')
     @ratelimit(key='ip', rate='2/m')

+ 17 - 0
Model/models.py

@@ -650,3 +650,20 @@ class UID_Bucket(models.Model):
 
 
     def __str__(self):
     def __str__(self):
         return self.id
         return self.id
+
+# class UserStsModel(models.Model):
+#     id = models.AutoField(primary_key=True, verbose_name='主键')
+#     uid = models.CharField(max_length=20, verbose_name='设备UID')
+#     channel = models.SmallIntegerField(default=0, verbose_name='通道')
+#     data = models.TextField(verbose_name='设备sts')
+#     addTime = models.IntegerField(verbose_name='添加时间', default=0)
+#     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id',on_delete=models.CASCADE, default=1, verbose_name='存储空间')
+#
+#     def __str__(self):
+#         return self.id
+#
+#     class Meta:
+#         db_table = 'vod_user_sts'
+#         verbose_name = u'用户证书'
+#         verbose_name_plural = verbose_name
+#         ordering = ('-id',)