このガイドでは、画像審査 2.0 の有効化、認証情報の設定、および最初の審査呼び出しを行う手順を説明します。統合方法として、SDK (推奨) とネイティブ HTTPS の 2 つがサポートされています。SDK を使用すると、署名認証とリクエストのフォーマットが自動的に処理されるため、可能な限り SDK を使用してください。
前提条件
開始する前に、以下をご確認ください:
-
RAM ユーザーを作成し、サービスを有効化するための十分な権限を持つ Alibaba Cloud アカウント
ステップ 1:サービスの有効化
サービスの有効化ページに移動し、画像審査 2.0 を有効化します。
デフォルトの課金方法は従量課金です。料金は実際の使用量に基づいて毎日決済されます。API 呼び出しを行わない場合、料金は発生しません。料金の詳細については、「課金の詳細」をご参照ください。
ステップ 2:RAM ユーザーの作成と権限付与
-
Alibaba Cloud アカウントまたは管理者権限を持つ RAM ユーザーで RAM コンソールにログインします。
-
RAM ユーザーを作成します。アクセスタイプとして OpenAPI アクセス を選択し、生成された AccessKey ペアを記録します。詳細については、「RAM ユーザーの作成」をご参照ください。
-
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.ap-southeast-3.aliyuncs.com |
なし |
|
|
インドネシア (ジャカルタ) |
green-cip.ap-southeast-5.aliyuncs.com |
なし |
|
|
中国 (香港) |
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 つのフィールドがあります:
|
フィールド |
説明 |
|
|
検出されたリスクカテゴリ (例: |
|
|
ラベルに対する信頼度を示す 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 に送信できます。
-
pom.xmlに依存関係を追加します:<dependency> <groupId>com.aliyun</groupId> <artifactId>green20220302</artifactId> <version>3.3.3</version> </dependency> -
API を呼び出します:
ローカル画像の検出
パブリック URL のないローカル画像は、検出前に Content Moderation の OSS バケットにアップロードする必要があります。サービスは OSS から画像を取得して審査します。
-
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> -
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 にご利用のバケットへのアクセスを許可します。
-
Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して権限を付与します。
-
pom.xmlに依存関係を追加します:<dependency> <groupId>com.aliyun</groupId> <artifactId>green20220302</artifactId> <version>3.3.3</version> </dependency> -
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
パブリックにアクセス可能な画像の検出
-
SDK をインストールします:
pip install alibabacloud_green20220302==3.2.4 -
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)
ローカル画像の検出
-
両方の SDK をインストールします:
pip install alibabacloud_green20220302==3.2.4 pip install oss2 -
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 画像の検出
-
Content Moderation にご利用の OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して AliyunCIPScanOSSRole サービスロールを作成します。
-
SDK をインストールします:
pip install alibabacloud_green20220302==3.2.4 -
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
パブリックにアクセス可能な画像の検出
-
SDK をインストールします:
composer require alibabacloud/green-20220302 3.2.4 -
API を呼び出します:
ローカル画像の検出
-
両方の SDK をインストールします:
composer require alibabacloud/green-20220302 3.2.4 composer require aliyuncs/oss-sdk-php -
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 画像の検出
-
Content Moderation にご利用の OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して AliyunCIPScanOSSRole サービスロールを作成します。
-
SDK をインストールします:
composer require alibabacloud/green-20220302 3.2.4 -
API を呼び出します:
SDK の初期化リージョンと OSS バケットのリージョンは同じである必要がありますか?
いいえ。SDK を初期化する際に指定するリージョンは、Content Moderation サービスを呼び出すために使用されるエンドポイント (例:cn-shanghai) であり、OSS バケットのリージョンは画像が保存されている場所 (例:cn-hangzhou) です。2 つのリージョンが一致する必要はありません。OSS 権限付与を使用して画像を検出する場合、ServiceParameters で正しい ossRegionId (OSS バケットのリージョン)、ossBucketName、および ossObjectName を渡し、AliyunCIPScanOSSRole の権限付与を完了すれば、リージョンをまたいで画像を検出できます。
Go SDK
ソースコード:GitHub の Go SDK
パブリックにアクセス可能な画像の検出
-
SDK をインストールします:
go get github.com/alibabacloud-go/green-20220302/v3@v3.2.4 -
API を呼び出します:
ローカル画像の検出
-
両方の SDK をインストールします:
go get github.com/alibabacloud-go/green-20220302/v3 go get github.com/aliyun/aliyun-oss-go-sdk/oss -
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 画像の検出
-
Content Moderation にご利用の OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して AliyunCIPScanOSSRole サービスロールを作成します。
-
SDK をインストールします:
go get github.com/alibabacloud-go/green-20220302/v3 -
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
パブリックにアクセス可能な画像の検出
-
SDK をインストールします:
npm install @alicloud/green20220302@3.2.4 -
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)) });
ローカル画像の検出
-
両方の依存関係をインストールします:
npm install @alicloud/green20220302@3.2.4 npm install ali-oss --save -
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 画像の検出
-
Content Moderation にご利用の OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して AliyunCIPScanOSSRole サービスロールを作成します。
-
SDK をインストールします:
npm install @alicloud/green20220302@3.2.4 -
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
パブリックにアクセス可能な画像の検出
-
SDK をインストールします:
dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.4 -
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 経由でインストールします:
-
ツール > NuGet パッケージマネージャー > ソリューションの NuGet パッケージの管理 を開きます。
-
aliyun.oss.sdkを検索します。 -
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 画像の検出
-
Content Moderation にご利用の OSS バケットへのアクセスを許可します:Alibaba Cloud アカウント (ルートアカウント) でログインし、クラウドリソースアクセス権限付与ページに移動して AliyunCIPScanOSSRole サービスロールを作成します。
-
SDK をインストールします:
dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.4 -
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 呼び出し
ネイティブ HTTPS 呼び出しは、SDK がご利用の環境に適していない場合にのみ使用してください:
-
お使いのアプリケーションには、クライアント依存関係に厳しいサイズ制約があります。
-
アップグレードできない特定のライブラリバージョンに依存している場合。
ネイティブ HTTPS を使用する場合、リクエスト URL の構築、HMAC-SHA1 署名の計算、およびすべてのリクエストパラメーターの組み立てを手動で行う必要があります。
エンドポイントとプロトコル
-
エンドポイント:
https://green-cip.{region}.aliyuncs.com -
プロトコル:HTTPS
-
メソッド:POST
共通リクエストパラメーター
すべてのリクエストには、以下のパラメーターが必要です:
|
パラメーター |
タイプ |
必須 |
説明 |
|
|
String |
はい |
レスポンスフォーマット: |
|
|
String |
はい |
YYYY-MM-DD 形式の API バージョン。値: |
|
|
String |
はい |
ご利用の AccessKey ID |
|
|
String |
はい |
HMAC-SHA1 署名文字列 |
|
|
String |
はい |
署名アルゴリズム: |
|
|
String |
はい |
ISO 8601 UTC 形式のリクエスト時刻: |
|
|
String |
はい |
署名アルゴリズムのバージョン: |
|
|
String |
はい |
リプレイ攻撃を防ぐための一意の乱数。リクエストごとに異なる値を使用してください |
|
|
String |
はい |
呼び出す API: |
共通レスポンスパラメーター
呼び出しが成功したかどうかにかかわらず、すべてのレスポンスには RequestId が含まれます。Data.Result 配列には Label と Confidence フィールドが含まれます。上記の 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:正規化されたクエリ文字列の構築
-
すべてのリクエストパラメーターをパラメーター名でアルファベット順にソートします (
Signatureを除く)。 -
各パラメーター名と値を UTF-8 と以下のルールを使用して URL エンコードします:
-
エンコードしない:
A–Z、a–z、0–9、ハイフン (-)、アンダースコア (_)、ピリオド (.)、チルダ (~) -
その他の文字は
%XY(16 進数 ASCII) としてエンコードします -
スペースは
+ではなく%20としてエンコードします。*は%2Aとしてエンコードします。%7Eは~に置き換えます -
拡張 UTF-8 文字は
%XY%ZA…としてエンコードします
標準の URL エンコーディングライブラリ (例:
java.net.URLEncoder) は、application/x-www-form-urlencodedMIME タイプのルールを使用します。エンコード後、+を%20に、*を%2Aに、%7Eを~に置き換えてください。 -
-
各エンコードされた名前と値のペアを
=で接続します。 -
すべてのペアをアルファベット順に
&で接続して、正規化されたクエリ文字列を取得します。
ステップ 2:署名する文字列の構築
StringToSign = HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)
ここで、percentEncode("/") は %2F であり、HTTPMethod は POST です。
ステップ 3:HMAC-SHA1 値の計算
RFC 2104 で定義されているように、StringToSign の HMAC-SHA1 ハッシュを計算します。署名キーは、ご利用の AccessKey Secret の後に & (ASCII 38) を付けたものです。
ステップ 4:結果のエンコード
HMAC-SHA1 値を Base64 エンコードして Signature 文字列を取得します。
ステップ 5:リクエストへの署名の追加
Signature を RFC 3986 エンコーディングルールを使用して URL エンコードされたクエリパラメーターとして追加します。
次のステップ
-
画像審査 2.0 API リファレンス — 完全なパラメータードキュメントとすべての API オペレーション
-
リスクラベルの説明 — ラベルとその意味の完全なリスト
-
認証情報の設定 — その他の認証情報の設定オプション
-
課金の詳細 — 料金と課金サイクル