2023微信小程序 图片内容安全检测实例总结 security.mediaCheckAsync

踩了很多次坑,终于在微信小程序中搞定了图片内容安全检测。

最开始看的以前的文章用的是老版本的图片安全检测,在开发者工具中是可以跑通的,但是到了真机调试就无法进行图片检测,后来提了个工单,才知道要用新版本的安全检测——security.mediaCheckAsync。发现以前也看到过这个接口,好像是因为是异步的传输结果,而且还是30分钟内给出结果,于是就放弃了,结果选了个老版本。哎!!

话不多说,我们开始:

参考文章:https://blog.csdn.net/weixin_55109830/article/details/127143342

本文主要根据参考文章进行,由于版本问题,其中有些坑还是要注意。

由于我们用的是新版本,其中有些参数已经改变,这一点要注意。

第一步:创建云函数

我在这里创建了imgcheck2这个云函数

首先要对云函数的config.json文件进行配置,引入我们要用的接口

{
  "permissions": {
    "openapi": [
      "openapi.security.msgSecCheck",
      "openapi.security.mediaCheckAsync"
    ]
  }
}

在index.js中进行调用接口

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 云函数入口函数

exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  console.log(event)
  try {

      const result = await cloud.openapi.security.mediaCheckAsync({
          media_url: event.value,
          media_type: 2,
          version: 2,
          openid: wxContext.OPENID,
          scene: 3
      })

      return result

  } catch (err) {
      return err;
  }
}

注意接口中的参数较以前版本已经改变,且根据文档我们没有填写access_token这个参数

最开始还纳闷这个函数怎么写,查看文档后发现云函数是不用填写的。

最后将云函数进行上传(云端部署),并在云开发工具中添加云函数。

第一步完成。

第二步:创建消息推送

官方说是在30分钟内将结果推送,看着有点吓人,但实测一张图片在10秒内会有结果,甚至5秒也有可能。

我们首先需要一个函数来接收传过来的结果消息,我创建了receiveimgcheck这个云函数

配置文件无需改动,只要将主文件进行编写即可,这是我的代码

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  await cloud.database().collection('imgCheckResult').add({
    data:{
      traceid:event.trace_id,
      result:event.result.suggest
    }
  })
  
  
  return event
}

代码非常简单,结果返回到云函数后,将结果result和traceid保存到集合中。

好了接收的云函数有了,下面我们进行配置消息推送

盗用参考文章中的图,点击云开发中的设置、其他设置、推送模式改为云函数、点击添加消息推送,

消息类型选event 、事件类型选wxa_media_check、云函数选刚才创建的云函数。

OK,这样就配置完成了。

第三步 测试

下面是我的测试代码

wx.getFileSystemManager().readFile({
            // encoding:'ucs2',
            filePath:this.data.localFilesPath[nr],
            success(res){
              console.log(res)
              var buffer = res.data
              //传入云函数进行检测
              wx.cloud.callFunction({
                name:'imagecheck2',
                data:{
                  value:wx.cloud.CDN(buffer)
                },
                success:res=>{
                  console.log(res)  
                  
                  traceIds.push(res.result.traceId) 
                }
              })
            }
          })
        }

我将本地选取的图片进行读取,保存成buffer类型,用wx.cloud.CDN保存到CDN中,将图片链接传入云函数中,云函数嗲用成功后会返回给我们traceid,可以根据traceid来定位图片,等待几秒后我们就可以在接收云函数的日志中看到结果啦。

并且集合中也上传了结果和traceid

我们根据traceid可以定位到结果。

db.collection('imgCheckResult').where({
              traceid:traceIds[i]
            }).get({
              success: function(res) {
            }

大功告成,可能我的方法运行时间有点长,如果大家有更好的方案,可以在评论区交流。

<think>好的,我现在需要回答用户关于在Java中调用MediaCheckAsync方法的示问题。首先,我得理解用户的需求。用户可能正在开发微信小程序,需要实现内容安全审核,特别是图片审核。用户已经看到相关的引用内容,现在需要Java的示代码。 首先,我应该回忆微信开放文档中关于MediaCheckAsync的说明。根据引用[2],MediaCheckAsync用于影音检测,而用户之前提到了图片审核,可能这里需要确认MediaCheckAsync是否支持图片。不过微信的接口中,img_sec_check是专门用于图片检测的,而media_check_async可能用于异步的媒体检测,包括图片、视频等。或者可能用户混淆了接口名称?需要确认。 但根据用户的问题,明确提到MediaCheckAsync,所以应该以该接口为准。查阅微信官方文档,确认media_check_async的使用场景和参数。如,该接口可能需要传入access_token、媒体URL、媒体类型等参数。 接下来,用户需要Java的示代码。我需要考虑如何在Java中发送HTTP POST请求到微信的API端点。通常,可以使用Apache HttpClient或者OkHttp等库。这里可能需要选择一个常用的库来演示。 然后,构造请求体,包括必要的参数,比如access_token、media_url、media_type等。需要注意参数的格式,比如JSON格式,并设置正确的Content-Type头部。 另外,微信的接口需要access_token,如何获取access_token也是一个步骤。可能需要先调用获取access_token的接口,但用户的问题可能只关注MediaCheckAsync本身,所以示中可能需要包含获取access_token的部分,或者假设用户已经获取了。 还需要处理异步回调,因为MediaCheckAsync是异步接口,完成后会通过回调通知结果。但示可能需要简化,只展示如何发起请求,不处理回调。 另外,需要注意安全措施,比如使用HTTPS、处理异常情况等,但示可能简化这些部分。 现在,开始组织步骤: 1. 获取access_token:需要小程序的appid和secret,调用微信的接口获取。 2. 构建请求JSON,包含media_url(需要是微信的临时素材media_id或者网络URL?需要确认参数是否正确。) 3. 发送POST请求到微信的media_check_async接口。 4. 解析响应结果,判断是否成功。 可能遇到的疑问点:media_url的具体格式是什么?根据微信文档,media_check_async的参数可能需要media_url,并且该URL需要是小程序已下发的素材或通过内容安全接口上传的。或者,可能用户需要先上传图片到微信服务器,获取media_id,再调用接口? 如,微信的img_sec_check接口需要上传图片的二进制数据,而media_check_async可能需要media_id或者URL。需要确认参数。 假设media_check_async需要的是media_id,那么用户需要先通过其他接口上传图片,获取media_id。但用户的问题可能希望直接传递图片URL,这需要查阅文档确认。 如果文档中media_check_async允许直接传递图片的URL,那么示可以包含该参数。否则可能需要先上传素材。 假设允许传递URL,那么示代码的结构大致如下: 使用HttpClient发送POST请求到https://api.weixin.qq.com/wxa/media_check_async?access_token=ACCESS_TOKEN,请求体为JSON包含media_url、media_type等。 现在,编写Java代码示,包括必要的依赖,比如HttpClient的依赖,处理JSON的库如Gson或Jackson。 如,代码结构可能包括: - 创建CloseableHttpClient实例 - 构建URI,包括access_token参数 - 构建JSON请求体,包含media_url和media_type(比如1表示图片) - 发送POST请求,并处理响应 同时,需要处理可能的异常,比如网络错误,或者微信返回的错误码。 此外,用户提供的引用[2]中的链接提到了一些CSDN博客的示,可能可以参考。比如,Java调用imgSecCheck可能需要上传图片的二进制数据,但media_check_async可能不同。 综上,现在需要写出一个完整的Java示,展示如何调用media_check_async接口,假设media_url是用户提供的图片URL,media_type为1(图片),并处理响应。</think>以下是Java调用`media_check_async`方法的示代码及步骤说明: --- ### 1. 获取Access Token 调用微信接口需先获取`access_token`,使用小程序`appid`和`secret`发起请求: ```java String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; // 发起GET请求获取access_token,需替换APPID和APPSECRET ``` --- ### 2. 调用MediaCheckAsync接口 使用Apache HttpClient发送POST请求,JSON参数需包含待检测的媒体URL和类型: ```java import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; public class MediaCheckAsyncExample { public static void main(String[] args) { String accessToken = "YOUR_ACCESS_TOKEN"; // 替换为实际token String mediaUrl = "https://example.com/image.jpg"; // 待检测的图片URL int mediaType = 1; // 1-图片,2-音频,4-视频 String apiUrl = "https://api.weixin.qq.com/wxa/media_check_async?access_token=" + accessToken; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(apiUrl); httpPost.setHeader("Content-Type", "application/json"); // 构建JSON请求体 String jsonBody = String.format( "{\"media_url\": \"%s\", \"media_type\": %d}", mediaUrl, mediaType ); httpPost.setEntity(new StringEntity(jsonBody)); // 发送请求并解析响应 try (CloseableHttpResponse response = httpClient.execute(httpPost)) { String result = EntityUtils.toString(response.getEntity()); System.out.println("检测结果: " + result); // 返回示: {"errcode":0,"errmsg":"ok","trace_id":"xxx"} } } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### 关键参数说明 - **media_url**: 需检测的媒体文件URL(需在小程序内已上传或通过微信API生成)[^2] - **media_type**: 媒体类型,`1`-图片,`2`-音频,`4`-视频 - **access_token**: 需通过小程序凭证动态获取[^1] --- ### 3. 处理异步回调 接口调用成功后,微信会通过**回调URL**(需在小程序配置)返回检测结果,需在服务端添加接收逻辑: ```java // 示回调处理(需在服务端接口中实现) @PostMapping("/security_callback") public String handleCallback(@RequestBody String callbackData) { // 解析回调数据,格式示: // {"trace_id":"xxx","result":{"suggest":"pass","label":100}} System.out.println("安全检测结果: " + callbackData); return "success"; // 固定返回success确认接收 } ``` --- ### 注意事项 1. 媒体URL需符合微信要求(如已通过素材管理接口上传) 2. 需处理接口限频(默认2000次/分钟) 3. 生产环境需添加异常重试和日志监控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值