chenjunkai 6 жил өмнө
parent
commit
c44199fe6d

+ 13 - 0
Ansjer/mqtt/__init__.py

@@ -0,0 +1,13 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2019/3/7 9:53
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: __init__.py.py
+@Contact: chanjunkai@163.com
+"""

+ 28 - 0
Ansjer/mqtt/mqtt_client.py

@@ -0,0 +1,28 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2019/3/7 9:43
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: mqtt_client.py
+@Contact: chanjunkai@163.com
+"""
+import paho.mqtt.client as mqtt
+
+HOST = "192.168.136.40"
+PORT = 1883
+
+
+def test():
+    client = mqtt.Client()
+    client.connect(HOST, PORT, 60)
+    client.publish("chat", "hello chenfulin", 2)
+    client.loop_forever()
+
+
+if __name__ == '__main__':
+    test()

+ 30 - 0
Ansjer/mqtt/mqtt_server.py

@@ -0,0 +1,30 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2019/3/7 9:42
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: mqtt_server.py
+@Contact: chanjunkai@163.com
+"""
+import paho.mqtt.client as mqtt
+
+
+def on_connect(client, userdata, flags, rc):
+    print("Connected with result code " + str(rc))
+    client.subscribe("chat")
+
+
+def on_message(client, userdata, msg):
+    print(msg.topic + " " + ":" + str(msg.payload))
+
+
+client = mqtt.Client()
+client.on_connect = on_connect
+client.on_message = on_message
+client.connect("192.168.136.45", 1883, 60)
+client.loop_forever()

+ 3 - 0
Ansjer/test/.cache/v/cache/lastfailed

@@ -0,0 +1,3 @@
+{
+  "mqtt_client.py::test": true
+}

+ 70 - 0
Ansjer/test/coposs_sts.py

@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+'''
+生成sts上传授权
+'''
+from aliyunsdkcore import client
+from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+import json
+import oss2
+
+# Endpoint以杭州为例,其它Region请按实际情况填写。
+endpoint = 'oss-cn-shenzhen.aliyuncs.com'
+# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+access_key_id = 'LTAIyMkGfEdogyL9'
+access_key_secret = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
+bucket_name = 'cloudvod1'
+# role_arn是角色的资源名称。
+role_arn = 'acs:ram::1901342792446414:role/stsoss'
+
+clt = client.AcsClient(access_key_id, access_key_secret, 'cn-shenzhen')
+req = AssumeRoleRequest.AssumeRoleRequest()
+
+# 设置返回值格式为JSON。
+req.set_accept_format('json')
+req.set_RoleArn(role_arn)
+req.set_RoleSessionName('test')
+req.set_DurationSeconds(3600)
+policys = {
+    "Version": "1",
+    "Statement": [
+        {
+            "Action": [
+                "oss:PutObject",
+                "oss:DeleteObject",
+            ],
+            "Resource": ["acs:oss:*:*:cloudvod1/*"],
+            "Effect": "Allow",
+            "Condition": {
+                "IpAddress": {
+                    "acs:SourceIp": "120.237.157.184"
+                }
+            }
+        }
+    ]
+}
+req.set_Policy(Policy=json.dumps(policys))
+body = clt.do_action(req)
+# body = clt.do_action_with_exception(req)
+# 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
+token = json.loads(body)
+print(token)
+# exit()
+# tokens = {
+#     "Credentials":{
+#     'AccessKeySecret': 'eDwALgKkfZp6eXD2jz8ckktfduneNCjEz8NgHxcZsVe',
+#     'AccessKeyId': 'STS.NJNUa1UjHgo5idVKqY9wBLB3e',
+#     'Expiration': '2018-11-15T09:06:30Z',
+#     'SecurityToken': 'CAISwgJ1q6Ft5B2yfSjIr4n7HtuFuLVp0K3ea0Lnr3EMNfhuo4eYhzz2IHxLf3RuAe8dvvw+nGBV7vsdlqN4S5ZDR1HCbsJxtkXiZd84J9ivgde8yJBZom/MewHKeeKSvqL7Z+H+U6mSGJOEYEzFkSle2KbzcS7YMXWuLZyOj+wADLEQRRLqVSdaI91UKwB+0pN4U0HcLvGwKBXnr3PNBU5zwGpGhHh49L60z7/siGTXh0aozfQO9cajYMq4YtJwJot6S5D3pqgUF4vZ+SJc8RVR790ShadfqwzAo8uWDnhJkWzkVLOOqps1d1A/P/VlXfcU8NqEzKUi5raIyN+tkE0WZboOCh6yHt7wnJH2f8qyLcs8eLrBPHDA78uCLJGdsXl/PS1AaV0SJIFxci4oWUF0F27ASqqu6FnGZwalW1srcmfDSBocGoABBPrYt/W5rkesL4dOVkQTaYz14WpwbEQfMBi+8/T5xLEqUP4tuwsiiBbsQhfAm3QLKzGODGJB9bCcfxpQPSnZuAyCI4uSUZiuCFUzdKX/eaiurRDLMnACYx3aEzfmDCvQ6dYbbHxIdk+0UNMWk51eWKXfWnoH+udI6rkks2AWjTM='
+#   }
+# }
+# 使用临时token中的认证信息初始化StsAuth实例。
+auth = oss2.StsAuth(token['Credentials']['AccessKeyId'],
+                    token['Credentials']['AccessKeySecret'],
+                    token['Credentials']['SecurityToken'])
+print(auth)
+# 使用StsAuth实例初始化存储空间。
+bucket = oss2.Bucket(auth, endpoint, bucket_name)
+# 上传一个字符串。
+# res = bucket.put_object('oss_media_hls.ts', b'hello world')
+res = bucket.put_object('object-name.txt', b'hello world')
+print(res)

+ 73 - 0
Ansjer/test/oss.py

@@ -0,0 +1,73 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/9/19 10:53
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: oss.py
+@Contact: chanjunkai@163.com
+"""
+from oss2 import *
+from oss2.models import *
+import time
+from var_dump import var_dump
+import urllib
+
+###########
+host = "oss-cn-shenzhen.aliyuncs.com"  # just for example
+# host = "hlsvoda.zositech.cn"  # just for example
+# host = 'oss-eu-central-1.aliyuncs.com'
+
+accessid = 'LTAIyMkGfEdogyL9'
+accesskey = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
+
+
+
+import oss2
+
+# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+auth = Auth(accessid, accesskey)
+
+# Endpoint以杭州为例,其它Region请按实际情况填写。
+service = oss2.Service(auth, host)
+
+print([b.name for b in oss2.BucketIterator(service)])
+
+
+exit()
+
+
+
+bucket_name = "cnvod1"
+channel_name = "vod"
+auth = Auth(accessid, accesskey)
+bucket = Bucket(auth, host, bucket_name)
+
+######################
+# 缩略图
+url = bucket.sign_url('GET', 'VVDHCVBYDKFMJRWA111A/vod1/2019010315/1546498920/ts2.ts', 60 * 60, params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
+# url = bucket.sign_url('GET', 'FTSLL8HM437Z38WU111A/vod4/2018121001/1543902118/1543902118.m3u8', 60 * 60, params={'x-oss-process': 'hls/sign'})
+# url = urllib.parse.unquote(url, encoding='utf-8', errors='replace')
+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)
+print(vod_play_url)
+exit()
+# 播放m3u8
+# m3list = bucket.post_vod_playlist(channel_name=channel_name, playlist_name='test.m3u8', start_time=1537336020119,
+#                                   end_time=1537336029318)
+
+exit()
+# 获取推流地址
+channel_cfg = LiveChannelInfo(target=LiveChannelInfoTarget(frag_count=10))
+channel = bucket.create_live_channel(channel_name, channel_cfg)
+publish_url = channel.publish_url
+signed_publish_url = bucket.sign_rtmp_url("vod", "playlist.m3u8", 3600)
+print(signed_publish_url)
+

+ 60 - 0
Ansjer/test/oss_sts.py

@@ -0,0 +1,60 @@
+from aliyunsdkcore import client
+from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+import json
+import oss2
+
+
+# Endpoint以杭州为例,其它egion请按实际情况填写。
+endpoint = 'oss-cn-shenzhen.aliyuncs.com'
+access_key_id = 'LTAIyMkGfEdogyL9'
+access_key_secret = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
+bucket_name = 'cloudvod1'
+# role_arn是角色的资源名称。
+role_arn = 'acs:ram::1901342792446414:role/stsoss'
+
+clt = client.AcsClient(access_key_id, access_key_secret, 'cn-shenzhen')
+req = AssumeRoleRequest.AssumeRoleRequest()
+
+# 设置返回值格式为JSON。
+req.set_accept_format('json')
+req.set_RoleArn(role_arn)
+req.set_RoleSessionName('uid13241234123')
+req.set_DurationSeconds(3600)
+policys = {
+    "Version": "1",
+    "Statement": [
+        {
+            "Action": [
+                "oss:PutObject",
+                "oss:DeleteObject",
+            ],
+            # "Resource": ["acs:oss:*:*:cloudvod1/*"],
+            "Resource": ["acs:oss:*:*:cloudvod1/test/*"],
+            "Effect": "Allow",
+            "Condition": {
+                "IpAddress": {
+                    "acs:SourceIp": "120.237.157.184"
+                }
+            }
+        }
+    ]
+}
+req.set_Policy(Policy=json.dumps(policys))
+body = clt.do_action(req)
+# body = clt.do_action_with_exception(req)
+# 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
+token = json.loads(body)
+print(token)
+
+
+# 使用临时token中的认证信息初始化StsAuth实例。
+auth = oss2.StsAuth(token['Credentials']['AccessKeyId'],
+                    token['Credentials']['AccessKeySecret'],
+                    token['Credentials']['SecurityToken'])
+print(auth)
+# 使用StsAuth实例初始化存储空间。
+bucket = oss2.Bucket(auth, endpoint, bucket_name)
+# 上传一个字符串。
+# res = bucket.put_object('oss_media_hls.ts', b'hello world')
+res = bucket.put_object('test/test-name.txt', b'hello world')
+print(res)

+ 66 - 0
Ansjer/test/osssigput.py

@@ -0,0 +1,66 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/11/8 9:23
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: oss_sts.py
+@Contact: chanjunkai@163.com
+"""
+# -*- coding: utf-8 -*-
+'''
+生成sts上传授权
+'''
+from aliyunsdkcore import client
+from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+import json
+import oss2
+import base64
+
+'''
+http://test.dvema.com/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsIjoiNCIsInVpZCI6IkZUU0xMOEhNNDM3WjM4V1UxMTFBIn0.wkrwYvIYf5qEukOSTxALSAgSqop-gNBdEvSwScOgYB8
+'''
+
+# tokenss ={"arn": "acs:ram::1901342792446414:role/stsoss/P2WNGJRD2EHA5EU9111A", "expire": "3600", "Expiration": "2019-02-25T07:03:40Z", "endpoint": "oss-cn-shenzhen.aliyuncs.com", "ip": "120.237.157.181", "storage": "P2WNGJRD2EHA5EU9111A/vod1/", "AccessKeySecret": "ErbGnFyPWPcfNBPRkcpZBJNBVpsX73q2u5vgJYownBQd", "SecurityToken": "CAIS9AJ1q6Ft5B2yfSjIr4vWBsLMjLBI0q2haFD/pTUgb8RvqL3pqDz2IHFIf3NhAe0bv/kzm2lX7/YYlr1LEaBjam7+QZFdzr0K3D7wOtOYkpRIRwn3ctj3d1KIAjvXgeV+CoeQFaELE5XAQlTAkTAJkNmeXD6+XlujHISUgJp8FLo+VRW5ajw0TbUzIRB5+vcHKVzbN/umLnyShXHLXmZlvgdghER166m03re4iHzkgUb91/UeqqnoP5GgdLMMBppkVMqv1+EELsiH2SVLuR9R7/U03u4W8jHZud3ERGEL3DOpEdD4qPBPBVJUW/ljQvdt6+b7maQ/+JaX9eXW0z9BMftYSD+lIImr25n/H/6zPdsYbcSCWROUiIjJbMKq9Vp5PjRCZFpoA4NwciYrVUZzG2uGdvH7oQzwD139G/Tf4sYfyoFoyljkx92OKmWUTq+RuSRiYc5gNBl5b0NLjDG9LfZZKlwWaT18G62SVp5jypvDLGYoZWYagAGOO+MMAjzgPaDMySC/exBy3d1Lp0iCGLeY6HYgMhel1YjuC2+vaPxvIaTgp4n9+QmQi+i1wtRhCVk8bwY0YCgNO5nZds4E0J5g7xTfnMfm30FaRs5s3rJohwEwp4cnsxgqsDGwwvqpOAefRd/hscpw3frgyPEVG6b6XRY4na+xpA==", "AccessKeyId": "STS.NHcMxxaoieoJjvNA5ucKCGxBJ", "bucket_name": "cnvod1", "code": 0}
+tokenss = {"arn": "acs:ram::1901342792446414:role/stsoss/P2WNGJRD2EHA5EU9111A", "expire": "3600", "endpoint": "oss-cn-shenzhen.aliyuncs.com", "AccessKeySecret": "ErbGnFyPWPcfNBPRkcpZBJNBVpsX73q2u5vgJYownBQd", "ip": "120.237.157.181", "storage": "P2WNGJRD2EHA5EU9111A/vod1/", "Expiration": "2019-02-25T07:03:40Z", "SecurityToken": "CAIS9AJ1q6Ft5B2yfSjIr4vWBsLMjLBI0q2haFD/pTUgb8RvqL3pqDz2IHFIf3NhAe0bv/kzm2lX7/YYlr1LEaBjam7+QZFdzr0K3D7wOtOYkpRIRwn3ctj3d1KIAjvXgeV+CoeQFaELE5XAQlTAkTAJkNmeXD6+XlujHISUgJp8FLo+VRW5ajw0TbUzIRB5+vcHKVzbN/umLnyShXHLXmZlvgdghER166m03re4iHzkgUb91/UeqqnoP5GgdLMMBppkVMqv1+EELsiH2SVLuR9R7/U03u4W8jHZud3ERGEL3DOpEdD4qPBPBVJUW/ljQvdt6+b7maQ/+JaX9eXW0z9BMftYSD+lIImr25n/H/6zPdsYbcSCWROUiIjJbMKq9Vp5PjRCZFpoA4NwciYrVUZzG2uGdvH7oQzwD139G/Tf4sYfyoFoyljkx92OKmWUTq+RuSRiYc5gNBl5b0NLjDG9LfZZKlwWaT18G62SVp5jypvDLGYoZWYagAGOO+MMAjzgPaDMySC/exBy3d1Lp0iCGLeY6HYgMhel1YjuC2+vaPxvIaTgp4n9+QmQi+i1wtRhCVk8bwY0YCgNO5nZds4E0J5g7xTfnMfm30FaRs5s3rJohwEwp4cnsxgqsDGwwvqpOAefRd/hscpw3frgyPEVG6b6XRY4na+xpA==", "AccessKeyId": "STS.NHcMxxaoieoJjvNA5ucKCGxBJ", "bucket_name": "cnvod1", "code": 0}
+# 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
+
+# 使用临时token中的认证信息初始化StsAuth实例。
+auth = oss2.StsAuth(tokenss['AccessKeyId'],
+                    tokenss['AccessKeySecret'],
+                    tokenss['SecurityToken'])
+print(auth)
+############### callback
+callback_dict = {}
+callback_dict['callbackUrl'] = 'http://www.dvema.com:3000/?token=token&filename=shijianchuo&size=1234&len=1234'
+# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。
+callback_dict['callbackHost'] = 'oss-cn-shenzhen.aliyuncs.com'
+# 设置发起回调时请求body的值。
+callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'
+# 设置发起回调请求的Content-Type。
+callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'
+# 回调参数是Json格式,并且需要Base64编码。
+callback_param = json.dumps(callback_dict).strip()
+base64_callback_body = oss2.utils.b64encode_as_string(callback_param)
+# 回调参数编码后放在Header中发送给OSS。
+headers = {'x-oss-callback': base64_callback_body}
+################
+# exit()
+# 使用StsAuth实例初始化存储空间。
+endpoint = tokenss['endpoint']
+bucket = oss2.Bucket(auth, tokenss['endpoint'], tokenss['bucket_name'])
+# # 上传一个字符串。
+# bucket.delete_object('a-3.txt')
+# exit()
+patht = tokenss['storage'] + 'asfsdafsdafdsa'
+print(patht)
+print(endpoint)
+print(bucket.put_object(patht, b'ddd'))
+# bucket.put_object('FTSLL8HM437Z38WU111A/vod4/1234.txt', b'12345646',headers)
+exit()
+res = bucket.get_object('ddd.txt')
+print(res.read())

+ 97 - 0
Ansjer/test/s3sts.py

@@ -0,0 +1,97 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/11/8 17:30
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: s3sts.py
+@Contact: chanjunkai@163.com
+"""
+
+def getCredentials():
+    import boto3
+    REGION_NAME = 'us-east-1'  # e.g
+    import json
+
+    sts = boto3.client(
+        'sts',
+        aws_access_key_id='AKIAIXAA4C3QCK7ZNUOA',
+        aws_secret_access_key='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',
+        region_name=REGION_NAME
+    )
+
+    Policy = {"Version": "2012-10-17",
+              "Statement": [{"Effect": "Allow", "Action": "s3:*", "Resource": ["arn:aws:s3:::ansjerfilemanager/*"]}]}
+    credentials = sts.get_federation_token(
+        Name='chanjunkai@163.com',  # or any unique text related to user
+        Policy=json.dumps(Policy),
+        DurationSeconds=3600,
+        # minimum is 200 which is enough as token is just for start of request and necessarily need not live throughout the life of the whole upload.
+    )
+
+    print(credentials)
+    access_key_id = credentials['Credentials']['AccessKeyId']
+    session_token = credentials['Credentials']['SessionToken']
+    secret_access_key = credentials['Credentials']['SecretAccessKey']
+
+# getCredentials()
+#
+# exit()
+def getCredentialsTemplate():
+    import boto3
+    REGION_NAME = 'us-east-1'  # e.g
+
+    sts = boto3.client(
+        'sts',
+        aws_access_key_id='AKIAIXAA4C3QCK7ZNUOA',
+        aws_secret_access_key='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',
+        region_name=REGION_NAME
+    )
+
+    Policy = {"Version": "2012-10-17", "Statement": [
+        {"Effect": "Allow", "Action": "s3:*", "Resource": ["arn:aws:s3:::<your-bucket>/<key-folder>/*"]}]}
+    credentials = sts.get_federation_token(
+        Name='12132@qq.com',  # or any unique text related to user
+        Policy={},
+        DurationSeconds=3600,
+        # minimum is 200 which is enough as token is just for start of request and necessarily need not live throughout the life of the whole upload.
+    )
+    access_key_id = credentials['Credentials']['AccessKeyId']
+    session_token = credentials['Credentials']['SessionToken']
+    secret_access_key = credentials['Credentials']['SecretAccessKey']
+    print(credentials)
+
+def test():
+    print('test')
+    import boto3
+    REGION_NAME = 'us-east-1'  # e.g
+    import json
+    # crd = {'Credentials': {'AccessKeyId': 'ASIA2E67UIMDZEZW7F56', 'SecretAccessKey': '2XE3bxqUlt7RTwojtsOxAQdp25dXlPSOGJr4PJ9l', 'SessionToken': 'FQoGZXIvYXdzEHIaDNE8Ddu2SeUjFQB3ICL7AVZuoryvjuDgFFkNuB81R2tO+jo5xbH3mecUN9SygDRWccfGqUkZZli8h9oF9nxht3LzawpTzR8Xsk3Zcq7hXZ4n69nNjCzO5iRAqNU5OSA5QdS70xcJyGBvMz5QX+QL6T8nTUf0qImvgTgzHl1U7dhPDkpR2TTpuFkoCxPjPDDmljA45TzOzDPkZ9P48njKF0ijJsWKUIJSOOXpixn7QZHE0+WzCrl4OQdr4gyYBDufYQl4Hc/jhG1W40FE9KARRClOFQk01gc8RZR07K26+bDUfLdhT4uBpwZ64xR64VQX0OKVu0e9hjPFEePDheSIwdzS7htJomuF5Vq7KIGuk98F', 'Expiration': datetime.datetime(2018, 11, 9, 1, 38, 25, tzinfo=tzutc())}, 'FederatedUser': {'FederatedUserId': '697864307463:chanjunkai@163.com', 'Arn': 'arn:aws:sts::697864307463:federated-user/chanjunkai@163.com'}, 'PackedPolicySize': 11, 'ResponseMetadata': {'RequestId': 'c4e67d2b-e3b7-11e8-b1b0-bfa03e244fac', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'c4e67d2b-e3b7-11e8-b1b0-bfa03e244fac', 'content-type': 'text/xml', 'content-length': '1151', 'date': 'Fri, 09 Nov 2018 00:38:24 GMT'}, 'RetryAttempts': 0}}
+    crd = {'AccessKeyId': 'ASIA2E67UIMD2KA76ZX3', 'SecretAccessKey': 'HbbZPLKcdr1vh81fUH5M8bGzhobPJ9/7SjOBqLNB', 'SessionToken': 'FQoGZXIvYXdzEOz//////////wEaDOT/uGl4KlSpHcQk1SL7AZW+0TxQFvhBp+UtPACl1L7WXftaHv7R5AozWYO/MmDHU1IDSQw0JNbK6v5xhOtxgdE2aSmN0UGq9g5SyI5+EX8xDrwuSg6b8fgUJ6Z9N62xO1e5qnY5wYI1R6xbmRHqCfIN+uBg/PzeKKcSLiLfK49nPbxTsgXn3drW+pQ4kjvyTDQlNVqwCk61eNTrt+WIqKz7e71BUV5I0vlERivyknWve5uoBrBGesYRSxAYT5/9MqvvGMc8k8lfDStlJOwANPqcXFyQFg8heU3pnenjJZOQ+vMHzEHxL7yZseq6SoadjkWT6xm4VyDLGPGr4IdUaoP1V9FFDdGbVHwzKM6crt8F'}
+
+
+
+    # s3_resource = boto3.resource(
+    s3_resource = boto3.client(
+        's3',
+        aws_access_key_id=crd['AccessKeyId'],
+        aws_secret_access_key=crd['SecretAccessKey'],
+        aws_session_token=crd['SessionToken'],
+    )
+    response = s3_resource.put_object(
+        Body='xxxxx',
+        Key='test',
+        Bucket='ansjerfilemanager',
+        # Expires=datetime()
+    )
+    # response = s3_resource.get_object(
+    #     Bucket='ansjerfilemanager',
+    #     Key='face.jpg',
+    # )
+    print(response)
+
+test()

+ 80 - 0
Ansjer/test/test.py

@@ -0,0 +1,80 @@
+# -*- coding:utf-8 -*-
+import smtplib
+import email
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from email.mime.image import MIMEImage
+from email.mime.base import MIMEBase
+from email.mime.application import MIMEApplication
+from email.header import Header
+# 发件人地址,通过控制台创建的发件人地址
+username = 'message@dvema.com'
+# 发件人密码,通过控制台创建的发件人密码
+password = 'SMtp123456'
+# 自定义的回复地址
+replyto = '***'
+# 收件人地址或是地址列表,支持多个收件人,最多30个
+#rcptto = '***,***'
+# rcptto = '1758730877@qq.com'
+rcptto = 'cjk1758730877@gmail.com'
+# 构建alternative结构
+msg = MIMEMultipart('alternative')
+msg['Subject'] = Header('自定义信件主题').encode()
+msg['From'] = '%s <%s>' % (Header('自定义发信昵称').encode(), username)
+# msg['To'] = rcptto
+msg['Reply-to'] = replyto
+msg['Message-id'] = email.utils.make_msgid()
+msg['Date'] = email.utils.formatdate()
+# 构建alternative的text/plain部分
+# textplain = MIMEText('自定义TEXT纯文本部分', _subtype='plain', _charset='UTF-8')
+# msg.attach(textplain)
+# 构建alternative的text/html部分
+sendHtml = '''
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+<div class="content"
+     style="overflow: hidden;padding:30px 10% 70px 10%;margin:0 10%;background-color: #fff;box-shadow:0 4px 20px rgba(0,0,0,0.1);word-break: break-all;">
+    <h2 style="margin: 30px 0;">Hello, {username}</h2>
+    <p style="margin-bottom: 40px;">请输入验证码完成注册,有效期10分钟:</p>
+    <span style="padding: 10px 20px; font-size: 24px;background-color: #EB6F5A;border-radius:4px;color:#fff;">{captcha}</span>
+</div>
+</body>
+</html>
+'''
+texthtml = MIMEText(sendHtml, _subtype='html', _charset='UTF-8')
+msg.attach(texthtml)
+# 发送邮件
+try:
+    client = smtplib.SMTP()
+    #python 2.7以上版本,若需要使用SSL,可以这样创建client
+    #client = smtplib.SMTP_SSL()
+    #SMTP普通端口为25或80
+    client.connect('smtpdm.aliyun.com', 25)
+    #开启DEBUG模式
+    client.set_debuglevel(0)
+    client.login(username, password)
+    #发件人和认证地址必须一致
+    #备注:若想取到DATA命令返回值,可参考smtplib的sendmaili封装方法:
+    #      使用SMTP.mail/SMTP.rcpt/SMTP.data方法
+    client.sendmail(username, rcptto, msg.as_string())
+    client.quit()
+    print('邮件发送成功')
+except smtplib.SMTPConnectError as e:
+    print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error)
+except smtplib.SMTPAuthenticationError as e:
+    print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error)
+except smtplib.SMTPSenderRefused as e:
+    print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error)
+except smtplib.SMTPRecipientsRefused as e:
+    print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error)
+except smtplib.SMTPDataError as e:
+    print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error)
+except smtplib.SMTPException as e:
+    print('邮件发送失败, ', e.message)
+except Exception as e:
+    print('邮件发送异常, ', str(e))

+ 13 - 0
Ansjer/test/util/__init__.py

@@ -0,0 +1,13 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2019/3/7 9:53
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: __init__.py.py
+@Contact: chanjunkai@163.com
+"""

+ 71 - 0
Ansjer/test/util/apns-dev.pem

@@ -0,0 +1,71 @@
+Bag Attributes
+    friendlyName: Apple Development IOS Push Services: com.ansjer.zsavcloud
+    localKeyID: EE FA 88 7C 98 58 FD 7D 8C 91 F5 33 67 4F 73 49 BB AA E4 EE 
+subject=/UID=com.ansjer.zsavcloud/CN=Apple Development IOS Push Services: com.ansjer.zsavcloud/OU=772N5HXAR2/C=CN
+issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
+-----BEGIN CERTIFICATE-----
+MIIFjTCCBHWgAwIBAgIIS9oJMHjnoMgwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js
+ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3
+aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+HhcNMTkwMTE0MDcyNzE3WhcNMjAwMTE0MDcyNzE3WjCBjDEkMCIGCgmSJomT8ixk
+AQEMFGNvbS5hbnNqZXIuenNhdmNsb3VkMUIwQAYDVQQDDDlBcHBsZSBEZXZlbG9w
+bWVudCBJT1MgUHVzaCBTZXJ2aWNlczogY29tLmFuc2plci56c2F2Y2xvdWQxEzAR
+BgNVBAsMCjc3Mk41SFhBUjIxCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAxVcdPjJE7jqqFezK6Ws/hIgTb3npC62l7QTyOWFoi7pt
+Kz4QQaarV1oy7+vaTY1wi8BdSL5zi9puINXuBU50efj2b7Ev2elMSKFma2v96k8s
+t/fEX7x1bANjUjqZFY9A2rcoYpnTzsbBvw3UT2ljDw7W0KqvoYecmqhvzs2qcaxk
+54uCQOzY/4eKSwnWzDh/UmsQYKTm+PJfOXwV2T1ZiOzkntMkrW/olZpHbkWUY5WF
+LM7teMc+ubTxPLwqs7oe0gVGi2qaVPApnTkPyMys+wxK03o7bUXF2y/ZizO19Ww+
+TXV4zGhhDmYymkSs7VhgqgSbrg+f6vZRQ9y+0HVUKwIDAQABo4IB5TCCAeEwCQYD
+VR0TBAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAQ8GA1Ud
+IASCAQYwggECMIH/BgkqhkiG92NkBQEwgfEwgcMGCCsGAQUFBwICMIG2DIGzUmVs
+aWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBh
+Y2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMg
+YW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNl
+cnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wKQYIKwYBBQUHAgEWHWh0
+dHA6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMBMGA1UdJQQMMAoGCCsGAQUFBwMC
+ME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2Nl
+cnRpZmljYXRpb25hdXRob3JpdHkvd3dkcmNhLmNybDAdBgNVHQ4EFgQU7vqIfJhY
+/X2MkfUzZ09zSbuq5O4wCwYDVR0PBAQDAgeAMBAGCiqGSIb3Y2QGAwEEAgUAMA0G
+CSqGSIb3DQEBBQUAA4IBAQBhSQLhTOPAIubqCWQo/PE6Ibo8SIp7nJs3scn9SyxZ
+xJCZKWHJIsHQc8mlSshgNweWzMLXwHtOuV2P7Gu+4hVC6viUj35HlWuc42WEMD83
+Q9ztnbhHFEO27By0Ogv5j0MslxwkMZ1lQ5B/jdJ7I/IMa0pzmIZ75gcQC79Yur0Y
+EBrjSJhWESpwnP1165GdnfAMsoDRIICFPjH/RwVtcfoFqcujcmGlkDb/fRYI7sUN
+TQWayJWpTpl2kk6fToRWedwVsO+Wo6jesF93HziyoiMGv/ZsBqU97o5tc9yYb283
+FfyCQCIf/myb9lkxhYkwAEFcJiA1EvEIns1YogRlavsL
+-----END CERTIFICATE-----
+Bag Attributes
+    friendlyName: testAPN
+    localKeyID: EE FA 88 7C 98 58 FD 7D 8C 91 F5 33 67 4F 73 49 BB AA E4 EE 
+Key Attributes: <No Attributes>
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIP1sglTmNa+QCAggA
+MBQGCCqGSIb3DQMHBAiHnz0S7++cqgSCBMj6aT2tgl720pDqknYzMRi7vIFXd6FU
+QSy6j2EjiEq9JPFaSzGLMihGtNyMeJ6zDclzEJoP4+PC8tYBd5Ij2dVU0k0EEksv
+gEix8deokPB9npaksC/OP61vz9G40deMJ8URqKB9cpo6+zTpdO7ful0yAB++fLez
+y7qzAnd6T1MgJiMs7yBmQNq33UghOG9KYT+NTMT6hQ1CJ2l4iB6HJhW0X/sjo0qJ
+l9c+ccZqBwjG9DsXTi+Vx+hRDB6xD+E8aD8kwcrOuV5u+geRLQSnBFSc97CWi3aX
+OY+wClWEPwYwrx5g5tTXN3Ee07ydMzLA8CY6BjnsfCECtDNA5B//aGx6+BB1Zbd+
+YFg7xW7FC0VK1uq/gpsGsfRX6y+d1xkNw0UMaPRaxeRiqXuaK7iHHYWz6LHybw1m
+46ypsOEnLK+tHSv1XZgAGgM3zIE8YH1Ls6Hmtbzsnp1gSTzBmwBqx3WaCUi7sqYN
+oSUrQhBDoxXzwwCQ78KHqdme8V6uec9NRtv236y65jt1ycRSNVkZDrwUcqf8PpXG
+U7D0E6OmRLRTd91VTvTJOjLvCwYKhqt5VkF0kicSf2fE35Meejz2WW2KUKDCTyER
+Pd0Xi+u94JxXREdhDH0GVQSbfbJ5ieA5u0G7pYcDX8qOzIunECoxtzM03NVAhuAE
+s3axsDsBSQuSI3zMwxa4JusFdkL318GBeya9aQnojVfyu5oUCADZx69+/dn3Zru0
+0SLFEhYdSNJ+cqlrkNgyQk+dxO927hoZjjye59lWNcVzySdO0Qz7R6HmO+30DbG2
+5PIFdMzhNGfYMGOrIJWTpLM0XtBSCmTpOWfhf2CdpFhz9xLtq1lXOVMlGswUnoG1
+s3WENfQdiMESLmO1a07GYTT+b357TUqNUQzvC+kbbTYtk0GDP14a9obMsRvWhkNx
++uB04AYcFrnbzjn1d8wRnUmVbOjLFZ1T3FS0XgvHv3MsLRbFegBtHklGYwZJyG0i
+kDn3fixTMDQClRx7r+dh3Vj+bgent4n+h6Rs0XYpbufdqOUGoIKgG9PsgHtJESbc
+ii3TPMAtRGwRuya2G9Yka11k56PLg6oimJUZrh6CmYkRhBzbYnPFZBo03xgmM8lT
+8mkKmPCxCfDTq6ar844z7mv73dMcfshvkcurlsuf5SEIu8iFFD0D1FajP0fWbHQW
+weLz5LZBknMEfx1M0OqYLBIQGCjUlXuuXZ/U+Y0/lE0SV/ctciaM2IbWX7ZMVFzU
+Pd8ebPpKdoyhKw1RZjFTJNuPL6g8NBUcWZvfDIUuHTtuLy6Pz1P+jVPmQAtZicqi
+hu/MWSfjJS28MQyr8IhiHpx5WSGcCQMWZ4i9eHDwt88VYgwphB/15954LCOefHzK
+h2HpR+q6frB3sZ241a6sIFXLFSFeq6HzRxVWPi8UfPkwhXFC/XXhBDX0Om9lllXr
+GTGbFcKmZHM32V3Xznec2yUVSvf8TX3GrEjLXRHAG7U7URxzsnk7cqXURftHmMpZ
+O/xl9EXT4B1hfPGggcxY03hxrnCNbVn/K1CKEfx3zh2dZHYDZtZo0BosWl/RTaCY
+S9bPNneMaJz551uzHcA1vGPWqbQeJvykVP2hO1G/c6YTSCQIpw9YgGrXSL/k3vjI
+LIc=
+-----END ENCRYPTED PRIVATE KEY-----

+ 155 - 0
Ansjer/test/util/email_log.py

@@ -0,0 +1,155 @@
+# coding=utf-8
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
+#        ┏┓   ┏┓+ +
+#    ┏┛┻━━━┛┻┓ + +
+#    ┃       ┃  
+#    ┃   ━   ┃ ++ + + +
+#    ████━████ ┃+
+#    ┃       ┃ +
+#    ┃   ┻   ┃
+#    ┃       ┃ + +
+#    ┗━┓   ┏━┛
+#      ┃   ┃           
+#      ┃   ┃ + + + +
+#      ┃   ┃    Codes are far away from bugs with the animal protecting   
+#      ┃   ┃ +     神兽保佑,代码无bug  
+#      ┃   ┃
+#      ┃   ┃  +         
+#      ┃    ┗━━━┓ + +
+#      ┃        ┣┓
+#      ┃        ┏┛
+#      ┗┓┓┏━┳┓┏┛ + + + +
+#       ┃┫┫ ┃┫┫
+#       ┗┻┛ ┗┻┛+ + + +
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
+"""
+"""
+import base64
+import hashlib
+import time
+
+import datetime
+
+
+def getTimeDict(times):
+    time_dict = []
+    t = 0
+    for x in range(24):
+        if x < 10:
+            x = '0' + str(x)
+        else:
+            x = str(x)
+        # a = times.strftime("%Y-%m-%d") + " " + x
+        a = times.strftime("%Y%m%d") + x
+        time_dict.append(a)
+        t += 1
+    return time_dict
+
+
+def md5s(text, isBackByte=False):
+    """md5加密函数"""
+    md5 = hashlib.md5()
+    if isinstance(text, bytes):
+        md5.update(text)
+    else:
+        md5.update(text.encode('utf-8'))
+
+    if isBackByte:
+        # 返回二进制的加密结果
+        return md5.digest()
+
+        # 返回十六进制的机密结果
+    return md5.hexdigest()
+
+
+def base64_encode(text, isBytes=False):
+    """进行base64编码处理"""
+    if isBytes:
+        return base64.b64encode(text)
+    return base64.b64encode(bytes(text, encoding="utf-8"))
+
+
+def get_timestamp10():
+    """获取当前时间长度为10位长度的时间戳"""
+    return int(time.time())
+
+
+def get_sign_url_content(to_tt):
+    # url = '13.56.141.156:81'
+    # url = '35.176.238.187:81'
+    url = '111.230.145.16:81'
+    secret = 'ansjer';  # 密钥--对应#st的哈希格式为 secret+url+e,e为时间戳单位s,url为请求地址  secure_link_md5 xiaozhong.com$uri$arg_e;
+    # path = '/hls/5553.mp4/index.m3u8'  # 下载文件
+    # path = '/L59KVYDAEPHR1T6M111A_0/555666.mp4'  # 下载文件
+    path = '/Relay' + to_tt + '.txt'  # 下载文件
+    # path = '/444.mp4'  # 下载文件
+    # 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
+    expire = get_timestamp10() + 3600;
+    res = md5s(str(secret) + str(path) + str(expire), True)
+    md5_str = str(base64_encode(res, True))
+    md5_str = md5_str.replace('b\'', '').replace('\'', '').replace('+', '-').replace('/', '_').replace('=', '')
+    sig_uri = 'http://' + url + path + '?' + 'st=' + str(md5_str) + '&e=' + str(expire)
+    # print(sig_uri)
+    return {
+        'url' : sig_uri,
+        'time' :to_tt
+    }
+
+
+to_date = datetime.datetime.now() - datetime.timedelta(days=1)
+to_list = getTimeDict(to_date)
+
+HTML_DATA = ''
+# sign_uri_list = []
+for tt in to_list:
+    su = get_sign_url_content(to_tt=tt)
+    HTML_DATA +='<p><span><a href="{{url}}" target="_Blank">{{time}}<a></span></p>'.replace("{{time}}",su['time']).replace("{{url}}",su['url'])
+    # sign_uri_list.append(su)
+# print(sign_uri_list)
+# print(HTML_DATA)
+print(type(HTML_DATA))
+from boto3.session import Session
+import traceback
+
+AWS_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
+AWS_ACCESS_SECRET = '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'
+AWS_ACCESS_REGION = 'us-east-1'
+COMPANY_EMAIL = 'user_server@nsst.com'
+session = Session(
+    aws_access_key_id=AWS_ACCESS_ID,
+    aws_secret_access_key=AWS_ACCESS_SECRET,
+    region_name=AWS_ACCESS_REGION,
+)
+conn = session.client('ses')
+
+try:
+    response = conn.send_email(
+        # 发送人
+        Source=COMPANY_EMAIL,
+        Destination={
+            # 收件人
+            'ToAddresses': [COMPANY_EMAIL]
+            # 'ToAddresses': ['1758730877@qq.com']
+        },
+        Message={
+            # 标题
+            'Subject': {
+                # 'Data': '英国P2P日志文件',
+                'Data': '中国P2P日志文件',
+                # 'Data': '美国P2P日志文件',
+                'Charset': 'utf-8'
+            },
+            'Body': {
+                'Html': {
+                    'Charset': 'UTF-8',
+                    'Data': HTML_DATA,
+                },
+            }
+        },
+    )
+except Exception as e:
+    errorInfo = traceback.format_exc()
+    print(errorInfo)
+else:
+    print('yes')
+

+ 71 - 0
Ansjer/test/util/encryDownLoad.py

@@ -0,0 +1,71 @@
+# coding=utf-8
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
+#        ┏┓   ┏┓+ +
+#    ┏┛┻━━━┛┻┓ + +
+#    ┃       ┃  
+#    ┃   ━   ┃ ++ + + +
+#    ████━████ ┃+
+#    ┃       ┃ +
+#    ┃   ┻   ┃
+#    ┃       ┃ + +
+#    ┗━┓   ┏━┛
+#      ┃   ┃           
+#      ┃   ┃ + + + +
+#      ┃   ┃    Codes are far away from bugs with the animal protecting   
+#      ┃   ┃ +     神兽保佑,代码无bug  
+#      ┃   ┃
+#      ┃   ┃  +         
+#      ┃    ┗━━━┓ + +
+#      ┃        ┣┓
+#      ┃        ┏┛
+#      ┗┓┓┏━┳┓┏┛ + + + +
+#       ┃┫┫ ┃┫┫
+#       ┗┻┛ ┗┻┛+ + + +
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
+"""
+"""
+import base64
+import hashlib
+import time
+
+def md5(text, isBackByte=False):
+    """md5加密函数"""
+    md5 = hashlib.md5()
+    if isinstance(text, bytes):
+        md5.update(text)
+    else:
+        md5.update(text.encode('utf-8'))
+
+    if isBackByte:
+        # 返回二进制的加密结果
+        return md5.digest()
+
+        # 返回十六进制的机密结果
+    return md5.hexdigest()
+
+
+def base64_encode(text, isBytes=False):
+    """进行base64编码处理"""
+    if isBytes:
+        return base64.b64encode(text)
+    return base64.b64encode(bytes(text, encoding="utf-8"))
+
+
+def get_timestamp10():
+    """获取当前时间长度为10位长度的时间戳"""
+    return int(time.time())
+
+
+secret = 'ansjer';  # 密钥--对应#st的哈希格式为 secret+url+e,e为时间戳单位s,url为请求地址  secure_link_md5 xiaozhong.com$uri$arg_e;
+# path = '/hls/5553.mp4/index.m3u8'  # 下载文件
+# path = '/L59KVYDAEPHR1T6M111A_0/555666.mp4'  # 下载文件
+path = '/5553.mp4'  # 下载文件
+# path = '/444.mp4'  # 下载文件
+# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
+expire = get_timestamp10() + 3600;
+res = md5(str(secret) + str(path) + str(expire), True)
+md5 = str(base64_encode(res, True))
+md5 = md5.replace('b\'', '').replace('\'', '').replace('+', '-').replace('/', '_').replace('=', '')
+
+# print('生成代相关认证签名的地址:','http://52.8.197.107/444.mp4.m3u8?' + 'st=' + str(md5) + '&e=' + str(expire))
+print('io:','http://52.8.197.107/5553.mp4.m3u8?' + 'st=' + str(md5) + '&e=' + str(expire))

+ 13 - 0
Ansjer/test/util/jpush.py

@@ -0,0 +1,13 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2019/3/6 17:43
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: jpush.py
+@Contact: chanjunkai@163.com
+"""

+ 30 - 0
Ansjer/test/util/spnsss.py

@@ -0,0 +1,30 @@
+#coding=utf-8
+import threading
+from time import sleep,ctime
+
+def sing():
+    for i in range(3):
+        print("正在唱歌...%d"%i)
+        sleep(1)
+
+def dance():
+    for i in range(3):
+        print("正在跳舞...%d"%i)
+        sleep(1)
+
+if __name__ == '__main__':
+    print('---开始---:%s'%ctime())
+
+    t1 = threading.Thread(target=sing)
+    t2 = threading.Thread(target=dance)
+
+    t1.start()
+    t2.start()
+
+    while True:
+        length = len(threading.enumerate())
+        print('当前运行的线程数为:%d'%length)
+        if length<=1:
+            break
+
+        sleep(0.5)

+ 2 - 1
Controller/Test.py

@@ -40,10 +40,11 @@ class Test(View):
         _jpush.set_logging("DEBUG")
         # push.audience = jpush.all_
         push.audience = jpush.registration_id(devToken)
+
         push.notification = jpush.notification(alert="hello python jpush api")
         push.platform = jpush.all_
         try:
-            response = push.send()
+            res = push.send()
         except Exception as e:
             print("Exception")
             return response.json(10,repr(e))