すべてのプロダクト
Search
ドキュメントセンター

AI Guardrails:画像審査 2.0 の SDK と統合ガイド

最終更新日:Aug 25, 2026

このガイドでは、画像審査 2.0 の有効化、認証情報の設定、および最初の審査コールの実行方法について説明します。統合方法として、SDK (推奨) とネイティブ HTTPS の 2 つがサポートされています。SDK は署名認証とリクエストのフォーマットを自動的に処理するため、可能な限り SDK を使用してください。

前提条件

開始する前に、次のものがあることを確認してください:

  • RAM ユーザーを作成し、サービスを有効化するための十分な権限を持つ Alibaba Cloud アカウント

ステップ 1:サービスの有効化

サービスの有効化 ページに移動し、画像審査 2.0 を有効化します。

デフォルトの課金方法は従量課金です。料金は実際の使用量に基づいて毎日決済されます。API コールを行わない場合、料金は発生しません。料金詳細については、「課金詳細」をご参照ください。

ステップ 2:RAM ユーザーの作成と権限の付与

  1. Alibaba Cloud アカウント (root ユーザー) または管理者 RAM ユーザーで RAM コンソールにログインします。

  2. RAM ユーザーを作成します:アクセスタイプとして OpenAPI アクセス を選択し、生成された AccessKey ペアを記録します。詳細については、「RAM ユーザーの作成」をご参照ください。

  3. RAM ユーザーに AliyunYundunGreenWebFullAccess システムポリシーを付与します。詳細については、「RAM ユーザーへの権限付与」をご参照ください。

ステップ 3:認証情報の設定

AccessKey ペアを環境変数として保存することで、コードにシークレットをハードコーディングすることなく読み取ることができます。

Linux / macOS

export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-access-key-id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-access-key-secret>

Windows (コマンドプロンプト)

set ALIBABA_CLOUD_ACCESS_KEY_ID=<your-access-key-id>
set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-access-key-secret>

<your-access-key-id><your-access-key-secret> をステップ 2 の値に置き換えてください。

その他の認証情報の設定オプションについては、「認証情報の設定」をご参照ください。

ステップ 4:SDK のインストールと呼び出し

サポートされているリージョン

リージョン

パブリックエンドポイント

VPC エンドポイント

サポートされているサービスコード

シンガポール

green-cip.ap-southeast-1.aliyuncs.com

green-cip-vpc.ap-southeast-1.aliyuncs.com

postImageCheckByVL_global, baselineCheck_global, aigcDetector_global, faceDetect_global, faceDetect_pro_global

中国 (香港)

green-cip.cn-hongkong.aliyuncs.com

green-cip-vpc.cn-hongkong.aliyuncs.com

postImageCheckByVL_cb, postImageCheckByVL_global

イギリス (ロンドン)

green-cip.eu-west-1.aliyuncs.com

なし

米国 (バージニア)

green-cip.us-east-1.aliyuncs.com

green-cip-vpc.us-east-1.aliyuncs.com

baselineCheck_global, aigcDetector_global

米国 (シリコンバレー)

green-cip.us-west-1.aliyuncs.com

なし

ドイツ (フランクフルト)

green-cip.eu-central-1.aliyuncs.com

green-cip-vpc.eu-central-1.aliyuncs.com

他の言語の SDK サンプルコードについては、OpenAPI Developer Portal を使用して API オペレーションをデバッグしてください。各言語のサンプルコードが自動生成されます。

画像ソースの選択

渡すパラメーターは、画像の保存場所によって異なります:

画像ソース

対処方法

パブリックにアクセス可能な URL

リクエストで URL を直接渡します

ローカルファイル (パブリック URL なし)

まず Content Moderation の OSS バケットにアップロードし、その後 OSS オブジェクト参照を渡します

ファイルがすでに OSS バケットにある場合

ご利用のバケットへの Content Moderation のアクセスを許可し、その後 OSS オブジェクト参照を渡します

レスポンスの理解

成功したすべての審査コールは、1 つ以上のラベルを持つ Result 配列を返します。各ラベルには 2 つのフィールドがあります:

フィールド

説明

Label

検出されたリスクカテゴリ (例:pornographic_adultContentsexual_partialNudity)。完全なリストについては、「リスクラベルの説明」をご参照ください。

Confidence

ラベルの信頼度を示す 0 から 100 までの浮動小数点数。値が高いほど、確実性が高くなります。

レスポンス例:

{
  "Msg": "OK",
  "Code": 200,
  "Data": {
    "DataId": "uimg123****",
    "Result": [
      { "Label": "pornographic_adultContent", "Confidence": 81.3 },
      { "Label": "sexual_partialNudity", "Confidence": 98.9 }
    ]
  },
  "RequestId": "ABCD1234-1234-1234-1234-1234XYZ"
}

Java SDK

要件: Java 1.8 以降

ソースコード: GitHub の Java SDK

パブリックにアクセス可能な画像の検出

パブリック URL 経由でアクセス可能な画像は、API に直接送信できます。

  1. pom.xml に依存関係を追加します:

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>green20220302</artifactId>
      <version>3.3.3</version>
    </dependency>
  2. API を呼び出します:

ローカル画像の検出

パブリック URL を持たないローカル画像は、検出前に Content Moderation の OSS バケットにアップロードする必要があります。サービスは OSS から画像を取得して審査します。

  1. pom.xml に両方の依存関係を追加します:

    <!-- Content Moderation SDK -->
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>green20220302</artifactId>
      <version>3.3.3</version>
    </dependency>
    <!-- OSS SDK -->
    <dependency>
      <groupId>com.aliyun.oss</groupId>
      <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.16.3</version>
    </dependency>
  2. API を呼び出します:

    import com.alibaba.fastjson.JSON;
    import com.aliyun.green20220302.Client;
    import com.aliyun.green20220302.models.DescribeUploadTokenResponse;
    import com.aliyun.green20220302.models.DescribeUploadTokenResponseBody;
    import com.aliyun.green20220302.models.ImageModerationRequest;
    import com.aliyun.green20220302.models.ImageModerationResponse;
    import com.aliyun.green20220302.models.ImageModerationResponseBody;
    import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyData;
    import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyDataResult;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.model.PutObjectRequest;
    import com.aliyun.teaopenapi.models.Config;
    import com.aliyun.teautil.models.RuntimeOptions;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.UUID;
    
    public class ScanLocalImage {
    
        // VPC 環境で実行する場合は true に設定します。
        public static boolean isVPC = false;
    
        // リクエストごとに新しいトークンを取得するのを避けるため、エンドポイントごとにアップロードトークンをキャッシュします。
        public static Map<String, DescribeUploadTokenResponseBody.DescribeUploadTokenResponseBodyData> tokenMap = new HashMap<>();
    
        public static OSS ossClient = null;
    
        public static Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
            Config config = new Config();
            config.setAccessKeyId(accessKeyId);
            config.setAccessKeySecret(accessKeySecret);
            config.setEndpoint(endpoint);
            return new Client(config);
        }
    
        public static void getOssClient(DescribeUploadTokenResponseBody.DescribeUploadTokenResponseBodyData tokenData, boolean isVPC) {
            // リクエスト間で OSS クライアントを再利用します。
            if (isVPC) {
                ossClient = new OSSClientBuilder().build(tokenData.ossInternalEndPoint, tokenData.getAccessKeyId(), tokenData.getAccessKeySecret(), tokenData.getSecurityToken());
            } else {
                ossClient = new OSSClientBuilder().build(tokenData.ossInternetEndPoint, tokenData.getAccessKeyId(), tokenData.getAccessKeySecret(), tokenData.getSecurityToken());
            }
        }
    
        public static String uploadFile(String filePath, DescribeUploadTokenResponseBody.DescribeUploadTokenResponseBodyData tokenData) throws Exception {
            String[] split = filePath.split("\\.");
            String objectName = split.length > 1
                ? tokenData.getFileNamePrefix() + UUID.randomUUID() + "." + split[split.length - 1]
                : tokenData.getFileNamePrefix() + UUID.randomUUID();
            PutObjectRequest putObjectRequest = new PutObjectRequest(tokenData.getBucketName(), objectName, new File(filePath));
            ossClient.putObject(putObjectRequest);
            return objectName;
        }
    
        public static ImageModerationResponse invokeFunction(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
            // リクエスト間でクライアントを再利用します。
            Client client = createClient(accessKeyId, accessKeySecret, endpoint);
            RuntimeOptions runtime = new RuntimeOptions();
    
            // ローカルファイルの実際のパスに置き換えてください。
            String filePath = "D:\\localPath\\exampleFile.png";
    
            // アップロードトークンを取得してキャッシュし、有効期限が切れたら更新します。
            if (tokenMap.get(endpoint) == null || tokenMap.get(endpoint).expiration <= System.currentTimeMillis() / 1000) {
                DescribeUploadTokenResponse tokenResponse = client.describeUploadToken();
                tokenMap.put(endpoint, tokenResponse.getBody().getData());
            }
            getOssClient(tokenMap.get(endpoint), isVPC);
    
            String objectName = uploadFile(filePath, tokenMap.get(endpoint));
    
            Map<String, String> serviceParameters = new HashMap<>();
            serviceParameters.put("ossBucketName", tokenMap.get(endpoint).getBucketName());
            serviceParameters.put("ossObjectName", objectName);
            serviceParameters.put("dataId", UUID.randomUUID().toString());
    
            ImageModerationRequest request = new ImageModerationRequest();
            request.setService("baselineCheck_global");
            request.setServiceParameters(JSON.toJSONString(serviceParameters));
    
            try {
                return client.imageModerationWithOptions(request, runtime);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public static void main(String[] args) throws Exception {
            String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            ImageModerationResponse response = invokeFunction(accessKeyId, accessKeySecret, "green-cip.ap-southeast-1.aliyuncs.com");
    
            if (response != null && response.getStatusCode() == 200) {
                ImageModerationResponseBody body = response.getBody();
                System.out.println("requestId=" + body.getRequestId());
                if (body.getCode() == 200) {
                    ImageModerationResponseBodyData data = body.getData();
                    List<ImageModerationResponseBodyDataResult> results = data.getResult();
                    for (ImageModerationResponseBodyDataResult result : results) {
                        System.out.println("label=" + result.getLabel());
                        System.out.println("confidence=" + result.getConfidence());
                    }
                } else {
                    System.out.println("Moderation failed. code=" + body.getCode());
                }
            }
        }
    }

OSS 画像の検出

すでに OSS バケットに保存されている画像は、再アップロードせずに直接審査できます。まず、AliyunCIPScanOSSRole サービスロールを作成して、Content Moderation にご利用のバケットへのアクセスを許可します。

  1. Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して権限を付与します。

  2. pom.xml に依存関係を追加します:

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>green20220302</artifactId>
      <version>3.3.3</version>
    </dependency>
  3. API を呼び出します:

    import com.alibaba.fastjson.JSON;
    import com.aliyun.green20220302.Client;
    import com.aliyun.green20220302.models.ImageModerationRequest;
    import com.aliyun.green20220302.models.ImageModerationResponse;
    import com.aliyun.green20220302.models.ImageModerationResponseBody;
    import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyData;
    import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyDataResult;
    import com.aliyun.teaopenapi.models.Config;
    import com.aliyun.teautil.models.RuntimeOptions;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.UUID;
    
    public class OssScanDemo {
    
        public static Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
            Config config = new Config();
            config.setAccessKeyId(accessKeyId);
            config.setAccessKeySecret(accessKeySecret);
            // オプション:必要に応じて HTTP/HTTPS プロキシを設定します
            // config.setHttpProxy("http://10.10.xx.xx:xxxx");
            // config.setHttpsProxy("https://10.10.xx.xx:xxxx");
            config.setEndpoint(endpoint);
            return new Client(config);
        }
    
        public static ImageModerationResponse invokeFunction(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
            Client client = createClient(accessKeyId, accessKeySecret, endpoint);
            RuntimeOptions runtime = new RuntimeOptions();
    
            Map<String, String> serviceParameters = new HashMap<>();
            serviceParameters.put("dataId", UUID.randomUUID().toString());
            serviceParameters.put("ossRegionId", "ap-southeast-1");   // バケットが配置されているリージョン
            serviceParameters.put("ossBucketName", "bucket001");       // ご利用の OSS バケット名
            serviceParameters.put("ossObjectName", "image/001.jpg");   // バケット内のオブジェクトパス
    
            ImageModerationRequest request = new ImageModerationRequest();
            request.setService("baselineCheck_global");
            request.setServiceParameters(JSON.toJSONString(serviceParameters));
    
            try {
                return client.imageModerationWithOptions(request, runtime);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public static void main(String[] args) throws Exception {
            String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            ImageModerationResponse response = invokeFunction(accessKeyId, accessKeySecret, "green-cip.ap-southeast-1.aliyuncs.com");
    
            if (response != null && response.getStatusCode() == 200) {
                ImageModerationResponseBody body = response.getBody();
                System.out.println("requestId=" + body.getRequestId());
                if (body.getCode() == 200) {
                    ImageModerationResponseBodyData data = body.getData();
                    List<ImageModerationResponseBodyDataResult> results = data.getResult();
                    for (ImageModerationResponseBodyDataResult result : results) {
                        System.out.println("label=" + result.getLabel());
                        System.out.println("confidence=" + result.getConfidence());
                    }
                } else {
                    System.out.println("Moderation failed. code=" + body.getCode());
                }
            }
        }
    }

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

Python SDK

要件: Python 3.6 以降

ソースコード: PyPI の Python SDK

パブリックにアクセス可能な画像の検出

  1. SDK をインストールします:

    pip install alibabacloud_green20220302==3.2.4
  2. API を呼び出します:

    # coding=utf-8
    
    import json
    import os
    import uuid
    
    from alibabacloud_green20220302.client import Client
    from alibabacloud_green20220302 import models
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_tea_util import models as util_models
    
    
    def create_client(access_key_id, access_key_secret, endpoint):
        config = Config(
            access_key_id=access_key_id,
            access_key_secret=access_key_secret,
            # オプション:必要に応じて HTTP/HTTPS プロキシを設定します
            # http_proxy='http://10.10.xx.xx:xxxx',
            # https_proxy='https://10.10.xx.xx:xxxx',
            endpoint=endpoint
        )
        return Client(config)
    
    
    def invoke_function(access_key_id, access_key_secret, endpoint):
        # リクエスト間でクライアントを再利用します。
        client = create_client(access_key_id, access_key_secret, endpoint)
        runtime = util_models.RuntimeOptions()
    
        service_parameters = {
            'imageUrl': 'https://img.alicdn.com/tfs/xxxxxxxxxx001.png',  # パブリック URL
            'dataId': str(uuid.uuid1())
        }
    
        image_moderation_request = models.ImageModerationRequest(
            # AI ガードレールコンソールで設定されたサービスコードを設定します。
            service='baselineCheck_global',
            service_parameters=json.dumps(service_parameters)
        )
    
        try:
            return client.image_moderation_with_options(image_moderation_request, runtime)
        except Exception as err:
            print(err)
    
    
    if __name__ == '__main__':
        # 環境変数から認証情報を読み取ります。ハードコーディングしないでください。
        access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        # ご利用のリージョンに合わせてエンドポイントを変更してください。
        response = invoke_function(access_key_id, access_key_secret, 'green-cip.ap-southeast-1.aliyuncs.com')
    
        if response is not None and response.status_code == 200:
            result = response.body
            if result.code == 200:
                result_data = result.data
                print('result:', result_data)
            else:
                print('Moderation failed. status:', response.status_code)

ローカル画像の検出

  1. 両方の SDK をインストールします:

    pip install alibabacloud_green20220302==3.2.4
    pip install oss2
  2. API を呼び出します:

    import json
    import os
    import time
    import uuid
    
    import oss2
    from alibabacloud_green20220302.client import Client
    from alibabacloud_green20220302 import models
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_tea_util import models as util_models
    
    
    # VPC 環境で実行する場合は True に設定します。
    is_vpc = False
    # リクエストごとに新しいトークンを取得するのを避けるため、エンドポイントごとにアップロードトークンをキャッシュします。
    token_dict = dict()
    bucket = None
    
    
    def create_client(access_key_id, access_key_secret, endpoint):
        config = Config(
            access_key_id=access_key_id,
            access_key_secret=access_key_secret,
            endpoint=endpoint
        )
        return Client(config)
    
    
    def create_oss_bucket(is_vpc, upload_token):
        global bucket
        auth = oss2.StsAuth(upload_token.access_key_id, upload_token.access_key_secret, upload_token.security_token)
        end_point = upload_token.oss_internal_end_point if is_vpc else upload_token.oss_internet_end_point
        # リクエスト間でバケットクライアントを再利用します。
        bucket = oss2.Bucket(auth, end_point, upload_token.bucket_name)
    
    
    def upload_file(file_name, upload_token):
        create_oss_bucket(is_vpc, upload_token)
        object_name = upload_token.file_name_prefix + str(uuid.uuid1()) + '.' + file_name.split('.')[-1]
        bucket.put_object_from_file(object_name, file_name)
        return object_name
    
    
    def invoke_function(access_key_id, access_key_secret, endpoint):
        client = create_client(access_key_id, access_key_secret, endpoint)
        runtime = util_models.RuntimeOptions()
    
        # ローカルファイルの実際のパスに置き換えてください。
        file_path = 'D:\\localPath\\exampleFile.png'
    
        # アップロードトークンを取得してキャッシュし、有効期限が切れたら更新します。
        upload_token = token_dict.setdefault(endpoint, None)
        if upload_token is None or int(upload_token.expiration) <= int(time.time()):
            response = client.describe_upload_token()
            upload_token = response.body.data
            token_dict[endpoint] = upload_token
    
        object_name = upload_file(file_path, upload_token)
    
        service_parameters = {
            'ossBucketName': upload_token.bucket_name,
            'ossObjectName': object_name,
            'dataId': str(uuid.uuid1())
        }
    
        image_moderation_request = models.ImageModerationRequest(
            service='baselineCheck_global',
            service_parameters=json.dumps(service_parameters)
        )
    
        try:
            return client.image_moderation_with_options(image_moderation_request, runtime)
        except Exception as err:
            print(err)
    
    
    if __name__ == '__main__':
        access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        response = invoke_function(access_key_id, access_key_secret, 'green-cip.ap-southeast-1.aliyuncs.com')
    
        if response is not None and response.status_code == 200:
            result = response.body
            if result.code == 200:
                print('result:', result.data)
            else:
                print('Moderation failed. status:', response.status_code)

OSS 画像の検出

  1. Content Moderation に OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して、AliyunCIPScanOSSRole サービスロールを作成します。

  2. SDK をインストールします:

    pip install alibabacloud_green20220302==3.2.4
  3. API を呼び出します:

    import json
    import os
    import uuid
    
    from alibabacloud_green20220302.client import Client
    from alibabacloud_green20220302 import models
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_tea_util import models as util_models
    
    
    def create_client(access_key_id, access_key_secret, endpoint):
        config = Config(
            access_key_id=access_key_id,
            access_key_secret=access_key_secret,
            endpoint=endpoint
        )
        return Client(config)
    
    
    def invoke_function(access_key_id, access_key_secret, endpoint):
        client = create_client(access_key_id, access_key_secret, endpoint)
        runtime = util_models.RuntimeOptions()
    
        service_parameters = {
            'ossRegionId': 'ap-southeast-1',   // バケットが配置されているリージョン
            'ossBucketName': 'bucket001',       // ご利用の OSS バケット名
            'ossObjectName': 'image/001.jpg',   // バケット内のオブジェクトパス
            'dataId': str(uuid.uuid1())
        }
    
        image_moderation_request = models.ImageModerationRequest(
            service='baselineCheck_global',
            service_parameters=json.dumps(service_parameters)
        )
    
        try:
            return client.image_moderation_with_options(image_moderation_request, runtime)
        except Exception as err:
            print(err)
    
    
    if __name__ == '__main__':
        access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        response = invoke_function(access_key_id, access_key_secret, 'green-cip.ap-southeast-1.aliyuncs.com')
    
        if response is not None and response.status_code == 200:
            result = response.body
            if result.code == 200:
                print('result:', result.data)
            else:
                print('Moderation failed. status:', response.status_code)

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

PHP SDK

要件: PHP 5.6 以降

ソースコード: Packagist の PHP SDK

パブリックにアクセス可能な画像の検出

  1. SDK をインストールします:

    composer require alibabacloud/green-20220302 3.2.4
  2. API を呼び出します:

ローカル画像の検出

  1. 両方の SDK をインストールします:

    composer require alibabacloud/green-20220302 3.2.4
    composer require aliyuncs/oss-sdk-php
  2. API を呼び出します:

    <?php
    require('vendor/autoload.php');
    
    use AlibabaCloud\SDK\Green\V20220302\Models\ImageModerationResponse;
    use Darabonba\OpenApi\Models\Config;
    use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
    use AlibabaCloud\SDK\Green\V20220302\Green;
    use AlibabaCloud\SDK\Green\V20220302\Models\ImageModerationRequest;
    use OSS\OssClient;
    
    // VPC 環境で実行する場合は true に設定します。
    $isVPC = false;
    // エンドポイントごとにアップロードトークンをキャッシュします。
    $tokenArray = array();
    $ossClient = null;
    
    function create_client($accessKeyId, $accessKeySecret, $endpoint): Green
    {
        $config = new Config([
            "accessKeyId" => $accessKeyId,
            "accessKeySecret" => $accessKeySecret,
            "endpoint" => $endpoint,
        ]);
        return new Green($config);
    }
    
    function create_upload_client($tokenData): void
    {
        global $isVPC, $ossClient;
        // リクエスト間で OSS クライアントを再利用します。
        if ($isVPC) {
            $ossClient = new OssClient($tokenData->accessKeyId, $tokenData->accessKeySecret, $tokenData->ossInternalEndPoint, false, $tokenData->securityToken);
        } else {
            $ossClient = new OssClient($tokenData->accessKeyId, $tokenData->accessKeySecret, $tokenData->ossInternetEndPoint, false, $tokenData->securityToken);
        }
    }
    
    function upload_file($filePath, $tokenData): string
    {
        global $ossClient;
        create_upload_client($tokenData);
        $split = explode(".", $filePath);
        $objectName = count($split) > 1
            ? $tokenData->fileNamePrefix . uniqid() . "." . end($split)
            : $tokenData->fileNamePrefix . uniqid();
        $ossClient->uploadFile($tokenData->bucketName, $objectName, $filePath);
        return $objectName;
    }
    
    function invoke($accessKeyId, $accessKeySecret, $endpoint): ImageModerationResponse
    {
        global $tokenArray;
        $client = create_client($accessKeyId, $accessKeySecret, $endpoint);
        $runtime = new RuntimeOptions([]);
    
        // ローカルファイルの実際のパスに置き換えてください。
        $filePath = "D:\\localPath\\exampleFile.png";
    
        // アップロードトークンを取得してキャッシュし、有効期限が切れたら更新します。
        if (!isset($tokenArray[$endpoint]) || $tokenArray[$endpoint]->expiration <= time()) {
            $token = $client->describeUploadToken();
            $tokenArray[$endpoint] = $token->body->data;
        }
    
        $objectName = upload_file($filePath, $tokenArray[$endpoint]);
    
        $request = new ImageModerationRequest();
        $request->service = "baselineCheck_global";
        $serviceParameters = array(
            'ossObjectName' => $objectName,
            'ossBucketName' => $tokenArray[$endpoint]->bucketName,
            'dataId' => uniqid()
        );
        $request->serviceParameters = json_encode($serviceParameters);
        return $client->imageModerationWithOptions($request, $runtime);
    }
    
    $accessKeyId = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    $accessKeySecret = getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    $endpoint = "green-cip.ap-southeast-1.aliyuncs.com";
    
    try {
        $response = invoke($accessKeyId, $accessKeySecret, $endpoint);
        print_r(json_encode($response->body, JSON_UNESCAPED_UNICODE));
    } catch (Exception $e) {
        var_dump($e->getMessage());
    }

OSS 画像の検出

  1. Content Moderation に OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して、AliyunCIPScanOSSRole サービスロールを作成します。

  2. SDK をインストールします:

    composer require alibabacloud/green-20220302 3.2.4
  3. API を呼び出します:

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

Go SDK

ソースコード: GitHub の Go SDK

パブリックにアクセス可能な画像の検出

  1. SDK をインストールします:

    go get github.com/alibabacloud-go/green-20220302/v3@v3.2.4
  2. API を呼び出します:

ローカル画像の検出

  1. 両方の SDK をインストールします:

    go get github.com/alibabacloud-go/green-20220302/v3
    go get github.com/aliyun/aliyun-oss-go-sdk/oss
  2. API を呼び出します:

    package main
    
    import (
        "encoding/json"
        "fmt"
        openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
        green20220302 "github.com/alibabacloud-go/green-20220302/v3/client"
        util "github.com/alibabacloud-go/tea-utils/v2/service"
        "github.com/alibabacloud-go/tea/tea"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
        "github.com/google/uuid"
        "net/http"
        "os"
        "strings"
        "time"
    )
    
    // エンドポイントごとにアップロードトークンをキャッシュします。
    var TokenMap = make(map[string]*green20220302.DescribeUploadTokenResponseBodyData)
    
    // VPC 環境で実行する場合は true に設定します。
    var isVPC = false
    var Bucket *oss.Bucket
    
    func createClient(accessKeyId string, accessKeySecret string, endpoint string) (*green20220302.Client, error) {
        config := &openapi.Config{
            AccessKeyId:     tea.String(accessKeyId),
            AccessKeySecret: tea.String(accessKeySecret),
            Endpoint:        tea.String(endpoint),
        }
        return green20220302.NewClient(config)
    }
    
    func createOssClient(tokenData *green20220302.DescribeUploadTokenResponseBodyData) {
        var endPoint string
        if isVPC {
            endPoint = tea.StringValue(tokenData.OssInternalEndPoint)
        } else {
            endPoint = tea.StringValue(tokenData.OssInternetEndPoint)
        }
        ossClient, err := oss.New(endPoint, tea.StringValue(tokenData.AccessKeyId), tea.StringValue(tokenData.AccessKeySecret), oss.SecurityToken(tea.StringValue(tokenData.SecurityToken)))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        Bucket, _ = ossClient.Bucket(tea.StringValue(tokenData.BucketName))
    }
    
    func uploadFile(filePath string, tokenData *green20220302.DescribeUploadTokenResponseBodyData) (string, error) {
        createOssClient(tokenData)
        objectName := tea.StringValue(tokenData.FileNamePrefix) + uuid.New().String() + "." + strings.Split(filePath, ".")[1]
        _err := Bucket.PutObjectFromFile(objectName, filePath)
        if _err != nil {
            fmt.Println("Error:", _err)
            os.Exit(-1)
        }
        return objectName, _err
    }
    
    func invoke(accessKeyId string, accessKeySecret string, endpoint string) (_result *green20220302.ImageModerationResponse, _err error) {
        client, _err := createClient(accessKeyId, accessKeySecret, endpoint)
        if _err != nil {
            return nil, _err
        }
        runtime := &util.RuntimeOptions{}
    
        // ローカルファイルの実際のパスに置き換えてください。
        var filePath = "D:\\localPath\\exampleFile.png"
    
        // アップロードトークンを取得してキャッシュし、有効期限が切れたら更新します。
        tokenData, ok := TokenMap[endpoint]
        if !ok || tea.Int32Value(tokenData.Expiration) <= int32(time.Now().Unix()) {
            uploadTokenResponse, _err := client.DescribeUploadToken()
            if _err != nil {
                return nil, _err
            }
            tokenData = uploadTokenResponse.Body.Data
            TokenMap[endpoint] = tokenData
        }
    
        objectName, _ := uploadFile(filePath, TokenMap[endpoint])
    
        serviceParameters, _ := json.Marshal(
            map[string]interface{}{
                "ossBucketName": tea.StringValue(TokenMap[endpoint].BucketName),
                "ossObjectName": objectName,
                "dataId":        uuid.New().String(),
            },
        )
        imageModerationRequest := &green20220302.ImageModerationRequest{
            Service:           tea.String("baselineCheck_global"),
            ServiceParameters: tea.String(string(serviceParameters)),
        }
    
        return client.ImageModerationWithOptions(imageModerationRequest, runtime)
    }
    
    func main() {
        accessKeyId := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
        accessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        endpoint := "green-cip.ap-southeast-1.aliyuncs.com"
        response, _err := invoke(accessKeyId, accessKeySecret, endpoint)
    
        if response != nil {
            statusCode := tea.IntValue(tea.ToInt(response.StatusCode))
            body := response.Body
            fmt.Println("requestId:" + tea.StringValue(body.RequestId))
            if statusCode == http.StatusOK {
                if tea.IntValue(tea.ToInt(body.Code)) == 200 {
                    result := body.Data.Result
                    for i := 0; i < len(result); i++ {
                        fmt.Println("label:" + tea.StringValue(result[i].Label))
                        fmt.Println("confidence:" + tea.ToString(tea.Float32Value(result[i].Confidence)))
                    }
                } else {
                    fmt.Println("Moderation failed. code:", body.Code)
                }
            } else {
                fmt.Println("Request failed. status:", statusCode, "error:", _err)
            }
        }
    }

OSS 画像の検出

  1. Content Moderation に OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して、AliyunCIPScanOSSRole サービスロールを作成します。

  2. SDK をインストールします:

    go get github.com/alibabacloud-go/green-20220302/v3
  3. API を呼び出します:

    package main
    
    import (
        "encoding/json"
        "fmt"
        openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
        green20220302 "github.com/alibabacloud-go/green-20220302/v3/client"
        util "github.com/alibabacloud-go/tea-utils/v2/service"
        "github.com/alibabacloud-go/tea/tea"
        "github.com/google/uuid"
        "net/http"
        "os"
    )
    
    func createClient(accessKeyId *string, accessKeySecret *string, endpoint *string) (*green20220302.Client, error) {
        config := &openapi.Config{
            AccessKeyId:     accessKeyId,
            AccessKeySecret: accessKeySecret,
            Endpoint:        endpoint,
        }
        return green20220302.NewClient(config)
    }
    
    func invoke(accessKeyId *string, accessKeySecret *string, endpoint *string) (_result *green20220302.ImageModerationResponse, _err error) {
        client, _err := createClient(accessKeyId, accessKeySecret, endpoint)
        if _err != nil {
            return nil, _err
        }
        runtime := &util.RuntimeOptions{}
    
        serviceParameters, _ := json.Marshal(
            map[string]interface{}{
                "ossRegionId":  "ap-southeast-1",  // バケットが配置されているリージョン
                "ossBucketName": "bucket001",       // ご利用の OSS バケット名
                "ossObjectName": "image/001.jpg",   // バケット内のオブジェクトパス
                "dataId":        uuid.New().String(),
            },
        )
        imageModerationRequest := &green20220302.ImageModerationRequest{
            Service:           tea.String("baselineCheck_global"),
            ServiceParameters: tea.String(string(serviceParameters)),
        }
    
        return client.ImageModerationWithOptions(imageModerationRequest, runtime)
    }
    
    func main() {
        accessKeyId := tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
        accessKeySecret := tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
        endpoint := tea.String("green-cip.ap-southeast-1.aliyuncs.com")
        response, _err := invoke(accessKeyId, accessKeySecret, endpoint)
    
        if response != nil {
            statusCode := tea.IntValue(tea.ToInt(response.StatusCode))
            body := response.Body
            fmt.Println("requestId:" + tea.StringValue(body.RequestId))
            if statusCode == http.StatusOK {
                if tea.IntValue(tea.ToInt(body.Code)) == 200 {
                    result := body.Data.Result
                    for i := 0; i < len(result); i++ {
                        fmt.Println("label:" + tea.StringValue(result[i].Label))
                        fmt.Println("confidence:" + tea.ToString(tea.Float32Value(result[i].Confidence)))
                    }
                } else {
                    fmt.Println("Moderation failed. code:", body.Code)
                }
            } else {
                fmt.Println("Request failed. status:", statusCode, "error:", _err)
            }
        }
    }

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

Node.js SDK

ソースコード: npm の Node.js SDK

パブリックにアクセス可能な画像の検出

  1. SDK をインストールします:

    npm install @alicloud/green20220302@3.2.4
  2. API を呼び出します:

    const RPCClient = require("@alicloud/pop-core");
    const { v4: uuidv4 } = require('uuid');
    
    async function main() {
        // 注:インスタンス化されたクライアントをできるだけ再利用して、接続の確立を繰り返し行わないようにし、検出パフォーマンスを向上させてください。
        var client = new RPCClient({
    				/**
             * Alibaba Cloud アカウントの AccessKey は、すべての API オペレーションに対する完全な権限を持っています。API コールや日常の O&M には RAM ユーザーを使用することを推奨します。
             * AccessKey ID と AccessKey Secret をプロジェクトコードに保存しないことを強く推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
             * 環境変数を取得する一般的な方法:
             * RAM ユーザーの AccessKey ID を取得する:process.env['ALIBABA_CLOUD_ACCESS_KEY_ID']
             * RAM ユーザーの AccessKey Secret を取得する:process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
             */
            accessKeyId: '環境変数から RAM ユーザーの AccessKey ID を取得することを推奨します',
            accessKeySecret: '環境変数から RAM ユーザーの AccessKey Secret を取得することを推奨します',
            // 必要に応じてリージョンとエンドポイントを変更してください。
            endpoint: "https://green-cip.ap-southeast-1.aliyuncs.com",
            apiVersion: '2022-03-02',
            // HTTP プロキシを設定します。
            // httpProxy: "http://xx.xx.xx.xx:xxxx",
            // HTTPS プロキシを設定します。
            // httpsProxy: "https://username:password@xxx.xxx.xxx.xxx:9999",
        });
    
        // API リクエストを作成し、パラメーターを設定します。
        var params = {
            // 画像審査サービス:AI ガードレールコンソールで画像審査プロ版ルールに設定された serviceCode。例:baselineCheck_global
            "Service": "baselineCheck_global",
            // 検出対象の画像の OSS 情報。
            "ServiceParameters": JSON.stringify({
                // 検出対象のファイルが格納されているバケットのリージョン。例:ap-southeast-1
                "ossRegionId": "ap-southeast-1",
                // 検出対象のファイルが格納されているバケットの名前。例:bucket001
                "ossBucketName": "bucket001",
                // 検出対象のファイル。例:image/001.jpg
                "ossObjectName": "image/001.jpg",
                // データの一意な識別子。
                "dataId": uuidv4()
            })
        }
    
        var requestOption = {
            method: 'POST',
            formatParams: false,
        };
    
        try {
            // API オペレーションを呼び出して検出結果を取得します。
            var response = await client.request('ImageModeration', params, requestOption)
            return response;
        } catch (err) {
            console.log(err);
        }
    }
    
    main().then(function (response) {
        console.log(JSON.stringify(response))
    });

ローカル画像の検出

  1. 両方の依存関係をインストールします:

    npm install @alicloud/green20220302@3.2.4
    npm install ali-oss --save
  2. API を呼び出します:

    const RPCClient = require("@alicloud/pop-core");
    const OSS = require('ali-oss');
    const { v4: uuidv4 } = require('uuid');
    const path = require("path");
    
    // サービスが VPC にデプロイされているかどうかを指定します。
    var isVPC = false;
    // ファイルアップロードトークン。
    var tokenDic = new Array();
    // ファイルアップロード用クライアント。
    var ossClient;
    
    // ファイルアップロード用クライアントを作成します。
    function createClient(accessKeyId, accessKeySecret, endpoint) {
        return new RPCClient({
            accessKeyId: accessKeyId,
            accessKeySecret: accessKeySecret,
            endpoint: endpoint,
            apiVersion: '2022-03-02',
            // HTTP プロキシを設定します。
            // httpProxy: "http://xx.xx.xx.xx:xxxx",
            // HTTPS プロキシを設定します。
            // httpsProxy: "https://username:password@xxx.xxx.xxx.xxx:9999",
        });
    }
    
    // ファイルアップロード用クライアントを作成します。
    function getOssClient(tokenData, isVPC) {
        if (isVPC) {
            ossClient = new OSS({
                accessKeyId: tokenData['AccessKeyId'],
                accessKeySecret: tokenData['AccessKeySecret'],
                stsToken: tokenData['SecurityToken'],
                endpoint: tokenData['OssInternalEndPoint'],
                bucket: tokenData['BucketName'],
            });
        } else {
            ossClient = new OSS({
                accessKeyId: tokenData['AccessKeyId'],
                accessKeySecret: tokenData['AccessKeySecret'],
                stsToken: tokenData['SecurityToken'],
                endpoint: tokenData['OssInternetEndPoint'],
                bucket: tokenData['BucketName'],
            });
        }
    }
    
    
    async function invoke(accessKeyId, accessKeySecret, endpoint) {
        // 注:インスタンス化されたクライアントをできるだけ再利用して、接続の確立を繰り返し行わないようにし、検出パフォーマンスを向上させてください。
        var client = createClient(accessKeyId, accessKeySecret, endpoint);
        var requestOption = {
            method: 'POST',
            formatParams: false,
        };
        // ローカルファイルのフルパス。例:D:\\localPath\\exampleFile.png。
        var filePath = 'D:\\localPath\\exampleFile.png';
    
        // ファイルアップロードトークンを取得します。
        if (tokenDic[endpoint] == null || tokenDic[endpoint]['Expiration'] <= Date.parse(new Date() / 1000)) {
            var tokenResponse = await client.request('DescribeUploadToken', '', requestOption)
            tokenDic[endpoint] = tokenResponse.Data;
        }
    
        // ファイルアップロード用クライアントを取得します。
        getOssClient(tokenDic[endpoint], isVPC)
        var split = filePath.split(".");
        var objectName;
        if (split.length > 1) {
            objectName = tokenDic[endpoint].FileNamePrefix + uuidv4() + "." + split[split.length - 1];
        } else {
            objectName = tokenDic[endpoint].FileNamePrefix + uuidv4();
        }
        // ファイルをアップロードします。
        const result = await ossClient.put(objectName, path.normalize(filePath));
    
        // 検出 API リクエストを作成し、パラメーターを設定します。
        var params = {
            // 画像審査サービス:AI ガードレールコンソールで画像審査プロ版ルールに設定された serviceCode。例:baselineCheck_global
            "Service": "baselineCheck_global",
            // アップロードされたローカル画像に関する情報。
            "ServiceParameters": JSON.stringify({
                "ossBucketName": tokenDic[endpoint].BucketName,
                "ossObjectName": objectName
            })
        }
        // API オペレーションを呼び出して検出結果を取得します。
        return await client.request('ImageModeration', params, requestOption);
    }
    
    
    
    function main() {
    	/**
        * Alibaba Cloud アカウントの AccessKey は、すべての API オペレーションに対する完全な権限を持っています。API コールや日常の O&M には RAM ユーザーを使用することを推奨します。
        * AccessKey ID と AccessKey Secret をプロジェクトコードに保存しないことを強く推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
        * 環境変数を取得する一般的な方法:
        * RAM ユーザーの AccessKey ID を取得する:process.env['ALIBABA_CLOUD_ACCESS_KEY_ID']
        * RAM ユーザーの AccessKey Secret を取得する:process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        */
        const accessKeyId: '環境変数から RAM ユーザーの AccessKey ID を取得することを推奨します'
        const accessKeySecret: '環境変数から RAM ユーザーの AccessKey Secret を取得することを推奨します'
        // 必要に応じてリージョンとエンドポイントを変更してください。
        var endpoint = "https://green-cip.ap-southeast-1.aliyuncs.com"
    
        try {
            // API オペレーションを呼び出して検出結果を取得します。
            invoke(accessKeyId, accessKeySecret, endpoint).then(function (response) {
                    console.log(JSON.stringify(response))
            })
        } catch (err) {
            console.log(err);
        }
    }
    
    main();

OSS 画像の検出

  1. Content Moderation に OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して、AliyunCIPScanOSSRole サービスロールを作成します。

  2. SDK をインストールします:

    npm install @alicloud/green20220302@3.2.4
  3. API を呼び出します:

    const RPCClient = require("@alicloud/pop-core");
    const { v4: uuidv4 } = require('uuid');
    
    async function main() {
        var client = new RPCClient({
            accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
            endpoint: "https://green-cip.ap-southeast-1.aliyuncs.com",
            apiVersion: '2022-03-02',
        });
    
        var params = {
            "Service": "baselineCheck_global",
            "ServiceParameters": JSON.stringify({
                "ossRegionId": "ap-southeast-1",  // バケットが配置されているリージョン
                "ossBucketName": "bucket001",      // ご利用の OSS バケット名
                "ossObjectName": "image/001.jpg",  // バケット内のオブジェクトパス
                "dataId": uuidv4()
            })
        };
    
        var requestOption = { method: 'POST', formatParams: false };
    
        try {
            var response = await client.request('ImageModeration', params, requestOption);
            return response;
        } catch (err) {
            console.log(err);
        }
    }
    
    main().then(function (response) {
        console.log(JSON.stringify(response));
    });

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

C# SDK

ソースコード: NuGet の C# SDK

パブリックにアクセス可能な画像の検出

  1. SDK をインストールします:

    dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.4
  2. API を呼び出します:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    
    namespace AlibabaCloud.SDK.Green20220302
    {
        public class ImageModerationAutoRoute
        {
            public static void Main(string[] args)
            {
                // 環境変数から認証情報を読み取ります。ハードコーディングしないでください。
                string accessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
                string accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
                // ご利用のリージョンに合わせてエンドポイントを変更してください。
                string endpoint = "green-cip.ap-southeast-1.aliyuncs.com";
    
                // リクエスト間でクライアントを再利用します。
                Client client = createClient(accessKeyId, accessKeySecret, endpoint);
                AlibabaCloud.TeaUtil.Models.RuntimeOptions runtimeOptions = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    
                Models.ImageModerationRequest imageModerationRequest = new Models.ImageModerationRequest();
                // AI ガードレールコンソールで設定されたサービスコードを設定します。
                imageModerationRequest.Service = "baselineCheck_global";
                Dictionary<string, object> task = new Dictionary<string, object>();
                task.Add("imageUrl", "https://img.alicdn.com/tfs/xxxxxxxxxx001.png");  // パブリック URL
                task.Add("dataId", Guid.NewGuid().ToString());
                imageModerationRequest.ServiceParameters = JsonConvert.SerializeObject(task);
    
                try
                {
                    Models.ImageModerationResponse response = client.ImageModerationWithOptions(imageModerationRequest, runtimeOptions);
                    Console.WriteLine(response.Body.RequestId);
                    Console.WriteLine(JsonConvert.SerializeObject(response.Body));
                }
                catch (Exception err)
                {
                    Console.WriteLine(err);
                }
            }
    
            public static Client createClient(string accessKeyId, string accessKeySecret, string endpoint)
            {
                AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
                {
                    AccessKeyId = accessKeyId,
                    AccessKeySecret = accessKeySecret,
                    // オプション:必要に応じて HTTP/HTTPS プロキシを設定します
                    // HttpProxy = "http://10.10.xx.xx:xxxx",
                    // HttpsProxy = "https://username:password@xxx.xxx.xxx.xxx:9999",
                    Endpoint = endpoint,
                };
                return new Client(config);
            }
        }
    }

ローカル画像の検出

Content Moderation SDK と OSS SDK をインストールします:

dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.4

OSS SDK については、Visual Studio の NuGet 経由でインストールします:

  1. ツール > NuGet パッケージ マネージャー > ソリューションの NuGet パッケージの管理 を開きます。

  2. aliyun.oss.sdk を検索します。

  3. Aliyun.OSS.SDK (.NET Framework の場合) または Aliyun.OSS.SDK.NetCore (.NET Core の場合) を選択し、インストール をクリックします。

次に、API を呼び出します:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Aliyun.OSS;

namespace AlibabaCloud.SDK.Green20220302
{
    public class ImageModerationAutoRoute
    {
        // エンドポイントごとにアップロードトークンをキャッシュします。
        public static Dictionary<string, Models.DescribeUploadTokenResponse> tokenDic =
            new Dictionary<string, Models.DescribeUploadTokenResponse>();

        public static OssClient ossClient = null;

        // VPC 環境で実行する場合は true に設定します。
        public static bool isVPC = false;

        public static void Main(string[] args)
        {
            string accessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
            string accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            string endpoint = "green-cip.ap-southeast-1.aliyuncs.com";

            Models.ImageModerationResponse response = invoke(accessKeyId, accessKeySecret, endpoint);
            Console.WriteLine(response.Body.RequestId);
            Console.WriteLine(JsonConvert.SerializeObject(response.Body));
        }

        public static Client createClient(string accessKeyId, string accessKeySecret, string endpoint)
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                AccessKeyId = accessKeyId,
                AccessKeySecret = accessKeySecret,
                Endpoint = endpoint,
            };
            return new Client(config);
        }

        private static OssClient getOssClient(Models.DescribeUploadTokenResponse tokenResponse, bool isVPC)
        {
            var tokenData = tokenResponse.Body.Data;
            return isVPC
                ? new OssClient(tokenData.OssInternalEndPoint, tokenData.AccessKeyId, tokenData.AccessKeySecret, tokenData.SecurityToken)
                : new OssClient(tokenData.OssInternetEndPoint, tokenData.AccessKeyId, tokenData.AccessKeySecret, tokenData.SecurityToken);
        }

        public static string uploadFile(string filePath, Models.DescribeUploadTokenResponse tokenResponse)
        {
            ossClient = getOssClient(tokenResponse, isVPC);
            var tokenData = tokenResponse.Body.Data;
            string objectName = tokenData.FileNamePrefix + Guid.NewGuid().ToString() + "." + filePath.Split(".").GetValue(1);
            ossClient.PutObject(tokenData.BucketName, objectName, filePath);
            return objectName;
        }

        public static Models.ImageModerationResponse invoke(string accessKeyId, string accessKeySecret, string endpoint)
        {
            // リクエスト間でクライアントを再利用します。
            Client client = createClient(accessKeyId, accessKeySecret, endpoint);
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtimeOptions = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();

            // ローカルファイルの実際のパスに置き換えてください。
            string filePath = "D:\\localPath\\exampleFile.png";

            try
            {
                // アップロードトークンを取得してキャッシュし、有効期限が切れたら更新します。
                if (!tokenDic.ContainsKey(endpoint) || tokenDic[endpoint].Body.Data.Expiration <= DateTimeOffset.Now.ToUnixTimeSeconds())
                {
                    tokenDic[endpoint] = client.DescribeUploadToken();
                }

                string objectName = uploadFile(filePath, tokenDic[endpoint]);

                Models.ImageModerationRequest imageModerationRequest = new Models.ImageModerationRequest();
                imageModerationRequest.Service = "baselineCheck_global";
                Dictionary<string, object> task = new Dictionary<string, object>();
                task.Add("ossBucketName", tokenDic[endpoint].Body.Data.BucketName);
                task.Add("ossObjectName", objectName);
                task.Add("dataId", Guid.NewGuid().ToString());
                imageModerationRequest.ServiceParameters = JsonConvert.SerializeObject(task);

                return client.ImageModerationWithOptions(imageModerationRequest, runtimeOptions);
            }
            catch (Exception err)
            {
                Console.WriteLine(err);
                return null;
            }
        }
    }
}

OSS 画像の検出

  1. Content Moderation に OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (root アカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して、AliyunCIPScanOSSRole サービスロールを作成します。

  2. SDK をインストールします:

    dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.4
  3. API を呼び出します:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    
    namespace AlibabaCloud.SDK.Green20220302
    {
        public class OssScanDemo
        {
            public static void Main(string[] args)
            {
                string accessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
                string accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
                string endpoint = "green-cip.ap-southeast-1.aliyuncs.com";
    
                Client client = createClient(accessKeyId, accessKeySecret, endpoint);
                AlibabaCloud.TeaUtil.Models.RuntimeOptions runtimeOptions = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    
                Models.ImageModerationRequest imageModerationRequest = new Models.ImageModerationRequest();
                imageModerationRequest.Service = "baselineCheck_global";
                Dictionary<string, object> task = new Dictionary<string, object>();
                task.Add("ossRegionId", "ap-southeast-1");  // バケットが配置されているリージョン
                task.Add("ossBucketName", "bucket001");      // ご利用の OSS バケット名
                task.Add("ossObjectName", "image/001.jpg");  // バケット内のオブジェクトパス
                task.Add("dataId", Guid.NewGuid().ToString());
                imageModerationRequest.ServiceParameters = JsonConvert.SerializeObject(task);
    
                try
                {
                    Models.ImageModerationResponse response = client.ImageModerationWithOptions(imageModerationRequest, runtimeOptions);
                    Console.WriteLine(response.Body.RequestId);
                    Console.WriteLine(JsonConvert.SerializeObject(response.Body));
                }
                catch (Exception err)
                {
                    Console.WriteLine(err);
                }
            }
    
            public static Client createClient(string accessKeyId, string accessKeySecret, string endpoint)
            {
                AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
                {
                    AccessKeyId = accessKeyId,
                    AccessKeySecret = accessKeySecret,
                    Endpoint = endpoint,
                };
                return new Client(config);
            }
        }
    }

SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?

いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンは一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole 権限付与を完了させます。これにより、リージョンをまたいで画像を検出できます。

ネイティブ HTTPS コール

SDK がご利用の環境に適していない場合にのみ、ネイティブ HTTPS コールを使用してください:

  • ご利用のアプリケーションには、クライアントの依存関係に厳しいサイズ制約があります。

  • アップグレードできない特定のライブラリバージョンに依存しています。

ネイティブ HTTPS を使用する場合、リクエスト URL の構築、HMAC-SHA1 署名の計算、およびすべてのリクエストパラメーターの組み立てを手動で行う必要があります。

エンドポイントとプロトコル

  • エンドポイント: https://green-cip.{region}.aliyuncs.com

  • プロトコル: HTTPS

  • メソッド: POST

共通リクエストパラメーター

すべてのリクエストには、以下のパラメーターが必要です:

パラメーター

タイプ

必須

説明

Format

String

はい

レスポンスのフォーマット:JSON (デフォルト) または XML

Version

String

はい

API バージョン (YYYY-MM-DD 形式)。値:2022-03-02

AccessKeyId

String

はい

ご利用の AccessKey ID

Signature

String

はい

HMAC-SHA1 署名文字列

SignatureMethod

String

はい

署名アルゴリズム:HMAC-SHA1

Timestamp

String

はい

リクエスト時刻 (ISO 8601 UTC 形式):yyyy-MM-ddTHH:mm:ssZ

SignatureVersion

String

はい

署名アルゴリズムのバージョン:1.0

SignatureNonce

String

はい

リプレイ攻撃を防ぐための一意の乱数。リクエストごとに異なる値を使用してください

Action

String

はい

呼び出す API:ImageModeration (同期)、ImageModerationAsync (非同期)

共通レスポンスパラメーター

すべてのレスポンスには、呼び出しが成功したかどうかに関わらず RequestId が含まれます。Data.Result 配列には LabelConfidence フィールドが含まれます。上記の SDK セクションのレスポンス形式とフィールドの説明をご参照ください。

リクエスト例

次の例では、同期ベースライン検出 API を呼び出します:

https://green-cip.ap-southeast-1.aliyuncs.com/ 
    ?Format=JSON
    &Version=2022-03-02
    &Signature=vpEEL0zFHfxXYzSFV0n7%2FZiFL9o%3D
    &SignatureMethod=Hmac-SHA1
    &SignatureNonce=15215528852396
    &SignatureVersion=1.0
    &Action=ImageModeration
    &AccessKeyId=123****cip
    &Timestamp=2022-12-12T12:00:00Z
    &Service=baselineCheck_global
    &ServiceParameters={"imageUrl": "https://img.alicdn.com/tfs/TB1U4r9AeH2gK0jSZJnXXaT1FXa-2880-480.png",
    "dataId": "img1234567"}

署名の計算

画像審査 2.0 は、すべてのリクエストを認証するために HMAC-SHA1 を使用します。

ステップ 1:正規化されたクエリ文字列の構築

  1. すべてのリクエストパラメーターをパラメーター名でアルファベット順にソートします (Signature を除く)。

  2. 各パラメーター名と値を UTF-8 と以下のルールを使用して URL エンコードします:

    • エンコードしない:A–Za–z0–9、ハイフン (-)、アンダースコア (_)、ピリオド (.)、チルダ (~)

    • その他の文字は %XY (16 進数 ASCII) としてエンコードします

    • スペースは + ではなく %20 としてエンコードします。*%2A としてエンコードします。%7E~ に置き換えます

    • 拡張 UTF-8 文字は %XY%ZA… としてエンコードします

    標準の URL エンコーディングライブラリ (例:java.net.URLEncoder) は、application/x-www-form-urlencoded MIME タイプ規則を使用します。エンコード後、+%20 に、*%2A に、%7E~ に置き換えてください。
  3. エンコードされた各名前と値のペアを = で接続します。

  4. すべてのペアをアルファベット順に & で接続して、正規化されたクエリ文字列を取得します。

ステップ 2:署名する文字列の構築

StringToSign = HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)

ここで、percentEncode("/")%2F であり、HTTPMethodPOST です。

ステップ 3:HMAC-SHA1 値の計算

RFC 2104 で定義されているように、StringToSign の HMAC-SHA1 ハッシュを計算します。署名キーは、ご利用の AccessKey Secret の後に & (ASCII 38) を付けたものです。

ステップ 4:結果のエンコード

HMAC-SHA1 値を Base64 エンコードして、Signature 文字列を取得します。

ステップ 5:リクエストへの署名の追加

RFC 3986 エンコーディングルールを使用して、URL エンコードされたクエリパラメーターとして Signature を追加します。

次のステップ