腾讯云使用

注:本文的所有演示的代码都基于尚硅谷的尚乐代驾项目

对象存储COS

一种云存储器

官方文档:

对象存储 快速入门-SDK 文档-文档中心-腾讯云 (tencent.com)

一  上传文件

1  初始化客户端

官方示例:

// 1 传入获取到的临时密钥 (tmpSecretId, tmpSecretKey, sessionToken)
String tmpSecretId = "SECRETID";
String tmpSecretKey = "SECRETKEY";
String sessionToken = "TOKEN";
BasicSessionCredentials cred = new BasicSessionCredentials(tmpSecretId, tmpSecretKey, sessionToken);
// 2 设置 bucket 的地域
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分
Region region = new Region("COS_REGION"); //COS_REGION 参数:配置成存储桶 bucket 的实际地域,例如 ap-beijing,更多 COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(region);
// 3 生成 cos 客户端
COSClient cosClient = new COSClient(cred, clientConfig);

自己实际用的。尚硅谷的乐尚代驾内的内容。这里面要自己定义一个配置类,将腾讯云存储的相关的属性写到yml文件中,然后用配置类读取。这里没用到token

// 1 初始化用户身份信息(secretId, secretKey)。
        String secretId = tencentCloudProperties.getSecretId();
        String secretKey = tencentCloudProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的地域, COS 地域
        Region region = new Region(tencentCloudProperties.getRegion());
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用 https 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);

2  上传文件

官方示例:

// 指定要上传的文件
File localFile = new File(localFilePath);
// 指定文件将要存放的存储桶
String bucketName = "examplebucket-1250000000";
// 指定文件上传到 COS 上的路径,即对象键。例如对象键为 folder/picture.jpg,则表示将文件 picture.jpg 上传到 folder 路径下
String key = "folder/picture.jpg";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

自己修改的

//文件上传
        //元数据信息
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentLength(file.getSize());
        meta.setContentEncoding("UTF-8");
        meta.setContentType(file.getContentType());

        //向存储桶中保存文件
        String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); //文件后缀名
        String uploadPath = "/driver/" + path + "/" + UUID.randomUUID().toString().replaceAll("-", "") + fileType;
        // 01.jpg
        // /driver/auth/0o98754.jpg
        PutObjectRequest putObjectRequest = null;
        try {
            //1 bucket名称
            //2
            putObjectRequest = new PutObjectRequest(tencentCloudProperties.getBucketPrivate(),
                    uploadPath,
                    file.getInputStream(),
                    meta);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        putObjectRequest.setStorageClass(StorageClass.Standard);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); //上传文件
        cosClient.shutdown();

这里区别有点大:

两段代码示例都是关于使用腾讯云 COS Java SDK 来上传文件到 COS 存储桶的。它们展示了两种不同的上传方式,但都实现了相同的目标。下面是它们之间的关系和区别:

  1. 基本上传:

    • 第一段代码是一个更简单的上传示例,它直接使用本地文件对象 localFile 和目标路径 key 来创建 PutObjectRequest 请求。
    • 它没有设置任何额外的元数据信息,直接使用文件的默认属性。
  2. 带元数据的上传:

    • 第二段代码在上传文件之前设置了一些元数据信息,例如内容长度、内容编码和内容类型。
    • 它还生成了一个随机的文件名和路径,以确保上传的文件名是唯一的。

两段代码的共同点:

  • 都使用了 PutObjectRequest 来设置上传请求的参数。
  • 都调用了 cosClient.putObject 方法来执行上传操作,并接收 PutObjectResult 作为响应。

不同点:

  • 第一段代码直接使用本地文件进行上传,而第二段代码使用文件输入流 file.getInputStream()
  • 第二段代码设置了更多的元数据信息,这在需要自定义文件属性时非常有用。
  • 第二段代码中还设置了存储类别 StorageClass,这可以影响文件的存储成本和可用性。

在实际应用中,你可以根据需求选择使用哪种方式。如果你需要上传的文件已经存在于本地文件系统中,并且不需要设置特殊的元数据,那么可以使用第一段代码的方式。如果你需要更多的控制,比如设置自定义的元数据、生成唯一的文件名或者使用文件流,那么第二段代码的方式可能更适合你。

二  回显url

1  详细信息

对象存储 生成预签名 URL-SDK 文档-文档中心-腾讯云 (tencent.com)

这个支持我们上传了文件之后,来获得这个文件的url

生成临时访问URL的功能不仅限于图片文件,它适用于所有存储在腾讯云对象存储(COS)中的文件类型,包括但不限于:

  • 图片文件(如.jpg, .png, .gif等)
  • 文档文件(如.pdf, .docx, .xlsx等)
  • 视频文件(如.mp4, .mov等)
  • 音频文件(如.mp3, .wav等)
  • 以及其他任何格式的文件

要获取其他类型文件的临时访问URL,你只需要将文件路径作为参数传递给getImageUrl方法,方法本身会生成一个适用于该路径的临时URL,无论该路径指向的是图片还是其他类型的文件。

生成预签名 URL

对象存储(Cloud Object Storage,COS)支持使用预签名 URL 进行对象的上传、下载,原理是将签名嵌入 URL 生成签名链接

2  代码编写

官方给的创造临时URL的示例代码:

// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:创建 COSClient
COSClient cosClient = createCOSClient();

// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = "examplebucket-1250000000";
// 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://cloud.tencent.com/document/product/436/13324)
String key = "exampleobject";

GeneratePresignedUrlRequest req =
        new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);

// 设置下载时返回的 http 头
ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
String responseContentType = "image/x-icon";
String responseContentLanguage = "zh-CN";
// 设置返回头部里包含文件名信息
String responseContentDispositon = "filename=exampleobject";
String responseCacheControl = "no-cache";
String cacheExpireStr =
        DateUtils.formatRFC822Date(new Date(System.currentTimeMillis() + 24L * 3600L * 1000L));
responseHeaders.setContentType(responseContentType);
responseHeaders.setContentLanguage(responseContentLanguage);
responseHeaders.setContentDisposition(responseContentDispositon);
responseHeaders.setCacheControl(responseCacheControl);
responseHeaders.setExpires(cacheExpireStr);

req.setResponseHeaders(responseHeaders);

// 设置签名过期时间(可选),若未进行设置,则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
req.setExpiration(expirationDate);

// 填写本次请求的参数
req.addRequestParameter("param1", "value1");
// 填写本次请求的头部
// host 必填
req.putCustomRequestHeader(Headers.HOST, cosClient.getClientConfig().getEndpointBuilder().buildGeneralApiEndpoint(bucketName));
req.putCustomRequestHeader("header1", "value1");

URL url = cosClient.generatePresignedUrl(req);
System.out.println(url.toString());

// 确认本进程不再使用 cosClient 实例之后,关闭即可
cosClient.shutdown();

其中我们主要用到这两个方法:

2.1  创建请求对象
GeneratePresignedUrlRequest req =
        new GeneratePresignedUrlRequest(bucketName, key, HttpMethodName.GET);
  1. 创建请求对象:这行代码创建了一个GeneratePresignedUrlRequest的实例,这个实例包含了生成预签名URL所需的所有信息。

  2. 参数说明

    • bucketName:这是一个String类型的参数,表示您要访问的COS存储桶的名称。存储桶名称通常遵循BucketName-APPID的格式,其中APPID是您在腾讯云平台的账户标识。
    • key:这也是一个String类型的参数,表示存储桶中对象的唯一标识符,也就是对象键(Key)。
    • HttpMethodName.GET:这是一个枚举类型的参数,表示您希望对COS对象执行的HTTP方法。在这个例子中,使用GET方法,意味着生成的URL将用于下载或读取对象。
  3. 作用:创建GeneratePresignedUrlRequest对象的主要作用是为了生成一个可以在指定HTTP方法下访问COS对象的URL,而无需提供用户的永久密钥。这个URL将在一定时间后过期,提供临时的访问权限。

  4. 后续操作:创建了GeneratePresignedUrlRequest对象之后,您可能还需要设置其他属性,比如过期时间(setExpiration方法)、响应头(setResponseHeaders方法)等,然后使用COSClient实例的generatePresignedUrl方法来生成最终的预签名URL。

2.2  创建最终的URL
URL url = cosClient.generatePresignedUrl(bucketName, key, expirationDate, method, headers, params);
  1. 方法调用cosClient.generatePresignedUrl是一个方法调用,它属于COSClient类,用于生成一个预签名URL。

  2. 参数

    • bucketName:存储桶的名称,格式通常是BucketName-APPID
    • key:对象在存储桶中的唯一标识符,即对象键(Key)。
    • expirationDate:预签名URL的过期时间,表示这个URL在何时之后将不再有效。这个时间是基于当前时间加上一个额外的时间(例如,30分钟或1小时)来设置的。
    • method:一个HttpMethodName枚举,表示这个预签名URL将用于哪种HTTP方法,例如GETPUT等。
    • headers:一个Map<String, String>,包含要包含在签名中的HTTP头部信息。这个参数是可选的,如果不需要特别指定头部,可以传递一个空的Map或者null。
    • params:一个Map<String, String>,包含要包含在URL查询字符串中的参数。这个参数也是可选的。
  3. 返回值:方法返回一个URL对象,这个对象包含了生成的预签名URL。这个URL可以被用于在指定的过期时间之前执行指定的HTTP方法来访问COS上的对象。

  4. 作用:生成的预签名URL允许用户在没有密钥的情况下访问COS资源。这在需要临时授权他人访问某个资源时非常有用,例如,允许用户下载一个文件而不需要他们拥有访问存储桶的权限。

  5. 安全性:预签名URL的安全性在于它结合了存储桶策略、密钥和过期时间,确保了只有拥有这个URL的用户才能在有限的时间内访问特定的资源。

  6. 使用场景:这个预签名URL可以用于多种场景,包括但不限于:

    • 临时分享文件下载链接。
    • 允许第三方服务在没有密钥的情况下上传文件到您的存储桶。
    • 实现一个安全的、无需密钥的文件上传或下载接口。

2.3  项目实际的使用

具体代码的临时回调地址实现:

将腾讯对象存储的桶,所需要上传文件的url,和方法的请求类型作为参数创建一个GeneratePresignedUrlRequest对象,设置了临时的时间,并传入了腾讯云服务的客户端对象里面,获取了url。

   public String getImageUrl(String path) {
        if(!StringUtils.hasText(path)) return "";
        //获取cosclient对象
        COSClient cosClient = this.getCosClient();
        //GeneratePresignedUrlRequest
        GeneratePresignedUrlRequest request =
                new GeneratePresignedUrlRequest(tencentCloudProperties.getBucketPrivate(),
                        path, HttpMethodName.GET);
        //设置临时URL有效期为15分钟
        Date date = new DateTime().plusMinutes(15).toDate();
        request.setExpiration(date);
        //调用方法获取
        URL url = cosClient.generatePresignedUrl(request);
        cosClient.shutdown();
        return url.toString();
    }
}

认证功能

一  腾讯云身份证认证接口

在做这些认证接口之前要去开通相应的服务,比如文字识别服务

官方文档:

API Explorer - 云 API - 控制台 (tencent.com)

1  使用说明

点击地址后,我们看到这个页面

其中我们注意到中间和右边的。中间是可选项,右边是示例代码。我们输入region,并选择要认证的文件为base64格式。如图所示。

2  实现代码

之后下面就是示代码

package com.tencent;
import com.tencentcloudapi.common.AbstractModel;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.ocr.v20181119.OcrClient;
import com.tencentcloudapi.ocr.v20181119.models.*;

public class Sample
{
    public static void main(String [] args) {
        try{
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("SecretId", "SecretKey");
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            IDCardOCRRequest req = new IDCardOCRRequest();
            req.setImageBase64("1");
            // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
            IDCardOCRResponse resp = client.IDCardOCR(req);
            // 输出json格式的字符串回包
            System.out.println(AbstractModel.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }
}

稍作修改后,我们项目最终的代码。

        try {
            //图片转换base64格式字符串
            byte[] base64 = Base64.encodeBase64(file.getBytes());
            String fileBase64 = new String(base64);
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            Credential cred = new Credential
                    (tencentCloudProperties.getSecretId(), tencentCloudProperties.getSecretKey());
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, tencentCloudProperties.getRegion(), clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象,并把图片设置进去
            IDCardOCRRequest req = new IDCardOCRRequest();
            req.setImageBase64(fileBase64);
            // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
            IDCardOCRResponse resp = client.IDCardOCR(req);
            }
            return idCardOcrVo;
        } catch (Exception e) {
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }

验证驾驶证以及其他验证相关的功能和上面同理

腾讯位置服务地图选点

一  介绍

他主要有六种服务。我们这里使用距离计算服务

二  前提准备

使用“腾讯位置服务地图选点”插件时,我们要开通“腾讯位置服务”,并且设置授权APP ID,这样才能使用正确使用选点服务

第一步: 访问腾讯官网 https://lbs.qq.com/

第二步 进行注册,手机号或者微信或者其他方式

第三步 使用注册账号进行登录,找到控制台

第四步 在应用管理 -- 我的应用 ,创建应用

第五步 在创建应用中,添加key

第六步 找到添加key的值,要自己保存起来

三  代码演示

官方的接口文档:

WebService API | 腾讯位置服务 (qq.com)

1  封装从前端传来的数据

这四个值是后面请求接口需要用到的

@Data
public class CalculateDrivingLineForm {

    @Schema(description = "起始地点经度")
    private BigDecimal startPointLongitude;

    @Schema(description = "起始点伟度")
    private BigDecimal startPointLatitude;

    @Schema(description = "结束地点经度")
    private BigDecimal endPointLongitude;

    @Schema(description = "结束地点经度")
    private BigDecimal endPointLatitude;
}

2  封装前提准备中所申请服务的key

这个也是后面请求接口需要用到的。

我们将他放在配置文件里面,用一个变量提取出来,避免硬编码。

配置文件  :

读取配置文件

@Value("tencent.cloud.map")
    private String key;

3  发送请求并处理结果

我们对请求的地址进行处理,用RestTemplate发送请求,将结果返回给前端

 //计算驾驶线路
    @Override
    public DrivingLineVo calculateDrivingLine(CalculateDrivingLineForm calculateDrivingLineForm) {
        // 向微信提供的接口地址发送请求,处理返回值
        /*
        https://apis.map.qq.com/ws/direction/v1/driving/
        ?from=39.915285,116.403857
        &to=39.915285,116.803857
        key=[你的key]
         */

        //1  定义原始的url,将里面的参数给替代掉
        String url = "https://apis.map.qq.com/ws/direction/v1/driving/" +
                "        ?from={from}" +
                "        &to={to}" +
                "        key={key}";

        //2 替代起始经纬度
        String begin = calculateDrivingLineForm.getStartPointLatitude() + "," +
                calculateDrivingLineForm.getStartPointLongitude();
        url.replace("{from}", begin);

        //3 代替终点经纬度
        String end = calculateDrivingLineForm.getEndPointLatitude() + "," +
                calculateDrivingLineForm.getEndPointLongitude();
        url.replace("{to}", end);

        //4 代替我的key
        url.replace("key", key);

        //5 利用restTemplate来发送请求,获得返回值
        JSONObject result = restTemplate.getForObject(url, JSONObject.class);

        //6 处理返回结果 判断调用是否成功
        int status = result.getIntValue("status");
        if(status != 0) {
            //失败
            throw new GuiguException(ResultCodeEnum.MAP_FAIL);
        }

        //7 获取返回路线信息  他会有三条路径,第一条是最优的,所以get 0
        JSONObject route =
                result.getJSONObject("result").getJSONArray("routes").getJSONObject(0);

        //8  创建vo对象
        DrivingLineVo drivingLineVo = new DrivingLineVo();
        //预估时间
        drivingLineVo.setDuration(route.getBigDecimal("duration"));
        //距离  6.583 == 6.58 / 6.59
        drivingLineVo.setDistance(route.getBigDecimal("distance")
                .divide(new BigDecimal(1000))
                .setScale(2, RoundingMode.HALF_UP));
        //路线
        drivingLineVo.setPolyline(route.getJSONArray("polyline"));

        return drivingLineVo;
    }

4  替换字符串方法

String Str.replace(oldvalue, newvalue);

oldvalue是想要替代的值,newvalue是替代的值。返回值是替代完后的值

我们上面代码中

 //5 利用restTemplate来发送请求,获得返回值
        JSONObject result = restTemplate.getForObject(url, JSONObject.class);

这行代码做了以下几件事情:

  1. 使用RestTemplate: restTemplate 是Spring框架提供的一个用于发起HTTP请求的工具类。它简化了HTTP客户端的使用,使得发起网络请求变得更加简单。

  2. 发起GET请求: 这行代码使用 getForObject 方法发起了一个GET请求。getForObject 是RestTemplate中用于发送GET请求并将响应体映射为对象的方法。

  3. 请求URL: url 是一个字符串,包含了请求的完整URL地址。

  4. 返回类型: JSONObject.class 指定了响应体应该被映射(转换成)的类型。这意味着服务器返回的JSON响应将被转换成一个 JSONObject 对象。

  5. 结果赋值: 转换后的 JSONObject 对象被赋值给变量 result。之后,你可以使用这个 result 对象来访问JSON响应中的各种属性和值。

我们将map对应的属性给url赋值。这是restTemplate封装的方法。

腾讯云数据万象服务CI

官网地址:https://cloud.tencent.com/product/ci

API文档地址:https://cloud.tencent.com/document/product/460/57227

一  介绍

数据万象(Cloud Infinite,CI)是依托腾讯云对象存储的数据处理平台,涵盖图片处理、内容审核、媒体处理、AI 识别、文档预览等功能,为客户提供一站式的专业数据处理解决方案,满足您多种业务场景的需求。

我们项目中很多业务都可以使用腾讯云的数据万象服务,比如审核司机上传的身份证、驾驶证照片与手持证件照片等是否包含暴力色情的内容,还有审核代驾过程对话记录是否含有暴力色情等等。如果用人工审核,速度太慢,所以我们需要用数据万象的AI引擎来帮我们审核。

二  开通数据万象服务

开通服务后,绑定我们需要处理的cos的桶,手动绑定

三  具体审核

1  审核图片

根据path读取内容并审核。这里我们审核图片。

@Autowired
    private TencentCloudProperties tencentCloudProperties;

    private COSClient getPrivateCOSClient() {
        COSCredentials cred = new BasicCOSCredentials(tencentCloudProperties.getSecretId(), tencentCloudProperties.getSecretKey());
        ClientConfig clientConfig = new ClientConfig(new Region(tencentCloudProperties.getRegion()));
        clientConfig.setHttpProtocol(HttpProtocol.https);
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

    @Override
    public Boolean imageAuditing(String path) {
        COSClient cosClient = this.getPrivateCOSClient();

        //审核图片内容
        //1.创建任务请求对象
        ImageAuditingRequest request = new ImageAuditingRequest();
        //2.添加请求参数 参数详情请见 API 接口文档
        //2.1设置请求 bucket
        request.setBucketName(tencentCloudProperties.getBucketPrivate());
        //2.2设置审核策略 不传则为默认策略(预设)
        //request.setBizType("");
        //2.3设置 bucket 中的图片位置
        request.setObjectKey(path);
        //3.调用接口,获取任务响应对象
        ImageAuditingResponse response = cosClient.imageAuditing(request);
        cosClient.shutdown();
        //用于返回该审核场景的审核结果,返回值:0:正常。1:确认为当前场景的违规内容。2:疑似为当前场景的违规内容。
        if (!response.getPornInfo().getHitFlag().equals("0")
                || !response.getAdsInfo().getHitFlag().equals("0")
                || !response.getTerroristInfo().getHitFlag().equals("0")
                || !response.getPoliticsInfo().getHitFlag().equals("0")
        ) {
            return false;
        }
        return true;
    }

然后在我们上传图片的接口调用这个方法。如果发现违规,删除存放的照片并报错

Boolean imageAuditing = ciService.imageAuditing(uploadPath);
if(!imageAuditing) {
    //删除违规图片
    cosClient.deleteObject(tencentCloudProperties.getBucketPrivate(),uploadPath);
    throw new GuiguException(ResultCodeEnum.IMAGE_AUDITION_FAIL);
}

2  审核文本(语音转过来的文字)

@Override
    public TextAuditingVo textAuditing(String content) {
        // 判断传过来的语音有没有内容
        if(!StringUtils.hasText(content)) {
            TextAuditingVo textAuditingVo = new TextAuditingVo();
            textAuditingVo.setResult("0");
            return textAuditingVo;
        }
        // 创建客户端
        COSClient cosClient = this.getPrivateCOSClient();

        TextAuditingRequest request = new TextAuditingRequest();
        request.setBucketName(tencentCloudProperties.getBucketPrivate());

        //将图片转换为base64字符串
        byte[] encoder = org.apache.commons.codec.binary.Base64.encodeBase64(content.getBytes());
        String contentBase64 = new String(encoder);
        request.getInput().setContent(contentBase64);
        request.getConf().setDetectType("all");

        TextAuditingResponse response = cosClient.createAuditingTextJobs(request);
        AuditingJobsDetail detail = response.getJobsDetail();
        TextAuditingVo textAuditingVo = new TextAuditingVo();
        if ("Success".equals(detail.getState())) {
            //检测结果: 0(审核正常),1 (判定为违规敏感文件),2(疑似敏感,建议人工复核)。
            String result = detail.getResult();

            //违规关键词
            StringBuffer keywords = new StringBuffer();
            List<SectionInfo> sectionInfoList = detail.getSectionList();
            for (SectionInfo info : sectionInfoList) {
                String pornInfoKeyword = info.getPornInfo().getKeywords();
                String illegalInfoKeyword = info.getIllegalInfo().getKeywords();
                String abuseInfoKeyword = info.getAbuseInfo().getKeywords();
                if (pornInfoKeyword.length() > 0) {
                    keywords.append(pornInfoKeyword).append(",");
                }
                if (illegalInfoKeyword.length() > 0) {
                    keywords.append(illegalInfoKeyword).append(",");
                }
                if (abuseInfoKeyword.length() > 0) {
                    keywords.append(abuseInfoKeyword).append(",");
                }
            }
            textAuditingVo.setResult(result);
            textAuditingVo.setKeywords(keywords.toString());
        }
        return textAuditingVo;
    }

调用方法来审核:

//增加文本审核
        TextAuditingVo textAuditingVo =
                ciFeignClient.textAuditing(orderMonitorForm.getContent()).getData();
        orderMonitorRecord.setResult(textAuditingVo.getResult());
        orderMonitorRecord.setKeywords(textAuditingVo.getKeywords());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt | ubuntu20.04安装Qt6.5.3并创建一个example完整教程(涉及诸多开发细节,商用慎重)

点击上方"蓝字"关注我们 01、下载 >>> 下载Qt在线安装包 这里采用镜像地址进行下载,避免网络过慢。 镜像地址:http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.5/ 选择最新版本下载,如截至目前最新版本为qt-unified-linux-x64-4.5.2…

Python数据分析于可视化

Python数据分析于可视化 一、前言二、引言三、需求分析四、系统设计1.系统功能结构2.系统业务流程图 五、系统开发必备 一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;让我们一起来学习Python数据分析于可视化。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连…

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…

国外创意二维码应用案例:迪卡侬太会搞事情了!

想必大家还记得前不久轰动全球的蓝屏事件。多个国家多个行业的大量用户都受到了影响&#xff0c;就在航空公司、银行、超市、酒店、电信、媒体……因为突发的电脑蓝屏故障而手忙脚乱的时候&#xff0c;迪卡侬&#xff08;Decathlon&#xff09;却在这场“危机”中看到了机会。 …

VScode安装和使用教程,2024最新最全,零基础入门到精通,看完这一篇就够了!

# VSCode 安装使用教程&#xff08;图文版&#xff09; 工欲善其事&#xff0c;必先利其器 对于我们每一位软件工程师来说&#xff0c;都要有自己顺手的 IDE 开发工具&#xff0c;它就是我们的武器。 一个好用的 IDE 不仅能提升我们的开发效率&#xff0c;还能让我们保持愉悦…

51单片机+proteus仿真+基本实验学习1(跑马灯、独立按键和数码管)

目录 1.实验一跑马灯 1.1代码的生成 1.1.151单片机的延时函数的生成 1.1.251单片机的流水灯代码编写 1.2仿真框图 2.实验二I/O独立按键 2.1基本概念 2.1.1按键所需的基本知识 2.2代码的生成 2.2.1头文件定义的代码 2.2.2 执行代码 2.3仿真图 ​3实验三数码管 3.1基…

CentOS镜像源更新

如果 CentOS 7.9 的官方镜像源已不维护&#xff0c;你可以使用以下方法更新&#xff1a; 切换到其他镜像源&#xff1a;使用 CentOS 镜像站点或第三方镜像源&#xff0c;如 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;。修改 /etc/yum.repos.d/CentOS-Ba…

电商API接口安全:构建稳固的数字防线

电子商务的蓬勃发展带来了前所未有的便利&#xff0c;同时也带来了新的安全挑战。API接口作为电商系统的核心组件&#xff0c;其安全性直接关系到企业的数据安全和业务连续性。因此&#xff0c;评估和加固电商API接口的安全性变得尤为重要。 电商API接口安全的重要性 电商API接…

Android生成Java AIDL

AIDL:Android Interface Definition Language AIDL是为了实现进程间通信而设计的Android接口语言 Android进程间通信有多种方式&#xff0c;Binder机制是其中最常见的一种 AIDL的本质就是基于对Binder的运用从而实现进程间通信 这篇博文从实战出发&#xff0c;用一个尽可能…

《深入浅出AI》前言知识:机器学习知识总结

&#x1f468;‍&#x1f4bb;面向对象&#xff1a; 本篇前言知识主要介绍机器学习&#xff0c;方便小白或AI爱好者学习基础知识。 &#x1f49a;友情提醒&#xff1a; 本文内容可能未能含概机器学习所有知识点&#xff0c;其他内容可以访问本人主页其他文章或个人博客&#xf…

【devops】devops-git之介绍以及日常使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座

数字化办公时代&#xff0c;企业升级 IT 基础设施&#xff0c;已不再是选择题&#xff0c;而是必答题。 数字化办公时代&#xff0c;企业为何要升级 IT 基础设施&#xff1f; 随着时代变化与科技进步&#xff0c;人们的工作方式也发生了巨大变化。如今&#xff0c;远程办公、全…

算法导论 总结索引 | 第五部分 第二十四章:单源最短路径

1、在最短路径问题中&#xff0c;给定一个带权重的有向图 G (V, E) 和权重函数 w: E→R &#xff0c;该权重函数 将每条边映射到实数值的权重上。图中一条路径 p 〈v0, v1, …, vk〉 的权重 w(p) 是构成该路径的 所有边的权重之和&#xff1a; 定义从结点 u 到结点 v 的最短路…

电压跟随器的作用是什么?

电压跟随器&#xff08;也称为单位增益放大器、缓冲放大器和隔离放大器&#xff09;是一种电压增益为 1 的运算放大器电路。这意味着运算放大器不会对信号进行任何放大。 之所以称为电压跟随器&#xff0c;是因为输出电压直接跟随输入电压&#xff0c;即输出电压与输入电压相同…

测试工程师学历路径:从功能测试到测试开发

现在软件从业者越来越多&#xff0c;测试工程师的职位也几近饱和&#xff0c;想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师&#xff1a; 1、软件测试基本概念&#xff1a; 学习软件测试的定义、目的…

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台

在当今高速发展的信息技术领域&#xff0c;特别是对于那些致力于前沿科技探索与实践的高校而言&#xff0c;拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台&#xff08;Data Network Development Platform&#xff0c;简称DNDP&#xff09;&am…

Marin说PCB之在CST软件中如何搭建两端子电容器--03

上期文章的结尾讲到的问题不知诸位大神们是否还记得&#xff1a;就是一颗新电容器的物料是否可以完全替换掉之前的Murata家的这个GRT033D70E105ME18物料&#xff1f; 小编我也看了私信有不少的人认为是可以替换掉的&#xff0c;原因是两个电容封装&#xff0c;容值都是一样的&a…

停止向供应商提供您的数据

组织管理其数据基础设施的方式正在发生重大转变。越来越多的公司认识到存储和计算分离的优势&#xff0c;从而获得更好的性能、成本节约和可扩展性。这一趋势是由 AI 和 ML 工作负载日益复杂所推动的&#xff0c;这些工作负载需要灵活、高性能的系统。Databricks 首席执行官 Al…

Java短信验证码

想利用java给用户发送短信的话&#xff0c;需要我们与电信、移动、联通三大巨头合作&#xff08;其实还有广电&#xff0c;但是比较少用&#xff09;&#xff0c;让它帮你发信息&#xff0c;当然直接与它合作显然是不现实的&#xff0c;所以我们要借助第三方的短信平台来替我们…

el-tree父子不互相关联时,手动实现全选、反选、子级全选、清空功能

el-tree父子不互相关联时&#xff0c;手动实现全选、反选、子级全选、清空功能 1、功能实现图示 2、实现思路 当属性check-strictly为true时&#xff0c;父子节点不互相关联&#xff0c;如果需要全部选中或选择某一节点下的全部节点就必须手动选择每个节点&#xff0c;十分麻…