Beispiel #1
0
    def __init__(self, key):
        """

        :param key: 秘钥
        """
        Assert.is_true(is_not_empty(key), 'AES 秘钥不能为空')
        self.key = key
Beispiel #2
0
    def lexer(self, text, ne_list=[], url=None):
        """
        词法分析
        :param url:
        :param text:
        :param ne_list: 过滤命名实体类型
        :return:
        """
        url = url if url else getattr(self, 'lexer_url', None)
        url = url.format(access_token=self.token)
        res = requests.post(url=url,
                            data=json.dumps(obj={'text': text}),
                            headers=ContentType.JSON_UTF8.value)
        res.encoding = encodes.Unicode.UTF_8.value

        if res is None or res.status_code != codes.ok:
            raise MyError(code=codes.failed, msg='百度词法分析请求失败.')

        lexer_res, errors = LexerRes.LexerResSchema().load(
            res.json())  # type: LexerRes
        Assert.is_true(is_empty(errors), errors)

        if is_not_empty(ne_list):
            for lexer_item in lexer_res.items[:]:
                if lexer_item.ne not in ne_list:
                    # 根据实体列表过滤
                    lexer_res.items.remove(lexer_item)
        return lexer_res
Beispiel #3
0
 def __init__(self, api_key=None, secret_key=None, baidu_cloud=None):
     """
     百度云图像识别
     :param str api_key: 应用的API Key
     :param str secret_key: 应用的Secret Key
     :param BaiduCloud baidu_cloud:
     """
     self.token = None
     if is_not_empty(api_key) and is_not_empty(secret_key):
         baidu_cloud = BaiduCloud(api_key, secret_key)
         baidu_cloud.init_token()
     elif is_not_empty(baidu_cloud) and is_not_empty(baidu_cloud.token):
         pass
     else:
         raise MyError('缺失鉴权 Token 参数.')
     self.token = baidu_cloud.token
Beispiel #4
0
    def _format_convert(cls,
                        input_file,
                        output_file,
                        output_ac,
                        output_ar,
                        input_ac=None,
                        input_ar=None,
                        input_format=None,
                        input_acodec=None,
                        output_format=None,
                        output_acodec=None):
        """
        音频文件格式转换
        :param input_file:
        :param output_file:
        :param output_ac:
        :param output_ar:
        :param input_ac:
        :param input_ar:
        :param input_format:
        :param input_acodec:
        :param output_format:
        :param output_acodec:
        :return:
        """
        output_dir, _, _ = FileUtil.get_path_name_ext(output_file,
                                                      is_strict=False)
        FileUtil.creat_dirs(output_dir)

        if cls.is_pcm(input_file):
            # 格式为 pcm 格式,需要音频文件参数
            Assert.is_true((is_not_empty(input_ac) and is_not_empty(input_ar)
                            and is_not_empty(input_format)
                            and is_not_empty(input_acodec)), 'pcm 缺失文件参数')

        _, error = (ffmpeg.input(
            input_file,
            **cls._file_args(
                input_format, input_acodec, input_ac, input_ar)).output(
                    output_file,
                    **cls._file_args(output_format, output_acodec, output_ac,
                                     output_ar)).run(capture_stdout=False,
                                                     overwrite_output=True))
Beispiel #5
0
 def _file_args(cls, format=None, acodec=None, ac=None, ar=None):
     """
     音频文件参数信息
     :param str format: 格式
     :param str acodec: 编码器
     :param int ac: 声道数
     :param int ar: 采样率
     :return:
     """
     file_dict_args = {}
     if is_not_empty(format):
         file_dict_args['format'] = format
     if is_not_empty(acodec):
         file_dict_args['acodec'] = acodec
     if is_not_empty(ac):
         file_dict_args['ac'] = ac
     if is_not_empty(ar):
         file_dict_args['ar'] = ar
     return file_dict_args
Beispiel #6
0
        def decorated_function(*args, **kwargs):
            args_tuple = args[1:]
            if is_not_empty(args_tuple):
                return func(*args, **kwargs)

            try:
                kwargs_dict = current_app.get_object_dict(key)
                kwargs_dict.update(kwargs)
                return func(*args, **kwargs_dict)
            except RuntimeError:
                # 未创建 flask 上下文,直接返回原参数
                return func(*args, **kwargs)
Beispiel #7
0
    def __init__(self, app_id=None, api_key=None, secret_key=None, baidu_cloud=None, **kwargs):
        """
        音频应用
        :param app_id:
        :param api_key:
        :param secret_key:
        :param baidu_cloud:
        """
        self.app_id = app_id
        self.token = None
        if is_not_empty(api_key) and is_not_empty(secret_key):
            baidu_cloud = BaiduCloud(api_key, secret_key)
            baidu_cloud.init_token()
        elif is_not_empty(baidu_cloud) and is_not_empty(baidu_cloud.token):
            pass
        else:
            raise MyError('缺失鉴权 Token 参数.')
        self.token = baidu_cloud.token

        if kwargs:
            for key, value in kwargs.items():
                setattr(self, key, value)
Beispiel #8
0
    def __init__(self, app_id=None, api_key=None, sign=None, **kwargs):
        """
        讯飞开放平台数字签名
        :param str app_id: 讯飞开放平台应用ID
        :param str api_key: 讯飞开放平台应用秘钥
        :param Sign sign: 讯飞开放平台数字签名对象

        """
        if is_not_empty(app_id) and is_not_empty(api_key):
            sign = Sign(app_id, api_key)
        elif is_not_empty(sign) and is_not_empty(sign.signa):
            pass
        else:
            raise MyError('缺失数字签名参数.')

        self.app_id = app_id
        self.ts = sign.ts
        self.signa = sign.signa
        self.task_id = None

        if kwargs:
            for key, value in kwargs.items():
                setattr(self, key, value)
Beispiel #9
0
def amount_formatting(s, formats):
    """
    金额格式化
    :param s:
    :param formats:
    :return:
    """
    try:
        if is_not_empty(s):
            for format in formats:
                s = s.replace(format, '')
            return float(s.strip())
        return None
    except:
        return None
Beispiel #10
0
 def init_token(self):
     """
     百度云鉴权接口
     :return:
     :rtype:Token
     """
     res = requests.post(url=self.token_url, headers=ContentType.JSON_UTF8.value)
     res.encoding = encodes.Unicode.UTF_8.value
     if res is None or res.status_code != codes.ok:
         raise MyError(
             code=codes.server_error,
             msg='百度云鉴权请求失败【{0}】'.
                 format(res.status_code if res is not None else codes.bad)
         )
     token, _ = Token.TokenSchema().load(res.json())
     if is_not_empty(token.error):
         raise MyError(
             code=codes.server_error,
             msg='百度云鉴权失败【{0}】: {1}'.format(token.error, token.error_description)
         )
     self.token = token.access_token
     return token
Beispiel #11
0
def digest(input_str, salt, hash_cls, iterations):
    """
    对字符串进行散列, 支持md5与sha1算法.
    :param str input_str: 待散列字符
    :param bytes salt: 盐
    :param str hash_cls: 算法实例
    :param int iterations: 跌算次数
    :return:
    """
    from utils.encodes import Unicode

    _hash_model = 'hashlib'

    hash_instance = create_instance(_hash_model, hash_cls)
    if is_not_empty(salt):
        hash_instance.update(salt)

    hash_instance.update(bytes(input_str, encoding=Unicode.UTF_8.value))
    res = hash_instance.digest()

    for i in range(1, iterations):
        res = create_instance(_hash_model, hash_cls, res).digest()
    return res
Beispiel #12
0
        def decorated_function(*args, **kwargs):
            # 根据参数类型实例化序列化实例
            cls = schema_cls
            if isinstance(cls, type):
                cls = cls(*s, **ks)
            elif isinstance(cls, basestring):
                cls = create_instance(module_name, cls, *s, **ks)

            keys, res = func(*args, **kwargs)

            if not res:
                return res

            # 查询转字典
            res_add = Dict(dict(zip(keys, res)))
            res_dic = res_add.load_nest()

            # 字典反序列化
            entity, errors = cls.load(res_dic, partial=cls.partial_db())

            if is_not_empty(errors):
                raise MyError(msg=errors)
            return entity
Beispiel #13
0
    def pdf_to_pic(path,
                   pic_dir,
                   format=FileFormat.JPG.value,
                   loss=True,
                   gamma=True,
                   zoom=210,
                   min_size=1.50,
                   max_size=15.0):
        """
        从pdf中提取图片
        :param path: pdf的路径
        :param pic_dir: 图片保存的路径
        :param format: 图片格式
        :param bool loss: 是否压缩
        :param bool gamma: 是否 gamma 矫正
        :param int zoom: 保存图片分辨率
        :param min_size: 文件大小最小阈值
        :param max_size: 文件大小最大阈值
        :return: {page_num, success_num, fail_num, msg}
        """
        Assert.is_true(os.path.isfile(path), '文件不存在, path: {0}'.format(path))
        page_num, success_num, fail_num = 0, 0, 0
        detail_info = {'images': []}
        pdf = None
        # 初始化图片压缩
        pngquant = PngQuant(min_quality=80,
                            max_quality=100,
                            tmp_file=os.path.join(pic_dir, 'quant.tmp.png'))

        try:
            FileUtil.creat_dirs(pic_dir)
            pdf = fitz.Document(path)
            page_num = pdf.pageCount

            for pg in range(page_num):
                pg_zoom = zoom
                pm_dict = {'page_code': pg + 1}
                try:
                    page = pdf[pg]  # type: Page
                    trans = fitz.Matrix(pg_zoom / 100.0,
                                        pg_zoom / 100.0).preRotate(0)
                    pm = page.getPixmap(matrix=trans, alpha=False)  # 获得每一页的流对象
                    page_path = FileUtil.path_join(pic_dir, '{0}.{1}'.format(
                        (pg + 1), format))  # 图片路径
                    pm.writeImage(page_path)  # 保存图片

                    file_size = FileUtil.get_file_size(page_path)
                    if file_size <= min_size:
                        # 低于最小阀值
                        pg_zoom = zoom * 2
                        trans = fitz.Matrix(pg_zoom / 100.0,
                                            pg_zoom / 100.0).preRotate(0)
                        pm = page.getPixmap(matrix=trans, alpha=False)
                        pm.writeImage(page_path)
                    elif file_size >= max_size:
                        # 大于最大阀值
                        pg_zoom = zoom * 2 / 3
                        trans = fitz.Matrix(pg_zoom / 100.0,
                                            pg_zoom / 100.0).preRotate(0)
                        pm = page.getPixmap(matrix=trans, alpha=False)
                        pm.writeImage(page_path)

                    if gamma:
                        # gamma 矫正
                        Enhancer().enhance(page_path, False, False, False,
                                           False, True)

                    if loss:
                        # 对图片进行近无损压缩
                        pngquant.quant_image(page_path)

                    pm_dict['img_path'] = page_path
                    success_num = success_num + 1
                except Exception as e:
                    page_path = pm_dict.get('img_path', '')
                    if is_not_empty(page_path):
                        pm_dict.pop('img_path')
                    if os.path.isfile(page_path):
                        # 处理失败,删除失败文件
                        FileUtil.del_file(page_path)
                    pm_dict['error_msg'] = repr(e) if repr(e) else 'pdf转图片失败'
                    fail_num = fail_num + 1
                finally:
                    detail_info.get('images').append(pm_dict)
        except Exception as e1:
            detail_info['error_msg'] = repr(e1) if repr(e1) else '处理pdf失败'
        finally:
            if is_not_empty(pdf):
                pdf.close()
        if success_num + fail_num != page_num:
            fail_num = page_num - success_num
        return page_num, success_num, fail_num, detail_info