|
| 1 | +# -*- coding=utf-8 |
| 2 | +import base64 |
| 3 | +import jwt |
| 4 | +from urllib.parse import quote, quote_plus |
| 5 | +from qcloud_cos import CosConfig |
| 6 | +from qcloud_cos import CosS3Client |
| 7 | +from datetime import datetime, timedelta |
| 8 | + |
| 9 | +import sys |
| 10 | +import logging |
| 11 | +import os |
| 12 | + |
| 13 | +# 腾讯云COSV5Python SDK, 目前可以支持Python2.6与Python2.7以及Python3.x |
| 14 | + |
| 15 | +# 媒体处理相关API请参考 https://cloud.tencent.com/document/product/460/84790 |
| 16 | + |
| 17 | +logging.basicConfig(level=logging.INFO, stream=sys.stdout) |
| 18 | + |
| 19 | +# 设置用户属性, 包括secret_id, secret_key, region |
| 20 | +# appid已在配置中移除,请在参数Bucket中带上appid。Bucket由bucketname-appid组成 |
| 21 | +# 这里秘钥是从环境变量取得,如自己测试可改成自己对应的秘钥 |
| 22 | +secret_id = os.environ["SECRETID"] # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi |
| 23 | +secret_key = os.environ["SECRETKEY"] # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi |
| 24 | +region = 'ap-chongqing' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket |
| 25 | +# COS支持的所有region列表参见https://www.qcloud.com/document/product/436/6224 |
| 26 | +token = None # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048 |
| 27 | + |
| 28 | +config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme='https') # 获取配置对象 |
| 29 | +client = CosS3Client(config) |
| 30 | + |
| 31 | + |
| 32 | +bucket_name = 'demo-1250000000' |
| 33 | +play_key = 'play_key' |
| 34 | +object_name = 'test.m3u8' |
| 35 | + |
| 36 | + |
| 37 | +def generate_token(): |
| 38 | + now = datetime.now() |
| 39 | + expire_time = now + timedelta(minutes=30) |
| 40 | + path_encoded = quote(object_name) |
| 41 | + object = quote_plus(path_encoded) |
| 42 | + |
| 43 | + headers = { |
| 44 | + # 加密的算法,固定为 HS256 |
| 45 | + "alg": "HS256", |
| 46 | + # 类型,固定为 JWT |
| 47 | + "typ": "JWT" |
| 48 | + } |
| 49 | + token_info = { |
| 50 | + # 固定为 CosCiToken, 必填参数 |
| 51 | + 'Type': 'CosCiToken', |
| 52 | + # app id,必填参数 |
| 53 | + 'AppId': '1250000000', |
| 54 | + # 播放文件所在的BucketId, 必填参数 |
| 55 | + 'BucketId': bucket_name, |
| 56 | + # 播放文件名 |
| 57 | + 'Object': object, |
| 58 | + # 固定为client,必填参数 |
| 59 | + 'Issuer': 'client', |
| 60 | + # token颁发时间戳,必填参数 |
| 61 | + 'IssuedTimeStamp': now.timestamp(), |
| 62 | + # token过期时间戳,非必填参数,默认1天过期 |
| 63 | + 'ExpireTimeStamp': expire_time.timestamp(), |
| 64 | + # token使用次数限制,非必填参数,默认限制100000次 |
| 65 | + 'UsageLimit': 20, |
| 66 | + # 是否加密解密密钥(播放时解密ts视频流的密钥),1表示对解密密钥加密,0表示不对解密密钥加密。 |
| 67 | + 'ProtectContentKey': 1, |
| 68 | + } |
| 69 | + if token_info['ProtectContentKey'] == 1: |
| 70 | + public_key = """-----BEGIN PUBLIC KEY----- |
| 71 | +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBgQCj9GNktf2yA0Mp8aCzxxxxxxxx |
| 72 | +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx54Jl4NVNewBLPZq1WFxxxxxxxxxx |
| 73 | +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKpSCdl9hHxFZ732ixxxxxxxxxxxx |
| 74 | +xxxxxxxxxxxxxxxxxxxx |
| 75 | +-----END PUBLIC KEY-----""" |
| 76 | + base64_public_key = base64.urlsafe_b64encode(public_key.encode('utf-8')).decode('utf-8') |
| 77 | + token_info.update({ |
| 78 | + # 保护模式,填写为 rsa1024 ,则表示使用 RSA 非对称加密的方式保护,公私钥对长度为 1024 bit |
| 79 | + 'ProtectSchema': "rsa1024", |
| 80 | + # 公钥。1024 bit 的 RSA 公钥,需使用 Base64 进行编码 |
| 81 | + 'PublicKey': base64_public_key, |
| 82 | + }) |
| 83 | + return jwt.encode(token_info, play_key, algorithm="HS256", headers=headers) |
| 84 | + |
| 85 | + |
| 86 | +def get_url(): |
| 87 | + url = client.get_presigned_download_url( |
| 88 | + Bucket=bucket_name, # 存储桶名称 |
| 89 | + Key="/" + object_name, |
| 90 | + Expired=3600, # 预签名超时时间 |
| 91 | + ) |
| 92 | + if token is not None: |
| 93 | + url = url + "&x-cos-security-token=" + token |
| 94 | + url = url + "&tokenType=JwtToken&expires=3600&ci-process=pm3u8&token=" + generate_token() |
| 95 | + return url |
| 96 | + |
| 97 | + |
| 98 | +if __name__ == '__main__': |
| 99 | + print(generate_token()) |
| 100 | + print(get_url()) |
0 commit comments