Files
hsa/.venv/lib/python3.10/site-packages/qcloud_cos/cos_client.py
2025-09-11 13:29:12 +00:00

11177 lines
458 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding=utf-8
import requests
import logging
import hashlib
import base64
import os
import sys
import time
import copy
import json
import threading
import xml.dom.minidom
import xml.etree.ElementTree
from requests import Request, Session, ConnectionError, Timeout
from datetime import datetime
from six.moves.urllib.parse import quote, unquote, urlencode, urlparse
from six import text_type, binary_type
from hashlib import md5
from .streambody import StreamBody
from .xml2dict import Xml2Dict
from .cos_auth import CosS3Auth
from .cos_auth import CosRtmpAuth
from .cos_comm import *
from .cos_threadpool import SimpleThreadPool
from .cos_exception import CosClientError
from .cos_exception import CosServiceError
from .version import __version__
from .select_event_stream import EventStream
from .resumable_downloader import ResumableDownLoader
# python 3.10报错"module 'collections' has no attribute 'Iterable'",这里先规避
if sys.version_info.major >= 3 and sys.version_info.minor >= 10:
import collections.abc
collections.Iterable = collections.abc.Iterable
logger = logging.getLogger(__name__)
class CosConfig(object):
"""config类保存用户相关信息"""
def __init__(self, Appid=None, Region=None, SecretId=None, SecretKey=None, Token=None, CredentialInstance=None, Scheme=None, Timeout=None,
Access_id=None, Access_key=None, Secret_id=None, Secret_key=None, Endpoint=None, IP=None, Port=None,
Anonymous=None, UA=None, Proxies=None, Domain=None, ServiceDomain=None, KeepAlive=True, PoolConnections=10,
PoolMaxSize=10, AllowRedirects=False, SignHost=True, EndpointCi=None, EndpointPic=None, EnableOldDomain=True, EnableInternalDomain=True, SignParams=True,
AutoSwitchDomainOnRetry=False, VerifySSL=None, SSLCert=None):
"""初始化,保存用户的信息
:param Appid(string): 用户APPID.
:param Region(string): 地域信息.
:param SecretId(string): 秘钥SecretId.
:param SecretKey(string): 秘钥SecretKey.
:param Token(string): 临时秘钥使用的token.
:param Scheme(string): http/https
:param Timeout(int): http超时时间.
:param Access_id(string): 秘钥AccessId(兼容).
:param Access_key(string): 秘钥AccessKey(兼容).
:param Secret_id(string): 秘钥SecretId(兼容).
:param Secret_key(string): 秘钥SecretKey(兼容).
:param Endpoint(string): endpoint.
:param IP(string): 访问COS的ip
:param Port(int): 访问COS的port
:param Anonymous(bool): 是否使用匿名访问COS
:param UA(string): 使用自定义的UA来访问COS
:param Proxies(dict): 使用代理来访问COS
:param Domain(string): 使用自定义的域名来访问COS
:param ServiceDomain(string): 使用自定义的域名来访问cos service
:param KeepAlive(bool): 是否使用长连接
:param PoolConnections(int): 连接池个数
:param PoolMaxSize(int): 连接池中最大连接数
:param AllowRedirects(bool): 是否重定向
:param SignHost(bool): 是否将host算入签名
:param EndpointCi(string): ci的endpoint
:param EnableOldDomain(bool): 是否使用旧的myqcloud.com域名访问COS
:param EnableInternalDomain(bool): 是否使用内网域名访问COS
:param SignParams(bool): 是否将请求参数算入签名
:param AutoSwitchDomainOnRetry(bool): 重试请求时是否将myqcloud.com域名切换为tencentcos.cn
:param VerifySSL(bool or string): 是否开启SSL证书校验, 或客户端CA bundle证书文件路径. 示例: True/False 或 '/path/certfile'
:param SSLCert(string or tuple): 客户端SSL证书路径. 示例: '/path/client.pem' 或 ('/path/client.cert', '/path/client.key')
"""
self._appid = to_unicode(Appid)
self._token = to_unicode(Token)
self._timeout = Timeout
self._region = Region
self._endpoint = Endpoint
self._endpoint_ci = EndpointCi
self._endpoint_pic = EndpointPic
self._ip = to_unicode(IP)
self._port = Port
self._anonymous = Anonymous
self._ua = UA
self._proxies = Proxies
self._domain = Domain
self._service_domain = ServiceDomain
self._keep_alive = KeepAlive
self._pool_connections = PoolConnections
self._pool_maxsize = PoolMaxSize
self._allow_redirects = AllowRedirects
self._sign_host = SignHost
self._copy_part_threshold_size = SINGLE_UPLOAD_LENGTH
self._enable_old_domain = EnableOldDomain
self._enable_internal_domain = EnableInternalDomain
self._sign_params = SignParams
self._auto_switch_domain_on_retry = AutoSwitchDomainOnRetry
self._verify_ssl = VerifySSL
self._ssl_cert = SSLCert
if self._domain is None:
self._endpoint = format_endpoint(Endpoint, Region, u'cos.', EnableOldDomain, EnableInternalDomain)
if Scheme is None:
Scheme = u'https'
Scheme = to_unicode(Scheme)
if (Scheme != u'http' and Scheme != u'https'):
raise CosClientError('Scheme can be only set to http/https')
self._scheme = Scheme
# 格式化ci的endpoint 不支持自定义域名的
# ci暂不支持新域名
self._endpoint_ci = format_endpoint(EndpointCi, Region, u'ci.', True, False)
self._endpoint_pic = format_endpoint(EndpointCi, Region, u'pic.', True, False)
# 兼容(SecretId,SecretKey)以及(AccessId,AccessKey)
if (SecretId and SecretKey):
self._secret_id = self.convert_secret_value(SecretId)
self._secret_key = self.convert_secret_value(SecretKey)
elif (Secret_id and Secret_key):
self._secret_id = self.convert_secret_value(Secret_id)
self._secret_key = self.convert_secret_value(Secret_key)
elif (Access_id and Access_key):
self._secret_id = self.convert_secret_value(Access_id)
self._secret_key = self.convert_secret_value(Access_key)
elif (CredentialInstance and hasattr(CredentialInstance, "secret_id") and hasattr(CredentialInstance, "secret_key") and hasattr(CredentialInstance, "token")):
self._secret_id = None
self._secret_key = None
self._credential_inst = CredentialInstance
elif self._anonymous:
self._secret_id = None
self._secret_key = None
self._credential_inst = None
else:
raise CosClientError('SecretId and SecretKey is Required!')
def uri(self, bucket=None, path=None, endpoint=None, domain=None, useAppid=False):
"""拼接url
:param bucket(string): 存储桶名称.
:param path(string): 请求COS的路径.
:return(string): 请求COS的URL地址.
"""
scheme = self._scheme
# 拼接请求的url,默认使用bucket和endpoint拼接请求域名
# 使用自定义域名时则使用自定义域名访问
# 指定ip和port时,则使用ip:port方式访问,优先级最高
if domain is None:
domain = self._domain
if domain is not None:
url = domain
else:
if endpoint is None:
endpoint = self._endpoint
if bucket is not None:
bucket = format_bucket(bucket, self._appid)
url = u"{bucket}.{endpoint}".format(bucket=bucket, endpoint=endpoint)
else:
if useAppid:
url = u"{appid}.{endpoint}".format(appid=self._appid, endpoint=endpoint)
else:
url = u"{endpoint}".format(endpoint=endpoint)
if self._ip is not None:
url = self._ip
if self._port is not None:
url = u"{ip}:{port}".format(ip=self._ip, port=self._port)
if path is not None:
if not path:
raise CosClientError("Key is required not empty")
path = to_unicode(path)
if path[0] == u'/':
path = path[1:]
path = quote(to_bytes(path), '/-_.~')
path = path.replace('./', '.%2F')
request_url = u"{scheme}://{url}/{path}".format(
scheme=to_unicode(scheme),
url=to_unicode(url),
path=to_unicode(path)
)
else:
request_url = u"{scheme}://{url}/".format(
scheme=to_unicode(scheme),
url=to_unicode(url)
)
return request_url
def get_host(self, Bucket=None, Appid=None):
"""传入bucket名称,根据endpoint获取Host名称
:param Bucket(string): bucket名称
:return (string): Host名称
"""
if Bucket is not None:
return u"{bucket}.{endpoint}".format(bucket=format_bucket(Bucket, self._appid), endpoint=self._endpoint)
if Appid is not None:
return u"{appid}.{endpoint}".format(appid=Appid, endpoint=self._endpoint)
def set_ip_port(self, IP, Port=None):
"""设置直接访问的ip:port,可以不指定Port,http默认为80,https默认为443
:param IP(string): 访问COS的ip
:param Port(int): 访问COS的port
:return None
"""
self._ip = to_unicode(IP)
self._port = Port
def set_credential(self, SecretId, SecretKey, Token=None):
"""设置访问的身份,包括secret_id,secret_key,临时秘钥token默认为空
:param SecretId(string): 秘钥SecretId.
:param SecretKey(string): 秘钥SecretKey.
:param Token(string): 临时秘钥使用的token.
"""
self._secret_id = self.convert_secret_value(SecretId)
self._secret_key = self.convert_secret_value(SecretKey)
self._token = self.convert_secret_value(Token)
def set_copy_part_threshold_size(self, size):
if size > 0:
self._copy_part_threshold_size = size
def convert_secret_value(self, value):
value = to_unicode(value)
if value.endswith(' ') or value.startswith(' '):
raise CosClientError('secret_id and secret_key cannot contain spaces at the beginning and end')
return value
class CosS3Client(object):
"""cos客户端类封装相应请求"""
__built_in_sessions = None # 内置的静态连接池多个Client间共享使用
__built_in_pid = 0
def __init__(self, conf, retry=3, session=None):
"""初始化client对象
:param conf(CosConfig): 用户的配置.
:param retry(int): 失败重试的次数.
:param session(object): http session.
"""
self._conf = conf
self._retry = retry # 重试的次数,分片上传时可适当增大
self._retry_exe_times = 0 # 重试已执行次数
if session is None:
if not CosS3Client.__built_in_sessions:
with threading.Lock():
if not CosS3Client.__built_in_sessions: # 加锁后double check
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(self._conf._pool_connections, self._conf._pool_maxsize)
CosS3Client.__built_in_pid = os.getpid()
self._session = CosS3Client.__built_in_sessions
self._use_built_in_pool = True
logger.info("bound built-in connection pool when new client. maxsize=%d,%d" % (self._conf._pool_connections, self._conf._pool_maxsize))
else:
self._session = session
self._use_built_in_pool = False
def generate_built_in_connection_pool(self, PoolConnections, PoolMaxSize):
"""生成SDK内置的连接池此连接池是client间共用的"""
built_in_sessions = requests.session()
built_in_sessions.mount('http://', requests.adapters.HTTPAdapter(pool_connections=PoolConnections, pool_maxsize=PoolMaxSize))
built_in_sessions.mount('https://', requests.adapters.HTTPAdapter(pool_connections=PoolConnections, pool_maxsize=PoolMaxSize))
logger.info("generate built-in connection pool success. maxsize=%d,%d" % (PoolConnections, PoolMaxSize))
return built_in_sessions
def handle_built_in_connection_pool_by_pid(self):
if not CosS3Client.__built_in_sessions:
return
if not self._use_built_in_pool:
return
if CosS3Client.__built_in_pid == os.getpid():
return
with threading.Lock():
if CosS3Client.__built_in_pid == os.getpid(): # 加锁后double check
return
# 重新生成内置连接池
CosS3Client.__built_in_sessions.close()
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(self._conf._pool_connections, self._conf._pool_maxsize)
CosS3Client.__built_in_pid = os.getpid()
# 重新绑定到内置连接池
self._session = CosS3Client.__built_in_sessions
logger.info("bound built-in connection pool when new processor. maxsize=%d,%d" % (self._conf._pool_connections, self._conf._pool_maxsize))
def get_conf(self):
"""获取配置"""
return self._conf
def get_retry_exe_times(self):
"""获取重试已执行次数"""
return self._retry_exe_times
def inc_retry_exe_times(self):
"""重试执行次数递增"""
self._retry_exe_times += 1
def get_auth(self, Method, Bucket, Key, Expired=300, Headers={}, Params={}, SignHost=None, UseCiEndPoint=False):
"""获取签名
:param Method(string): http method,如'PUT','GET'.
:param Bucket(string): 存储桶名称.
:param Key(string): 请求COS的路径.
:param Expired(int): 签名有效时间,单位为s.
:param headers(dict): 签名中的http headers.
:param params(dict): 签名中的http params.
:param SignHost(bool): 是否将host算入签名.
:return (string): 计算出的V5签名.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取上传请求的签名
auth_string = client.get_auth(
Method='PUT',
Bucket='bucket',
Key='test.txt',
Expired=600,
Headers={'header1': 'value1'},
Params={'param1': 'value1'}
)
print (auth_string)
"""
# python中默认参数只会初始化一次这里重新生成可变对象实例避免多线程访问问题
if not Headers:
Headers = dict()
if not Params:
Params = dict()
endpoint = None
if UseCiEndPoint:
endpoint = self._conf._endpoint_ci
url = self._conf.uri(bucket=Bucket, path=Key, endpoint=endpoint)
r = Request(Method, url, headers=Headers, params=Params)
auth = CosS3Auth(self._conf, Key, Params, Expired, SignHost)
return auth(r).headers['Authorization']
def should_switch_domain(self, url, headers={}):
host = urlparse(url).hostname
if not 'x-cos-request-id' in headers and \
self._conf._auto_switch_domain_on_retry and \
re.match(r'^([a-z0-9-]+-[0-9]+\.)(cos\.[a-z]+-[a-z]+(-[a-z]+)?(-1)?)\.(myqcloud\.com)$', host):
return True
return False
def send_request(self, method, url, bucket=None, timeout=30, cos_request=True, ci_request=False, appid=None, **kwargs):
"""封装request库发起http请求"""
if self._conf._timeout is not None: # 用户自定义超时时间
timeout = self._conf._timeout
if self._conf._ua is not None:
kwargs['headers']['User-Agent'] = self._conf._ua
else:
kwargs['headers']['User-Agent'] = 'cos-python-sdk-v' + __version__
if self._conf._token is not None:
if ci_request:
kwargs['headers']['x-ci-security-token'] = self._conf._token
else:
kwargs['headers']['x-cos-security-token'] = self._conf._token
if self._conf._ip is not None: # 使用IP访问时需要设置请求host
if self._conf._domain is not None:
kwargs['headers']['Host'] = self._conf._domain
elif bucket is not None:
kwargs['headers']['Host'] = self._conf.get_host(Bucket=bucket)
elif appid is not None:
kwargs['headers']['Host'] = self._conf.get_host(Appid=appid)
if self._conf._keep_alive == False:
kwargs['headers']['Connection'] = 'close'
kwargs['headers'] = format_values(kwargs['headers'])
file_position = None
if 'data' in kwargs:
body = kwargs['data']
if hasattr(body, 'tell') and hasattr(body, 'seek') and hasattr(body, 'read'):
try:
file_position = body.tell() # 记录文件当前位置
except Exception as ioe:
file_position = None
kwargs['data'] = to_bytes(kwargs['data'])
# 使用https访问时可设置ssl证书校验相关参数
if self._conf._scheme == 'https':
if self._conf._verify_ssl is not None:
kwargs['verify'] = self._conf._verify_ssl
if self._conf._ssl_cert is not None:
kwargs['cert'] = self._conf._ssl_cert
if self._conf._allow_redirects is not None:
kwargs['allow_redirects'] = self._conf._allow_redirects
exception_logbuf = list() # 记录每次重试的错误日志
# 切换了进程需要重新生成连接池
self.handle_built_in_connection_pool_by_pid()
for j in range(self._retry + 1):
try:
if j != 0:
if client_can_retry(file_position, **kwargs):
kwargs['headers']['x-cos-sdk-retry'] = 'true' # SDK重试标记
self.inc_retry_exe_times()
time.sleep(j)
else:
break
logger.debug("send request: url: {}, headers: {}".format(url, kwargs['headers']))
if method == 'POST':
res = self._session.post(url, timeout=timeout, proxies=self._conf._proxies, **kwargs)
elif method == 'GET':
res = self._session.get(url, timeout=timeout, proxies=self._conf._proxies, **kwargs)
elif method == 'PUT':
res = self._session.put(url, timeout=timeout, proxies=self._conf._proxies, **kwargs)
elif method == 'DELETE':
res = self._session.delete(url, timeout=timeout, proxies=self._conf._proxies, **kwargs)
elif method == 'HEAD':
res = self._session.head(url, timeout=timeout, proxies=self._conf._proxies, **kwargs)
logger.debug("recv response: status_code: {}, headers: {}".format(res.status_code, res.headers))
if res.status_code < 400: # 2xx和3xx都认为是成功的
if res.status_code == 301 or res.status_code == 302 or res.status_code == 307:
if j < self._retry and self.should_switch_domain(url, res.headers):
url = switch_hostname_for_url(url)
continue
return res
elif res.status_code < 500: # 4xx 不重试
break
else:
if j == (self._retry - 1) and self.should_switch_domain(url, res.headers):
url = switch_hostname_for_url(url)
continue
except Exception as e: # 捕获requests抛出的如timeout等客户端错误,转化为客户端错误
logger.debug("recv exception: {}".format(e))
# 记录每次请求的exception
exception_log = 'url:%s, retry_time:%d exception:%s' % (url, j, str(e))
exception_logbuf.append(exception_log)
if j < self._retry and (isinstance(e, ConnectionError) or isinstance(e, Timeout)): # 只重试网络错误
if j == (self._retry - 1) and self.should_switch_domain(url):
url = switch_hostname_for_url(url)
continue
logger.exception(exception_logbuf) # 最终重试失败, 输出前几次重试失败的exception
raise CosClientError(str(e))
if not cos_request:
return res
if res.status_code >= 400: # 所有的4XX,5XX都认为是COSServiceError
if method == 'HEAD' and res.status_code == 404: # Head 需要处理
info = dict()
info['code'] = 'NoSuchResource'
info['message'] = 'The Resource You Head Not Exist'
info['resource'] = url
if 'x-cos-request-id' in res.headers:
info['requestid'] = res.headers['x-cos-request-id']
if 'x-cos-trace-id' in res.headers:
info['traceid'] = res.headers['x-cos-trace-id']
logger.warning(info)
if len(exception_logbuf) > 0:
logger.exception(exception_logbuf) # 最终重试失败, 输出前几次重试失败的exception
raise CosServiceError(method, info, res.status_code)
else:
msg = res.text
if msg == u'': # 服务器没有返回Error Body时 给出头部的信息
msg = res.headers
logger.error(msg)
if len(exception_logbuf) > 0:
logger.exception(exception_logbuf) # 最终重试失败, 输出前几次重试失败的exception
raise CosServiceError(method, msg, res.status_code)
return None
# s3 object interface begin
def put_object(self, Bucket, Body, Key, EnableMD5=False, **kwargs):
"""单文件上传接口适用于小文件最大不得超过5GB
:param Bucket(string): 存储桶名称.
:param Body(file|string): 上传的文件内容,类型为文件流或字节流.
:param Key(string): COS路径.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功返回的结果包含ETag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
with open('test.txt', 'rb') as fp:
response = client.put_object(
Bucket='bucket',
Body=fp,
Key='test.txt'
)
print (response['ETag'])
"""
check_object_content_length(Body)
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("put object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
if EnableMD5:
md5_str = get_content_md5(Body)
if md5_str:
headers['Content-MD5'] = md5_str
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key),
data=Body,
headers=headers)
response = dict(**rt.headers)
return response
def get_object(self, Bucket, Key, KeySimplifyCheck=True, **kwargs):
"""单文件下载接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param KeySimplifyCheck(bool): 是否对Key进行posix路径语义归并检查
:param kwargs(dict): 设置下载的headers.
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 下载cos上的文件到本地
response = client.get_object(
Bucket='bucket',
Key='test.txt'
)
response['Body'].get_stream_to_file('local_file.txt')
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params = format_values(params)
# 检查key: 按照posix路径语义合并后如果是'/'则抛异常(因为这导致GetObject请求变成GetBucket)
if KeySimplifyCheck:
path_simplify_check(path=Key)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get object, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def get_object_sensitive_content_recognition(self, Bucket, Key=None, DetectType=None, Interval=None, MaxFrames=None, BizType=None, DetectUrl=None, LargeImageDetect=None,
DataId=None, Async=0, CallBack=None, **kwargs):
"""文件内容识别接口 https://cloud.tencent.com/document/product/460/37318
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param DetectType(int): 内容识别标志,位计算 1:porn,8:ads
:param Interval(int): 截帧频率GIF图/长图检测专用默认值为0表示只会检测GIF图/长图的第一帧.
:param MaxFrames(int): 最大截帧数量GIF图/长图检测专用默认值为1表示只取GIF的第1帧图片进行审核或长图不做切分识别.
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param DetectUrl(string): 您可以通过填写detect-url审核任意公网可访问的图片链接。不填写detect-url时后台会默认审核ObjectKey
填写了detect-url时后台会审核detect-url链接无需再填写ObjectKey。 detect-url示例http://www.example.com/abc.jpg.
:param LargeImageDetect(int): 对于超过大小限制的图片是否进行压缩后再审核,取值为: 0不压缩1压缩。默认为0。
压缩最大支持32M的图片且会收取压缩费用。
:param DataId(string): 图片标识该字段在结果中返回原始内容长度限制为512字节.
:param Async(int): 是否异步进行审核,取值 0同步返回结果1异步进行审核默认为0。
:param Callback(string): 审核结果Detail版本以回调形式发送至您的回调地址异步审核时生效支持以 http:// 或者 https:// 开头的地址,例如: http://www.callback.com。
:param kwargs(dict): 设置下载的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的图片
response = client.get_object_sensitive_content_recognition(
Bucket='bucket',
DetectType=CiDetectType.PORN | CiDetectType.POLITICS,
Key='test.png'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params['ci-process'] = 'sensitive-content-recognition'
if DetectType is not None:
detect_type = ''
if DetectType & CiDetectType.PORN > 0:
detect_type += 'porn'
if DetectType & CiDetectType.TERRORIST > 0:
if len(detect_type) > 0:
detect_type += ','
detect_type += 'terrorist'
if DetectType & CiDetectType.POLITICS > 0:
if len(detect_type) > 0:
detect_type += ','
detect_type += 'politics'
if DetectType & CiDetectType.ADS > 0:
if len(detect_type) > 0:
detect_type += ','
detect_type += 'ads'
if DetectType & CiDetectType.TEENAGER > 0:
if len(detect_type) > 0:
detect_type += ','
detect_type += 'teenager'
params['detect-type'] = detect_type
if Interval:
params['interval'] = Interval
if MaxFrames:
params['max-frames'] = MaxFrames
if BizType:
params['biz-type'] = BizType
if DetectUrl:
params['detect-url'] = DetectUrl
if LargeImageDetect:
params['large-image-detect'] = LargeImageDetect
if DataId:
params['dataid'] = DataId
if Async != 0:
params['async'] = Async
if CallBack:
params['callback'] = CallBack
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get object sensitive content recognition, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
logger.debug("get object sensitive content recognition rsp:%s", rt.content)
data = xml_to_dict(rt.content)
# format res
if 'PornInfo' in data:
if 'OcrResults' in data['PornInfo']:
format_dict_or_list(data['PornInfo']['OcrResults'], ['Keywords'])
format_dict(data['PornInfo'], ['OcrResults'])
if 'TerroristInfo' in data:
if 'OcrResults' in data['TerroristInfo']:
format_dict_or_list(data['TerroristInfo']['OcrResults'], ['Keywords'])
format_dict(data['TerroristInfo'], ['OcrResults'])
if 'PoliticsInfo' in data:
if 'OcrResults' in data['PoliticsInfo']:
format_dict_or_list(data['PoliticsInfo']['OcrResults'], ['Keywords'])
format_dict(data['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'AdsInfo' in data:
if 'OcrResults' in data['AdsInfo']:
format_dict_or_list(data['AdsInfo']['OcrResults'], ['Keywords'])
format_dict(data['AdsInfo'], ['OcrResults'])
return data
def get_presigned_url(self, Bucket, Key, Method, Expired=300, Params={}, Headers={}, UseCiEndPoint=False, SignHost=None):
"""生成预签名的url
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Method(string): HTTP请求的方法, 'PUT'|'POST'|'GET'|'DELETE'|'HEAD'
:param Expired(int): 签名过期时间.
:param Params(dict): 签入签名的参数
:param Headers(dict): 签入签名的头部
:param SignHost(bool): 是否将host算入签名.
:return(string): 预先签名的URL.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取预签名链接
response = client.get_presigned_url(
Bucket='bucket',
Key='test.txt',
Method='PUT'
)
"""
endpoint = None
if UseCiEndPoint:
endpoint = self._conf._endpoint_ci
url = self._conf.uri(bucket=Bucket, path=Key, endpoint=endpoint)
sign = self.get_auth(Method=Method, Bucket=Bucket, Key=Key, Expired=Expired, Headers=Headers, Params=Params, SignHost=SignHost, UseCiEndPoint=UseCiEndPoint)
sign = urlencode(dict([item.split('=', 1) for item in sign.split('&')]))
url = url + '?' + sign
if Params:
url = url + '&' + urlencode(Params)
return url
def get_presigned_download_url(self, Bucket, Key, Expired=300, Params={}, Headers={}, UseCiEndPoint=False, SignHost=None):
"""生成预签名的下载url
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Expired(int): 签名过期时间.
:param Params(dict): 签入签名的参数
:param Headers(dict): 签入签名的头部
:param SignHost(bool): 是否将host算入签名.
:return(string): 预先签名的下载URL.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取预签名文件下载链接
response = client.get_presigned_download_url(
Bucket='bucket',
Key='test.txt'
)
"""
return self.get_presigned_url(Bucket, Key, 'GET', Expired, Params, Headers, UseCiEndPoint, SignHost)
def get_object_url(self, Bucket, Key):
"""生成对象访问的url
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:return(string): 对象访问的URL.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取预签名链接
response = client.get_object_url(
Bucket='bucket',
Key='test.txt'
)
"""
url = self._conf.uri(bucket=Bucket, path=Key)
return url
def delete_object(self, Bucket, Key, **kwargs):
"""单文件删除接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return: dict.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除一个文件
response = client.delete_object(
Bucket='bucket',
Key='test.txt'
)
"""
headers = mapped(kwargs)
params = {}
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("delete object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params),
headers=headers,
params=params)
data = dict(**rt.headers)
return data
def delete_objects(self, Bucket, Delete={}, **kwargs):
"""文件批量删除接口,单次最多支持1000个object
:param Bucket(string): 存储桶名称.
:param Delete(dict): 批量删除的object信息.
:param kwargs(dict): 设置请求headers.
:return(dict): 批量删除的结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 批量删除文件
objects = {
"Quiet": "true",
"Object": [
{
"Key": "file_name1"
},
{
"Key": "file_name2"
}
]
}
response = client.delete_objects(
Bucket='bucket',
Delete=objects
)
"""
xml_config = format_xml(data=Delete, root='Delete')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'delete': ''}
params = format_values(params)
url = self._conf.uri(bucket=Bucket)
logger.info("delete objects, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['Deleted', 'Error'])
return data
def head_object(self, Bucket, Key, **kwargs):
"""获取文件信息
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): 文件的metadata信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文件属性
response = client.head_object(
Bucket='bucket',
Key='test.txt'
)
"""
headers = mapped(kwargs)
params = {}
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("head object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='HEAD',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return dict(**rt.headers)
def copy_object(self, Bucket, Key, CopySource, CopyStatus='Copy', **kwargs):
"""文件拷贝,文件信息修改
:param Bucket(string): 存储桶名称.
:param Key(string): 上传COS路径.
:param CopySource(dict): 拷贝源,包含Appid,Bucket,Region,Key.
:param CopyStatus(string): 拷贝状态,可选值'Copy'|'Replaced'.
:param kwargs(dict): 设置请求headers.
:return(dict): 拷贝成功的结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 文件拷贝
copy_source = {'Bucket': 'test04-1252448703', 'Key': '/test.txt', 'Region': 'ap-beijing-1'}
response = client.copy_object(
Bucket='bucket',
Key='test.txt',
CopySource=copy_source
)
"""
headers = mapped(kwargs)
headers['x-cos-copy-source'] = gen_copy_source_url(CopySource, self._conf._enable_old_domain, self._conf._enable_internal_domain)
if CopyStatus != 'Copy' and CopyStatus != 'Replaced':
raise CosClientError('CopyStatus must be Copy or Replaced')
headers['x-cos-metadata-directive'] = CopyStatus
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("copy object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key),
headers=headers)
body = xml_to_dict(rt.content)
if 'ETag' not in body:
logger.error(rt.content)
raise CosServiceError('PUT', rt.content, 200)
data = dict(**rt.headers)
data.update(body)
return data
def upload_part_copy(self, Bucket, Key, PartNumber, UploadId, CopySource, CopySourceRange='', **kwargs):
"""拷贝指定文件至分块上传
:param Bucket(string): 存储桶名称.
:param Key(string): 上传COS路径.
:param PartNumber(int): 上传分块的编号.
:param UploadId(string): 分块上传创建的UploadId.
:param CopySource(dict): 拷贝源,包含Appid,Bucket,Region,Key.
:param CopySourceRange(string): 拷贝源的字节范围,bytes=first-last。
:param kwargs(dict): 设置请求headers.
:return(dict): 拷贝成功的结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 分块上传拷贝分块
copy_source = {'Bucket': 'test04-1252448703', 'Key': '/test.txt', 'Region': 'ap-beijing-1'}
response = client.upload_part_copy(
Bucket='bucket',
Key='test.txt',
PartNumber=1,
UploadId='your uploadid',
CopySource=copy_source
)
"""
headers = mapped(kwargs)
headers['x-cos-copy-source'] = gen_copy_source_url(CopySource, self._conf._enable_old_domain, self._conf._enable_internal_domain)
headers['x-cos-copy-source-range'] = CopySourceRange
params = {'partNumber': PartNumber, 'uploadId': UploadId}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.debug("upload part copy, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
headers=headers,
params=params,
auth=CosS3Auth(self._conf, Key, params=params))
body = xml_to_dict(rt.content)
data = dict(**rt.headers)
data.update(body)
return data
def create_multipart_upload(self, Bucket, Key, **kwargs):
"""创建分块上传,适用于大文件上传
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): 初始化分块上传返回的结果包含UploadId等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建分块上传
response = client.create_multipart_upload(
Bucket='bucket',
Key='test.txt'
)
"""
headers = mapped(kwargs)
params = {'uploads': ''}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("create multipart upload, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def upload_part(self, Bucket, Key, Body, PartNumber, UploadId, EnableMD5=False, **kwargs):
"""上传分块单个大小不得超过5GB
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Body(file|string): 上传分块的内容,可以为文件流或者字节流.
:param PartNumber(int): 上传分块的编号.
:param UploadId(string): 分块上传创建的UploadId.
:param kwargs(dict): 设置请求headers.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:return(dict): 上传成功返回的结果包含单个分块ETag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 分块上传
with open('test.txt', 'rb') as fp:
data = fp.read(1024*1024)
response = client.upload_part(
Bucket='bucket',
Body=data,
Key='test.txt'
)
"""
check_object_content_length(Body)
headers = mapped(kwargs)
params = {'partNumber': PartNumber, 'uploadId': UploadId}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.debug("upload part, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
if EnableMD5:
md5_str = get_content_md5(Body)
if md5_str:
headers['Content-MD5'] = md5_str
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
headers=headers,
params=params,
auth=CosS3Auth(self._conf, Key, params=params),
data=Body)
response = dict(**rt.headers)
return response
def complete_multipart_upload(self, Bucket, Key, UploadId, MultipartUpload={}, **kwargs):
"""完成分片上传,除最后一块分块块大小必须大于等于1MB,否则会返回错误.
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param UploadId(string): 分块上传创建的UploadId.
:param MultipartUpload(dict): 所有分块的信息,包含Etag和PartNumber.
:param kwargs(dict): 设置请求headers.
:return(dict): 上传成功返回的结果包含整个文件的ETag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 分块上传
response = client.complete_multipart_upload(
Bucket='bucket',
Key='multipartfile.txt',
UploadId='uploadid',
MultipartUpload={'Part': lst}
)
"""
headers = mapped(kwargs)
params = {'uploadId': UploadId}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("complete multipart upload, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
data=dict_to_xml(MultipartUpload),
timeout=1200, # 分片上传大文件的时间比较长设置为20min
headers=headers,
params=params)
body = xml_to_dict(rt.content)
# 分块上传文件返回200OK并不能代表文件上传成功,返回的body里面如果没有ETag则认为上传失败
if 'ETag' not in body:
logger.error(rt.content)
raise CosServiceError('POST', rt.content, 200)
data = dict(**rt.headers)
data.update(body)
return data
def abort_multipart_upload(self, Bucket, Key, UploadId, **kwargs):
"""放弃一个已经存在的分片上传任务,删除所有已经存在的分片.
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param UploadId(string): 分块上传创建的UploadId.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 分块上传
response = client.abort_multipart_upload(
Bucket='bucket',
Key='multipartfile.txt',
UploadId='uploadid'
)
"""
headers = mapped(kwargs)
params = {'uploadId': UploadId}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("abort multipart upload, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return None
def list_parts(self, Bucket, Key, UploadId, EncodingType='', MaxParts=1000, PartNumberMarker=0, **kwargs):
"""列出已上传的分片.
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param UploadId(string): 分块上传创建的UploadId.
:param EncodingType(string): 设置返回结果编码方式,只能设置为url.
:param MaxParts(int): 设置单次返回最大的分块数量,最大为1000.
:param PartNumberMarker(int): 设置返回的开始处,从PartNumberMarker下一个分块开始列出.
:param kwargs(dict): 设置请求headers.
:return(dict): 分块的相关信息包括Etag和PartNumber等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 列出分块
response = client.list_parts(
Bucket='bucket',
Key='multipartfile.txt',
UploadId='uploadid'
)
"""
headers = mapped(kwargs)
decodeflag = True
params = {
'uploadId': UploadId,
'part-number-marker': PartNumberMarker,
'max-parts': MaxParts}
if EncodingType:
if EncodingType != 'url':
raise CosClientError('EncodingType must be url')
params['encoding-type'] = EncodingType
decodeflag = False
else:
params['encoding-type'] = 'url'
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("list multipart upload parts, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['Part'])
if decodeflag:
decode_result(data, ['Key'], [])
return data
def put_object_acl(self, Bucket, Key, AccessControlPolicy={}, **kwargs):
"""设置object ACL
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param AccessControlPolicy(dict): 设置object ACL规则.
:param kwargs(dict): 通过headers来设置ACL.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置 object ACL
response = client.put_object_acl(
Bucket='bucket',
Key='multipartfile.txt',
ACL='public-read',
GrantRead='id="qcs::cam::uin/123:uin/456",id="qcs::cam::uin/123:uin/123"'
)
"""
xml_config = ""
if AccessControlPolicy:
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy')
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("put object acl, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return None
def get_object_acl(self, Bucket, Key, **kwargs):
"""获取object ACL
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): Object对应的ACL信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取object ACL
response = client.get_object_acl(
Bucket='bucket',
Key='multipartfile.txt'
)
"""
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get object acl, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content, "type", "Type")
if data['AccessControlList'] is not None and isinstance(data['AccessControlList']['Grant'], dict):
lst = []
lst.append(data['AccessControlList']['Grant'])
data['AccessControlList']['Grant'] = lst
data['CannedACL'] = parse_object_canned_acl(data, rt.headers)
return data
def restore_object(self, Bucket, Key, RestoreRequest={}, **kwargs):
"""取回沉降到CAS中的object到COS
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param RestoreRequest(dict): 取回object的属性设置
:param kwargs(dict): 设置请求headers.
:return: None.
"""
params = {'restore': ''}
headers = mapped(kwargs)
if 'versionId' in headers:
params['versionId'] = headers['versionId']
headers.pop('versionId')
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("restore_object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
xml_config = format_xml(data=RestoreRequest, root='RestoreRequest')
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return None
def select_object_content(self, Bucket, Key, Expression, ExpressionType, InputSerialization, OutputSerialization,
RequestProgress=None, **kwargs):
"""从指定文对象中检索内容
:param Bucket(string): 存储桶名称.
:param Key(string): 检索的路径.
:param Expression(string): 查询语句
:param ExpressionType(string): 查询语句的类型
:param RequestProgress(dict): 查询进度设置
:param InputSerialization(dict): 输入格式设置
:param OutputSerialization(dict): 输出格式设置
:param kwargs(dict): 设置请求headers.
:return(dict): 检索内容.
"""
params = {'select': '', 'select-type': 2}
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("select object content, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
SelectRequest = {
'Expression': Expression,
'ExpressionType': ExpressionType,
'InputSerialization': InputSerialization,
'OutputSerialization': OutputSerialization
}
if RequestProgress is not None:
SelectRequest['RequestProgress'] = RequestProgress
xml_config = format_xml(data=SelectRequest, root='SelectRequest')
rt = self.send_request(
method='POST',
url=url,
stream=True,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
data = {'Payload': EventStream(rt)}
return data
# s3 bucket interface begin
def create_bucket(self, Bucket, BucketAZConfig=None, BucketArchConfig=None, **kwargs):
"""创建一个bucket
:param Bucket(string): 存储桶名称. 存储桶名称不支持大写字母COS 后端会将用户传入的大写字母自动转换为小写字母用于创建存储桶.
:param BucketAZConfig(string): 存储桶的多AZ配置
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建单AZ bucket
response = client.create_bucket(
Bucket='bucket'
)
# 创建多AZ bucket
response = client.create_bucket(
Bucket='bucket',
BucketAZConfig='MAZ'
)
"""
headers = mapped(kwargs)
xml_config = None
bucket_config = dict()
if BucketAZConfig == 'MAZ':
bucket_config.update({'BucketAZConfig': 'MAZ'})
if BucketArchConfig == 'OFS':
bucket_config.update({'BucketArchConfig': 'OFS'})
if len(bucket_config) != 0:
xml_config = format_xml(data=bucket_config, root='CreateBucketConfiguration')
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
url = self._conf.uri(bucket=Bucket)
logger.info("create bucket, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf),
headers=headers)
return None
def delete_bucket(self, Bucket, **kwargs):
"""删除一个bucketbucket必须为空
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket
response = client.delete_bucket(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf),
headers=headers)
return None
def list_objects(self, Bucket, Prefix="", Delimiter="", Marker="", MaxKeys=1000, EncodingType="", **kwargs):
"""获取文件列表
:param Bucket(string): 存储桶名称.
:param Prefix(string): 设置匹配文件的前缀.
:param Delimiter(string): 分隔符.
:param Marker(string): 从marker开始列出条目.
:param MaxKeys(int): 设置单次返回最大的数量,最大为1000.
:param EncodingType(string): 设置返回结果编码方式,只能设置为url.
:param kwargs(dict): 设置请求headers.
:return(dict): 文件的相关信息包括Etag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 列出bucket
response = client.list_objects(
Bucket='bucket',
MaxKeys=100,
Prefix='中文',
Delimiter='/'
)
"""
decodeflag = True # 是否需要对结果进行decode
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket)
logger.info("list objects, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
params = {
'prefix': Prefix,
'delimiter': Delimiter,
'marker': Marker,
'max-keys': MaxKeys
}
if EncodingType:
if EncodingType != 'url':
raise CosClientError('EncodingType must be url')
decodeflag = False # 用户自己设置了EncodingType不需要去decode
params['encoding-type'] = EncodingType
else:
params['encoding-type'] = 'url'
params = format_values(params)
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
params=params,
headers=headers,
auth=CosS3Auth(self._conf, params=params))
data = xml_to_dict(rt.content)
format_dict(data, ['Contents', 'CommonPrefixes'])
if decodeflag:
decode_result(
data,
[
'Prefix',
'Marker',
'NextMarker'
],
[
['Contents', 'Key'],
['CommonPrefixes', 'Prefix']
]
)
return data
def list_objects_versions(self, Bucket, Prefix="", Delimiter="", KeyMarker="", VersionIdMarker="", MaxKeys=1000,
EncodingType="", **kwargs):
"""获取文件列表
:param Bucket(string): 存储桶名称.
:param Prefix(string): 设置匹配文件的前缀.
:param Delimiter(string): 分隔符.
:param KeyMarker(string): 从KeyMarker指定的Key开始列出条目.
:param VersionIdMarker(string): 从VersionIdMarker指定的版本开始列出条目.
:param MaxKeys(int): 设置单次返回最大的数量,最大为1000.
:param EncodingType(string): 设置返回结果编码方式,只能设置为url.
:param kwargs(dict): 设置请求headers.
:return(dict): 文件的相关信息包括Etag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 列出bucket带版本
response = client.list_objects_versions(
Bucket='bucket',
MaxKeys=100,
Prefix='中文',
Delimiter='/'
)
"""
headers = mapped(kwargs)
decodeflag = True
url = self._conf.uri(bucket=Bucket)
logger.info("list objects versions, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
params = {
'versions': '',
'prefix': Prefix,
'delimiter': Delimiter,
'key-marker': KeyMarker,
'version-id-marker': VersionIdMarker,
'max-keys': MaxKeys
}
if EncodingType:
if EncodingType != 'url':
raise CosClientError('EncodingType must be url')
decodeflag = False
params['encoding-type'] = EncodingType
else:
params['encoding-type'] = 'url'
params = format_values(params)
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
params=params,
headers=headers,
auth=CosS3Auth(self._conf, params=params))
data = xml_to_dict(rt.content)
format_dict(data, ['Version', 'DeleteMarker', 'CommonPrefixes'])
if decodeflag:
decode_result(
data,
[
'Prefix',
'KeyMarker',
'NextKeyMarker',
'VersionIdMarker',
'NextVersionIdMarker'
],
[
['Version', 'Key'],
['CommonPrefixes', 'Prefix'],
['DeleteMarker', 'Key']
]
)
return data
def list_multipart_uploads(self, Bucket, Prefix="", Delimiter="", KeyMarker="", UploadIdMarker="", MaxUploads=1000,
EncodingType="", **kwargs):
"""获取Bucket中正在进行的分块上传
:param Bucket(string): 存储桶名称.
:param Prefix(string): 设置匹配文件的前缀.
:param Delimiter(string): 分隔符.
:param KeyMarker(string): 从KeyMarker指定的Key开始列出条目.
:param UploadIdMarker(string): 从UploadIdMarker指定的UploadID开始列出条目.
:param MaxUploads(int): 设置单次返回最大的数量,最大为1000.
:param EncodingType(string): 设置返回结果编码方式,只能设置为url.
:param kwargs(dict): 设置请求headers.
:return(dict): 文件的相关信息包括Etag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 列出所有分块上传
response = client.list_multipart_uploads(
Bucket='bucket',
MaxUploads=100,
Prefix='中文',
Delimiter='/'
)
"""
headers = mapped(kwargs)
decodeflag = True
url = self._conf.uri(bucket=Bucket)
logger.info("get multipart uploads, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
params = {
'uploads': '',
'prefix': Prefix,
'delimiter': Delimiter,
'key-marker': KeyMarker,
'upload-id-marker': UploadIdMarker,
'max-uploads': MaxUploads
}
if EncodingType:
if EncodingType != 'url':
raise CosClientError('EncodingType must be url')
decodeflag = False
params['encoding-type'] = EncodingType
else:
params['encoding-type'] = 'url'
params = format_values(params)
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
params=params,
headers=headers,
auth=CosS3Auth(self._conf, params=params))
data = xml_to_dict(rt.content)
format_dict(data, ['Upload', 'CommonPrefixes'])
if decodeflag:
decode_result(
data,
[
'Prefix',
'KeyMarker',
'NextKeyMarker',
'UploadIdMarker',
'NextUploadIdMarker'
],
[
['Upload', 'Key'],
['CommonPrefixes', 'Prefix']
]
)
return data
def head_bucket(self, Bucket, **kwargs):
"""确认bucket是否存在
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: HEAD Bucket响应头域.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 确认bucket是否存在
response = client.head_bucket(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket)
logger.info("head bucket, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='HEAD',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf),
headers=headers)
response = dict(**rt.headers)
return response
def put_bucket_acl(self, Bucket, AccessControlPolicy={}, **kwargs):
"""设置bucket ACL
:param Bucket(string): 存储桶名称.
:param AccessControlPolicy(dict): 设置bucket ACL规则.
:param kwargs(dict): 通过headers来设置ACL.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置 object ACL
response = client.put_bucket_acl(
Bucket='bucket',
ACL='private',
GrantRead='id="qcs::cam::uin/123:uin/456",id="qcs::cam::uin/123:uin/123"'
)
"""
xml_config = ""
if AccessControlPolicy:
xml_config = format_xml(data=AccessControlPolicy, root='AccessControlPolicy')
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket acl, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_acl(self, Bucket, **kwargs):
"""获取bucket ACL
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置headers.
:return(dict): Bucket对应的ACL信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置 object ACL
response = client.get_bucket_acl(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'acl': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket acl, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content, "type", "Type")
if data['AccessControlList'] is not None and not isinstance(data['AccessControlList']['Grant'], list):
lst = []
lst.append(data['AccessControlList']['Grant'])
data['AccessControlList']['Grant'] = lst
data['CannedACL'] = parse_bucket_canned_acl(data)
return data
def put_bucket_cors(self, Bucket, CORSConfiguration={}, **kwargs):
"""设置bucket CORS
:param Bucket(string): 存储桶名称.
:param CORSConfiguration(dict): 设置Bucket跨域规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket跨域配置
cors_config = {
'CORSRule': [
{
'ID': '1234',
'AllowedOrigin': ['http://www.qq.com'],
'AllowedMethod': ['GET', 'PUT'],
'AllowedHeader': ['x-cos-meta-test'],
'ExposeHeader': ['x-cos-meta-test1'],
'MaxAgeSeconds': 500
}
]
}
response = client.put_bucket_cors(
Bucket='bucket',
CORSConfiguration=cors_config
)
"""
xml_config = format_xml(data=CORSConfiguration, root='CORSConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'cors': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket cors, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_cors(self, Bucket, **kwargs):
"""获取bucket CORS
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 获取Bucket对应的跨域配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket跨域配置
response = client.get_bucket_cors(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'cors': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket cors, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if 'CORSRule' in data and not isinstance(data['CORSRule'], list):
lst = []
lst.append(data['CORSRule'])
data['CORSRule'] = lst
if 'CORSRule' in data:
allow_lst = ['AllowedOrigin', 'AllowedMethod', 'AllowedHeader', 'ExposeHeader']
for rule in data['CORSRule']:
for text in allow_lst:
if text in rule and not isinstance(rule[text], list):
lst = []
lst.append(rule[text])
rule[text] = lst
return data
def delete_bucket_cors(self, Bucket, **kwargs):
"""删除bucket CORS
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket跨域配置
response = client.delete_bucket_cors(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'cors': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket cors, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_lifecycle(self, Bucket, LifecycleConfiguration={}, **kwargs):
"""设置bucket LifeCycle
:param Bucket(string): 存储桶名称.
:param LifecycleConfiguration(dict): 设置Bucket的生命周期规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket生命周期配置
lifecycle_config = {
'Rule': [
{
'Expiration': {'Date': get_date(2018, 4, 24)},
'ID': '123',
'Filter': {'Prefix': ''},
'Status': 'Enabled',
}
]
}
response = client.put_bucket_lifecycle(
Bucket='bucket',
LifecycleConfiguration=lifecycle_config
)
"""
# 类型为list的标签
xml_config = format_xml(data=LifecycleConfiguration, root='LifecycleConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'lifecycle': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket lifecycle, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_lifecycle(self, Bucket, **kwargs):
"""获取bucket LifeCycle
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的生命周期配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket生命周期配置
response = client.get_bucket_lifecycle(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'lifecycle': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket lifecycle, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['Rule'])
if 'Rule' in data:
for rule in data['Rule']:
format_dict(rule, ['Transition', 'NoncurrentVersionTransition'])
if 'Filter' in rule:
format_dict(rule['Filter'], ['Tag'])
return data
def delete_bucket_lifecycle(self, Bucket, **kwargs):
"""删除bucket LifeCycle
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket生命周期配置
response = client.delete_bucket_lifecycle(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'lifecycle': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket lifecycle, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_versioning(self, Bucket, Status, **kwargs):
"""设置bucket版本控制
:param Bucket(string): 存储桶名称.
:param Status(string): 设置Bucket版本控制的状态可选值为'Enabled'|'Suspended'.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 打开多版本配置
response = client.put_bucket_versioning(
Bucket='bucket',
Status='Enabled'
)
"""
headers = mapped(kwargs)
params = {'versioning': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket versioning, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
if Status != 'Enabled' and Status != 'Suspended':
raise CosClientError('versioning status must be set to Enabled or Suspended!')
config = dict()
config['Status'] = Status
xml_config = format_xml(data=config, root='VersioningConfiguration')
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_versioning(self, Bucket, **kwargs):
"""查询bucket版本控制
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 获取Bucket版本控制的配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取多版本配置
response = client.get_bucket_versioning(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'versioning': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket versioning, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def get_bucket_location(self, Bucket, **kwargs):
"""查询bucket所属地域
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 存储桶的地域信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket所在地域信息
response = client.get_bucket_location(
Bucket='bucket'
)
print (response['LocationConstraint'])
"""
headers = mapped(kwargs)
params = {'location': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket location, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
root = xml.etree.ElementTree.fromstring(rt.content)
data = dict()
data['LocationConstraint'] = root.text
return data
def put_bucket_replication(self, Bucket, ReplicationConfiguration={}, **kwargs):
"""设置bucket跨区域复制配置
:param Bucket(string): 存储桶名称.
:param ReplicationConfiguration(dict): 设置Bucket的跨区域复制规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket跨区域复制配置
replication_config = {
'Role': 'qcs::cam::uin/735905558:uin/735905558',
'Rule': [
{
'ID': '123',
'Status': 'Enabled',
'Prefix': 'replication',
'Destination': {
'Bucket': 'qcs:id/0:cos:cn-south:appid/1252448703:replicationsouth'
}
}
]
}
response = client.put_bucket_replication(
Bucket='bucket',
ReplicationConfiguration=replication_config
)
"""
xml_config = format_xml(data=ReplicationConfiguration, root='ReplicationConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'replication': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket replication, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_replication(self, Bucket, **kwargs):
"""获取bucket 跨区域复制配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的跨区域复制配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket跨区域复制配置
response = client.get_bucket_replication(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'replication': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket replication, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['Rule'])
return data
def delete_bucket_replication(self, Bucket, **kwargs):
"""删除bucket 跨区域复制配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket跨区域复制配置
response = client.delete_bucket_replication(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'replication': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket replication, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_website(self, Bucket, WebsiteConfiguration={}, **kwargs):
"""设置bucket静态网站配置
:param Bucket(string): 存储桶名称.
:param ReplicationConfiguration(dict): 设置Bucket的静态网站规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket跨区域复制配置
website_config = {
'IndexDocument': {
'Suffix': 'string'
},
'ErrorDocument': {
'Key': 'string'
},
'RedirectAllRequestsTo': {
'HostName': 'string',
'Protocol': 'http'|'https'
},
'RoutingRules': [
{
'Condition': {
'HttpErrorCodeReturnedEquals': 'string',
'KeyPrefixEquals': 'string'
},
'Redirect': {
'HostName': 'string',
'HttpRedirectCode': 'string',
'Protocol': 'http'|'https',
'ReplaceKeyPrefixWith': 'string',
'ReplaceKeyWith': 'string'
}
}
]
}
response = client.put_bucket_website(
Bucket='bucket',
WebsiteConfiguration=website_config
)
"""
# 重构 WebsiteConfiguration['RoutingRules']
WebsiteConfigurationCpy = copy.deepcopy(WebsiteConfiguration)
if 'RoutingRules' in WebsiteConfigurationCpy.keys():
WebsiteConfigurationCpy['RoutingRules'] = {'RoutingRule': WebsiteConfigurationCpy['RoutingRules']}
xml_config = format_xml(data=WebsiteConfigurationCpy, root='WebsiteConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'website': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket website, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_website(self, Bucket, **kwargs):
"""获取bucket 静态网站配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的静态网站配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket静态网站配置
response = client.get_bucket_website(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'website': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket website, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if 'RoutingRules' in data and not isinstance(data['RoutingRules']['RoutingRule'], list):
lst = []
lst.append(data['RoutingRules']['RoutingRule'])
data['RoutingRules']['RoutingRule'] = lst
if 'RoutingRules' in data:
data['RoutingRules'] = data['RoutingRules']['RoutingRule']
return data
def delete_bucket_website(self, Bucket, **kwargs):
"""删除bucket 静态网站配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket静态网站配置
response = client.delete_bucket_website(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'website': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket website, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_logging(self, Bucket, BucketLoggingStatus={}, **kwargs):
"""设置bucket logging
:param Bucket(string): 存储桶名称.
:param BucketLoggingStatus(dict): 设置Bucket的日志配置.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket logging服务
logging_bucket = 'logging-beijing-1250000000'
logging_config = {
'LoggingEnabled': {
'TargetBucket': logging_bucket,
'TargetPrefix': 'test'
}
}
response = logging_client.put_bucket_logging(
Bucket=logging_bucket,
BucketLoggingStatus=logging_config
)
"""
xml_config = format_xml(data=BucketLoggingStatus, root='BucketLoggingStatus')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'logging': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket logging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
logging_rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_logging(self, Bucket, **kwargs):
"""获取bucket logging
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的logging配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket logging服务配置
response = logging_client.get_bucket_logging(
Bucket=logging_bucket
)
"""
headers = mapped(kwargs)
params = {'logging': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket logging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def put_bucket_policy(self, Bucket, Policy, **kwargs):
"""设置bucket policy
:param Bucket(string): 存储桶名称.
:param Policy(dict): 设置Bucket的Policy配置.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket policy服务
bucket = 'test-1252448703'
response = client.put_bucket_policy(
Bucket=bucket,
Policy=policy
)
"""
# Policy必须是一个json字符串(str)或者json对象(dict)
body = Policy
policy_type = type(body)
if policy_type != str and policy_type != dict:
raise CosClientError("Policy must be a json format string or json format dict")
if policy_type == dict:
body = json.dumps(body)
headers = mapped(kwargs)
headers['Content-Type'] = 'application/json'
params = {'policy': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket policy, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=body,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_policy(self, Bucket, **kwargs):
"""获取bucket policy
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的policy配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket policy服务配置
response = client.get_bucket_policy(
Bucket=bucket
)
"""
headers = mapped(kwargs)
params = {'policy': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket policy, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = {'Policy': json.dumps(rt.json())}
return data
def delete_bucket_policy(self, Bucket, **kwargs):
"""删除bucket policy
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket policy服务配置
response = client.delete_bucket_policy(
Bucket=bucket
)
"""
headers = mapped(kwargs)
params = {'policy': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket policy, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_domain(self, Bucket, DomainConfiguration={}, **kwargs):
"""设置bucket的自定义域名
:param Bucket(string): 存储桶名称.
:param DomainConfiguration(dict): 设置Bucket的自定义域名规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket自定义域名配置
domain_config = {
'DomainRule': [
{
'Name': 'www.abc.com',
'Type': 'REST',
'Status': 'ENABLED',
'ForcedReplacement': 'CNAME'
},
]
}
response = client.put_bucket_domain(
Bucket='bucket',
DomainConfiguration=domain_config
)
"""
xml_config = format_xml(data=DomainConfiguration, root='DomainConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'domain': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket domain, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_domain(self, Bucket, **kwargs):
"""获取bucket 自定义域名配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的自定义域名配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket自定义域名配置
response = client.get_bucket_domain(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'domain': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket domain, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['DomainRule'])
if 'x-cos-domain-txt-verification' in rt.headers:
data['x-cos-domain-txt-verification'] = rt.headers['x-cos-domain-txt-verification']
return data
def delete_bucket_domain(self, Bucket, **kwargs):
"""删除bucket 自定义域名配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除ucket自定义域名配置
response = client.delete_bucket_domain(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'domain': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket domain, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_domain_certificate(self, Bucket, DomainCertificateConfiguration, **kwargs):
"""设置bucket的自定义域名证书配置规则
:param Bucket(string): 存储桶名称.
:param DomainCertificateConfiguration(dict): 设置Bucket的自定义域名证书配置规则.
:param kwargs(dict): 设置请求headers.
:return: None
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket自定义域名证书配置规则
domain_cert_config = {}
response = client.put_bucket_domain_certificate(
Bucket='bucket',
DomainCertificateConfiguration=domain_cert_config
)
"""
xml_config = format_xml(data=DomainCertificateConfiguration, root='DomainCertificate')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'domaincertificate': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket domain certificate, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_domain_certificate(self, Bucket, DomainName, **kwargs):
"""获取bucket的自定义域名证书配置规则
:param Bucket(string): 存储桶名称.
:param DomainName(string): Bucket的自定义域名.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket的自定义域名证书配置规则.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket自定义域名证书配置规则
response = client.get_bucket_domain_certificate(
Bucket='bucket',
DomainName='domain-name'
)
"""
headers = mapped(kwargs)
params = {'domaincertificate': '', 'domainname': DomainName}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket domain certificate, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def delete_bucket_domain_certificate(self, Bucket, DomainName, **kwargs):
"""删除bucket的自定义域名证书配置规则
:param Bucket(string): 存储桶名称.
:param DomainName(string): Bucket的自定义域名.
:param kwargs(dict): 设置请求headers.
:return: None
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket自定义域名证书配置规则
response = client.delete_bucket_domain_certificate(
Bucket='bucket',
DomainName='domain-name'
)
"""
headers = mapped(kwargs)
params = {'domaincertificate': '', 'domainname': DomainName}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket domain certificate, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_origin(self, Bucket, OriginConfiguration={}, **kwargs):
"""设置bucket的回源规则
:param Bucket(string): 存储桶名称.
:param OriginConfiguration(dict): 设置Bucket的回源规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket回源规则
origin_config = {}
response = client.put_bucket_origin(
Bucket='bucket',
OriginConfiguration=origin_config
)
"""
xml_config = format_xml(data=OriginConfiguration, root='OriginConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'origin': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket origin, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_origin(self, Bucket, **kwargs):
"""获取bucket 回源配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的回源规则.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket回源规则
response = client.get_bucket_origin(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'origin': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket origin, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['OriginRule'])
return data
def delete_bucket_origin(self, Bucket, **kwargs):
"""删除bucket 回源配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket回源规则
response = client.delete_bucket_origin(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'origin': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket origin, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_inventory(self, Bucket, Id, InventoryConfiguration={}, **kwargs):
"""设置bucket的清单规则
:param Bucket(string): 存储桶名称.
:param Id(string): 清单规则名称.
:param InventoryConfiguration(dict): Bucket的清单规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket清单规则
inventory_config = {
'Destination': {
'COSBucketDestination': {
'AccountId': '100000000001',
'Bucket': 'qcs::cos:ap-guangzhou::examplebucket-1250000000',
'Format': 'CSV',
'Prefix': 'list1',
'Encryption': {
'SSECOS': {}
}
},
'IsEnabled': 'True',
'Filter': {
'Prefix': 'filterPrefix'
},
'IncludedObjectVersions':'All',
'OptionalFields': {
'Field': [
'Size',
'LastModifiedDate',
'ETag',
'StorageClass',
'IsMultipartUploaded',
'ReplicationStatus'
]
},
'Schedule': {
'Frequency': 'Daily'
}
}
response = client.put_bucket_inventory(
Bucket='bucket',
Id='list1',
InventoryConfiguration=inventory_config
)
"""
InventoryConfiguration['Id'] = Id
xml_config = format_xml(data=InventoryConfiguration, root='InventoryConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'inventory': '', 'id': Id}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket inventory, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_inventory(self, Bucket, Id, **kwargs):
"""获取bucket清单规则
:param Bucket(string): 存储桶名称.
:param Id(string): 清单规则名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的清单规则.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket清单规则
response = client.get_bucket_inventory(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'inventory': '', 'id': Id}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket inventory, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data['OptionalFields'], ['Field'])
return data
def delete_bucket_inventory(self, Bucket, Id, **kwargs):
"""删除bucket清单规则
:param Bucket(string): 存储桶名称.
:param Id(string): 清单规则名称.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket清单规则
response = client.delete_bucket_origin(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'inventory': '', 'id': Id}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket inventory, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def list_bucket_inventory_configurations(self, Bucket, ContinuationToken=None, **kwargs):
"""列举存储桶清单规则
:param Bucket(string): 存储桶名称
:param ContinuationToken(string): 分页参数, 用以获取下一页信息
:param kwargs(dict): 设置请求headers.
:return(dict): 存储桶清单规则列表
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 分页列举bucket清单规则
continuation_token = ''
while True:
resp = client.list_bucket_inventory_configurations(
Bucket=bucket,
ContinuationToken=continuation_token,
)
if 'InventoryConfiguration' in resp:
for conf in resp['InventoryConfiguration']:
print(conf)
if resp['IsTruncated'] == 'true':
continuation_token = resp['NextContinuationToken']
else:
break
"""
headers = mapped(kwargs)
params = {'inventory': ''}
if ContinuationToken is not None:
params['continuation-token'] = ContinuationToken
url = self._conf.uri(bucket=Bucket)
logger.info("list bucket inventory configurations, url={url}, headers={headers}".format(
url=url,
headers=headers,
))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def post_bucket_inventory(self, Bucket, Id, InventoryConfiguration={}, **kwargs):
"""设置bucket的清单规则(一次性清单/即时清单)
:param Bucket(string): 存储桶名称.
:param Id(string): 清单规则名称.
:param InventoryConfiguration(dict): Bucket的清单规则.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket清单规则
inventory_config = {
'Destination': {
'COSBucketDestination': {
'AccountId': '100000000001',
'Bucket': 'qcs::cos:ap-guangzhou::examplebucket-1250000000',
'Format': 'CSV',
'Prefix': 'list1',
'Encryption': {
'SSECOS': {}
}
},
'Filter': {
'Prefix': 'filterPrefix'
},
'IncludedObjectVersions':'All',
'OptionalFields': {
'Field': [
'Size',
'LastModifiedDate',
'ETag',
'StorageClass',
'IsMultipartUploaded',
'ReplicationStatus'
]
},
}
response = client.put_bucket_inventory(
Bucket='bucket',
Id='list1',
InventoryConfiguration=inventory_config
)
"""
InventoryConfiguration['Id'] = Id
xml_config = format_xml(data=InventoryConfiguration, root='InventoryConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'inventory': '', 'id': Id}
url = self._conf.uri(bucket=Bucket)
logger.info("post bucket inventory, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_object_tagging(self, Bucket, Key, Tagging={}, **kwargs):
"""设置object的标签
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Tagging(dict): Object的标签集合
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket标签
tagging_set = {
'TagSet': {
'Tag': [
{
'Key': 'string',
'Value': 'string'
}
]
}
}
response = client.put_object_tagging(
Bucket='bucket',
Key='test.txt',
Tagging=tagging_set
)
"""
xml_config = format_xml(data=Tagging, root='Tagging')
headers = mapped(kwargs)
params = {'tagging': ''}
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("put object tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return None
def get_object_tagging(self, Bucket, Key, **kwargs):
"""获取object标签
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的标签.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket标签
response = client.get_object_tagging(
Bucket='bucket',
Key='test.txt'
)
"""
headers = mapped(kwargs)
params = {'tagging': ''}
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get object tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if 'TagSet' in data:
format_dict(data['TagSet'], ['Tag'])
return data
def delete_object_tagging(self, Bucket, Key, **kwargs):
"""删除object标签
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket标签
response = client.delete_object_tagging(
Bucket='bucket',
Key='test.txt'
)
"""
headers = mapped(kwargs)
params = {'tagging': ''}
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("delete object tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
return None
def put_bucket_tagging(self, Bucket, Tagging={}, **kwargs):
"""设置bucket的标签
:param Bucket(string): 存储桶名称.
:param Tagging(dict): Bucket的标签集合
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket标签
tagging_set = {
'TagSet': {
'Tag': [
{
'Key': 'string',
'Value': 'string'
}
]
}
}
response = client.put_bucket_tagging(
Bucket='bucket',
Tagging=tagging_set
)
"""
xml_config = format_xml(data=Tagging, root='Tagging')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'tagging': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_tagging(self, Bucket, **kwargs):
"""获取bucket标签
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的标签.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket标签
response = client.get_bucket_tagging(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'tagging': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if 'TagSet' in data:
format_dict(data['TagSet'], ['Tag'])
return data
def delete_bucket_tagging(self, Bucket, **kwargs):
"""删除bucket 回源配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除bucket标签
response = client.delete_bucket_tagging(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'tagging': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket tagging, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_referer(self, Bucket, RefererConfiguration={}, **kwargs):
"""设置bucket的防盗链规则
:param Bucket(string): 存储桶名称.
:param RefererConfiguration(dict): Bucket的防盗链规则
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置bucket标签
referer_config = {
'Status': 'Enabled',
'RefererType': 'White-List',
'EmptyReferConfiguration': 'Allow',
'DomainList': {
'Domain': [
'*.qq.com',
'*.qcloud.com'
]
}
}
response = client.put_bucket_referer(
Bucket='bucket',
RefererConfiguration=referer_config
)
"""
xml_config = format_xml(data=RefererConfiguration, root='RefererConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'referer': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket referer, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_referer(self, Bucket, **kwargs):
"""获取bucket防盗链规则
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): Bucket对应的防盗链规则.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket标签
response = client.get_bucket_referer(
Bucket='bucket'
)
"""
headers = mapped(kwargs)
params = {'referer': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket referer, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if 'DomainList' in data:
format_dict(data['DomainList'], ['Domain'])
return data
def delete_bucket_referer(self, Bucket, **kwargs):
"""删除bucket防盗链规则
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取bucket标签
response = client.delete_bucket_referer(
Bucket='bucket'
)
"""
xml_config = ''
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'referer': ''}
url = self._conf.uri(bucket=Bucket)
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_intelligenttiering_v2(self, Bucket, IntelligentTieringConfiguration=None, Id=None, **kwargs):
"""设置存储桶智能分层配置
:param Bucket(string): 存储桶名称.
:param IntelligentTieringConfiguration(dict): 智能分层配置
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
intelligent_tiering_conf = {
'Status': 'Enable',
'Transition': {
'Days': '30|60|90',
'RequestFrequent': '1'
}
}
client.put_bucket_intelligenttiering(Bucket="bucket", IntelligentTieringConfiguration=intelligent_tiering_conf)
"""
if IntelligentTieringConfiguration is None:
IntelligentTieringConfiguration = {}
xml_config = format_xml(data=IntelligentTieringConfiguration, root='IntelligentTieringConfiguration')
headers = mapped(kwargs)
headers['Content-Type'] = 'application/xml'
params = {'id': Id}
url = self._conf.uri(bucket=Bucket) + '?intelligent-tiering'
logger.info("put bucket intelligenttiering, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_bucket_intelligenttiering(self, Bucket, IntelligentTieringConfiguration=None, **kwargs):
"""设置存储桶智能分层配置
:param Bucket(string): 存储桶名称.
:param IntelligentTieringConfiguration(dict): 智能分层配置
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
intelligent_tiering_conf = {
'Status': 'Enable',
'Transition': {
'Days': '30|60|90',
'RequestFrequent': '1'
}
}
client.put_bucket_intelligenttiering(Bucket="bucket", IntelligentTieringConfiguration=intelligent_tiering_conf)
"""
if IntelligentTieringConfiguration is None:
IntelligentTieringConfiguration = {}
xml_config = format_xml(data=IntelligentTieringConfiguration, root='IntelligentTieringConfiguration')
headers = mapped(kwargs)
headers['Content-Type'] = 'application/xml'
params = {'intelligenttiering': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket intelligenttiering, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def get_bucket_intelligenttiering(self, Bucket, **kwargs):
"""获取存储桶智能分层配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 智能分层配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.get_bucket_intelligenttiering(Bucket='bucket')
"""
headers = mapped(kwargs)
params = {'intelligenttiering': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket intelligenttiering, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def get_bucket_intelligenttiering_v2(self, Bucket, Id, **kwargs):
"""获取存储桶智能分层配置
:param Bucket(string): 存储桶名称.
:param Id(string) 智能分层规则Id.
:param kwargs(dict): 设置请求headers.
:return(dict): 智能分层配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.get_bucket_intelligenttiering_v2(Bucket='bucket', Id='id')
"""
headers = mapped(kwargs)
params = {'id': Id}
url = self._conf.uri(bucket=Bucket) + '?intelligent-tiering'
logger.info("get bucket intelligenttiering, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def list_bucket_intelligenttiering_configurations(self, Bucket, **kwargs):
"""列举存储桶中的所有智能分层配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 所有的智能分层配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.list_bucket_intelligenttiering_configurations(Bucket='bucket')
"""
headers = mapped(kwargs)
params = {}
url = self._conf.uri(bucket=Bucket) + "?intelligent-tiering"
logger.info("list bucket intelligenttiering configurations, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def put_bucket_object_lock(self, Bucket, ObjectLockConfiguration={}, **kwargs):
"""设置存储桶对象锁定配置
:param Bucket(string): 存储桶名称.
:param ObjectLockConfiguration(dict): 对象锁定配置.
:param kwargs(dict): 设置请求headers.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
object_lock_conf = {
'ObjectLockEnabled': 'Enabled',
}
client.put_bucket_object_lock(Bucket="bucket", ObjectLockConfiguration=objeck_lock_conf)
"""
xml_config = format_xml(data=ObjectLockConfiguration, root='ObjectLockConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'object-lock': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket object-lock, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return rt.headers
def get_bucket_object_lock(self, Bucket, **kwargs):
"""获取存储桶对象锁定配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 对象锁定配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.get_bucket_object_lock(Bucket="bucket")
"""
headers = mapped(kwargs)
params = {'object-lock': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket object-lock, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def get_bucket_meta(self, Bucket, **kwargs):
"""获取存储桶各项配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求headers.
:return(dict): 存储桶各项配置.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.get_bucket_meta(Bucket="bucket")
"""
data = {
'BucketUrl': None,
'OFS': False,
'MAZ': False,
'Encryption': None,
'ACL': None,
'Website': None,
'Logging': None,
'CORS': None,
'Versioning': None,
'IntelligentTiering': None,
'Lifecycle': None,
'Tagging': None,
'ObjectLock': None,
'Replication': None,
}
pool = SimpleThreadPool(num_threads=10)
# HeadBucket
def _head_bucket_wrapper(Bucket, **kwargs):
resp = self.head_bucket(Bucket, **kwargs)
# x-cos-bucket-arch: 'OFS'
# x-cos-bucket-az-type: 'MAZ'
# x-cos-bucket-region: 'ap-beijing'
if 'x-cos-bucket-arch' in resp and resp['x-cos-bucket-arch'] == 'OFS':
data.update({'OFS': True})
else:
data.update({'OFS': False})
if 'x-cos-bucket-az-type' in resp and resp['x-cos-bucket-az-type'] == 'MAZ':
data.update({'MAZ': True})
else:
data.update({'MAZ': False})
data.update({"Location": resp['x-cos-bucket-region']})
url = self._conf.uri(bucket=Bucket).strip('/')
data.update({'BucketUrl': url})
pool.add_task(_head_bucket_wrapper, Bucket, **kwargs)
# Website
def _get_bucket_website_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_website(Bucket, **kwargs)
data.update({'Website': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get website conf:{}".format(e))
pool.add_task(_get_bucket_website_wrapper, Bucket, **kwargs)
# ObjectLock
def _get_bucket_object_lock_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_object_lock(Bucket, **kwargs)
data.update({'ObjectLock': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get object_lock conf:{}".format(e))
pool.add_task(_get_bucket_object_lock_wrapper, Bucket, **kwargs)
# ACL
def _get_bucket_acl_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_acl(Bucket, **kwargs)
data.update({'ACL': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get acl conf:{}".format(e))
pool.add_task(_get_bucket_acl_wrapper, Bucket, **kwargs)
# Logging
def _get_bucket_logging_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_logging(Bucket, **kwargs)
data.update({'Logging': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get logging conf:{}".format(e))
pool.add_task(_get_bucket_logging_wrapper, Bucket, **kwargs)
# Lifecycle
def _get_bucket_lifecycle_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_lifecycle(Bucket, **kwargs)
data.update({'Lifecycle': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get lifecycle conf:{}".format(e))
pool.add_task(_get_bucket_lifecycle_wrapper, Bucket, **kwargs)
# Replication
def _get_bucket_replication_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_replication(Bucket, **kwargs)
data.update({'Replication': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get replication conf:{}".format(e))
pool.add_task(_get_bucket_replication_wrapper, Bucket, **kwargs)
# Encryption
def _get_bucket_encryption_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_encryption(Bucket, **kwargs)
data.update({'Encryption': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get encryption conf:{}".format(e))
pool.add_task(_get_bucket_encryption_wrapper, Bucket, **kwargs)
# CORS
def _get_bucket_cors_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_cors(Bucket, **kwargs)
data.update({'CORS': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get cors conf:{}".format(e))
pool.add_task(_get_bucket_cors_wrapper, Bucket, **kwargs)
# Versioning
def _get_bucket_versioning_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_versioning(Bucket, **kwargs)
data.update({'Versioning': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get versioning conf:{}".format(e))
pool.add_task(_get_bucket_versioning_wrapper, Bucket, **kwargs)
# IntelligentTiering
def _list_bucket_intelligenttiering_conf_wrapper(Bucket, **kwargs):
try:
resp = self.list_bucket_intelligenttiering_configurations(Bucket, **kwargs)
data.update({'IntelligentTiering': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get intelligenttiering conf:{}".format(e))
pool.add_task(_list_bucket_intelligenttiering_conf_wrapper, Bucket, **kwargs)
# Tagging
def _get_bucket_tagging_wrapper(Bucket, **kwargs):
try:
resp = self.get_bucket_tagging(Bucket, **kwargs)
data.update({'Tagging': resp})
except CosServiceError as e:
logger.debug("get_bucket_meta failed to get tagging conf:{}".format(e))
pool.add_task(_get_bucket_tagging_wrapper, Bucket, **kwargs)
pool.wait_completion()
return data
# service interface begin
def list_buckets(self, TagKey=None, TagValue=None, Region=None, CreateTime=None, Range=None, Marker="", MaxKeys=2000, **kwargs):
"""列出符合条件的bucket
:param Bucket(string): 存储桶名称
:param TagKey(string): 标签键
:param TagValue(string): 标签值
:param Region(string): 地域名称
:param CreateTime(Timestamp): GMT时间戳, 和 Range 参数一起使用, 支持根据创建时间过滤存储桶
:param Range(string): 和 CreateTime 参数一起使用, 支持根据创建时间过滤存储桶,支持枚举值 lt创建时间早于 create-time、gt创建时间晚于 create-time、lte创建时间早于或等于 create-time、gte创建时间晚于或等于create-time
:param Marker(string): 起始标记, 从该标记之后(不含)按照 UTF-8 字典序返回存储桶条目
:param MaxKeys(int): 单次返回最大的条目数量默认值为2000最大为2000
:return(dict): 账号下bucket相关信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取账户下所有存储桶信息
response = client.list_buckets()
"""
headers = mapped(kwargs)
if self._conf._enable_old_domain:
url = '{scheme}://service.cos.myqcloud.com/'.format(scheme=self._conf._scheme)
else:
url = '{scheme}://service.cos.tencentcos.cn/'.format(scheme=self._conf._scheme)
if self._conf._service_domain is not None:
url = '{scheme}://{domain}/'.format(scheme=self._conf._scheme, domain=self._conf._service_domain)
params = {
'marker': Marker,
'max-keys': MaxKeys,
}
if TagKey and TagValue:
params['tagkey'] = TagKey
params['tagvalue'] = TagValue
if Region:
params['region'] = Region
if CreateTime and Range:
params['create-time'] = CreateTime
params['range'] = Range
rt = self.send_request(
method='GET',
url=url,
bucket=None,
headers=headers,
params=params,
auth=CosS3Auth(self._conf),
)
data = xml_to_dict(rt.content)
if data['Buckets'] is not None and not isinstance(data['Buckets']['Bucket'], list):
lst = []
lst.append(data['Buckets']['Bucket'])
data['Buckets']['Bucket'] = lst
return data
# Advanced interface
def _upload_part(self, bucket, key, local_path, offset, size, part_num, uploadid, md5_lst, resumable_flag,
already_exist_parts, enable_md5, progress_callback=None, **kwargs):
"""从本地文件中读取分块, 上传单个分块,将结果记录在md5——list中
:param bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:param local_path(string): 本地文件路径名.
:param offset(int): 读取本地文件的分块偏移量.
:param size(int): 读取本地文件的分块大小.
:param part_num(int): 上传分块的序号.
:param uploadid(string): 分块上传的uploadid.
:param md5_lst(list): 保存上传成功分块的MD5和序号.
:param resumable_flag(bool): 是否为断点续传.
:param already_exist_parts(dict): 断点续传情况下,保存已经上传的块的序号和Etag.
:param enable_md5(bool): 是否开启md5校验.
:param kwargs(dict): 设置请求headers.
:return: None.
"""
# 如果是断点续传且该分块已经上传了则不用实际上传
if resumable_flag and part_num in already_exist_parts:
md5_lst.append({'PartNumber': part_num, 'ETag': already_exist_parts[part_num]})
else:
with open(local_path, 'rb') as fp:
fp.seek(offset, 0)
data = fp.read(size)
rt = self.upload_part(bucket, key, data, part_num, uploadid, enable_md5, **kwargs)
lower_rt = dict([(k.lower(), v) for k, v in rt.items()])
md5_lst.append({'PartNumber': part_num, 'ETag': lower_rt['etag']})
if progress_callback:
progress_callback.report(size)
return None
def _get_resumable_uploadid(self, bucket, key):
"""从服务端获取未完成的分块上传任务,获取断点续传的uploadid
:param bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:return(string): 断点续传的uploadid,如果不存在则返回None.
"""
if key and key[0] == '/':
key = key[1:]
multipart_response = self.list_multipart_uploads(
Bucket=bucket,
Prefix=key
)
if 'Upload' in multipart_response:
# 取最后一个(最新的)uploadid
index = len(multipart_response['Upload']) - 1
while index >= 0:
if multipart_response['Upload'][index]['Key'] == key:
return multipart_response['Upload'][index]['UploadId']
index -= 1
return None
def _check_single_upload_part(self, local_path, offset, local_part_size, remote_part_size, remote_etag):
"""从本地文件中读取分块, 校验本地分块和服务端的分块信息
:param local_path(string): 本地文件路径名.
:param offset(int): 读取本地文件的分块偏移量.
:param local_part_size(int): 读取本地文件的分块大小.
:param remote_part_size(int): 服务端的文件的分块大小.
:param remote_etag(string): 服务端的文件Etag.
:return(bool): 本地单个分块的信息是否和服务端的分块信息一致
"""
if local_part_size != remote_part_size:
return False
with open(local_path, 'rb') as fp:
fp.seek(offset, 0)
local_etag = get_raw_md5(fp.read(local_part_size))
if local_etag == remote_etag:
return True
return False
def _check_all_upload_parts(self, bucket, key, uploadid, local_path, parts_num, part_size, last_size,
already_exist_parts):
"""获取所有已经上传的分块的信息,和本地的文件进行对比
:param bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:param uploadid(string): 分块上传的uploadid
:param local_path(string): 本地文件的大小
:param parts_num(int): 本地文件的分块数
:param part_size(int): 本地文件的分块大小
:param last_size(int): 本地文件的最后一块分块大小
:param already_exist_parts(dict): 保存已经上传的分块的part_num和Etag
:return(bool): 本地文件是否通过校验,True为可以进行断点续传,False为不能进行断点续传
"""
parts_info = []
part_number_marker = 0
list_over_status = False
while list_over_status is False:
response = self.list_parts(
Bucket=bucket,
Key=key,
UploadId=uploadid,
PartNumberMarker=part_number_marker
)
# 已经存在的分块上传,有可能一个分块都没有上传,判断一下
if 'Part' in response:
parts_info.extend(response['Part'])
if response['IsTruncated'] == 'false':
list_over_status = True
else:
part_number_marker = int(response['NextPartNumberMarker'])
for part in parts_info:
part_num = int(part['PartNumber'])
# 如果分块数量大于本地计算出的最大数量,校验失败
if part_num > parts_num:
return False
offset = (part_num - 1) * part_size
local_part_size = part_size
if part_num == parts_num:
local_part_size = last_size
# 有任何一块没有通过校验,则校验失败
if not self._check_single_upload_part(local_path, offset, local_part_size, int(part['Size']), part['ETag']):
return False
already_exist_parts[part_num] = part['ETag']
return True
def download_file(self, Bucket, Key, DestFilePath, PartSize=20, MAXThread=5, EnableCRC=False, progress_callback=None, DumpRecordDir=None, KeySimplifyCheck=True, DisableTempDestFilePath=False, **Kwargs):
"""小于等于20MB的文件简单下载大于20MB的文件使用续传下载
:param Bucket(string): 存储桶名称.
:param key(string): COS文件的路径名.
:param DestFilePath(string): 下载文件的目的路径.
:param PartSize(int): 分块下载的大小设置,单位为MB.
:param MAXThread(int): 并发下载的最大线程数.
:param EnableCRC(bool): 校验下载文件与源文件是否一致
:param DumpRecordDir(string): 指定保存断点信息的文件路径
:param KeySimplifyCheck(bool): 是否对Key进行posix路径语义归并检查
:param DisableTempDestFilePath(bool): 简单下载写入目标文件时,不使用临时文件
:param kwargs(dict): 设置请求headers.
"""
logger.debug("Start to download file, bucket: {0}, key: {1}, dest_filename: {2}, part_size: {3}MB,\
max_thread: {4}".format(Bucket, Key, DestFilePath, PartSize, MAXThread))
head_headers = dict()
# SSE-C对象在head时也要求传入加密头域
if 'SSECustomerAlgorithm' in Kwargs:
head_headers['SSECustomerAlgorithm'] = Kwargs['SSECustomerAlgorithm']
head_headers['SSECustomerKey'] = Kwargs['SSECustomerKey']
head_headers['SSECustomerKeyMD5'] = Kwargs['SSECustomerKeyMD5']
# head时需要携带版本ID
if 'VersionId' in Kwargs:
head_headers['VersionId'] = Kwargs['VersionId']
object_info = self.head_object(Bucket, Key, **head_headers)
file_size = int(object_info['Content-Length'])
if file_size <= 1024 * 1024 * PartSize:
response = self.get_object(Bucket, Key, KeySimplifyCheck, **Kwargs)
response['Body'].get_stream_to_file(DestFilePath, DisableTempDestFilePath)
return
# 支持回调查看进度
callback = None
if progress_callback:
callback = ProgressCallback(file_size, progress_callback)
downloader = ResumableDownLoader(self, Bucket, Key, DestFilePath, object_info, PartSize, MAXThread, EnableCRC,
callback, DumpRecordDir, KeySimplifyCheck, **Kwargs)
downloader.start()
def upload_file(self, Bucket, Key, LocalFilePath, PartSize=1, MAXThread=5, EnableMD5=False, progress_callback=None,
**kwargs):
"""
:param Bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:param LocalFilePath(string): 本地文件路径名.
:param PartSize(int): 分块的大小设置,单位为MB.
:param MAXThread(int): 并发上传的最大线程数.
:param EnableMD5(bool): 是否打开MD5校验.
:param kwargs(dict): 设置请求headers.
:return(dict): 成功上传文件的元信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 根据文件大小自动选择分块大小,多线程并发上传提高上传速度
file_name = 'thread_1GB_test'
response = client.upload_file(
Bucket='bucket',
Key=file_name,
LocalFilePath=file_name,
PartSize=10,
MAXThread=10,
)
"""
file_size = os.path.getsize(LocalFilePath)
if file_size <= 1024 * 1024 * PartSize:
with open(LocalFilePath, 'rb') as fp:
rt = self.put_object(Bucket=Bucket, Key=Key, Body=fp, EnableMD5=EnableMD5, **kwargs)
return rt
else:
part_size = 1024 * 1024 * PartSize # 默认按照1MB分块,最大支持10G的文件超过10G的分块数固定为10000
last_size = 0 # 最后一块可以小于1MB
parts_num = file_size // part_size
last_size = file_size % part_size
if last_size != 0:
parts_num += 1
else: # 如果刚好整除,最后一块的大小等于分块大小
last_size = part_size
if parts_num > 10000:
parts_num = 10000
part_size = file_size // parts_num
last_size = file_size % parts_num
last_size += part_size
# 创建分块上传
# 判断是否可以断点续传
resumable_flag = False
already_exist_parts = {}
uploadid = self._get_resumable_uploadid(Bucket, Key)
if uploadid is not None:
logger.info("fetch an existed uploadid in remote cos, uploadid={uploadid}".format(uploadid=uploadid))
# 校验服务端返回的每个块的信息是否和本地的每个块的信息相同,只有校验通过的情况下才可以进行断点续传
resumable_flag = self._check_all_upload_parts(Bucket, Key, uploadid, LocalFilePath, parts_num,
part_size, last_size, already_exist_parts)
# 如果不能断点续传,则创建一个新的分块上传
if not resumable_flag:
rt = self.create_multipart_upload(Bucket=Bucket, Key=Key, **kwargs)
uploadid = rt['UploadId']
logger.info("create a new uploadid in upload_file, uploadid={uploadid}".format(uploadid=uploadid))
# 增加限速功能
part_headers = dict()
if 'TrafficLimit' in kwargs:
part_headers['TrafficLimit'] = kwargs['TrafficLimit']
# SSE-C对象在上传段时也要求传入加密头域
if 'SSECustomerAlgorithm' in kwargs:
part_headers['SSECustomerAlgorithm'] = kwargs['SSECustomerAlgorithm']
part_headers['SSECustomerKey'] = kwargs['SSECustomerKey']
part_headers['SSECustomerKeyMD5'] = kwargs['SSECustomerKeyMD5']
offset = 0 # 记录文件偏移量
lst = list() # 记录分块信息
pool = SimpleThreadPool(MAXThread)
callback = None
if progress_callback:
callback = ProgressCallback(file_size, progress_callback)
for i in range(1, parts_num + 1):
if i == parts_num: # 最后一块
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, file_size - offset, i,
uploadid, lst, resumable_flag, already_exist_parts, EnableMD5, callback, **part_headers)
else:
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, part_size, i, uploadid, lst,
resumable_flag, already_exist_parts, EnableMD5, callback, **part_headers)
offset += part_size
pool.wait_completion()
result = pool.get_result()
if not result['success_all'] or len(lst) != parts_num:
raise CosClientError('some upload_part fail after max_retry, please upload_file again')
lst = sorted(lst, key=lambda x: x['PartNumber']) # 按PartNumber升序排列
# 完成分块上传
rt = self.complete_multipart_upload(Bucket=Bucket, Key=Key, UploadId=uploadid,
MultipartUpload={'Part': lst})
return rt
def _head_object_when_copy(self, CopySource, **kwargs):
"""查询源文件的长度"""
bucket, path, endpoint, versionid = get_copy_source_info(CopySource, self._conf._enable_old_domain, self._conf._enable_internal_domain)
params = {}
if versionid != '':
params['versionId'] = versionid
url = u"{scheme}://{bucket}.{endpoint}/{path}".format(scheme=self._conf._scheme, bucket=bucket,
endpoint=endpoint, path=quote(to_bytes(path), '/-_.~'))
headers = dict()
# SSE-C对象在head源对象时也要求传入加密头域
if 'CopySourceSSECustomerAlgorithm' in kwargs:
headers['SSECustomerAlgorithm'] = kwargs['CopySourceSSECustomerAlgorithm']
headers['SSECustomerKey'] = kwargs['CopySourceSSECustomerKey']
headers['SSECustomerKeyMD5'] = kwargs['CopySourceSSECustomerKeyMD5']
headers = mapped(headers)
rt = self.send_request(
method='HEAD',
url=url,
bucket=bucket,
auth=CosS3Auth(self._conf, path, params=params),
headers=headers,
params=params)
storage_class = 'standard'
if 'x-cos-storage-class' in rt.headers:
storage_class = rt.headers['x-cos-storage-class'].lower()
return int(rt.headers['Content-Length']), storage_class
def _upload_part_copy(self, bucket, key, part_number, upload_id, copy_source, copy_source_range, md5_lst, **kwargs):
"""拷贝指定文件至分块上传,记录结果到lst中去
:param bucket(string): 存储桶名称.
:param key(string): 上传COS路径.
:param part_number(int): 上传分块的编号.
:param upload_id(string): 分块上传创建的UploadId.
:param copy_source(dict): 拷贝源,包含Appid,Bucket,Region,Key.
:param copy_source_range(string): 拷贝源的字节范围,bytes=first-last。
:param md5_lst(list): 保存上传成功分块的MD5和序号.
:param kwargs(dict): 设置请求headers.
:return: None.
"""
rt = self.upload_part_copy(bucket, key, part_number, upload_id, copy_source, copy_source_range, **kwargs)
md5_lst.append({'PartNumber': part_number, 'ETag': rt['ETag']})
return None
def _check_same_region(self, dst_endpoint, CopySource):
src_endpoint = get_copy_source_info(CopySource, self._conf._enable_old_domain, self._conf._enable_internal_domain)[2]
if src_endpoint == dst_endpoint:
return True
return False
def copy(self, Bucket, Key, CopySource, CopyStatus='Copy', PartSize=10, MAXThread=5, **kwargs):
"""文件拷贝小于5G的文件调用copy_object大于等于5G的文件调用分块上传的upload_part_copy
:param Bucket(string): 存储桶名称.
:param Key(string): 上传COS路径.
:param CopySource(dict): 拷贝源,包含Appid,Bucket,Region,Key.
:param CopyStatus(string): 拷贝状态,可选值'Copy'|'Replaced'.
:param PartSize(int): 分块的大小设置.
:param MAXThread(int): 并发上传的最大线程数.
:param kwargs(dict): 设置请求headers.
:return(dict): 拷贝成功的结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 根据拷贝源文件的大小自动选择拷贝策略
copy_source = {'Bucket': 'testcopt-1252468703', 'Key': '/thread_1MB', 'Region': 'ap-guangzhou'}
response = client.copy(
Bucket='test',
Key='copy_10G.txt',
CopySource=copy_source,
MAXThread=10
)
"""
# 先查询下拷贝源object的content-length
file_size, src_storage_class = self._head_object_when_copy(CopySource, **kwargs)
dst_storage_class = 'standard'
if 'StorageClass' in kwargs:
dst_storage_class = kwargs['StorageClass'].lower()
# 同园区且不改存储类型的情况下直接走copy_object
if self._check_same_region(self._conf._endpoint, CopySource) and src_storage_class == dst_storage_class:
response = self.copy_object(Bucket=Bucket, Key=Key, CopySource=CopySource, CopyStatus=CopyStatus, **kwargs)
return response
# 如果源文件大小小于5G则直接调用copy_object接口
if file_size < self._conf._copy_part_threshold_size:
response = self.copy_object(Bucket=Bucket, Key=Key, CopySource=CopySource, CopyStatus=CopyStatus, **kwargs)
return response
# 如果源文件大小大于等于5G则先创建分块上传在调用upload_part
part_size = 1024 * 1024 * PartSize # 默认按照10MB分块
last_size = 0 # 最后一块可以小于1MB
parts_num = file_size // part_size
last_size = file_size % part_size
if last_size != 0:
parts_num += 1
if parts_num > 10000:
parts_num = 10000
part_size = file_size // parts_num
last_size = file_size % parts_num
last_size += part_size
# 创建分块上传
rt = self.create_multipart_upload(Bucket=Bucket, Key=Key, **kwargs)
uploadid = rt['UploadId']
# 上传分块拷贝
offset = 0 # 记录文件偏移量
lst = list() # 记录分块信息
pool = SimpleThreadPool(MAXThread)
part_headers = dict()
# 目标对象是SSE-C需要增加加密头域
if 'SSECustomerAlgorithm' in kwargs:
part_headers['SSECustomerAlgorithm'] = kwargs['SSECustomerAlgorithm']
part_headers['SSECustomerKey'] = kwargs['SSECustomerKey']
part_headers['SSECustomerKeyMD5'] = kwargs['SSECustomerKeyMD5']
# 源对象是SSE-C需要增加加密头域
if 'CopySourceSSECustomerAlgorithm' in kwargs:
part_headers['CopySourceSSECustomerAlgorithm'] = kwargs['CopySourceSSECustomerAlgorithm']
part_headers['CopySourceSSECustomerKey'] = kwargs['CopySourceSSECustomerKey']
part_headers['CopySourceSSECustomerKeyMD5'] = kwargs['CopySourceSSECustomerKeyMD5']
for i in range(1, parts_num + 1):
if i == parts_num: # 最后一块
copy_range = gen_copy_source_range(offset, file_size - 1)
pool.add_task(self._upload_part_copy, Bucket, Key, i, uploadid, CopySource, copy_range, lst, **part_headers)
else:
copy_range = gen_copy_source_range(offset, offset + part_size - 1)
pool.add_task(self._upload_part_copy, Bucket, Key, i, uploadid, CopySource, copy_range, lst, **part_headers)
offset += part_size
pool.wait_completion()
result = pool.get_result()
if not result['success_all']:
raise CosClientError('some upload_part_copy fail after max_retry')
lst = sorted(lst, key=lambda x: x['PartNumber']) # 按PartNumber升序排列
# 完成分片上传
try:
rt = self.complete_multipart_upload(Bucket=Bucket, Key=Key, UploadId=uploadid,
MultipartUpload={'Part': lst})
except Exception as e:
abort_response = self.abort_multipart_upload(Bucket=Bucket, Key=Key, UploadId=uploadid)
raise e
return rt
def _upload_part_from_buffer(self, bucket, key, data, part_num, uploadid, md5_lst):
"""从内存中读取分块, 上传单个分块,将结果记录在md5——list中
:param bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:param data(string): 数据块.
:param part_num(int): 上传分块的序号.
:param uploadid(string): 分块上传的uploadid.
:param md5_lst(list): 保存上传成功分块的MD5和序号.
:return: None.
"""
rt = self.upload_part(bucket, key, data, part_num, uploadid)
md5_lst.append({'PartNumber': part_num, 'ETag': rt['ETag']})
return None
def upload_file_from_buffer(self, Bucket, Key, Body, MaxBufferSize=100, PartSize=10, MAXThread=5, **kwargs):
"""小于分块大小的的文件简单上传,大于等于分块大小的文件使用分块上传
:param Bucket(string): 存储桶名称.
:param key(string): 分块上传路径名.
:param Body(fp): 文件流,必须实现了read方法.
:param MaxBufferSize(int): 缓存文件的大小,单位为MB,MaxBufferSize/PartSize决定线程池中最大等待调度的任务数量
:param PartSize(int): 分块的大小设置,单位为MB
:param MAXThread(int): 并发上传的最大线程数.
:param kwargs(dict): 设置请求headers.
:return(dict): 成功上传的文件的结果.
"""
if not hasattr(Body, 'read'):
raise CosClientError("Body must have attr read")
part_size = 1024 * 1024 * PartSize
# 先读一个块,如果直接EOF了就调用简单文件上传
part_num = 1
data = Body.read(part_size)
if len(data) < part_size:
rt = self.put_object(Bucket=Bucket, Key=Key, Body=data, **kwargs)
return rt
# 创建分块上传
rt = self.create_multipart_upload(Bucket=Bucket, Key=Key, **kwargs)
uploadid = rt['UploadId']
lst = list() # 记录分块信息
MAXQueue = MaxBufferSize // PartSize
if MAXQueue == 0:
MAXQueue = 1
pool = SimpleThreadPool(MAXThread, MAXQueue)
while True:
if not data:
break
pool.add_task(self._upload_part_from_buffer, Bucket, Key, data, part_num, uploadid, lst)
part_num += 1
data = Body.read(part_size)
pool.wait_completion()
result = pool.get_result()
if not result['success_all']:
raise CosClientError('some upload_part fail after max_retry')
lst = sorted(lst, key=lambda x: x['PartNumber']) # 按PartNumber升序排列
# 完成分片上传
try:
rt = self.complete_multipart_upload(Bucket=Bucket, Key=Key, UploadId=uploadid,
MultipartUpload={'Part': lst})
except Exception as e:
abort_response = self.abort_multipart_upload(Bucket=Bucket, Key=Key, UploadId=uploadid)
raise e
return rt
def append_object(self, Bucket, Key, Position, Data, **kwargs):
"""文件块追加接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Position(int): 追加内容的起始位置.
:param Data(string): 追加的内容
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功返回的结果包含ETag等信息.
"""
check_object_content_length(Data)
headers = mapped(kwargs)
params = {'append': '', 'position': Position}
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("append object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
data=Data,
headers=headers,
params=params)
response = dict(**rt.headers)
return response
def put_object_from_local_file(self, Bucket, LocalFilePath, Key, EnableMD5=False, **kwargs):
"""本地文件上传接口适用于小文件最大不得超过5GB
:param Bucket(string): 存储桶名称.
:param LocalFilePath(string): 上传文件的本地路径.
:param Key(string): COS路径.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功返回的结果包含ETag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
response = client.put_object_from_local_file(
Bucket='bucket',
LocalFilePath='local.txt',
Key='test.txt'
)
print (response['ETag'])
"""
with open(LocalFilePath, 'rb') as fp:
return self.put_object(Bucket, fp, Key, EnableMD5, **kwargs)
def object_exists(self, Bucket, Key):
"""判断一个文件是否存在
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:return(bool): 文件是否存在,返回True为存在,返回False为不存在
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
status = client.object_exists(
Bucket='bucket',
Key='test.txt'
)
"""
try:
self.head_object(Bucket, Key)
return True
except CosServiceError as e:
if e.get_status_code() == 404:
return False
else:
raise e
def bucket_exists(self, Bucket):
"""判断一个存储桶是否存在
:param Bucket(string): 存储桶名称.
:return(bool): 存储桶是否存在,返回True为存在,返回False为不存在.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
status = client.bucket_exists(
Bucket='bucket'
)
"""
try:
self.head_bucket(Bucket)
return True
except CosServiceError as e:
if e.get_status_code() == 404:
return False
else:
raise e
def change_object_storage_class(self, Bucket, Key, StorageClass):
"""改变文件的存储类型
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param StorageClass(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功返回的结果包含ETag等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
response = client.change_object_storage_class(
Bucket='bucket',
Key='test.txt',
StorageClass='STANDARD'
)
"""
copy_source = {
'Bucket': Bucket,
'Key': Key,
'Endpoint': self._conf._endpoint,
'Appid': self._conf._appid
}
response = self.copy_object(
Bucket=Bucket,
Key=Key,
CopySource=copy_source,
CopyStatus='Replaced',
StorageClass=StorageClass
)
return response
def update_object_meta(self, Bucket, Key, **kwargs):
"""改变文件的存储类型
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:kwargs(dict): 设置文件的元属性.
:return: None.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
response = client.update_object_meta(
Bucket='bucket',
Key='test.txt',
ContentType='text/html'
)
"""
copy_source = {
'Bucket': Bucket,
'Key': Key,
'Endpoint': self._conf._endpoint,
'Appid': self._conf._appid
}
response = self.copy_object(
Bucket=Bucket,
Key=Key,
CopySource=copy_source,
CopyStatus='Replaced',
**kwargs
)
return response
def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, **kwargs):
"""设置执行存储桶下的默认加密配置
:param Bucket(string): 存储桶名称.
:param ServerSideEncryptionConfiguration(dict): 设置Bucket的加密规则
:param kwargs(dict): 设置请求的headers.
:return: None.
"""
xml_config = format_xml(data=ServerSideEncryptionConfiguration, root='ServerSideEncryptionConfiguration')
headers = mapped(kwargs)
params = {'encryption': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("put bucket encryption, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
data=xml_config,
headers=headers,
params=params)
return None
def get_bucket_encryption(self, Bucket, **kwargs):
"""获取存储桶下的默认加密配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求的headers.
:return(dict): 返回bucket的加密规则.
"""
headers = mapped(kwargs)
params = {'encryption': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("get bucket encryption, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['Rule'])
return data
def delete_bucket_encryption(self, Bucket, **kwargs):
"""用于删除指定存储桶下的默认加密配置
:param Bucket(string): 存储桶名称.
:param kwargs(dict): 设置请求的headers.
:return: None.
"""
headers = mapped(kwargs)
params = {'encryption': ''}
url = self._conf.uri(bucket=Bucket)
logger.info("delete bucket encryption, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
return None
def put_async_fetch_task(self, Bucket, FetchTaskConfiguration={}, **kwargs):
"""发起异步拉取对象到COS的任务
:param Bucket(string): 存储桶名称.
:param FetchTaskConfiguration(dict): 异步拉取任务的配置.
:kwargs(dict): 扩展参数.
:return(dict): 异步任务成功返回的结果包含Taskid等信息.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 发起异步拉取任务
response = client.put_async_fetch_task(
Bucket='bucket',
FetchTaskConfiguration={
'Url':
'Key':
'MD5':
'SuccessCallbackUrl':
'FailureCallbackUrl':
}
)
"""
url = '{scheme}://{region}.migration.myqcloud.com/{bucket}/'.format(scheme=self._conf._scheme,
region=self._conf._region, bucket=Bucket)
if self._conf._domain is not None:
url = '{scheme}://{domain}/{bucket}/'.format(scheme=self._conf._scheme, domain=self._conf._domain,
bucket=Bucket)
headers = {'Content-Type': 'application/json'}
signed_key = Bucket + '/'
rt = self.send_request(
method='POST',
url=url,
bucket=None,
data=json.dumps(FetchTaskConfiguration),
headers=headers,
auth=CosS3Auth(self._conf, signed_key),
cos_request=False
)
data = rt.json()
return data
def get_async_fetch_task(self, Bucket, TaskId, **kwargs):
"""获取异步拉取对象到COS的任务状态
:param Bucket(string): 存储桶名称.
:param TaskId(string): 异步拉取任务查询的唯一标识.
:kwargs(dict): 扩展参数.
:return(dict): 异步任务的状态
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取异步拉取任务
response = client.get_async_fetch_task(
Bucket='bucket',
TaskId='string'
)
"""
url = '{scheme}://{region}.migration.myqcloud.com/{bucket}/{task_id}'.format(scheme=self._conf._scheme,
region=self._conf._region,
bucket=Bucket, task_id=TaskId)
if self._conf._domain is not None:
url = '{scheme}://{domain}/{bucket}/{task_id}'.format(scheme=self._conf._scheme, domain=self._conf._domain,
bucket=Bucket, task_id=TaskId)
headers = {'Content-Type': 'application/json'}
signed_key = '{bucket}/{task_id}'.format(bucket=Bucket, task_id=TaskId)
rt = self.send_request(
method='GET',
url=url,
bucket=None,
headers=headers,
auth=CosS3Auth(self._conf, signed_key),
cos_request=False
)
data = rt.json()
return data
def put_live_channel(self, Bucket, ChannelName, Expire=3600, PreSignExpire=0, LiveChannelConfiguration={}, **kwargs):
"""创建直播通道
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param Expire(int): 推流url签名过期时间.
:param PreSignExpire(int): playlist中ts分片签名的过期时间,合法值[60,43200],默认为0,不开启该签名.
:param LiveChannelConfiguration(dict): 直播通道配置.
:param kwargs(dict): 设置请求headers.
:return(dict): publish url and playurl.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 设置直播通道配置
livechannel_config = {
'Description': 'channel description',
'Switch': 'Enabled',
'Target': {
'Type': 'HLS',
'FragDuration': '3',
'FragCount': '5',
}
}
response = client.put_live_channel(Bucket='bucket', ChannelName='ch1', LiveChannelConfiguration=livechannel_config)
"""
xml_config = format_xml(data=LiveChannelConfiguration, root='LiveChannelConfiguration')
headers = mapped(kwargs)
headers['Content-MD5'] = get_md5(xml_config)
headers['Content-Type'] = 'application/xml'
params = {'live': ''}
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("put live channel, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
if data['PublishUrls']['Url'] is not None:
rtmpSign = CosRtmpAuth(self._conf, bucket=Bucket, channel=ChannelName, expire=Expire, presign_expire=PreSignExpire)
url = data['PublishUrls']['Url']
url += '?' + rtmpSign.get_rtmp_sign()
data['PublishUrls']['Url'] = url
return data
def get_rtmp_signed_url(self, Bucket, ChannelName, Expire=3600, Params={}):
"""获取直播通道带签名的推流url
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:return: dict.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.get_rtmp_signed_url(Bucket='bucket', ChannelName='ch1')
"""
rtmp_signed_url = 'rtmp://{bucket}.cos.{region}.myqcloud.com/live/{channel}'.format(bucket=Bucket,
region=self._conf._region,
channel=ChannelName)
rtmpAuth = CosRtmpAuth(self._conf, bucket=Bucket, channel=ChannelName, params=Params, expire=Expire)
return rtmp_signed_url + '?' + rtmpAuth.get_rtmp_sign()
def get_live_channel_info(self, Bucket, ChannelName, **kwargs):
"""获取直播通道配置信息
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param kwargs(dict): 设置请求headers.
:return: dict.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.get_live_channel_info(Bucket='bucket', ChannelName='ch1')
"""
params = {'live': ''}
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("get live channel info, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def put_live_channel_switch(self, Bucket, ChannelName, Switch, **kwargs):
"""禁用或者开启直播通道
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param Switch(string): 'enabled''disabled'.
:param kwargs(dict): 设置请求headers.
:return(None).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.put_live_channel_switch(Bucket='bucket', ChannelName='ch1', Switch='enabled')
"""
params = {'live': ''}
if Switch in ['enabled', 'disabled']:
params['switch'] = Switch
else:
raise CosClientError('switch must be enabled or disabled')
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("put live channel switch, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
return None
def get_live_channel_history(self, Bucket, ChannelName, **kwargs):
"""获取直播通道推流历史
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param kwargs(dict): 设置请求headers.
:return(dict).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.get_live_channel_history(Bucket='bucket', ChannelName='ch1')
"""
params = {'live': '', 'comp': 'history'}
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("get live channel history, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['LiveRecord'])
return data
def get_live_channel_status(self, Bucket, ChannelName, **kwargs):
"""获取直播通道推流状态
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param kwargs(dict): 设置请求headers.
:return(dict).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.get_live_channel_status(Bucket='bucket', ChannelName='ch1')
"""
params = {'live': '', 'comp': 'status'}
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("get live channel status, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
return data
def delete_live_channel(self, Bucket, ChannelName, **kwargs):
"""删除直播通道
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param kwargs(dict): 设置请求headers.
:return(dict).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
client.delete_live_channel(Bucket='bucket', ChannelName='ch1')
"""
params = {'live': ''}
url = self._conf.uri(bucket=Bucket, path=ChannelName)
headers = mapped(kwargs)
logger.info("delete live channel, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
data = dict(**rt.headers)
return data
def get_vod_playlist(self, Bucket, ChannelName, StartTime=0, EndTime=0, **kwargs):
"""查询指定时间段播放列表文件
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param StartTime(int): 播放列表ts文件的起始时间格式为unix时间戳.
:param EndTime(int): 播放列表ts文件的结束时间格式为unix时间戳.
:param kwargs(dict): 设置请求headers.
:return(string).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.get_vod_playlist(Bucket='bucket', ChannelName='ch1', StartTime=1611218201, EndTime=1611218300)
"""
if StartTime <= 0 or EndTime <= 0:
raise CosClientError('invalid timestamp')
if StartTime >= EndTime:
raise CosClientError('StartTime must be less than EndTime')
params = {'vod': '', 'starttime': StartTime, 'endtime': EndTime}
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=ChannelName)
logger.info("get vod playlist, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=ChannelName),
headers=headers,
params=params)
return rt.content
def post_vod_playlist(self, Bucket, ChannelName, PlaylistName, StartTime=0, EndTime=0, **kwargs):
"""生成点播播放列表文件
:param Bucket(string): 存储桶名称.
:param ChannelName(string): 直播通道名称.
:param PlaylistName(string): 播放列表文件名称.
:param StartTime(int): 播放列表ts文件的起始时间格式为unix时间戳.
:param EndTime(int): 播放列表ts文件的结束时间格式为unix时间戳.
:param kwargs(dict): 设置请求headers.
:return(None).
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.post_vod_playlist(Bucket='bucket', ChannelName='ch1', PlaylistName='test.m3u8', StartTime=1611218201, EndTime=1611218300)
"""
if StartTime <= 0 or EndTime <= 0:
raise CosClientError('invalid timestamp')
if StartTime >= EndTime:
raise CosClientError('StartTime must be less than EndTime')
if not PlaylistName.endswith('.m3u8'):
raise CosClientError('PlaylistName must be end with .m3u8')
params = {'vod': '', 'starttime': StartTime, 'endtime': EndTime}
headers = mapped(kwargs)
file_path = ChannelName + '/' + PlaylistName
url = self._conf.uri(bucket=Bucket, path=file_path)
logger.info("post vod playlist, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params, key=file_path),
headers=headers,
params=params)
return None
def list_live_channel(self, Bucket, MaxKeys=100, Prefix='', Marker='', **kwargs):
"""获取直播通道列表
:param Bucket(string): 存储桶名称.
:param MaxKeys(int): 每页可以列出通道数量的最大值,有效值范围为[1, 1000]默认值100.
:param Prefix(string): 限定返回的 LiveChannel 必须以 prefix 作为前缀.
:param Marker(string): 从 marker 之后按字母排序的第一个开始返回.
:param kwargs(dict): 设置请求headers.
:return: string.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
resp = client.list_channel(Bucket='bucket', MaxKeys=100)
"""
params = {'live': ''}
if MaxKeys >= 1:
params['max-keys'] = MaxKeys
if Prefix != '':
params['prefix'] = Prefix
if Marker != '':
params['marker'] = Marker
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket)
logger.info("list live channel, url=:{url} ,headers=:{headers}".format(url=url, headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
data = xml_to_dict(rt.content)
format_dict(data, ['LiveChannel'])
decode_result(
data,
[
'Prefix',
'Marker',
'MaxKeys',
'IsTruncated',
'NextMarker'
],
[
['LiveChannel', 'Name'],
])
return data
def ci_put_object_from_local_file(self, Bucket, LocalFilePath, Key, EnableMD5=False, **kwargs):
"""本地CI文件上传接口适用于小文件最大不得超过5GB
:param Bucket(string): 存储桶名称.
:param LocalFilePath(string): 上传文件的本地路径.
:param Key(string): COS路径.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功UploadResult结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到CI
response = client.ci_put_object_from_local_file(
Bucket='bucket-appid',
LocalFilePath='local.jpg',
Key='local.jpg'
PicOperations='{"is_pic_info":1,"rules":[{"fileid":"format.png","rule":"imageView2/format/png"}]}'
)
print(response['ProcessResults']['Object']['ETag'])
"""
with open(LocalFilePath, 'rb') as fp:
return self.ci_put_object(Bucket, fp, Key, EnableMD5, **kwargs)
def ci_put_object(self, Bucket, Body, Key, EnableMD5=False, **kwargs):
"""单文件CI上传接口适用于小文件最大不得超过5GB
:param Bucket(string): 存储桶名称.
:param Body(file|string): 上传的文件内容,类型为文件流或字节流.
:param Key(string): COS路径.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict): 上传成功UploadResult结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到cos
with open('local.jpg', 'rb') as fp:
response = client.ci_put_object(
Bucket='bucket',
Body=fp,
Key='local.jpg'
PicOperations='{"is_pic_info":1,"rules":[{"fileid":"format.jpg","rule":"imageView2/format/png"}]}'
)
print(response['ProcessResults']['Object']['ETag'])
"""
check_object_content_length(Body)
headers = mapped(kwargs)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_put_object, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
if EnableMD5:
md5_str = get_content_md5(Body)
if md5_str:
headers['Content-MD5'] = md5_str
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key),
data=Body,
headers=headers)
response = dict(**rt.headers)
data = xml_to_dict(rt.content)
return response, data
def ci_put_image_style(self, Bucket, Request, **kwargs):
"""CI增加图片样式接口
:param Bucket(string): 存储桶名称.
:param Request(dict): 图片样式请求体.
:kwargs(dict): 设置上传的headers.
:return(dict): 添加图片样式返回结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
body = {
'StyleName': 'style_name',
'StyleBody': 'imageMogr2/thumbnail/!50px',
}
response = client.ci_put_image_style(
Bucket=bucket_name,
Request=body,
)
"""
headers = mapped(kwargs)
params = {'style': ''}
xml_config = format_xml(data=Request, root='AddStyle')
url = self._conf.uri(bucket=Bucket, endpoint=self._conf._endpoint_pic)
logger.info("ci_put_image_style, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
response = dict(**rt.headers)
return response
def ci_get_image_style(self, Bucket, Request, **kwargs):
"""CI获取图片样式接口
:param Bucket(string): 存储桶名称.
:param Request(dict): 图片样式请求体.
:kwargs(dict): 设置上传的headers.
:return(dict): 获取图片样式结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
body = {
'StyleName': 'style_name',
}
response, data = client.ci_get_image_style(
Bucket=bucket_name,
Request=body,
)
print(response['x-cos-request-id'])
print(data)
"""
headers = mapped(kwargs)
params = {'style': ''}
url = self._conf.uri(bucket=Bucket, endpoint=self._conf._endpoint_pic)
xml_config = format_xml(data=Request, root='GetStyle')
logger.info("ci_get_image_style, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
response = dict(**rt.headers)
data = xml_to_dict(rt.content)
return response, data
def ci_delete_image_style(self, Bucket, Request, **kwargs):
"""CI删除图片样式接口
:param Bucket(string): 存储桶名称.
:param Request(dict): 图片样式请求体.
:kwargs(dict): 设置上传的headers.
:return(dict): 获取图片样式response header.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
body = {
'StyleName': 'style_name',
}
response = client.ci_delete_image_style(
Bucket=bucket_name,
Request=body,
)
print(response['x-cos-request-id'])
"""
headers = mapped(kwargs)
params = {'style': ''}
xml_config = format_xml(data=Request, root='DeleteStyle')
url = self._conf.uri(bucket=Bucket, endpoint=self._conf._endpoint_pic)
logger.info("ci_delete_image_style, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, params=params),
headers=headers,
params=params)
response = dict(**rt.headers)
return response
def ci_get_object(self, Bucket, Key, DestImagePath, Rule, **kwargs):
"""单文件CI下载对象到文件接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param DestImagePath(string): 下载图片的目的路径.
:param Rule(string): 图片处理规则.
:kwargs(dict): 设置上传的headers.
:return(dict): 下载后response header.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_get_object(
Bucket='bucket',
Key='local.jpg',
DestImagePath='download.png'
Rule='imageView2/format/png'
)
print(response['x-cos-request-id'])
"""
headers = mapped(kwargs)
final_headers = {}
params = {Rule: ''}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_get_object, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
StreamBody(rt).get_stream_to_file(DestImagePath)
response = dict(**rt.headers)
return response
def ci_get_image_info(self, Bucket, Key, Param='imageInfo', **kwargs):
"""ci获取图片基本信息接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Param(string): 请求参数,一般情况下不进行赋值操作.
:kwargs(dict): 设置获取图片信息的headers.
:return(dict): response header.
:return(dict): 图片信息结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_image_info(
Bucket=bucket_name,
Key='format.png',
)
print(response['x-cos-request-id'])
print(data)
"""
headers = mapped(kwargs)
final_headers = {}
params = {Param: ''}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_get_image_info, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
data = rt.content
return response, data
def ci_get_image_exif_info(self, Bucket, Key, **kwargs):
"""ci获取图片exif信息接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:kwargs(dict): 设置获取图片exif信息的headers.
:return(dict): response header.
:return(dict): 图片exif信息结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_image_exif_info(
Bucket=bucket_name,
Key='format.png',
)
print(response['x-cos-request-id'])
print(data)
"""
return self.ci_get_image_info(Bucket, Key, 'exif', **kwargs)
def ci_get_image_ave_info(self, Bucket, Key, **kwargs):
"""ci获取图片主色调接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:kwargs(dict): 设置获取图片主色调的headers.
:return(dict): response header.
:return(dict): 图片主色调结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_image_exif_info(
Bucket=bucket_name,
Key='format.png',
)
print(response['x-cos-request-id'])
print(data)
"""
return self.ci_get_image_info(Bucket, Key, 'imageAve', **kwargs)
def ci_process(self, Bucket, Key, CiProcess, Params={}, NeedHeader=False, Stream=False, **kwargs):
"""ci_process基本信息的接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param CiProcess(string): ci process处理参数.
:param kwargs(dict): 设置下载的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_process(
Bucket='bucket',
Key='test.mp4',
CiProcess='AssessQuality',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': CiProcess}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if Params is not None:
for key in Params:
params[key] = Params[key]
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_process=:{ci_process}, url=:{url} ,headers=:{headers}, params=:{params}".format(
ci_process=CiProcess,
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
stream=Stream,
params=params,
headers=headers)
data = ''
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
else:
if Stream:
data = StreamBody(rt)
else:
data = rt.content
if NeedHeader:
return response, data
return data
def ci_image_assess_quality(self, Bucket, Key, **kwargs):
"""ci_image_assess_quality图片质量评估接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): 图片质量评估返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_image_assess_quality(
Bucket='bucket',
Key='test.mp4',
)
print response
"""
return self.ci_process(Bucket, Key, "AssessQuality", **kwargs)
def ci_image_detect_car(self, Bucket, Key, **kwargs):
"""ci_image_detect_car车辆车牌检测接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): 车辆车牌检测返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_image_detect_car(
Bucket='bucket',
Key='test.mp4',
)
print response
"""
return self.ci_process(Bucket, Key, "DetectCar", **kwargs)
def ci_image_detect_label(self, Bucket, Key='', Scenes=None, DetectUrl=None, **kwargs):
"""ci_image_detect_label图片标签接口 https://cloud.tencent.com/document/product/460/39082
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Scenes(string): 本次调用支持的识别场景,可选值如下:
web针对网络图片优化
camera针对手机摄像头拍摄图片优化
album针对手机相册、网盘产品优化
news针对新闻、资讯、广电等行业优化
如果不传此参数则默认为camera。
支持多场景scenes一起检测分隔。例如使用 scenes=webcamera 即对一张图片使用两个模型同时检测,输出两套识别结果.
:param DetectUrl(string): 您可以通过填写 detect-url 处理任意公网可访问的图片链接。不填写 detect-url 时,后台会默认处理 ObjectKey ,填写了 detect-url 时,后台会处理 detect-url 链接.
:param kwargs(dict): 设置下载的headers.
:return(dict): 图片质量评估返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_image_detect_label(
Bucket='bucket',
Key='test.mp4',
)
print response
"""
params = {}
if Scenes is not None:
params['scenes'] = Scenes
if DetectUrl is not None:
params['detect-url'] = DetectUrl
path = "/" + Key
return self.ci_process(Bucket=Bucket, Key=path, CiProcess="detect-label", Params=params, **kwargs)
def ci_qrcode_generate(self, Bucket, QrcodeContent, Width, Mode=0, **kwargs):
"""二维码生成接口
:param Bucket(string): 存储桶名称.
:param QrcodeContent(string): 可识别的二维码文本信息.
:param Width(string): 指定生成的二维码或条形码的宽度,高度会进行等比压缩.
:param Mode(int): 生成的二维码类型可选值0或1。0为二维码1为条形码默认值为0.
:return(dict): 二维码生成结果
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_qrcode_generate(
Bucket=bucket_name,
QrcodeContent='https://www.example.com',
Width=200
)
qrCodeImage = base64.b64decode(response['ResultImage'])
with open('/result.png', 'wb') as f:
f.write(qrCodeImage)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'qrcode-generate'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['qrcode-content'] = QrcodeContent
params['width'] = Width
params['mode'] = Mode
params = format_values(params)
url = self._conf.uri(bucket=Bucket)
logger.info("ci_qrcode_generate, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, params=params),
params=params,
headers=headers)
data = xml_to_dict(rt.content)
return data
def ci_ocr_process(self, Bucket, Key, Type='general', LanguageType='zh', Ispdf=False, PdfPagenumber=1, Isword=False, EnableWordPolygon=False, **kwargs):
"""通用文字识别
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Type(string): OCR 的识别类型,有效值为 generalaccurateefficientfasthandwriting。general 表示通用印刷体识别accurate 表示印刷体高精度版efficient 表示印刷体精简版fast 表示印刷体高速版handwriting 表示手写体识别。默认值为 general。
:param LanguageType(string): type 值为 general 时有效,表示识别语言类型。支持自动识别语言类型,同时支持自选语言种类,默认中英文混合(zh),各种语言均支持与英文混合的文字识别。可选值请参见 可识别的语言类型。
:param Ispdf(bool): type 值为 general、fast 时有效,表示是否开启 PDF 识别,有效值为 true 和 false默认值为 false开启后可同时支持图片和 PDF 的识别。
:param PdfPagenumber(int): type 值为 general、fast 时有效,表示需要识别的 PDF 页面的对应页码,仅支持 PDF 单页识别,当上传文件为 PDF 且 ispdf 参数值为 true 时有效默认值为1。
:param Isword(bool): type 值为 general、accurate 时有效,表示识别后是否需要返回单字信息,有效值为 true 和 false默认为 false。
:param EnableWordPolygon(bool): type 值为 handwriting 时有效,表示是否开启单字的四点定位坐标输出,有效值为 true 和 false默认值为 false。
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
def ci_ocr_process():
# 通用文字识别
response = client.ci_ocr_process(
Bucket=bucket_name,
Key='ocr.jpeg',
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'OCR'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['type'] = Type
params['language-type'] = LanguageType
params['ispdf'] = str(Ispdf).lower()
params['pdf-pagenumber'] = PdfPagenumber
params['isword'] = str(Isword).lower()
params['enable-word-polygon'] = str(EnableWordPolygon).lower()
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_ocr_process, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
data = xml_to_dict(rt.content)
return data
def ci_image_process(self, Bucket, Key, **kwargs):
"""查询CI image process
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置请求headers.
:return(dict): 上传成功UploadResult结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建分块上传
response = client.ci_image_process(
Bucket='bucket',
Key='local.jpg'
PicOperations='{"is_pic_info":1,"rules":[{"fileid":"format.png","rule":"imageView2/format/png"}]}'
)
print(response['ProcessResults']['Object']['ETag'])
"""
headers = mapped(kwargs)
params = {'image_process': ''}
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_image_process, url=:{url} ,headers=:{headers}".format(
url=url,
headers=headers))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
headers=headers,
params=params)
response = dict(**rt.headers)
data = xml_to_dict(rt.content)
return response, data
def ci_download_compress_image(self, Bucket, Key, DestImagePath, CompressType, **kwargs):
"""图片压缩接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param DestImagePath(string): 下载图片的目的路径.
:param CompressType(string): 压缩格式,目标缩略图的图片格式为 TPG 或 HEIF.
:param kwargs(dict): 设置下载的headers.
:return response(dict): 请求成功返回的header.
"""
headers = mapped(kwargs)
final_headers = {}
params = {'imageMogr2/format/' + CompressType: ''}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_download_compress_image, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
StreamBody(rt).get_stream_to_file(DestImagePath)
response = dict(**rt.headers)
return response
def ci_image_inspect(self, Bucket, Key, **kwargs):
"""ci异常图片检测同步请求 https://cloud.tencent.com/document/product/460/75997
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置获取图片信息的headers.
:return(dict): response header.
:return(dict): 检测结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_image_inspect(
Bucket=bucket_name,
Key='format.png',
)
print(response['x-cos-request-id'])
print(data)
"""
headers = mapped(kwargs)
final_headers = {}
params = {'imageInspect': ''}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_image_inspect, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
data = rt.content
return response, data
def ci_get_image_aigc_metadata(self, Bucket, Key, **kwargs):
"""ci_get_image_aigc_metadata查询图片中保存的AIGC元数据标识信息接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): response header.
:return(dict): AIGC元数据标识信息结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_image_aigc_metadata(
Bucket='bucket',
ObjectKey=''
)
print data
print response
"""
path = "/" + Key
return self.ci_process(Bucket, path, "ImageAIGCMetadata", NeedHeader=True, **kwargs)
def ci_put_object_from_local_file_and_get_qrcode(self, Bucket, LocalFilePath, Key, EnableMD5=False, **kwargs):
"""本地CI文件上传接口并返回二维码适用于小文件最大不得超过5GB
:param Bucket(string): 存储桶名称.
:param LocalFilePath(string): 上传文件的本地路径.
:param Key(string): COS路径.
:param EnableMD5(bool): 是否需要SDK计算Content-MD5打开此开关会增加上传耗时.
:kwargs(dict): 设置上传的headers.
:return(dict,dict): 上传成功UploadResult结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 上传本地文件到CI
response, data = client.ci_put_object_qrcode_from_local_file(
Bucket='bucket-appid',
LocalFilePath='local.jpg',
Key='local.jpg'
PicOperations='{"is_pic_info":1,"rules":[{"fileid":"format.jpg","rule":"QRcode/cover/0"}]}'
)
print(response,data)
"""
with open(LocalFilePath, 'rb') as fp:
return self.ci_put_object(Bucket, fp, Key, EnableMD5, **kwargs)
def ci_get_object_qrcode(self, Bucket, Key, Cover, BarType=0, **kwargs):
"""单文件CI下载接口返回文件二维码信息
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Cover(int): 二维码覆盖功能.
:param BarType(int): 二维码/条形码识别功能,将对识别出的二维码/条形码 覆盖马赛克. 取值为0,1,2:
0表示都识别
1表示识别二维码
2表示识别条形码
默认值0
:param kwargs(dict): 设置下载的headers.
:return(dict,dict): 操作返回的结果.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_object_qrcode(
Bucket='bucket',
Key='test.txt',
Cover=0
)
print(response,data)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'versionId' in headers:
params['versionId'] = headers['versionId']
del headers['versionId']
params['ci-process'] = 'QRcode'
params['cover'] = Cover
params['bar-type'] = BarType
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get object, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
data = xml_to_dict(rt.content)
return response, data
def ci_auditing_submit_common(self, Bucket, Key, DetectType, Type, Url=None, BizType=None, Conf={}, Input=None, UserInfo=None, DataId=None, RequestType=None, StorageConf=None, Encryption=None, **kwargs):
"""通用提交审核任务接口 https://cloud.tencent.com/document/product/460/46427
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param DetectType(int): 内容识别标志,位计算 1:porn, 2:terrorist, 4:politics, 8:ads, 16: Illegal, 32:Abuse
:param Type(string): 审核类型video:视频text文本audio音频docment文档。
:param Url(string): Url, 支持非cos上的文件
:param Conf(dic): 审核的个性化配置
:param Input(dic): Input的个性化配置dict类型可跟restful api对应查询
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param StorageConf(dict): 包含直播流转存的配置信息。
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的视频
response = client.ci_auditing_submit_common(
Bucket='bucket',
DetectType=CiDetectType.PORN | CiDetectType.POLITICS,
Key='test.mp4',
Type='video'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
if DetectType is not None:
detect_type = CiDetectType.get_detect_type_str(DetectType)
Conf['DetectType'] = detect_type
request = {
'Input': {},
'Conf': Conf
}
if BizType:
request['Conf']['BizType'] = BizType
if Key:
request['Input']['Object'] = Key
if Url:
request['Input']['Url'] = Url
if Input:
request['Input'] = Input
if UserInfo:
request['Input']['UserInfo'] = UserInfo
if DataId:
request['Input']['DataId'] = DataId
if Encryption:
request['Input']['Encryption'] = Encryption
if RequestType:
request['Type'] = RequestType
if StorageConf:
request['StorageConf'] = StorageConf
xml_request = format_xml(data=request, root='Request')
headers['Content-Type'] = 'application/xml'
path = Type + '/auditing'
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.debug("ci auditing {type} job submit, url=:{url} ,headers=:{headers}, params=:{params}, request=:{request}, ci_endpoint=:{ci_endpoint}".format(
type=Type,
url=url,
headers=headers,
params=params,
request=request,
ci_endpoint=self._conf._endpoint_ci))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_request,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci auditing rsp:%s", rt.content)
data = xml_to_dict(rt.content)
return data
def ci_auditing_query_common(self, Bucket, Type, JobID, **kwargs):
"""通用查询审核任务接口 https://cloud.tencent.com/document/product/460/46926
:param Bucket(string): 存储桶名称.
:param Type(string): 审核类型video:视频text文本audio音频docment文档。
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询视频审核返回的结果
response = client.ci_auditing_video_query(
Bucket='bucket',
JobID='v11122zxxxazzz',
Type='video'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = Type + '/auditing/' + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("query ci auditing {type} result, url=:{url} ,headers=:{headers}, params=:{params}".format(
type=Type,
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("query ci auditing:%s", rt.content)
data = xml_to_dict(rt.content)
return data
def ci_auditing_video_submit(self, Bucket, Key, DetectType=None, Url=None, Callback=None, CallbackVersion='Simple',
CallbackType=None, DetectContent=0, Mode='Interval', Count=100, TimeInterval=1.0,
BizType=None, DataId=None, UserInfo=None, Freeze=None, Encryption=None, **kwargs):
"""提交video审核任务接口 https://cloud.tencent.com/document/product/460/46427
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Url(string): 支持直接传非cos上url过来审核
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param CallbackVersion(string): 回调内容的结构有效值Simple回调内容包含基本信息、Detail回调内容包含详细信息。默认为 Simple。
:param CallbackType(int): 回调片段类型有效值1回调全部截帧和音频片段、2回调违规截帧和音频片段。默认为 1。
:param DetectContent(int): 用于指定是否审核视频声音当值为0时表示只审核视频画面截图值为1时表示同时审核视频画面截图和视频声音。默认值为0。
:param Mode(string): 截帧模式。Interval 表示间隔模式Average 表示平均模式Fps 表示固定帧率模式。
Interval 模式TimeIntervalCount 参数生效。当设置 Count未设置 TimeInterval 时,表示截取所有帧,共 Count 张图片。
Average 模式Count 参数生效。表示整个视频,按平均间隔截取共 Count 张图片。
Fps 模式TimeInterval 表示每秒截取多少帧Count 表示共截取多少帧。
:param Count(int): 视频截帧数量,范围为(0, 10000]。
:param TimeInterval(float): 视频截帧频率,范围为(0, 60],单位为秒,支持 float 格式,执行精度精确到毫秒。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param Freeze(dict): 自动冻结配置项,可配置指定审核分数的结果进行自动冻结。
PornScore(int): 取值为[0,100],表示当色情审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AdsScore(int): 取值为[0,100],表示当广告审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
:param Encryption(dict):
Algorithm(string): 当前支持`aes-256-ctr、aes-256-cfb、aes-256-ofb、aes-192-ctr、aes-192-cfb、aes-192-ofb、aes-128-ctr、aes-128-cfb、aes-128-ofb`,不区分大小写。以`aes-256-ctr`为例,`aes`代表加密算法,`256`代表密钥长度,`ctr`代表加密模式。
Key(string): 文件加密使用的密钥的值,需进行 Base64 编码。当KeyType值为1时需要将Key进行指定的加密后再做Base64 编码。Key的长度与使用的算法有关详见`Algorithm`介绍,如:使用`aes-256-ctr`算法时需要使用256位密钥即32个字节。
IV(string): 初始化向量,需进行 Base64 编码。AES算法要求IV长度为128位即16字节。
KeyId(string): 当KeyType值为1时该字段表示RSA加密密钥的版本号当前支持`1.0`。默认值为`1.0`。
KeyType(int): 指定加密算法的密钥参数Key的传输模式有效值0明文传输、1RSA密文传输使用OAEP填充模式默认值为0。
:param kwargs(dict): 设置请求的headers.
:return(dict): 任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的视频
response = client.ci_auditing_video_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN,
BizType='xxxxx',
Key='test.mp4'
)
print response
"""
conf = {
'Snapshot': {
'Mode': Mode,
'TimeInterval': TimeInterval,
'Count': Count,
},
'DetectContent': DetectContent
}
if Callback:
conf['Callback'] = Callback
if CallbackVersion:
conf['CallbackVersion'] = CallbackVersion
if CallbackType:
conf['CallbackType'] = CallbackType
if Freeze:
conf['Freeze'] = Freeze
return self.ci_auditing_submit_common(
Bucket=Bucket,
Key=Key,
Type='video',
BizType=BizType,
Conf=conf,
Url=Url,
DetectType=DetectType,
UserInfo=UserInfo,
DataId=DataId,
Encryption=Encryption,
**kwargs
)
def ci_auditing_video_query(self, Bucket, JobID, **kwargs):
"""查询video审核任务接口 https://cloud.tencent.com/document/product/460/46926
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询视频审核返回的结果
response = client.ci_auditing_video_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='video',
**kwargs
)
if 'JobsDetail' in data:
format_dict(data['JobsDetail'], ['Snapshot', 'AudioSection'])
if 'Snapshot' in data['JobsDetail']:
for snapshot in data['JobsDetail']['Snapshot']:
if 'PornInfo' in snapshot:
format_dict(snapshot['PornInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in snapshot['PornInfo']:
for ocrResult in snapshot['PornInfo']['OcrResults']:
format_dict(ocrResult, ['Keywords'])
if 'TerrorismInfo' in snapshot:
format_dict(snapshot['TerrorismInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in snapshot['TerrorismInfo']:
for ocrResult in snapshot['TerrorismInfo']['OcrResults']:
format_dict(ocrResult, ['Keywords'])
if 'PoliticsInfo' in snapshot:
format_dict(snapshot['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in snapshot['PoliticsInfo']:
for ocrResult in snapshot['PoliticsInfo']['OcrResults']:
format_dict(ocrResult, ['Keywords'])
if 'AdsInfo' in snapshot:
format_dict(snapshot['AdsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in snapshot['AdsInfo']:
for ocrResult in snapshot['AdsInfo']['OcrResults']:
format_dict(ocrResult, ['Keywords'])
if 'AudioSection' in data['JobsDetail']:
for audioSection in data['JobsDetail']['AudioSection']:
if 'PornInfo' in audioSection:
format_dict(audioSection['PornInfo'], ['Keywords'])
if 'TerrorismInfo' in audioSection:
format_dict(audioSection['TerrorismInfo'], ['Keywords'])
if 'PoliticsInfo' in audioSection:
format_dict(audioSection['PoliticsInfo'], ['Keywords'])
if 'AdsInfo' in audioSection:
format_dict(audioSection['AdsInfo'], ['Keywords'])
return data
def ci_auditing_audio_submit(self, Bucket, Key, DetectType=None, Url=None, Callback=None, CallbackVersion='Simple', BizType=None, UserInfo=None,
DataId=None, CallbackType=None, Freeze=None, **kwargs):
"""提交音频审核任务接口 https://cloud.tencent.com/document/product/460/53395
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Url(string): 支持直接传非cos上url过来审核
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param CallbackVersion(string): 回调内容的结构有效值Simple回调内容包含基本信息、Detail回调内容包含详细信息。默认为 Simple。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param CallbackType(int): 回调片段类型有效值1回调全部音频片段、2回调违规音频片段。默认为 1。
:param Freeze(dict): 可通过该字段设置根据审核结果给出的不同分值对音频文件进行自动冻结仅当input中审核的音频为object时有效。
PornScore(int): 取值为[0,100],表示当色情审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AdsScore(int): 取值为[0,100],表示当广告审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
:param kwargs(dict): 设置请求的headers.
:return(dict): 任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的音频
response = client.ci_auditing_audio_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN | CiDetectType.POLITICS,
Key='test.mp3'
)
print response
"""
conf = {
}
if Callback:
conf['Callback'] = Callback
if CallbackVersion:
conf['CallbackVersion'] = CallbackVersion
if CallbackType:
conf['CallbackType'] = CallbackType
if Freeze:
conf['Freeze'] = Freeze
return self.ci_auditing_submit_common(
Bucket=Bucket,
Key=Key,
Type='audio',
BizType=BizType,
Conf=conf,
Url=Url,
DetectType=DetectType,
UserInfo=UserInfo,
DataId=DataId,
**kwargs
)
def ci_auditing_audio_query(self, Bucket, JobID, **kwargs):
"""查询音频审核任务接口 https://cloud.tencent.com/document/product/460/53396
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询视频审核返回的结果
response = client.ci_auditing_audio_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='audio',
**kwargs
)
if 'JobsDetail' in data:
format_dict(data['JobsDetail'], ['Section'])
if 'Section' in data['JobsDetail']:
for section in data['JobsDetail']['Section']:
if 'PornInfo' in section:
format_dict(section['PornInfo'], ['Keywords'])
if 'TerrorismInfo' in section:
format_dict(section['TerrorismInfo'], ['Keywords'])
if 'PoliticsInfo' in section:
format_dict(section['PoliticsInfo'], ['Keywords'])
if 'AdsInfo' in section:
format_dict(section['AdsInfo'], ['Keywords'])
return data
def ci_auditing_text_submit(self, Bucket, Key=None, DetectType=None, Content=None,
Callback=None, BizType=None, Url=None, UserInfo=None, DataId=None, CallbackVersion=None, CallbackType=None, Freeze=None, **kwargs):
"""提交文本审核任务接口 https://cloud.tencent.com/document/product/460/56285
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Url(string): 支持直接传非cos上url过来审核
:param Content(string): 当传入的内容为纯文本信息原文长度不能超过10000个 utf8 编码字符。若超出长度限制,接口将会报错。
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param CallbackVersion(string): 回调内容的结构有效值Simple回调内容包含基本信息、Detail回调内容包含详细信息。默认为 Simple。
:param CallbackType(int): 回调片段类型有效值1回调全部文本片段、2回调违规文本片段。默认为 1。
:param Freeze(dict): 可通过该字段,设置根据审核结果给出的不同分值,对文本文件进行自动冻结,仅当 input 中审核的文本为 object 时有效。
PornScore(int): 取值为[0,100],表示当色情审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AdsScore(int): 取值为[0,100],表示当广告审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
IllegalScore(int): 取值为[0,100],表示当违法审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AbuseScore(int): 取值为[0,100],表示当谩骂审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
:param kwargs(dict): 设置请求的headers.
:return(dict): 任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的文本
response = client.ci_auditing_text_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN,
BizType='xxxx',
Key='test.txt'
)
print response
"""
Input = {}
if Key:
Input['Object'] = Key
if Url:
Input['Url'] = Url
if Content:
Input['Content'] = base64.b64encode(Content).decode('UTF-8')
conf = {
}
if Callback:
conf['Callback'] = Callback
if CallbackVersion:
conf['CallbackVersion'] = CallbackVersion
if CallbackType:
conf['CallbackType'] = CallbackType
if Freeze:
conf['Freeze'] = Freeze
data = self.ci_auditing_submit_common(
Bucket=Bucket,
Key=Key,
Type='text',
BizType=BizType,
Conf=conf,
DetectType=DetectType,
Input=Input,
UserInfo=UserInfo,
DataId=DataId,
**kwargs
)
if 'JobsDetail' in data:
format_dict(data['JobsDetail'], ['Section'])
return data
def ci_auditing_text_query(self, Bucket, JobID, **kwargs):
"""查询文本审核任务接口 https://cloud.tencent.com/document/product/460/56284
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文本审核返回的结果
response = client.ci_auditing_text_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='text',
**kwargs
)
if 'JobsDetail' in data:
format_dict(data['JobsDetail'], ['Section'])
return data
def ci_auditing_document_submit(self, Bucket, Url=None, DetectType=None, Key=None, Type=None,
Callback=None, BizType=None, UserInfo=None, DataId=None, CallbackType=None, Freeze=None, **kwargs):
"""提交文档审核任务接口 https://cloud.tencent.com/document/product/460/59380
:param Bucket(string): 存储桶名称.
:param Url(string): 文档文件的链接地址,例如 http://www.example.com/doctest.doc
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param Key(string): 存储在 COS 存储桶中的文件名称,例如在目录 test 中的文件test.doc则文件名称为 test/test. Key 和 Url 只能选择其中一种。
:param Type(string): 指定文档文件的类型,如未指定则默认以文件的后缀为类型。
如果文件没有后缀该字段必须指定否则会审核失败。例如doc、docx、ppt、pptx 等
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param CallbackType(int): 回调片段类型有效值1回调全部音频片段、2回调违规音频片段。默认为1。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param Freeze(dict): 可通过该字段,设置根据审核结果给出的不同分值,对文档进行自动冻结。仅当 input 中审核的文档为 object 时有效。
PornScore(int): 取值为[0,100],表示当色情审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AdsScore(int): 取值为[0,100],表示当广告审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
:param kwargs(dict): 设置请求的headers.
:return(dict):任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的文本
response = client.ci_auditing_document_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN,
Url='http://www.example.com/doctest.doc'
)
print response
"""
Input = {}
if Url is not None:
Input['Url'] = Url
if Key is not None:
Input['Object'] = Key
if Type:
Input['Type'] = Type
conf = {
}
if Callback:
conf['Callback'] = Callback
if CallbackType:
conf['CallbackType'] = CallbackType
if Freeze:
conf['Freeze'] = Freeze
return self.ci_auditing_submit_common(
Bucket=Bucket,
Key='',
Type='document',
BizType=BizType,
Conf=conf,
DetectType=DetectType,
Input=Input,
UserInfo=UserInfo,
DataId=DataId,
**kwargs
)
def ci_auditing_document_query(self, Bucket, JobID, **kwargs):
"""查询文档审核任务接口 https://cloud.tencent.com/document/product/460/59383
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文本审核返回的结果
response = client.ci_auditing_document_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='document',
**kwargs
)
if 'JobsDetail' in data and 'PageSegment' in data['JobsDetail'] and 'Results' in data['JobsDetail']['PageSegment']:
format_dict(data['JobsDetail']['PageSegment'], ['Results'])
for resultsItem in data['JobsDetail']['PageSegment']['Results']:
if 'PornInfo' in resultsItem:
format_dict(resultsItem['PornInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in resultsItem['PornInfo']:
format_dict_or_list(resultsItem['PornInfo']['OcrResults'], ['Keywords'])
if 'TerrorismInfo' in resultsItem:
format_dict(resultsItem['TerrorismInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in resultsItem['TerrorismInfo']:
format_dict_or_list(resultsItem['TerrorismInfo']['OcrResults'], ['Keywords'])
if 'PoliticsInfo' in resultsItem:
format_dict(resultsItem['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in resultsItem['PoliticsInfo']:
format_dict_or_list(resultsItem['PoliticsInfo']['OcrResults'], ['Keywords'])
if 'AdsInfo' in resultsItem:
format_dict(resultsItem['AdsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in resultsItem['AdsInfo']:
format_dict_or_list(resultsItem['AdsInfo']['OcrResults'], ['Keywords'])
return data
def ci_auditing_html_submit(self, Bucket, Url, DetectType=None, ReturnHighlightHtml=False, Callback=None, BizType=None, UserInfo=None, DataId=None, **kwargs):
"""提交网页审核任务接口 https://cloud.tencent.com/document/product/436/63958
:param Bucket(string): 存储桶名称.
:param Url(string): 文档文件的链接地址,例如 http://www.example.com/doctest.doc
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param ReturnHighlightHtml(bool): 指定是否需要高亮展示网页内的违规文本,查询及回调结果时会根据此参数决定是否返回高亮展示的
html 内容。取值为 true 或者 false默认为 false。
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param kwargs(dict): 设置请求的headers.
:return(dict):任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别网页
response = client.ci_auditing_html_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN,
Url='http://www.example.com/index.html'
)
print response
"""
Input = {}
if Url is not None:
Input['Url'] = Url
conf = {
}
if Callback:
conf['Callback'] = Callback
if ReturnHighlightHtml:
conf['ReturnHighlightHtml'] = ReturnHighlightHtml
return self.ci_auditing_submit_common(
Bucket=Bucket,
Key='',
Type='webpage',
BizType=BizType,
Conf=conf,
DetectType=DetectType,
Input=Input,
UserInfo=UserInfo,
DataId=DataId,
**kwargs
)
def ci_auditing_html_query(self, Bucket, JobID, **kwargs):
"""查询网页审核任务接口 https://cloud.tencent.com/document/product/436/63959
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询网页审核返回的结果
response = client.ci_auditing_html_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='webpage',
**kwargs
)
if 'JobsDetail' in data and 'ImageResults' in data['JobsDetail'] and 'Results' in data['JobsDetail']['ImageResults']:
format_dict(data['JobsDetail']['ImageResults'], ['Results'])
for resultsItem in data['JobsDetail']['ImageResults']['Results']:
if 'PornInfo' in resultsItem:
format_dict(resultsItem['PornInfo'], ['OcrResults'])
if 'OcrResults' in resultsItem['PornInfo']:
format_dict_or_list(resultsItem['PornInfo']['OcrResults'], ['Keywords'])
if 'TerrorismInfo' in resultsItem:
format_dict(resultsItem['TerrorismInfo'], ['OcrResults'])
if 'OcrResults' in resultsItem['TerrorismInfo']:
format_dict_or_list(resultsItem['TerrorismInfo']['OcrResults'], ['Keywords'])
if 'PoliticsInfo' in resultsItem:
format_dict(resultsItem['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in resultsItem['PoliticsInfo']:
format_dict_or_list(resultsItem['PoliticsInfo']['OcrResults'], ['Keywords'])
if 'AdsInfo' in resultsItem:
format_dict(resultsItem['AdsInfo'], ['OcrResults'])
if 'OcrResults' in resultsItem['AdsInfo']:
format_dict_or_list(resultsItem['AdsInfo']['OcrResults'], ['Keywords'])
if 'JobsDetail' in data and 'TextResults' in data['JobsDetail'] and 'Results' in data['JobsDetail']['TextResults']:
format_dict(data['JobsDetail']['TextResults'], ['Results'])
return data
def ci_auditing_image_batch(self, Bucket, Input, DetectType=None, BizType=None, Async=0, Callback=None, Freeze=None, **kwargs):
"""图片同步批量审核接口 https://cloud.tencent.com/document/product/436/63593
:param Bucket(string): 存储桶名称.
:param Input(dict array): 需要审核的图片信息,每个array元素为dict类型支持的参数如下:
Object: 存储在 COS 存储桶中的图片文件名称,例如在目录 test 中的文件 image.jpg则文件名称为 test/image.jpg。
传入多个时仅一个生效,按 ContentObject Url 顺序。
Url: 图片文件的链接地址,例如 http://a-1250000.cos.ap-shanghai.tencentcos.cn/image.jpg。
传入多个时仅一个生效,按 ContentObject Url 顺序。
Content: 图片文件的内容,需要先经过 base64 编码。ContentObject 和 Url 只能选择其中一种,传入多个时仅一个生效,按 ContentObject Url 顺序。
Interval: 截帧频率GIF 图检测专用默认值为5表示从第一帧包含开始每隔5帧截取一帧
MaxFrames: 最大截帧数量GIF 图检测专用默认值为5表示只截取 GIF 的5帧图片进行审核必须大于0
DataId: 图片标识该字段在结果中返回原始内容长度限制为512字节
LargeImageDetect: 对于超过大小限制的图片是否进行压缩后再审核,取值为: 0不压缩1压缩。默认为0。
压缩最大支持32M的图片且会收取压缩费用。
DataId: 图片标识该字段在结果中返回原始内容长度限制为512字节
UserInfo: 用户业务字段。
Encryption(dict): 文件加密信息。如果图片未做加密则不需要使用该字段,如果设置了该字段,则会按设置的信息解密后再做审核。
Algorithm(string): 当前支持`aes-256-ctr、aes-256-cfb、aes-256-ofb、aes-192-ctr、aes-192-cfb、aes-192-ofb、aes-128-ctr、aes-128-cfb、aes-128-ofb`,不区分大小写。以`aes-256-ctr`为例,`aes`代表加密算法,`256`代表密钥长度,`ctr`代表加密模式。
Key(string): 文件加密使用的密钥的值,需进行 Base64 编码。当KeyType值为1时需要将Key进行指定的加密后再做Base64 编码。Key的长度与使用的算法有关详见`Algorithm`介绍,如:使用`aes-256-ctr`算法时需要使用256位密钥即32个字节。
IV(string): 初始化向量,需进行 Base64 编码。AES算法要求IV长度为128位即16字节。
KeyId(string): 当KeyType值为1时该字段表示RSA加密密钥的版本号当前支持`1.0`。默认值为`1.0`。
KeyType(int): 指定加密算法的密钥参数Key的传输模式有效值0明文传输、1RSA密文传输使用OAEP填充模式默认值为0。
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param Async(string): 是否异步进行审核0同步返回结果1异步进行审核。默认值为 0。
:param Callback(string): 审核结果Detail版本以回调形式发送至您的回调地址异步审核时生效支持以 http:// 或者 https:// 开头的地址例如http://www.callback.com。
:param Freeze(dict): 可通过该字段,设置根据审核结果给出的不同分值,对图片进行自动冻结,仅当 input 中审核的图片为 object 时有效。
PornScore: 取值为[0,100],表示当色情审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
AdsScore: 取值为[0,100],表示当广告审核结果大于或等于该分数时,自动进行冻结操作。不填写则表示不自动冻结,默认值为空。
:param kwargs(dict): 设置请求的headers.
:return(dict):任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别网页
response = client.ci_auditing_image_batch(
Bucket='bucket',
DetectType=CiDetectType.PORN,
Input=[{
Url='http://www.example.com/test.jpg',
}]
)
print response
"""
conf = {
}
if BizType:
conf['BizType'] = BizType
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
if DetectType is not None:
detect_type = CiDetectType.get_detect_type_str(DetectType)
conf['DetectType'] = detect_type
if Async == 0:
conf['Async'] = Async
if Callback is not None:
conf["Callback"] = Callback
if Freeze is not None:
conf["Freeze"] = Freeze
request = {
'Input': Input,
'Conf': conf
}
xml_request = format_xml(data=request, root='Request')
headers['Content-Type'] = 'application/xml'
path = 'image/auditing'
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci auditing {type} job submit, url=:{url} ,headers=:{headers}, params=:{params}, ci_endpoint=:{ci_endpoint}, xml_request=:{data}".format(
type='image',
url=url,
headers=headers,
params=params,
ci_endpoint=self._conf._endpoint_ci,
data=xml_request))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_request,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci auditing rsp:%s", rt.content)
data = xml_to_dict(rt.content)
if 'JobsDetail' in data:
format_dict(data, ['JobsDetail'])
for jobsDetail in data['JobsDetail']:
if 'PornInfo' in jobsDetail:
format_dict(jobsDetail['PornInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['PornInfo']:
format_dict_or_list(jobsDetail['PornInfo']['OcrResults'], ['Keywords'])
if 'TerrorismInfo' in jobsDetail:
format_dict(jobsDetail['TerrorismInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['TerrorismInfo']:
format_dict_or_list(jobsDetail['TerrorismInfo']['OcrResults'], ['Keywords'])
if 'PoliticsInfo' in jobsDetail:
format_dict(jobsDetail['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in jobsDetail['PoliticsInfo']:
format_dict_or_list(jobsDetail['PoliticsInfo']['OcrResults'], ['Keywords'])
if 'AdsInfo' in jobsDetail:
format_dict(jobsDetail['AdsInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['AdsInfo']:
format_dict_or_list(jobsDetail['AdsInfo']['OcrResults'], ['Keywords'])
return data
def ci_auditing_image_query(self, Bucket, JobID, **kwargs):
"""查询图片审核任务接口
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文本审核返回的结果
response = client.ci_auditing_image_query(
Bucket='bucket',
JobID='v11122zxxxazzz'
)
print response
"""
data = self.ci_auditing_query_common(
Bucket=Bucket,
JobID=JobID,
Type='image',
**kwargs
)
if 'JobsDetail' in data:
jobsDetail = data['JobsDetail']
if 'PornInfo' in jobsDetail:
format_dict(jobsDetail['PornInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['PornInfo']:
format_dict_or_list(jobsDetail['PornInfo']['OcrResults'], ['Keywords'])
if 'TerrorismInfo' in jobsDetail:
format_dict(jobsDetail['TerrorismInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['TerrorismInfo']:
format_dict_or_list(jobsDetail['TerrorismInfo']['OcrResults'], ['Keywords'])
if 'PoliticsInfo' in jobsDetail:
format_dict(jobsDetail['PoliticsInfo'], ['OcrResults', 'ObjectResults'])
if 'OcrResults' in jobsDetail['PoliticsInfo']:
format_dict_or_list(jobsDetail['PoliticsInfo']['OcrResults'], ['Keywords'])
if 'AdsInfo' in jobsDetail:
format_dict(jobsDetail['AdsInfo'], ['OcrResults'])
if 'OcrResults' in jobsDetail['AdsInfo']:
format_dict_or_list(jobsDetail['AdsInfo']['OcrResults'], ['Keywords'])
return data
def ci_auditing_live_video_submit(self, Bucket, BizType, DetectType=None, Url=None, DataId=None, Callback=None, CallbackType=None,
UserInfo=None, StorageConf=None, **kwargs):
"""提交直播流审核任务接口 https://cloud.tencent.com/document/product/460/46427
:param Bucket(string): 存储桶名称.
:param Url(string): 支持直接传非cos上url过来审核
:param DetectType(int): 内容识别标志,位计算 1:porn, 8:ads
:param DataId(string): 该字段在审核结果中会返回原始内容长度限制为512字节。您可以使用该字段对待审核的数据进行唯一业务标识。
:param Callback(string): 回调地址以http://或者https://开头的地址。
:param CallbackType(int): 回调片段类型有效值1回调全部截帧和音频片段、2回调违规截帧和音频片段。默认为 1。
:param BizType(string): 审核策略的唯一标识由后台自动生成在控制台中对应为Biztype值.
:param UserInfo(dict): 用户业务字段.
:param StorageConf(dict): 包含直播流转存的配置信息。
Path(string): 表示直播流所要转存的路径,直播流的 ts 文件和 m3u8 文件将保存在本桶该目录下。
m3u8 文件保存文件名为 Path/{$JobId}.m3u8ts 文件的保存文件名为
Path/{$JobId}-{$Realtime}.ts其中 Realtime 为17位年月日时分秒毫秒时间。
:param kwargs(dict): 设置请求的headers.
:return(dict): 任务提交成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的视频
response = client.ci_auditing_live_video_submit(
Bucket='bucket',
DetectType=CiDetectType.PORN,
BizType='xxxxx',
Url='test.mp4'
)
print response
"""
conf = {
}
if Callback:
conf['Callback'] = Callback
if CallbackType:
conf['CallbackType'] = CallbackType
return self.ci_auditing_submit_common(
Bucket=Bucket,
Type='video',
Key=None,
BizType=BizType,
Conf=conf,
Url=Url,
DetectType=DetectType,
RequestType='live_video',
DataId=DataId,
UserInfo=UserInfo,
StorageConf=StorageConf,
**kwargs
)
def ci_auditing_live_video_cancle(self, Bucket, JobID, **kwargs):
"""取消直播流审核任务接口 https://cloud.tencent.com/document/product/460/46926
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 取消直播流
response = client.ci_auditing_live_video_cancle(
Bucket='bucket',
JobID='v11122zxxxazzz',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = '/video/cancel_auditing/' + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("live video canlce result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("live video canlce:%s", rt.content)
data = xml_to_dict(rt.content)
return data
def ci_auditing_virus_submit(self, Bucket, Key=None, Url=None, Callback=None, **kwargs):
"""提交病毒审核任务接口 https://cloud.tencent.com/document/product/460/63964
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Url(string): Url, 支持非cos上的文件
:param Callback(string): 检测结果回调通知到您设置的地址,支持以 http:// 或者 https:// 开头的地址例如http://www.callback.com。
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的视频
response = client.ci_auditing_virus_submit(
Bucket='bucket',
Key='test.mp4',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
Conf = {
'DetectType': 'Virus',
}
if Callback:
Conf['Callback'] = Callback
request = {
'Input': {},
'Conf': Conf
}
if Key:
request['Input']['Object'] = Key
if Url:
request['Input']['Url'] = Url
xml_request = format_xml(data=request, root='Request')
headers['Content-Type'] = 'application/xml'
path = '/virus/detect'
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci auditing Virus submit, url=:{url} ,headers=:{headers}, params=:{params}, ci_endpoint=:{ci_endpoint}".format(
url=url,
headers=headers,
params=params,
ci_endpoint=self._conf._endpoint_ci))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_request,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci auditing rsp:%s", rt.content)
data = xml_to_dict(rt.content)
return data
def ci_auditing_virus_query(self, Bucket, JobID, **kwargs):
"""查询病毒审核任务接口 https://cloud.tencent.com/document/product/460/63965
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询视频审核返回的结果
response = client.ci_auditing_video_query(
Bucket='bucket',
JobID='v11122zxxxazzz',
Type='video'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = '/virus/detect/' + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("query ci auditing virus result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("query ci auditing:%s", rt.content)
data = xml_to_dict(rt.content)
# 格式化array的输出
if 'JobsDetail' in data and 'DetectDetail' in data['JobsDetail']:
format_dict(data['JobsDetail'], ['DetectDetail'])
for detectItem in data['JobsDetail']['DetectDetail']:
if 'Result' in detectItem:
format_dict(detectItem, ['Result'])
return data
def ci_auditing_report_badcase(self, Bucket, ContentType, Label, SuggestedLabel, Text=None, Url=None, JobId=None, ModerationTime=None, **kwargs):
"""审核结果反馈
:param Bucket(string): 存储桶名称.
:param ContentType(int): 需要反馈的数据类型取值为1-文本2-图片。
:param Label(string): 审核给出的有问题的结果标签。
:param SuggestedLabel(string): 期望的正确处置标签正常则填Normal。
:param Text(dic): 文本的Badcase需要填写base64的文本内容ContentType为1时必填。
:param Url(dic): 图片的Badcase需要填写图片的url链接ContentType为2时必填。
:param JobId(string): 该Case对应的审核任务ID有助于定位审核记录。
:param ModerationTime(dict): 该Case的审核时间有助于定位审核记录。格式为 2021-08-07T12:12:12+08:00
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 识别cos上的视频
response = client.ci_auditing_report_badcase(
Bucket='bucket',
ContentType=1,
Label='test.mp4',
SuggestedLabel='Normal'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
request = {
'ContentType': ContentType,
'Label': Label,
'SuggestedLabel': SuggestedLabel
}
if Text:
request['Text'] = Text
if Url:
request['Url'] = Url
if JobId:
request['JobId'] = JobId
if ModerationTime:
request['ModerationTime'] = ModerationTime
xml_request = format_xml(data=request, root='Request')
headers['Content-Type'] = 'application/xml'
path = '/report/badcase'
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.debug("ci_auditing_report_badcase, url=:{url} ,headers=:{headers}, params=:{params}, request=:{request}, ci_endpoint=:{ci_endpoint}".format(
url=url,
headers=headers,
params=params,
request=request,
ci_endpoint=self._conf._endpoint_ci))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_request,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci auditing rsp:%s", rt.content)
data = xml_to_dict(rt.content)
return data
def ci_get_media_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber='', PageSize='', **kwargs):
"""查询媒体处理开通状态接口 https://cloud.tencent.com/document/product/436/48988
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_media_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
return self.ci_get_bucket(Regions=Regions, BucketName=BucketName,
BucketNames=BucketNames, PageNumber=PageNumber,
PageSize=PageSize, **kwargs)
def ci_get_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber='', PageSize='', Path = '/mediabucket', **kwargs):
"""查询服务开通状态接口
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['regions'] = Regions
params['bucketNames'] = BucketNames
params['bucketName'] = BucketName
params['pageNumber'] = PageNumber
params['pageSize'] = PageSize
params = format_values(params)
path = Path
url = self._conf.uri(bucket=None, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=None,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
if path == '/picbucket':
format_dict(data, ['PicBucketList'])
else:
format_dict(data, ['MediaBucketList'])
return data
def ci_get_media_queue(self, Bucket, State='All', QueueIds='', PageNumber='', PageSize='', UrlPath='/queue', **kwargs):
"""查询媒体处理队列接口 https://cloud.tencent.com/document/product/436/54045
:param Bucket(string): 存储桶名称.
:param QueueIds(string): 队列 ID以“,”符号分割字符串.
:param State(string): 队列状态
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param UrlPath(string): 请求URL路径无需主动设置
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_media_queue(
Bucket='bucket'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['queueIds'] = QueueIds
params['state'] = State
params['pageNumber'] = PageNumber
params['pageSize'] = PageSize
params = format_values(params)
path = UrlPath
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_media_queue result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['QueueList'])
return data
def ci_update_media_queue(self, Bucket, QueueId, Request={}, UrlPath="/queue/", **kwargs):
""" 更新媒体处理队列接口 https://cloud.tencent.com/document/product/436/54046
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Request(dict): 更新队列配置请求体.
:param UrlPath(string): 请求URL路径无需主动设置
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_update_media_queue(
Bucket='bucket',
QueueId='',
Request={},
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=Request, root='Request')
path = UrlPath + QueueId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("update_media_queue result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['Queue'])
return data
def ci_open_pic_bucket(self, Bucket, **kwargs):
""" 开通图片处理异步服务 https://cloud.tencent.com/document/product/460/95749
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果, dict类型.
. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 开通图片处理异步服务
response, data = client.ci_open_pic_bucket(
Bucket='bucket')
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "picbucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_open_pic_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='POST',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_get_pic_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber='', PageSize='', **kwargs):
"""查询图片异步处理开通状态接口
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_pic_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
return self.ci_get_bucket(Regions=Regions, BucketName=BucketName,
BucketNames=BucketNames, PageNumber=PageNumber,
PageSize=PageSize, Path='/picbucket', **kwargs)
def ci_close_pic_bucket(self, Bucket, **kwargs):
""" 关闭图片处理异步服务 https://cloud.tencent.com/document/product/460/95751
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果, dict类型.
. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 关闭图片处理异步服务
response, data = client.ci_close_pic_bucket(
Bucket='bucket')
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "picbucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_close_pic_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_update_media_pic_queue(self, Bucket, QueueId, Request={}, **kwargs):
""" 更新图片处理队列接口
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Request(dict): 更新队列配置请求体.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_update_media_pic_queue(
Bucket='bucket',
QueueId='',
Request={},
)
print response
"""
return self.ci_update_media_queue(Bucket=Bucket, QueueId=QueueId,
Request=Request, UrlPath="/picqueue/", **kwargs)
def ci_get_media_pic_queue(self, Bucket, State='All', QueueIds='', PageNumber='', PageSize='', **kwargs):
"""查询图片处理队列接口
:param Bucket(string): 存储桶名称.
:param QueueIds(string): 队列 ID以“,”符号分割字符串.
:param State(string): 队列状态
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_media_pic_queue(
Bucket='bucket'
)
print response
"""
return self.ci_get_media_queue(Bucket=Bucket, State=State, QueueIds=QueueIds,
PageNumber=PageNumber, PageSize=PageSize,
UrlPath="/picqueue", **kwargs)
def ci_create_media_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):
""" 创建任务接口 https://cloud.tencent.com/document/product/436/54013
:param Bucket(string): 存储桶名称.
:param Jobs(dict): 创建任务的配置.
:param Lst(dict): 创建任务dict转xml时去除Key数组. TODO 替换成 xmltodict 库后可以将 Lst 参数去掉
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_create_media_jobs(
Bucket='bucket'
Jobs={},
Lst={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=Jobs, root='Request')
path = "/jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_media_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_create_media_pic_jobs(self, Bucket, Jobs={}, Lst={}, **kwargs):
""" 创建图片处理任务接口 https://cloud.tencent.com/document/product/436/67194
:param Bucket(string): 存储桶名称.
:param Jobs(dict): 创建任务的配置.
:param Lst(dict): 创建任务dict转xml时去除Key数组. TODO 替换为 xmltodict 库后可以将 Lst 参数去掉
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_create_media_pic_jobs(
Bucket='bucket'
Jobs={},
Lst={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=Jobs, root='Request')
path = "/pic_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_media_pic_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_get_media_jobs(self, Bucket, JobIDs, **kwargs):
""" 查询任务接口 https://cloud.tencent.com/document/product/436/54010
:param Bucket(string): 存储桶名称.
:param JobIDs(string): 任务ID以,分割多个任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_media_jobs(
Bucket='bucket'
JobIDs={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/jobs/" + JobIDs
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_media_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_media_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_get_media_pic_jobs(self, Bucket, JobIDs, **kwargs):
""" 查询图片处理任务接口 https://cloud.tencent.com/document/product/436/67197
:param Bucket(string): 存储桶名称.
:param JobIDs(string): 任务ID以,分割多个任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_media_pic_jobs(
Bucket='bucket'
JobIDs={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/pic_jobs/" + JobIDs
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_media_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_media_pic_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_list_media_pic_jobs(self, Bucket, Tag, QueueId=None, StartCreationTime=None, EndCreationTime=None, OrderByTime='Desc', States='All', Size=10, NextToken='', **kwargs):
""" 查询图片处理任务列表接口 https://cloud.tencent.com/document/product/436/67198
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Tag(string): 任务类型.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.
:param States(string): 任务状态.
:param Size(string): 任务个数.
:param NextToken(string): 请求的上下文,用于翻页.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_media_pic_jobs(
Bucket='bucket'
QueueId='',
Tag='PicProcess'
)
print response
"""
return self.ci_list_media_jobs(Bucket=Bucket, QueueId=QueueId, Tag=Tag,
StartCreationTime=StartCreationTime,
EndCreationTime=EndCreationTime,
OrderByTime=OrderByTime, States=States,
Size=Size, NextToken=NextToken, Path='/pic_jobs', **kwargs)
def ci_list_media_jobs(self, Bucket, Tag, QueueId=None, StartCreationTime=None, EndCreationTime=None, OrderByTime='Desc', States='All', Size=10, NextToken='', Path='/jobs', **kwargs):
""" 查询任务接口 https://cloud.tencent.com/document/product/436/54011
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Tag(string): 任务类型.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.
:param States(string): 任务状态.
:param Size(string): 任务个数.
:param NextToken(string): 请求的上下文,用于翻页.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_media_jobs(
Bucket='bucket'
QueueId='',
Tag='Transcode'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['tag'] = Tag
params['orderByTime'] = OrderByTime
params['states'] = States
params['size'] = str(Size)
params['nextToken'] = NextToken
if QueueId is not None:
params['queueId'] = QueueId
if StartCreationTime is not None:
params['startCreationTime'] = StartCreationTime
if EndCreationTime is not None:
params['endCreationTime'] = EndCreationTime
params = format_values(params)
path = Path
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("list_media_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("list_media_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_create_workflow(self, Bucket, Body, **kwargs):
""" 创建工作流接口 https://cloud.tencent.com/document/product/460/76856
:param Bucket(string): 存储桶名称.
:param Body(dict): 创建工作流的配置信息.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建工作流接口
response = client.ci_create_workflow(
Bucket='bucket'
Body={},
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=Body, root='Request')
path = "/workflow"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_create_workflow result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_update_workflow_state(self, Bucket, WorkflowId, UpdateState, **kwargs):
""" 更新工作流接口 https://cloud.tencent.com/document/product/460/76861
:param Bucket(string): 存储桶名称.
:param WorkflowId(string): 需要更新状态的工作流ID.
:param UpdateState(string): 更新工作流的状态,有效值为active、paused
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新工作流状态接口
response = client.ci_update_workflow_state(
Bucket='bucket'
WorkflowId='',
UpdateState='active'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params[UpdateState] = ''
params = format_values(params)
path = "/workflow/" + WorkflowId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_update_workflow_state result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
return data
def ci_update_workflow(self, Bucket, WorkflowId, Body, **kwargs):
""" 更新工作流接口 https://cloud.tencent.com/document/product/460/76861
:param Bucket(string): 存储桶名称.
:param WorkflowId(string): 需要更新状态的工作流ID.
:param Body(dict): 更新工作流的配置信息.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_update_workflow(
Bucket='bucket'
Body={},
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=Body, root='Request')
path = "/workflow/" + WorkflowId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_update_workflow result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_get_workflow(self, Bucket, Ids='', Name='', PageNumber='', PageSize='', **kwargs):
""" 获取工作流详情接口 https://cloud.tencent.com/document/product/460/76857
:param Bucket(string): 存储桶名称.
:param Ids(string): 需要查询的工作流 ID可传入多个以,符号分割字符串.
:param Name(string): 需要查询的工作流名称.
:param PageNumber(string): 第几页.
:param PageSize(string): 每页个数.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_workflow(
Bucket='bucket'
Body={},
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['ids'] = Ids
params['name'] = Name
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/workflow"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_workflow result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['MediaWorkflowList'])
return data
def ci_delete_workflow(self, Bucket, WorkflowId, **kwargs):
""" 删除工作流接口 https://cloud.tencent.com/document/product/460/76860
:param Bucket(string): 存储桶名称.
:param WorkflowId(string): 需要删除的工作流ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除指定工作流
response = client.ci_delete_workflow(
Bucket=bucket_name,
WorkflowId='w1bdxxxxxxxxxxxxxxxxx94a9',
)
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/workflow/" + WorkflowId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_delete_workflow result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_trigger_workflow(self, Bucket, WorkflowId, Key, **kwargs):
""" 触发工作流接口 https://cloud.tencent.com/document/product/436/54641
:param Bucket(string): 存储桶名称.
:param WorkflowId(string):工作流ID.
:param Key(string): 对象key.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 触发工作流接口
response = client.ci_trigger_workflow(
Bucket='bucket'
WorkflowId='',
Key='a.mp4'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['workflowId'] = WorkflowId
params['object'] = Key
params = format_values(params)
path = "/triggerworkflow"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_trigger_workflow result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_trigger_workflow result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
return data
def ci_get_workflowexecution(self, Bucket, RunId, **kwargs):
""" 获取工作流实例详情 https://cloud.tencent.com/document/product/436/53992
:param Bucket(string): 存储桶名称.
:param RunId(string): 工作流实例ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取工作流实例详情
response = client.ci_get_workflowexecution(
Bucket='bucket'
RunId=''
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/workflowexecution/" + RunId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_workflowexecution result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_workflowexecution result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['WorkflowExecution'])
return data
def ci_list_workflowexecution(self, Bucket, WorkflowId, Name='', StartCreationTime=None, EndCreationTime=None, OrderByTime='Desc', States='All', Size=10, NextToken='', BatchJobId=None, **kwargs):
""" 获取工作流实例列表 https://cloud.tencent.com/document/product/436/80048
:param Bucket(string): 存储桶名称.
:param WorkflowId(string): 工作流实例ID.
:param Name(string): 触发对象.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.
:param States(string): 任务状态.
:param Size(string): 任务个数.
:param NextToken(string): 请求的上下文,用于翻页.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_list_workflowexecution(
Bucket='bucket'
WorkflowId='',
Name='a.mp4'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['workflowId'] = WorkflowId
params['name'] = Name
params['orderByTime'] = OrderByTime
params['states'] = States
params['size'] = str(Size)
params['nextToken'] = NextToken
if StartCreationTime is not None:
params['startCreationTime'] = StartCreationTime
if EndCreationTime is not None:
params['endCreationTime'] = EndCreationTime
if BatchJobId is not None:
params['jobId'] = BatchJobId
params = format_values(params)
path = "/workflowexecution"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_list_workflowexecution result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_list_workflowexecution result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['WorkflowExecution'])
return data
def get_media_info(self, Bucket, Key, **kwargs):
"""用于查询媒体文件的信息 https://cloud.tencent.com/document/product/436/55672
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 用于查询COS上媒体文件的信息
response = client.get_media_info(
Bucket='bucket',
Key='test.mp4'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'videoinfo'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get_media_info, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
data = xml_to_dict(rt.content)
format_dict(data, ['MediaInfo'])
return data
def get_snapshot(self, Bucket, Key, Time, Width=None, Height=None, Format='jpg', Rotate='auto', Mode='exactframe', **kwargs):
"""获取媒体文件某个时间的截图 https://cloud.tencent.com/document/product/436/55671
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Time(string): 截图时间点.
:param Width(string): 截图宽.
:param Height(string): 截图高.
:param Format(string): jpg, png.
:param Rotate(string): auto 自动根据媒体信息旋转, off 不旋转.
:param Mode(string): 截帧方式 keyframe截取指定时间点之前的最近的一个关键帧 exactframe截取指定时间点的帧.
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 用于获取COS文件某个时间的截图
response = client.get_snapshot(
Bucket='bucket',
Key='test.mp4',
Time='1.5',
Witdh='480',
Format='jpg',
Rotate='auto',
Mode='exactframe'
)
response['Body'].get_stream_to_file('snapshot.jpg')
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'snapshot'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['time'] = Time
if Width is not None:
params['width'] = Width
if Height is not None:
params['height'] = Height
params['format'] = Format
params['rotate'] = Rotate
params['mode'] = Mode
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get_snapshot, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def get_pm3u8(self, Bucket, Key, Expires, **kwargs):
"""获取私有 M3U8 ts 资源的下载授权 https://cloud.tencent.com/document/product/436/63740
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Expires(string): 私有 ts 资源 url 下载凭证的相对有效期.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 用于获取COS文件某个时间的截图
response = client.get_snapshot(
Bucket='bucket',
Key='test.mp4',
Expires='3600',
)
response['Body'].get_stream_to_file('pm3u8.m3u8')
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'pm3u8'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['expires'] = Expires
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("get_pm3u8, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def ci_get_media_aigc_metadata(self, Bucket, Key, **kwargs):
"""ci_get_media_aigc_metadata查询音视频中保存的AIGC元数据标识信息接口
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): response header.
:return(dict): AIGC元数据标识信息结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response, data = client.ci_get_media_aigc_metadata(
Bucket='bucket',
ObjectKey='',
)
print data
print response
"""
path = "/" + Key
return self.ci_process(Bucket, path, "MediaAIGCMetadata", NeedHeader=True, **kwargs)
def ci_get_doc_queue(self, Bucket, State='All', QueueIds='', PageNumber=1, PageSize=10, **kwargs):
"""查询文档转码处理队列接口 https://cloud.tencent.com/document/product/460/46946
:param Bucket(string): 存储桶名称.
:param QueueIds(string): 队列 ID以“,”符号分割字符串.
:param State(string): 队列状态
:param PageNumber(int): 第几页
:param PageSize(int): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文档转码处理队列接口
response = client.ci_get_doc_queue(
Bucket='bucket'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['queueIds'] = QueueIds
params['state'] = State
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/docqueue"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_doc_queue result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['QueueList'])
return data
def ci_update_doc_queue(self, Bucket, QueueId, Request={}, **kwargs):
""" 更新文档预览队列接口
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Request(dict): 更新队列配置请求体.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新文档预览队列接口
response = client.ci_update_doc_queue(
Bucket='bucket',
QueueId='',
Request={},
)
print response
"""
return self.ci_update_media_queue(Bucket=Bucket, QueueId=QueueId,
Request=Request, UrlPath="/docqueue/", **kwargs)
def ci_create_doc_job(self, Bucket, InputObject, OutputBucket, OutputRegion, OutputObject, QueueId=None, SrcType=None, TgtType=None,
StartPage=None, EndPage=-1, SheetId=0, PaperDirection=0, PaperSize=0, DocPassword=None, Comments=None, PageRanges=None,
ImageParams=None, Quality=100, Zoom=100, ImageDpi=96, PicPagination=0, **kwargs):
""" 创建任务接口 https://cloud.tencent.com/document/product/460/46942
:param Bucket(string): 存储桶名称.
:param QueueId(string): 任务所在的队列 ID.
:param InputObject(string): 文件在 COS 上的文件路径Bucket 由 Host 指定.
:param OutputBucket(string): 存储结果的存储桶.
:param OutputRegion(string): 存储结果的存储桶的地域.
:param OutputObject(string): 输出文件路径。
非表格文件输出文件名需包含 ${Number} 或 ${Page} 参数。多个输出文件,${Number} 表示序号从1开始${Page} 表示序号与预览页码一致。
${Number} 表示多个输出文件序号从1开始例如输入 abc_${Number}.jpg预览某文件5 - 6页则输出文件名为 abc_1.jpgabc_2.jpg
${Page} 表示多个输出文件,序号与预览页码一致,例如输入 abc_${Page}.jpg预览某文件5-6页则输出文件名为 abc_5.jpgabc_6.jpg
表格文件输出路径需包含 ${SheetID} 占位符,输出文件名必须包含 ${Number} 参数。
例如 /${SheetID}/abc_${Number}.jpg先根据 excel 转换的表格数,生成对应数量的文件夹,再在对应的文件夹下,生成对应数量的图片文件.
:param SrcType(string): 源数据的后缀类型,当前文档转换根据 cos 对象的后缀名来确定源数据类型,当 cos 对象没有后缀名时,可以设置该值.
:param TgtType(string): 转换输出目标文件类型:
jpg转成 jpg 格式的图片文件;如果传入的格式未能识别,默认使用 jpg 格式
png转成 png 格式的图片文件
pdf转成 pdf 格式文件(暂不支持指定页数).
:param StartPage(int): 从第 X 页开始转换在表格文件中一张表可能分割为多页转换生成多张图片。StartPage 表示从指定 SheetId 的第 X 页开始转换。默认为1.
:param EndPage(int): 转换至第 X 页在表格文件中一张表可能分割为多页转换生成多张图片。EndPage 表示转换至指定 SheetId 的第 X 页。默认为-1即转换全部页
:param SheetId(int): 表格文件参数,转换第 X 个表默认为0设置 SheetId 为0即转换文档中全部表
:param PaperDirection(int): 表格文件转换纸张方向0代表垂直方向非0代表水平方向默认为0
:param PaperSize(int): 设置纸张(画布)大小,对应信息为: 0 → A4 、 1 → A2 、 2 → A0 ,默认 A4 纸张
:param DocPassword(string): Office 文档的打开密码,如果需要转换有密码的文档,请设置该字段
:param Comments(int): 是否隐藏批注和应用修订,默认为 00隐藏批注应用修订1显示批注和修订
:param ImageParams(string): 转换后的图片处理参数,支持 基础图片处理 所有处理参数,多个处理参数可通过 管道操作符 分隔,从而实现在一次访问中按顺序对图片进行不同处理
:param Quality(int): 生成预览图的图片质量,取值范围 [1-100]默认值100。 例值为100代表生成图片质量为100%
:param Zoom(int): 预览图片的缩放参数,取值范围[10-200] 默认值100。 例值为200代表图片缩放比例为200% 即放大两倍
:param ImageDpi(int): 按指定 dpi 渲染图片,该参数与 Zoom 共同作用,取值范围 96-600 ,默认值为 96 。转码后的图片单边宽度需小于65500像素
:param PicPagination(int): 是否转换成单张长图,设置为 1 时,最多仅支持将 20 标准页面合成单张长图,超过可能会报错,分页范围可以通过 StartPage、EndPage 控制。默认值为 0 按页导出图片TgtType="png"/"jpg" 时生效
:param PageRanges(string): 自定义需要转换的分页范围,例如: "1,2-4,7" ,则表示转换文档的 1、2、3、4、7 页面
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_create_doc_job(
Bucket='bucket'
QueueId='p532fdead78444e649e1a4467c1cd19d3',
InputObject='test.doc',
OutputBucket='outputbucket',
OutputRegion='outputregion',
OutputObject='/${SheetID}/abc_${Number}.jpg',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
body = {
'Input': {
'Object': InputObject,
},
'Tag': 'DocProcess',
'Operation': {
'Output': {'Bucket': OutputBucket, 'Region': OutputRegion, 'Object': OutputObject},
'DocProcess': {
}
}
}
if QueueId:
body['QueueId'] = QueueId
if SrcType:
body['Operation']['DocProcess']['SrcType'] = SrcType
if TgtType:
body['Operation']['DocProcess']['TgtType'] = TgtType
if ImageParams:
body['Operation']['DocProcess']['ImageParams'] = ImageParams
if DocPassword:
body['Operation']['DocProcess']['DocPassword'] = DocPassword
if PageRanges:
body['Operation']['DocProcess']['PageRanges'] = PageRanges
if StartPage:
body['Operation']['DocProcess']['StartPage'] = StartPage
if EndPage:
body['Operation']['DocProcess']['EndPage'] = EndPage
if SheetId:
body['Operation']['DocProcess']['SheetId'] = SheetId
if PaperDirection:
body['Operation']['DocProcess']['PaperDirection'] = PaperDirection
if PaperSize:
body['Operation']['DocProcess']['PaperSize'] = PaperSize
if Quality:
body['Operation']['DocProcess']['Quality'] = Quality
if Zoom:
body['Operation']['DocProcess']['Zoom'] = Zoom
if PicPagination:
body['Operation']['DocProcess']['PicPagination'] = PicPagination
if ImageDpi:
body['Operation']['DocProcess']['ImageDpi'] = ImageDpi
if Comments:
body['Operation']['DocProcess']['Comments'] = Comments
xml_config = format_xml(data=body, root='Request')
path = "/doc_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_doc_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_get_doc_job(self, Bucket, JobID, **kwargs):
""" 查询任务接口 https://cloud.tencent.com/document/product/460/46943
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询任务接口
response = client.ci_get_doc_job(
Bucket='bucket'
JobID='jobid'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
path = "/doc_jobs/" + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_doc_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_doc_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_list_doc_jobs(self, Bucket, QueueId=None, StartCreationTime=None, EndCreationTime=None, OrderByTime='Desc', States='All', Size=10, NextToken='', **kwargs):
""" 拉取文档预览任务列表接口 https://cloud.tencent.com/document/product/460/46944
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.Desc 或者 Asc。默认为 Desc
:param States(string): 拉取该状态的任务,以,分割支持多状态All、Submitted、Running、Success、Failed、Pause、Cancel。默认为 All
:param Size(string): 拉取的最大任务数。默认为10。最大为100.
:param NextToken(string): 请求的上下文,用于翻页.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_list_doc_jobs(
Bucket='bucket'
QueueId='',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params['tag'] = 'DocProcess'
params['orderByTime'] = OrderByTime
params['states'] = States
params['size'] = str(Size)
params['nextToken'] = NextToken
if QueueId is not None:
params['queueId'] = QueueId
if StartCreationTime is not None:
params['startCreationTime'] = StartCreationTime
if EndCreationTime is not None:
params['endCreationTime'] = EndCreationTime
params = format_values(params)
path = "/doc_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("list_doc_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("list_doc_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_doc_preview_process(self, Bucket, Key, SrcType=None, Page=None, DstType=None, PassWord=None, Comment=0, Sheet=1,
ExcelPaperDirection=0, ExcelRow=0, ExcelCol=0, ExcelPaperSize=None, TxtPagination=False,
ImageParams=None, Quality=100, Scale=100, ImageDpi=96, **kwargs):
"""文档预览同步接口 https://cloud.tencent.com/document/product/460/47074
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param SrcType(string): 源数据的后缀类型,当前文档转换根据 COS 对象的后缀名来确定源数据类型。当 COS 对象没有后缀名时,可以设置该值。
:param Page(int): 需转换的文档页码默认从1开始计数表格文件中 page 表示转换的第 X 个 sheet 的第 X 张图。
:param DstType(string): 转换输出目标文件类型:
png转成 png 格式的图片文件
jpg转成 jpg 格式的图片文件
pdf转成 pdf 格式文件。 无法选择页码page 参数不生效
txt转成 txt 格式文件
如果传入的格式未能识别,默认使用 jpg 格式。
:param PassWord(string): Office 文档的打开密码,如果需要转换有密码的文档,请设置该字段。
:param Comment(int): 是否隐藏批注和应用修订默认为0。0隐藏批注应用修订1显示批注和修订。
:param Sheet(int): 表格文件参数,转换第 X 个表默认为1。
:param ExcelPaperDirection(int): 表格文件转换纸张方向0代表垂直方向非0代表水平方向默认为0。
:param ExcelRow(int): 值为1表示将所有列放到1页进行排版默认值为0。
:param ExcelCol(int): 值为1表示将所有行放到1页进行排版默认值为0。
:param ExcelPaperSize(int): 设置纸张(画布)大小,对应信息为: 0 → A4 、 1 → A2 、 2 → A0 ,默认 A4 纸张 (需配合 excelRow 或 excelCol 一起使用)。
:param TxtPagination(bool): 是否转换成长文本,设置为 true 时,可以将需要导出的页中的文字合并导出,分页范围可以通过 Ranges 控制。默认值为 false ,按页导出 txt。 ExportType="txt" 时生效)。
:param ImageParams(string): 转换后的图片处理参数,支持 基础图片处理 所有处理参数,多个处理参数可通过 管道操作符 分隔,从而实现在一次访问中按顺序对图片进行不同处理。
:param Quality(int): 生成预览图的图片质量,取值范围为 [1, 100]默认值100。 例如取值为100代表生成图片质量为100%
:param Scale(int): 预览图片的缩放参数,取值范围为 [10, 200] 默认值100。 例如取值为200代表图片缩放比例为200% 即放大两倍。
:param ImageDpi(int): 按指定 dpi 渲染图片,该参数与 scale 共同作用,取值范围 96-600 ,默认值为 96 。转码后的图片单边宽度需小于65500像素。
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
def ci_doc_preview_process():
# 文档预览同步接口
response = client.ci_doc_preview_process(
Bucket=bucket_name,
Key='1.txt',
)
print(response)
response['Body'].get_stream_to_file('result.png')
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'doc-preview'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if SrcType:
params['srcType'] = SrcType
if Page:
params['page'] = Page
if DstType:
params['dstType'] = DstType
if PassWord:
params['password'] = PassWord
params['comment'] = Comment
params['sheet'] = Sheet
params['excelPaperDirection'] = ExcelPaperDirection
params['excelRow'] = ExcelRow
params['excelCol'] = ExcelCol
if ExcelPaperSize:
params['excelPaperSize'] = ExcelPaperSize
params['txtPagination'] = str(TxtPagination).lower()
if ImageParams:
params['ImageParams'] = ImageParams
params['quality'] = Quality
params['scale'] = Scale
params['imageDpi'] = ImageDpi
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_doc_preview_process, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def ci_doc_preview_html_process(self, Bucket, Key, SrcType=None, Copyable='1', DstType='html', HtmlParams=None, HtmlWaterword=None, HtmlFillStyle=None,
HtmlFront=None, HtmlRotate=None, HtmlHorizontal=None, HtmlVertical=None, HtmlTitle=None, **kwargs):
"""文档转 HTML https://cloud.tencent.com/document/product/460/52518
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param SrcType(string): 源数据的后缀类型,当前文档转换根据 COS 对象的后缀名来确定源数据类型。当 COS 对象没有后缀名时,可以设置该值。
:param Copyable(string): 是否可复制。默认为可复制填入值为1不可复制填入值为0。
:param DstType(string): 转换输出目标文件类型,文档 HTML 预览固定为 html需为小写字母.
:param HtmlParams(string): 自定义配置参数json结构需要经过 URL 安全 的 Base64 编码,默认配置为:{ commonOptions: { isShowTopArea: true, isShowHeader: true } }。
:param HtmlWaterword(string): 水印文字,需要经过 URL 安全 的 Base64 编码,默认为空。
:param Htmlfillstyle(string): 水印 RGBA颜色和透明度需要经过 URL 安全 的 Base64 编码默认为rgba(192,192,192,0.6)。
:param HtmlFront(string): 水印文字样式,需要经过 URL 安全 的 Base64 编码默认为bold 20px Serif。
:param HtmlRotate(string): 水印文字旋转角度0 - 360默认315度。
:param HtmlHorizontal(string): 水印文字水平间距,单位 px默认为50。
:param HtmlVertical(string): 水印文字垂直间距,单位 px默认为100。
:param HtmlTitle(string): 自定义返回html的title信息默认为“腾讯云-数据万象”,可输入自定义字符串并配合通配符使用,需要经过 URL安全的Base64 编码。
:return(dict): 获取成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_doc_preview_html_process(
Bucket=bucket_name,
Key='1.txt',
)
print(response)
response['Body'].get_stream_to_file('result.html')
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'doc-preview'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if SrcType:
params['srcType'] = SrcType
params['copyable'] = Copyable
params['dstType'] = DstType
if HtmlParams:
params['htmlParams'] = HtmlParams
if HtmlWaterword:
params['htmlwaterword'] = HtmlWaterword
if HtmlFillStyle:
params['htmlfillstyle'] = HtmlFillStyle
if HtmlFront:
params['htmlfront'] = HtmlFront
if HtmlRotate:
params['htmlrotate'] = HtmlRotate
if HtmlHorizontal:
params['htmlhorizontal'] = HtmlHorizontal
if HtmlVertical:
params['htmlvertical'] = HtmlVertical
if HtmlTitle:
params['htmltitle'] = HtmlTitle
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("ci_doc_preview_html_process, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def ci_get_doc_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber=1, PageSize=10, **kwargs):
"""查询文档预览开通状态接口 https://cloud.tencent.com/document/product/460/46945
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询文档预览开通状态接口
response = client.ci_get_doc_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['regions'] = Regions
params['bucketNames'] = BucketNames
params['bucketName'] = BucketName
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/docbucket"
url = self._conf.uri(bucket=None, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_doc_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=None,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['DocBucketList'])
return data
def ci_open_asr_bucket(self, Bucket, **kwargs):
""" 开通智能语音服务 https://cloud.tencent.com/document/product/460/95754
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 开通智能语音服务
response, data = client.ci_open_asr_bucket(
Bucket='bucket'
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "asrbucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_open_asr_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='POST',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_get_asr_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber='', PageSize='', **kwargs):
"""查询语音识别开通状态接口 https://cloud.tencent.com/document/product/460/46232
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询语音识别开通状态接口
response = client.ci_get_asr_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['regions'] = Regions
params['bucketNames'] = BucketNames
params['bucketName'] = BucketName
params['pageNumber'] = PageNumber
params['pageSize'] = PageSize
params = format_values(params)
path = "/asrbucket"
url = self._conf.uri(bucket=None, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_asr_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=None,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['AsrBucketList'])
return data
def ci_close_asr_bucket(self, Bucket, **kwargs):
""" 关闭智能语音服务 https://cloud.tencent.com/document/product/460/95755
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 关闭智能语音服务
response, data = client.ci_close_asr_bucket(
Bucket='bucket'
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "asrbucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_close_asr_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_get_asr_queue(self, Bucket, State='All', QueueIds='', PageNumber=1, PageSize=10, **kwargs):
"""查询语音识别队列接口 https://cloud.tencent.com/document/product/460/46234
:param Bucket(string): 存储桶名称.
:param QueueIds(string): 队列 ID以“,”符号分割字符串.
:param State(string): 队列状态
:param PageNumber(int): 第几页
:param PageSize(int): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询语音识别队列接口
response = client.ci_get_asr_queue(
Bucket='bucket'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['queueIds'] = QueueIds
params['state'] = State
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/asrqueue"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_asr_queue result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['QueueList'])
return data
def ci_update_asr_queue(self, Bucket, QueueId, Request={}, **kwargs):
""" 更新语音识别队列接口 https://cloud.tencent.com/document/product/460/46235
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Request(dict): 更新队列配置请求体.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新语音识别队列接口
response = client.ci_update_asr_queue(
Bucket='bucket',
QueueId='',
Request={},
)
print response
"""
return self.ci_update_media_queue(Bucket=Bucket, QueueId=QueueId,
Request=Request, UrlPath="/asrqueue/", **kwargs)
def ci_create_asr_job(self, Bucket, OutputBucket, OutputRegion, OutputObject, QueueId=None, InputObject=None, Url=None, TemplateId=None,
SpeechRecognition=None, CallBack=None, CallBackFormat=None, CallBackType=None, CallBackMqConfig=None, **kwargs):
""" 创建语音识别任务接口 https://cloud.tencent.com/document/product/460/78951
:param Bucket(string): 存储桶名称.
:param QueueId(string): 任务所在的队列 ID.
:param InputObject(string): 文件在 COS 上的文件路径Bucket 由 Host 指定.
:param Url(string): 外网可下载的Url.
:param OutputBucket(string): 存储结果的存储桶.
:param OutputRegion(string): 存储结果的存储桶的地域.
:param OutputObject(string): 输出文件路径。
:param TemplateId(string): 对应语音识别模板ID.
:param SpeechRecognition(dict): 语音识别参数信息当参数TemplateId 不为空时,此参数无效
:param CallBack(string): 任务结束回调回调Url
:param CallBackFormat(string): 任务回调格式JSON 或 XML默认 XML优先级高于队列的回调格式
:param CallBackType(string): 任务回调类型Url 或 TDMQ默认 Url优先级高于队列的回调类型
:param CallBackMqConfig(dict): 任务回调TDMQ配置当 CallBackType 为 TDMQ 时必填,详见 https://cloud.tencent.com/document/product/460/78927#CallBackMqConfig
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
body = {
'EngineModelType': '16k_zh',
'ChannelNum': '1',
'ResTextFormat': '1',
}
response = client.ci_create_asr_job(
Bucket=bucket_name,
QueueId='s0980xxxxxxxxxxxxxxxxff12',
# TemplateId='t1ada6f282d29742db83244e085e920b08',
InputObject='normal.mp4',
OutputBucket=bucket_name,
OutputRegion='ap-chongqing',
OutputObject='result.txt',
SpeechRecognition=body
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
body = {
'Input': {
},
'Tag': 'SpeechRecognition',
'Operation': {
'Output': {
'Bucket': OutputBucket,
'Region': OutputRegion,
'Object': OutputObject
},
}
}
if QueueId:
body['QueueId'] = QueueId
if InputObject:
body['Input']['Object'] = InputObject
if Url:
body['Input']['Url'] = Url
if TemplateId:
body['Operation']['TemplateId'] = TemplateId
if SpeechRecognition:
body['Operation']['SpeechRecognition'] = SpeechRecognition
if CallBack:
body['CallBack'] = CallBack
if CallBackFormat:
body['CallBackFormat'] = CallBackFormat
if CallBackMqConfig:
body['CallBackMqConfig'] = CallBackMqConfig
xml_config = format_xml(data=body, root='Request')
path = "/asr_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("create_asr_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_get_asr_job(self, Bucket, JobID, **kwargs):
""" 查询语音识别任务接口 https://cloud.tencent.com/document/product/460/46229
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询任务接口
response = client.ci_get_asr_job(
Bucket='bucket'
JobID='jobid'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
path = "/asr_jobs/" + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("get_asr_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_asr_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_list_asr_jobs(self, Bucket, QueueId=None, StartCreationTime=None, EndCreationTime=None, OrderByTime='Desc', States='All', Size=10, NextToken='', **kwargs):
""" 拉取语音识别任务列表接口 https://cloud.tencent.com/document/product/460/46230
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.Desc 或者 Asc。默认为 Desc
:param States(string): 拉取该状态的任务,以,分割支持多状态All、Submitted、Running、Success、Failed、Pause、Cancel。默认为 All
:param Size(string): 拉取的最大任务数。默认为10。最大为100.
:param NextToken(string): 请求的上下文,用于翻页.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 拉取语音识别任务列表接口
response = client.ci_list_asr_jobs(
Bucket='bucket'
QueueId='',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params['tag'] = 'SpeechRecognition'
params['orderByTime'] = OrderByTime
params['states'] = States
params['size'] = str(Size)
params['nextToken'] = NextToken
if QueueId is not None:
params['queueId'] = QueueId
if StartCreationTime is not None:
params['startCreationTime'] = StartCreationTime
if EndCreationTime is not None:
params['endCreationTime'] = EndCreationTime
params = format_values(params)
path = "/asr_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("list_asr_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("list_asr_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_create_asr_template(self, Bucket, Name, EngineModelType, ChannelNum=None,
ResTextFormat=None, FilterDirty=0, FilterModal=0, ConvertNumMode=0, SpeakerDiarization=0,
SpeakerNumber=0, FilterPunc=0, OutputFileType='txt', FlashAsr=False, Format=None, FirstChannelOnly=1, WordInfo=0, **kwargs):
""" 创建语音识别模板接口 https://cloud.tencent.com/document/product/460/78939
:param Bucket(string): 存储桶名称.
:param Name(string): 模板名称.
:param EngineModelType(string): 引擎模型类型,分为电话场景和非电话场景
电话场景:
8k_zh电话 8k 中文普通话通用(可用于双声道音频)。
8k_zh_s电话 8k 中文普通话话者分离(仅适用于单声道音频)。
8k_en电话 8k 英语。
非电话场景:
16k_zh16k 中文普通话通用。
16k_zh_video16k 音视频领域。
16k_en16k 英语。
16k_ca16k 粤语。
16k_ja16k 日语。
16k_zh_edu中文教育。
16k_en_edu英文教育。
16k_zh_medical医疗。
16k_th泰语。
16k_zh_dialect多方言支持23种方言。
:param ChannelNum(int): 语音声道数1 表示单声道.EngineModelType为非电话场景仅支持单声道。2 表示双声道(仅支持 8k_zh 引擎模型双声道应分别对应通话双方)。
:param ResTextFormat(int): 识别结果返回形式0 表示识别结果文本含分段时间戳。1 词级别粒度的详细识别结果不含标点含语速值词时间戳列表一般用于生成字幕场景。2 词级别粒度的详细识别结果(包含标点、语速值)。
:param FilterDirty(int): 是否过滤脏词目前支持中文普通话引擎0 表示不过滤脏词。1 表示过滤脏词。2 表示将脏词替换为 *。默认值为0。
:param FilterModal(int): 是否过语气词目前支持中文普通话引擎0 表示不过滤语气词。1 表示部分过滤。2 表示严格过滤 。默认值为0。
:param ConvertNumMode(int): 是否进行阿拉伯数字智能转换目前支持中文普通话引擎0 表示不转换直接输出中文数字。1 表示根据场景智能转换为阿拉伯数字。3 表示打开数学相关数字转换。默认值为0。
:param SpeakerDiarization(int): 是否开启说话人分离0 表示不开启。1 表示开启(仅支持8k_zh16k_zh16k_zh_video单声道音频)。默认值为0。注意8k电话场景建议使用双声道来区分通话双方设置ChannelNum=2即可不用开启说话人分离。
:param SpeakerNumber(int): 说话人分离人数需配合开启说话人分离使用取值范围0-10。0 代表自动分离目前仅支持≤6个人1-10代表指定说话人数分离。默认值为 0。
:param FilterPunc(int): 是否过滤标点符号目前支持中文普通话引擎0 表示不过滤。1 表示过滤句末标点。2 表示过滤所有标点。默认值为 0 。
:param OutputFileType(string): 输出文件类型,可选 txt、srt。默认为 txt。
:param FlashAsr(bool): 是否开启极速ASR可选true、false。默认为false.
:param Format(string): 极速ASR音频格式。支持 wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac 。
:param FirstChannelOnly(int): 极速ASR参数。表示是否只识别首个声道默认为1。0识别所有声道1识别首个声道。
:param WordInfo(int): 极速ASR参数。表示是否显示词级别时间戳默认为0。0不显示1显示不包含标点时间戳2显示包含标点时间戳。
:return(dict): 创建成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建语音识别模板接口
response = client.ci_create_asr_template(
Bucket=bucket_name,
Name='templateName',
EngineModelType='16k_zh',
ChannelNum=1,
ResTextFormat=2,
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
body = {
'Name': Name,
'Tag': 'SpeechRecognition',
'SpeechRecognition': {
'EngineModelType': EngineModelType,
}
}
if ChannelNum:
body['SpeechRecognition']['ChannelNum'] = ChannelNum
if ResTextFormat:
body['SpeechRecognition']['ResTextFormat'] = ResTextFormat
body['SpeechRecognition']['FilterDirty'] = FilterDirty
body['SpeechRecognition']['FilterModal'] = FilterModal
body['SpeechRecognition']['ConvertNumMode'] = ConvertNumMode
body['SpeechRecognition']['SpeakerDiarization'] = SpeakerDiarization
body['SpeechRecognition']['SpeakerNumber'] = SpeakerNumber
body['SpeechRecognition']['FilterPunc'] = FilterPunc
body['SpeechRecognition']['OutputFileType'] = OutputFileType
body['SpeechRecognition']['FlashAsr'] = str(FlashAsr).lower()
if Format:
body['SpeechRecognition']['Format'] = Format
body['SpeechRecognition']['FirstChannelOnly'] = FirstChannelOnly
body['SpeechRecognition']['WordInfo'] = WordInfo
xml_config = format_xml(data=body, root='Request')
path = "/template"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_create_asr_template result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_update_asr_template(self, Bucket, TemplateId, Name, EngineModelType, ChannelNum,
ResTextFormat, FilterDirty=0, FilterModal=0, ConvertNumMode=0, SpeakerDiarization=0,
SpeakerNumber=0, FilterPunc=0, OutputFileType='txt', FlashAsr=False, Format=None, FirstChannelOnly=1, WordInfo=0, **kwargs):
""" 更新语音识别模板接口 https://cloud.tencent.com/document/product/460/78942
:param Bucket(string): 存储桶名称.
:param TemplateId(string): 需要更新的模板ID。
:param Name(string): 存储桶名称.
:param EngineModelType(string): 引擎模型类型,分为电话场景和非电话场景
电话场景:
8k_zh电话 8k 中文普通话通用(可用于双声道音频)。
8k_zh_s电话 8k 中文普通话话者分离(仅适用于单声道音频)。
8k_en电话 8k 英语。
非电话场景:
16k_zh16k 中文普通话通用。
16k_zh_video16k 音视频领域。
16k_en16k 英语。
16k_ca16k 粤语。
16k_ja16k 日语。
16k_zh_edu中文教育。
16k_en_edu英文教育。
16k_zh_medical医疗。
16k_th泰语。
16k_zh_dialect多方言支持23种方言。
:param ChannelNum(int): 语音声道数1 表示单声道.EngineModelType为非电话场景仅支持单声道。2 表示双声道(仅支持 8k_zh 引擎模型双声道应分别对应通话双方)。
:param ResTextFormat(int): 识别结果返回形式0 表示识别结果文本含分段时间戳。1 词级别粒度的详细识别结果不含标点含语速值词时间戳列表一般用于生成字幕场景。2 词级别粒度的详细识别结果(包含标点、语速值)。
:param FilterDirty(int): 是否过滤脏词目前支持中文普通话引擎0 表示不过滤脏词。1 表示过滤脏词。2 表示将脏词替换为 *。默认值为0。
:param FilterModal(int): 是否过语气词目前支持中文普通话引擎0 表示不过滤语气词。1 表示部分过滤。2 表示严格过滤 。默认值为0。
:param ConvertNumMode(int): 是否进行阿拉伯数字智能转换目前支持中文普通话引擎0 表示不转换直接输出中文数字。1 表示根据场景智能转换为阿拉伯数字。3 表示打开数学相关数字转换。默认值为0。
:param SpeakerDiarization(int): 是否开启说话人分离0 表示不开启。1 表示开启(仅支持8k_zh16k_zh16k_zh_video单声道音频)。默认值为0。注意8k电话场景建议使用双声道来区分通话双方设置ChannelNum=2即可不用开启说话人分离。
:param SpeakerNumber(int): 说话人分离人数需配合开启说话人分离使用取值范围0-10。0 代表自动分离目前仅支持≤6个人1-10代表指定说话人数分离。默认值为 0。
:param FilterPunc(int): 是否过滤标点符号目前支持中文普通话引擎0 表示不过滤。1 表示过滤句末标点。2 表示过滤所有标点。默认值为 0。
:param OutputFileType(string): 输出文件类型,可选 txt、srt。默认为 txt。
:param FlashAsr(bool): 是否开启极速ASR可选true、false。默认为false.
:param Format(string): 极速ASR音频格式。支持 wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac 。
:param FirstChannelOnly(int): 极速ASR参数。表示是否只识别首个声道默认为1。0识别所有声道1识别首个声道。
:param WordInfo(int): 极速ASR参数。表示是否显示词级别时间戳默认为0。0不显示1显示不包含标点时间戳2显示包含标点时间戳。
:return(dict): 更新成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新语音识别模板接口
response = client.ci_update_asr_template(
Bucket=bucket_name,
TemplateId='t1bdxxxxxxxxxxxxxxxxx94a9',
Name='updateAsr',
EngineModelType='16k_zh',
ChannelNum=1,
ResTextFormat=1,
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
body = {
'Name': Name,
'Tag': 'SpeechRecognition',
'SpeechRecognition': {
'EngineModelType': EngineModelType,
}
}
if ChannelNum:
body['SpeechRecognition']['ChannelNum'] = ChannelNum
if ResTextFormat:
body['SpeechRecognition']['ResTextFormat'] = ResTextFormat
body['SpeechRecognition']['FilterDirty'] = FilterDirty
body['SpeechRecognition']['FilterModal'] = FilterModal
body['SpeechRecognition']['ConvertNumMode'] = ConvertNumMode
body['SpeechRecognition']['SpeakerDiarization'] = SpeakerDiarization
body['SpeechRecognition']['SpeakerNumber'] = SpeakerNumber
body['SpeechRecognition']['FilterPunc'] = FilterPunc
body['SpeechRecognition']['OutputFileType'] = OutputFileType
body['SpeechRecognition']['FlashAsr'] = str(FlashAsr).lower()
if Format:
body['SpeechRecognition']['Format'] = Format
body['SpeechRecognition']['FirstChannelOnly'] = FirstChannelOnly
body['SpeechRecognition']['WordInfo'] = WordInfo
xml_config = format_xml(data=body, root='Request')
path = "/template/" + TemplateId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_update_asr_template result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_get_asr_template(self, Bucket, Category='Custom', Ids='', Name='', PageNumber=1, PageSize=10, **kwargs):
""" 查询语音识别模板接口 https://cloud.tencent.com/document/product/460/46943
:param Bucket(string): 存储桶名称.
:param Category(string): Official系统预设模板Custom自定义模板默认值Custom.
:param Ids(string): 模板 ID以,符号分割字符串.
:param Name(string): 模板名称前缀.
:param PageNumber(string): 第几页默认值1.
:param PageSize(string): 每页个数默认值10.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询语音识别模板接口
response = client.ci_get_asr_template(
Bucket=bucket_name,
)
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['category'] = Category
params['ids'] = Ids
params['name'] = Name
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/template"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_asr_template result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['TemplateList'])
return data
def ci_delete_asr_template(self, Bucket, TemplateId, **kwargs):
""" 删除语音识别模板接口 https://cloud.tencent.com/document/product/460/46943
:param Bucket(string): 存储桶名称.
:param TemplateId(string): 需要删除的语音识别模板ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除指定语音识别模板
response = client.ci_delete_asr_template(
Bucket=bucket_name,
TemplateId='t1bdxxxxxxxxxxxxxxxxx94a9',
)
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/template/" + TemplateId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_delete_asr_template result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def file_hash(self, Bucket, Key, Type, AddToHeader=False, **kwargs):
"""以同步请求的方式进行文件哈希值计算,实时返回计算得到的哈希值 https://cloud.tencent.com/document/product/436/83107
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param Type(string): 支持的哈希算法类型有效值md5、sha1、sha256.
:param AddToHeader(bool): 是否将计算得到的哈希值自动添加至文件的自定义header格式为x-cos-meta-md5/sha1/sha256; 有效值: True、False不填则默认为False.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 用于获取COS文件某个时间的截图
response = client.file_hash(Bucket=bucket_name, Key="mytest.mp4", Type='md5')
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'filehash'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['type'] = Type
params['addtoheader'] = str(AddToHeader).lower()
params = format_values(params)
url = self._conf.uri(bucket=Bucket, path=Key)
logger.info("file_hash, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=CosS3Auth(self._conf, Key, params=params),
params=params,
headers=headers)
data = xml_to_dict(rt.content)
return data
def _ci_create_file_process_job(self, Bucket, Body=None, **kwargs):
""" 创建文件处理公共接口
:param Bucket(string): 存储桶名称.
:param Body(dict): 文件处理参数信息.
:return(dict): 查询成功返回的结果,dict类型.
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
xml_config = format_xml(data=Body, root='Request')
path = "/file_jobs"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("_ci_create_file_job result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_create_file_hash_job(self, Bucket, InputObject,
FileHashCodeConfig, QueueId=None, CallBack=None, CallBackFormat=None,
CallBackType=None, CallBackMqConfig=None, UserData=None, **kwargs):
""" 创建哈希值计算任务接口 https://cloud.tencent.com/document/product/436/83108
:param Bucket(string): 存储桶名称.
:param QueueId(string): 任务所在的队列 ID.
:param InputObject(string): 文件在 COS 上的文件路径Bucket 由 Host 指定.
:param FileHashCodeConfig(dict): 指定哈希值计算的处理规则.
:param CallBack(string): 任务结束回调回调Url
:param CallBackFormat(string): 任务回调格式JSON 或 XML默认 XML优先级高于队列的回调格式
:param CallBackType(string): 任务回调类型Url 或 TDMQ默认 Url优先级高于队列的回调类型
:param CallBackMqConfig(dict): 任务回调TDMQ配置当 CallBackType 为 TDMQ 时必填,详见 https://cloud.tencent.com/document/product/460/78927#CallBackMqConfig
:param UserData(string): 透传用户信息, 可打印的 ASCII 码, 长度不超过1024.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
body = {
'Type': 'MD5',
}
response = client.ci_create_file_hash_job(
Bucket=bucket_name,
InputObject="mytest.mp4",
FileHashCodeConfig=body
)
print(response)
return response
"""
body = {
'Input': {
'Object': InputObject
},
'Tag': 'FileHashCode',
'Operation': {
'FileHashCodeConfig': FileHashCodeConfig,
}
}
if QueueId:
body['QueueId'] = QueueId
if CallBack:
body['CallBack'] = CallBack
if CallBackFormat:
body['CallBackFormat'] = CallBackFormat
if CallBackMqConfig:
body['CallBackMqConfig'] = CallBackMqConfig
if CallBackType:
body['CallBackType'] = CallBackType
if UserData:
body['Operation']['UserData'] = UserData
return self._ci_create_file_process_job(Bucket, Body=body, **kwargs)
def ci_create_file_uncompress_job(self, Bucket, InputObject, OutputBucket,
OutputRegion, FileUncompressConfig, QueueId=None, CallBack=None,
CallBackFormat=None, CallBackType=None, CallBackMqConfig=None,
UserData=None, **kwargs):
""" 创建文件解压任务接口 https://cloud.tencent.com/document/product/436/83110
:param Bucket(string): 存储桶名称.
:param QueueId(string): 任务所在的队列 ID.
:param InputObject(string): 文件在 COS 上的文件路径Bucket 由 Host 指定.
:param OutputBucket(string): 存储结果的存储桶.
:param OutputRegion(string): 存储结果的存储桶的地域.
:param FileUncompressConfig(dict): 指定文件解压的处理规则.
:param CallBack(string): 任务结束回调回调Url
:param CallBackFormat(string): 任务回调格式JSON 或 XML默认 XML优先级高于队列的回调格式
:param CallBackType(string): 任务回调类型Url 或 TDMQ默认 Url优先级高于队列的回调类型
:param CallBackMqConfig(dict): 任务回调TDMQ配置当 CallBackType 为 TDMQ 时必填,详见 https://cloud.tencent.com/document/product/460/78927#CallBackMqConfig
:param UserData(string): 透传用户信息, 可打印的 ASCII 码, 长度不超过1024.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
body = {
'Prefix': 'output/',
}
response = client.ci_create_file_uncompress_job(
Bucket=bucket_name,
InputObject='test.zip',
FileUncompressConfig=body
)
print(response)
return response
"""
body = {
'Input': {
'Object': InputObject
},
'Tag': 'FileUncompress',
'Operation': {
'FileUncompressConfig': FileUncompressConfig,
'Output': {
'Bucket': OutputBucket,
'Region': OutputRegion,
}
}
}
if QueueId:
body['QueueId'] = QueueId
if CallBack:
body['CallBack'] = CallBack
if CallBackFormat:
body['CallBackFormat'] = CallBackFormat
if CallBackMqConfig:
body['CallBackMqConfig'] = CallBackMqConfig
if CallBackType:
body['CallBackType'] = CallBackType
if UserData:
body['Operation']['UserData'] = UserData
return self._ci_create_file_process_job(Bucket, Body=body, **kwargs)
def ci_create_file_compress_job(self, Bucket, OutputBucket, OutputRegion, OutputObject,
FileCompressConfig, QueueId=None, CallBack=None, CallBackFormat=None,
CallBackType=None, CallBackMqConfig=None, UserData=None, **kwargs):
""" 创建多文件打包压缩任务接口 https://cloud.tencent.com/document/product/436/83112
:param Bucket(string): 存储桶名称.
:param OutputBucket(string): 存储结果的存储桶.
:param OutputRegion(string): 存储结果的存储桶的地域.
:param OutputObject(string): 输出文件路径。
:param QueueId(string): 任务所在的队列 ID.
:param FileCompressConfig(dict): 指定文件打包的处理规则.
:param CallBack(string): 任务结束回调回调Url
:param CallBackFormat(string): 任务回调格式JSON 或 XML默认 XML优先级高于队列的回调格式
:param CallBackType(string): 任务回调类型Url 或 TDMQ默认 Url优先级高于队列的回调类型
:param CallBackMqConfig(dict): 任务回调TDMQ配置当 CallBackType 为 TDMQ 时必填,详见 https://cloud.tencent.com/document/product/460/78927#CallBackMqConfig
:param UserData(string): 透传用户信息, 可打印的 ASCII 码, 长度不超过1024.
:return(dict): 任务返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
body = {
'Flatten': '0',
'Format': 'zip',
'Prefix': '/',
}
response = client.ci_create_file_compress_job(
Bucket=bucket_name,
OutputBucket=bucket_name,
OutputRegion='ap-guangzhou',
OutputObject='result.zip',
FileCompressConfig=body
)
print(response)
return response
"""
body = {
'Tag': 'FileCompress',
'Operation': {
'FileCompressConfig': FileCompressConfig,
'Output': {
'Bucket': OutputBucket,
'Region': OutputRegion,
'Object': OutputObject
},
}
}
if QueueId:
body['QueueId'] = QueueId
if CallBack:
body['CallBack'] = CallBack
if CallBackFormat:
body['CallBackFormat'] = CallBackFormat
if CallBackMqConfig:
body['CallBackMqConfig'] = CallBackMqConfig
if CallBackType:
body['CallBackType'] = CallBackType
if UserData:
body['Operation']['UserData'] = UserData
return self._ci_create_file_process_job(Bucket, Body=body, **kwargs)
def ci_get_file_process_jobs(self, Bucket, JobIDs, **kwargs):
""" 查询文件处理任务接口
:param Bucket(string): 存储桶名称.
:param JobIDs(string): 任务ID以,分割多个任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_file_process_jobs(
Bucket='bucket'
JobIDs={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/file_jobs/" + JobIDs
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_file_process_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_file_process_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_file_zip_preview(self, Bucket, Key, **kwargs):
"""ci_file_zip_preview 压缩文件预览接口 https://cloud.tencent.com/document/product/436/93032
:param Bucket(string): 存储桶名称.
:param Key(string): COS路径.
:param kwargs(dict): 设置下载的headers.
:return(dict): 预览结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
response = client.ci_file_zip_preview(
Bucket='bucket',
Key='test.zip',
)
print response
"""
return self.ci_process(Bucket, Key, "zippreview", **kwargs)
def ci_recognize_logo_process(self, Bucket, Key=None, Url=None, **kwargs):
"""Logo 识别
:param Bucket(string): 存储桶名称.
:param Key(string): 对象文件名例如folder/document.jpg.
:param Url(string): 公网可访问的图片链接. Key与Url参数不可同时传入根据需求选择其中一个
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
def ci_recognize_logo_process():
# 通用文字识别
response = client.ci_recognize_logo_process(
Bucket=bucket_name,
Key='demo.jpeg',
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'RecognizeLogo'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if Url:
params['detect-url'] = Url
params = format_values(params)
url = self._conf.uri(bucket=Bucket)
cos_s3_auth = CosS3Auth(self._conf, params=params)
if Key:
url = self._conf.uri(bucket=Bucket, path=Key)
cos_s3_auth = CosS3Auth(self._conf, Key, params=params)
logger.info("ci_recognize_logo_process, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=cos_s3_auth,
params=params,
headers=headers)
data = xml_to_dict(rt.content)
return data
def ci_super_resolution_process(self, Bucket, Key=None, Url=None, **kwargs):
"""图像超分 https://cloud.tencent.com/document/product/460/83793#1.-.E4.B8.8B.E8.BD.BD.E6.97.B6.E5.A4.84.E7.90.86
:param Bucket(string): 存储桶名称.
:param Key(string): 对象文件名例如folder/document.jpg.
:param Url(string): 您可以通过填写 Url 处理任意公网可访问的图片链接。不填写 detect-url 时,后台会默认处理 ObjectKey ,填写了 detect-url 时,后台会处理 detect-url 链接,无需再填写 ObjectKeydetect-url 示例http://www.example.com/abc.jpg ,需要进行 UrlEncode处理后为http%25253A%25252F%25252Fwww.example.com%25252Fabc.jpg。
:return(dict): 下载成功返回的结果,包含Body对应的StreamBody,可以获取文件流或下载文件到本地.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
def ci_super_resolution_process():
# 图像超分
response = client.ci_super_resolution_process(
Bucket=bucket_name,
Key='demo.jpeg',
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {'ci-process': 'AISuperResolution'}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if Url:
params['detect-url'] = Url
params = format_values(params)
url = self._conf.uri(bucket=Bucket)
cos_s3_auth = CosS3Auth(self._conf, params=params)
if Key:
url = self._conf.uri(bucket=Bucket, path=Key)
cos_s3_auth = CosS3Auth(self._conf, Key, params=params)
logger.info("ci_super_resolution_process, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
stream=True,
auth=cos_s3_auth,
params=params,
headers=headers)
response = dict(**rt.headers)
response['Body'] = StreamBody(rt)
return response
def ci_cancel_jobs(self, Bucket, JobID, **kwargs):
"""取消媒体处理任务接口 https://cloud.tencent.com/document/product/436/85082
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务id.
:param kwargs(dict): 设置请求的headers.
:return(dict): 下载成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 取消任务
response = client.ci_cancel_jobs(
Bucket='bucket',
JobID='v11122zxxxazzz',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = '/jobs/' + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
url += "?cancel"
logger.info("ci_cancel_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_cancel_jobs:%s", rt.content)
return ''
def ci_create_inventory_trigger_jobs(self, Bucket, JobBody, **kwargs):
""" 创建批量处理任务接口 https://cloud.tencent.com/document/product/460/80155
:param Bucket(string): 存储桶名称.
:param JobBody(dict): 创建批量处理任务的配置.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_create_inventory_trigger_jobs(
Bucket='bucket'
JobBody={},
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
xml_config = format_xml(data=JobBody, root='Request')
path = "/inventorytriggerjob"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_create_inventory_trigger_jobs result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_delete_inventory_trigger_jobs(self, Bucket, JobId, **kwargs):
""" 取消指定批量任务接口 https://cloud.tencent.com/document/product/460/76892
:param Bucket(string): 存储桶名称.
:param JobId(string): 需要取消的批量任务ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新工作流状态接口
response = client.ci_delete_inventory_trigger_jobs(
Bucket='bucket'
JobId='',
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/inventorytriggerjob/" + JobId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
url = url + '?cancel'
logger.info("ci_delete_inventory_trigger_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
return rt
def ci_list_inventory_trigger_jobs(self, Bucket, StartCreationTime=None,
EndCreationTime=None, OrderByTime='Desc', States='All', Size=10,
NextToken='', Type='Workflow', WorkflowId='', JobId='', Name=None, **kwargs):
""" 查询批量任务列表接口 https://cloud.tencent.com/document/product/460/76894
:param Bucket(string): 存储桶名称.
:param StartCreationTime(string): 开始时间.
:param EndCreationTime(string): 结束时间.
:param OrderByTime(string): 排序方式.
:param States(string): 任务状态.
:param Size(string): 任务个数.
:param NextToken(string): 请求的上下文,用于翻页.
:param Type(string): 拉取批量任务类型,工作流类型 Workflow 、任务类型 Job.
:param WorkflowId(string): 工作流 ID.
:param JobId(string): 批量触发任务 ID.
:param Name(string): 批量触发任务名称.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_list_inventory_trigger_jobs(
Bucket='bucket'
QueueId='',
Tag='Transcode'
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['type'] = Type
params['orderByTime'] = OrderByTime
params['states'] = States
params['size'] = str(Size)
params['nextToken'] = NextToken
params['workflowId'] = WorkflowId
params['jobId'] = JobId
if Name is not None:
params['name'] = Name
if StartCreationTime is not None:
params['startCreationTime'] = StartCreationTime
if EndCreationTime is not None:
params['endCreationTime'] = EndCreationTime
params = format_values(params)
path = 'inventorytriggerjob'
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_list_inventory_trigger_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_list_inventory_trigger_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_get_inventory_trigger_jobs(self, Bucket, JobID, **kwargs):
""" 查询批量任务接口 https://cloud.tencent.com/document/product/460/76893
:param Bucket(string): 存储桶名称.
:param JobID(string): 任务ID
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_get_inventory_trigger_jobs(
Bucket='bucket'
JobIDs={}
)
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/inventorytriggerjob/" + JobID
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_inventory_trigger_jobs result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
logger.debug("ci_get_inventory_trigger_jobs result, url=:{url} ,content=:{content}".format(
url=url,
content=rt.content))
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['JobsDetail'])
return data
def ci_create_template(self, Bucket, Template, **kwargs):
""" 创建模板接口 https://cloud.tencent.com/document/product/460/78939
:param Bucket(string): 存储桶名称.
:param Name(string): 模板名称.
:param Template(dict): 模板详细配置
:param kwargs(dict): 设置请求的headers.
:return(dict): 创建成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建语音识别模板接口
response = client.ci_create_template(
Bucket=bucket_name,
Name='templateName',
Template='16k_zh',
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
xml_config = format_xml(data=Template, root='Request')
path = "/template"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_create_template result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='POST',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_update_template(self, Bucket, TemplateId, Template, **kwargs):
""" 更新模板接口 https://cloud.tencent.com/document/product/460/78942
:param Bucket(string): 存储桶名称.
:param TemplateId(string): 需要更新的模板ID。
:param Template(dict): 模板配置.
:param kwargs(dict): 设置请求的headers.
:return(dict): 更新成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 更新模板接口
response = client.ci_update_template(
Bucket=bucket_name,
TemplateId='t1bdxxxxxxxxxxxxxxxxx94a9',
Template={},
)
print(response)
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/xml'
params = format_values(params)
xml_config = format_xml(data=Template, root='Request')
path = "/template/" + TemplateId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_update_asr_template result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format(
url=url,
headers=headers,
params=params,
xml_config=xml_config))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
data=xml_config,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_get_template(self, Bucket, Category='Custom', Ids='', Name='', PageNumber=1, PageSize=10, **kwargs):
""" 查询模板接口 https://cloud.tencent.com/document/product/460/46943
:param Bucket(string): 存储桶名称.
:param Category(string): Official系统预设模板Custom自定义模板默认值Custom.
:param Ids(string): 模板 ID以,符号分割字符串.
:param Name(string): 模板名称前缀.
:param PageNumber(string): 第几页默认值1.
:param PageSize(string): 每页个数默认值10.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询语音识别模板接口
response = client.ci_get_template(
Bucket=bucket_name,
)
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params['category'] = Category
params['ids'] = Ids
params['name'] = Name
params['pageNumber'] = str(PageNumber)
params['pageSize'] = str(PageSize)
params = format_values(params)
path = "/template"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_get_template result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
# 单个元素时将dict转为list
format_dict(data, ['TemplateList'])
return data
def ci_delete_template(self, Bucket, TemplateId, **kwargs):
""" 删除模板接口 https://cloud.tencent.com/document/product/460/46943
:param Bucket(string): 存储桶名称.
:param TemplateId(string): 需要删除的模板ID.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 删除指定语音识别模板
response = client.ci_delete_template(
Bucket=bucket_name,
TemplateId='t1bdxxxxxxxxxxxxxxxxx94a9',
)
print(response)
return response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/template/" + TemplateId
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_delete_template result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = xml_to_dict(rt.content)
return data
def ci_open_ai_bucket(self, Bucket, **kwargs):
""" 开通AI内容识别服务 https://cloud.tencent.com/document/product/460/79593
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 开通AI内容识别服务
response, data = client.ci_open_ai_bucket(
Bucket='bucket'
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "ai_bucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_open_ai_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='POST',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml':
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_get_ai_bucket(self, Regions='', BucketName='', BucketNames='', PageNumber='', PageSize='', **kwargs):
"""查询ai处理开通状态接口 https://cloud.tencent.com/document/product/460/79594
:param Regions(string): 地域信息,例如 ap-shanghai、ap-beijing若查询多个地域以“,”分隔字符串
:param BucketName(string): 存储桶名称前缀,前缀搜索
:param BucketNames(string): 存储桶名称,以“,”分隔,支持多个存储桶,精确搜索
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_ai_bucket(
Regions='ap-chongqing,ap-shanghai',
BucketName='demo',
BucketNames='demo-1253960454,demo1-1253960454',
PageNumber='2'
PageSize='3',
)
print response
"""
return self.ci_get_bucket(Regions=Regions, BucketName=BucketName,
BucketNames=BucketNames, PageNumber=PageNumber,
PageSize=PageSize, Path='/ai_bucket', **kwargs)
def ci_close_ai_bucket(self, Bucket, **kwargs):
""" 关闭AI内容识别服务 https://cloud.tencent.com/document/product/460/95752
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 关闭AI内容识别服务
response, data = client.ci_close_ai_bucket(
Bucket='bucket'
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/" + "ai_bucket"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_close_ai_bucket result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='DELETE',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_update_ai_queue(self, Bucket, QueueId, Request={}, **kwargs):
""" 更新图片处理队列接口
:param Bucket(string): 存储桶名称.
:param QueueId(string): 队列ID.
:param Request(dict): 更新队列配置请求体.
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 创建任务接口
response = client.ci_update_ai_queue(
Bucket='bucket',
QueueId='',
Request={},
)
print response
"""
return self.ci_update_media_queue(Bucket=Bucket, QueueId=QueueId,
Request=Request, UrlPath="/ai_queue/", **kwargs)
def ci_get_ai_queue(self, Bucket, State='All', QueueIds='', PageNumber='', PageSize='', **kwargs):
"""查询ai队列接口 https://cloud.tencent.com/document/product/460/79394
:param Bucket(string): 存储桶名称.
:param QueueIds(string): 队列 ID以“,”符号分割字符串.
:param State(string): 队列状态
:param PageNumber(string): 第几页
:param PageSize(string): 每页个数
:param kwargs(dict): 设置请求的headers.
:return(dict): 查询成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 查询媒体处理队列接口
response = client.ci_get_ai_queue(
Bucket='bucket'
)
print response
"""
return self.ci_get_media_queue(Bucket=Bucket, State=State, QueueIds=QueueIds,
PageNumber=PageNumber, PageSize=PageSize,
UrlPath="/ai_queue", **kwargs)
def ci_get_hls_play_key(self, Bucket, **kwargs):
""" 获取 HLS 播放密钥 https://cloud.tencent.com/document/product/436/104292
:param Bucket(string) 存储桶名称.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取 HLS 播放密钥
response, data = client.ci_get_hls_play_key(
Bucket='bucket',
ObjectKey='',
Body={}
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
params = format_values(params)
path = "/playKey"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info(
"ci_get_hls_play_key result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='GET',
url=url,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
def ci_update_hls_play_key(self, Bucket, MasterPlayKey=None, BackupPlayKey=None, **kwargs):
""" 更新 HLS 播放密钥 https://cloud.tencent.com/document/product/436/104291
:param Bucket(string) 存储桶名称.
:param MasterPlayKey(string) 主播放密钥.
:param BackupPlayKey(string) 备播放密钥.
:param kwargs:(dict) 设置上传的headers.
:return(dict): response header.
:return(dict): 请求成功返回的结果,dict类型.
.. code-block:: python
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
client = CosS3Client(config)
# 获取 HLS 播放密钥
response, data = client.ci_get_hls_play_key(
Bucket='bucket',
ObjectKey='',
Body={}
)
print data
print response
"""
headers = mapped(kwargs)
final_headers = {}
params = {}
for key in headers:
if key.startswith("response"):
params[key] = headers[key]
else:
final_headers[key] = headers[key]
headers = final_headers
if MasterPlayKey is not None:
params['masterPlayKey'] = MasterPlayKey
if BackupPlayKey is not None:
params['backupPlayKey'] = BackupPlayKey
params = format_values(params)
path = "/playKey"
url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci)
logger.info("ci_update_hls_play_key result, url=:{url} ,headers=:{headers}, params=:{params}".format(
url=url,
headers=headers,
params=params))
rt = self.send_request(
method='PUT',
url=url,
bucket=Bucket,
auth=CosS3Auth(self._conf, path, params=params),
params=params,
headers=headers,
ci_request=True)
data = rt.content
response = dict(**rt.headers)
if 'Content-Type' in response:
if response['Content-Type'] == 'application/xml' and 'Content-Length' in response and \
response['Content-Length'] != 0:
data = xml_to_dict(rt.content)
format_dict(data, ['Response'])
elif response['Content-Type'].startswith('application/json'):
data = rt.json()
return response, data
if __name__ == "__main__":
pass