lib/wechat/mini_program/security.ex

defmodule WeChat.MiniProgram.Security do
  @moduledoc """
  小程序 - 内容安全接口
  """
  import Jason.Helpers
  alias Tesla.Multipart

  @typedoc "媒体类型 1 => 音频; 2 => 图片"
  @type media_type_audio :: 1
  @type media_type_image :: 2
  @type media_type :: media_type_audio | media_type_image
  @typep url :: String.t()
  @typep file_path :: Path.t()

  @doc """
  图片检测
  - [官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/security.imgSecCheck.html){:target="_blank"}

  校验一张图片是否含有违法违规内容。详见: [内容安全解决方案](https://developers.weixin.qq.com/miniprogram/dev/framework/operation.html)

  应用场景举例

  - 图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
  - 敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。

  ** 频率限制:单个 appId 调用上限为 2000 次/分钟,200,000 次/天 ( 图片大小限制:1M **)
  """
  @spec img_check(WeChat.client(), file_path) :: WeChat.response()
  def img_check(client, file_path) do
    multipart =
      Multipart.new()
      |> Multipart.add_file(file_path, name: "media", detect_content_type: true)

    client.post("/wxa/img_sec_check", multipart, query: [access_token: client.get_access_token()])
  end

  @doc """
  图片/音频异步检测
  - [官方文档](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/sec-center/sec-check/mediaCheckAsync.html){:target="_blank"}

  异步校验图片/音频是否含有违法违规内容。

  应用场景举例

  - 语音风险识别:社交类用户发表的语音内容检测;
  - 图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
  - 敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。

  ** 频率限制:单个 appId 调用上限为 2000 次/分钟,200,000 次/天;文件大小限制:单个文件大小不超过10M **
  """
  @spec media_check_async(WeChat.client(), url, media_type) :: WeChat.response()
  def media_check_async(client, media_url, media_type \\ 2) do
    client.post(
      "/wxa/media_check_async",
      json_map(media_url: media_url, media_type: media_type),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  文本检测
  - [官方文档](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/sec-center/sec-check/msgSecCheck.html){:target="_blank"}

  检查一段文本是否含有违法违规内容。

  应用场景举例

  - 用户个人资料违规文字检测;
  - 媒体新闻类用户发表文章,评论内容检测;
  - 游戏类用户编辑上传的素材(如答题类小游戏用户上传的问题及答案)检测等。

  ** 频率限制:单个 appId 调用上限为 4000 次/分钟,2,000,000 次/天 **
  """
  @spec msg_check(WeChat.client(), content :: String.t()) :: WeChat.response()
  def msg_check(client, content) do
    client.post(
      "/wxa/msg_sec_check",
      json_map(content: content),
      query: [access_token: client.get_access_token()]
    )
  end
end