在 C# 中使用自訂影像清單進行仲裁
本文提供資訊和範例程式碼,可協助您開始使用 Content Moderator SDK for .NET 來執行下列操作:
- 建立自訂影像清單
- 為清單新增和移除影像
- 取得清單中所有影像的識別碼
- 擷取和更新清單中繼資料
- 重新整理清單搜尋索引
- 依據清單中的影像過濾影像
- 從清單中刪除所有影像
- 刪除自訂清單
注意
上限是 5 個影像清單,且每個清單不可超過 10,000 個影像。
本指南的主控台應用程式,會模擬您可以使用影像清單 API 執行的一些工作。
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
註冊 Content Moderator 服務
您必須有 API 訂用帳戶金鑰,才能透過 REST API 或 SDK 使用 Content Moderator 服務。 請在 Azure 入口網站中訂閱 Content Moderator 服務,以取得此項目。
建立 Visual Studio 專案
將一個新的 [主控台應用程式 (.NET Framework)] 專案新增到您的解決方案。
在範例程式碼中,將專案命名為 ImageLists。
選取此專案作為解決方案的單一啟始專案。
安裝必要的套件
安裝下列 NuGet 套件:
- Microsoft.Azure.CognitiveServices.ContentModerator
- Microsoft.Rest.ClientRuntime
- Newtonsoft.Json
更新程式的 using 陳述式
新增下列 using
陳述式
using Microsoft.Azure.CognitiveServices.ContentModerator;
using Microsoft.Azure.CognitiveServices.ContentModerator.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
建立 Content Moderator 用戶端
新增下列程式碼,為您的訂用帳戶建立 Content Moderator 用戶端。 使用您端點 URL 和訂用帳戶金鑰的值來更新 AzureEndpoint
和 CMSubscriptionKey
欄位。 您可以在 Azure 入口網站資源的 [快速入門] 索引標籤中找到這些選項。
/// <summary>
/// Wraps the creation and configuration of a Content Moderator client.
/// </summary>
/// <remarks>This class library contains insecure code. If you adapt this
/// code for use in production, use a secure method of storing and using
/// your Content Moderator subscription key.</remarks>
public static class Clients
{
/// <summary>
/// The base URL for Content Moderator calls.
/// </summary>
private static readonly string AzureEndpoint = "YOUR ENDPOINT URL";
/// <summary>
/// Your Content Moderator subscription key.
/// </summary>
private static readonly string CMSubscriptionKey = "YOUR API KEY";
/// <summary>
/// Returns a new Content Moderator client for your subscription.
/// </summary>
/// <returns>The new client.</returns>
/// <remarks>The <see cref="ContentModeratorClient"/> is disposable.
/// When you have finished using the client,
/// you should dispose of it either directly or indirectly. </remarks>
public static ContentModeratorClient NewClient()
{
// Create and initialize an instance of the Content Moderator API wrapper.
ContentModeratorClient client = new ContentModeratorClient(new ApiKeyServiceClientCredentials(CMSubscriptionKey));
client.Endpoint = AzureEndpoint;
return client;
}
}
重要
完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。 在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需詳細資訊,請參閱 Azure AI 服務安全性一文。
將應用程式特定的設定初始化
將下列類別和靜態欄位新增至 Program.cs 中的 Program 類別。
/// <summary>
/// The minimum amount of time, im milliseconds, to wait between calls
/// to the Image List API.
/// </summary>
private const int throttleRate = 3000;
/// <summary>
/// The number of minutes to delay after updating the search index before
/// performing image match operations against the list.
/// </summary>
private const double latencyDelay = 0.5;
/// <summary>
/// Define constants for the labels to apply to the image list.
/// </summary>
private class Labels
{
public const string Sports = "Sports";
public const string Swimsuit = "Swimsuit";
}
/// <summary>
/// Define input data for images for this sample.
/// </summary>
private class Images
{
/// <summary>
/// Represents a group of images that all share the same label.
/// </summary>
public class Data
{
/// <summary>
/// The label for the images.
/// </summary>
public string Label;
/// <summary>
/// The URLs of the images.
/// </summary>
public string[] Urls;
}
/// <summary>
/// The initial set of images to add to the list with the sports label.
/// </summary>
public static readonly Data Sports = new Data()
{
Label = Labels.Sports,
Urls = new string[] {
"https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample6.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample9.png"
}
};
/// <summary>
/// The initial set of images to add to the list with the swimsuit label.
/// </summary>
/// <remarks>We're adding sample16.png (image of a puppy), to simulate
/// an improperly added image that we will later remove from the list.
/// Note: each image can have only one entry in a list, so sample4.png
/// will throw an exception when we try to add it with a new label.</remarks>
public static readonly Data Swimsuit = new Data()
{
Label = Labels.Swimsuit,
Urls = new string[] {
"https://moderatorsampleimages.blob.core.windows.net/samples/sample1.jpg",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample3.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png"
}
};
/// <summary>
/// The set of images to subsequently remove from the list.
/// </summary>
public static readonly string[] Corrections = new string[] {
"https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png"
};
}
/// <summary>
/// The images to match against the image list.
/// </summary>
/// <remarks>Samples 1 and 4 should scan as matches; samples 5 and 16 should not.</remarks>
private static readonly string[] ImagesToScreen = new string[] {
"https://moderatorsampleimages.blob.core.windows.net/samples/sample1.jpg",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample5.png",
"https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png"
};
/// <summary>
/// A dictionary that tracks the ID assigned to each image URL when
/// the image is added to the list.
/// </summary>
/// <remarks>Indexed by URL.</remarks>
private static readonly Dictionary<string, int> ImageIdMap =
new Dictionary<string, int>();
/// <summary>
/// The name of the file to contain the output from the list management operations.
/// </summary>
/// <remarks>Relative paths are relative to the execution directory.</remarks>
private static string OutputFile = "ListOutput.log";
/// <summary>
/// A static reference to the text writer to use for logging.
/// </summary>
private static TextWriter writer;
/// <summary>
/// A copy of the list details.
/// </summary>
/// <remarks>Used to initially create the list, and later to update the
/// list details.</remarks>
private static Body listDetails;
注意
您的 Content Moderator 服務金鑰會有每秒要求數目 (RPS) 的速率限制。如果超出此限制,SDK 就會擲回錯誤碼為 429 的例外狀況。 免費層金鑰有一個 RPS 速率限制。
建立方法以將訊息寫入至記錄檔
將下列方法新增至 Program 類別。
/// <summary>
/// Writes a message to the log file, and optionally to the console.
/// </summary>
/// <param name="message">The message.</param>
/// <param name="echo">if set to <c>true</c>, write the message to the console.</param>
private static void WriteLine(string message = null, bool echo = false)
{
writer.WriteLine(message ?? String.Empty);
if (echo)
{
Console.WriteLine(message ?? String.Empty);
}
}
建立方法以建立自訂清單
將下列方法新增至 Program 類別。
/// <summary>
/// Creates the custom list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <returns>The response object from the operation.</returns>
private static ImageList CreateCustomList(ContentModeratorClient client)
{
// Create the request body.
listDetails = new Body("MyList", "A sample list",
new BodyMetadata("Acceptable", "Potentially racy"));
WriteLine($"Creating list {listDetails.Name}.", true);
var result = client.ListManagementImageLists.Create(
"application/json", listDetails);
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
建立方法以將影像集合新增至清單
將下列方法新增至 Program 類別。 本指南不會示範如何將標記套用至清單中的影像。
/// <summary>
/// Adds images to an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <param name="imagesToAdd">The images to add.</param>
/// <param name="label">The label to apply to each image.</param>
/// <remarks>Images are assigned content IDs when they are added to the list.
/// Track the content ID assigned to each image.</remarks>
private static void AddImages(
ContentModeratorClient client, int listId,
IEnumerable<string> imagesToAdd, string label)
{
foreach (var imageUrl in imagesToAdd)
{
WriteLine();
WriteLine($"Adding {imageUrl} to list {listId} with label {label}.", true);
try
{
var result = client.ListManagementImage.AddImageUrlInput(
listId.ToString(), "application/json", new BodyModel("URL", imageUrl), null, label);
ImageIdMap.Add(imageUrl, Int32.Parse(result.ContentId));
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
}
catch (Exception ex)
{
WriteLine($"Unable to add image to list. Caught {ex.GetType().FullName}: {ex.Message}", true);
}
finally
{
Thread.Sleep(throttleRate);
}
}
}
建立方法以從清單中移除影像
將下列方法新增至 Program 類別。
/// <summary>
/// Removes images from an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <param name="imagesToRemove">The images to remove.</param>
/// <remarks>Images are assigned content IDs when they are added to the list.
/// Use the content ID to remove the image.</remarks>
private static void RemoveImages(
ContentModeratorClient client, int listId,
IEnumerable<string> imagesToRemove)
{
foreach (var imageUrl in imagesToRemove)
{
if (!ImageIdMap.ContainsKey(imageUrl)) continue;
int imageId = ImageIdMap[imageUrl];
WriteLine();
WriteLine($"Removing entry for {imageUrl} (ID = {imageId}) from list {listId}.", true);
var result = client.ListManagementImage.DeleteImage(
listId.ToString(), imageId.ToString());
Thread.Sleep(throttleRate);
ImageIdMap.Remove(imageUrl);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
}
}
建立方法以取得清單中影像的所有內容識別碼
將下列方法新增至 Program 類別。
/// <summary>
/// Gets all image IDs in an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <returns>The response object from the operation.</returns>
private static ImageIds GetAllImageIds(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Getting all image IDs for list {listId}.", true);
var result = client.ListManagementImage.GetAllImageIds(listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
建立方法以更新清單的詳細資料
將下列方法新增至 Program 類別。
/// <summary>
/// Updates the details of an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <returns>The response object from the operation.</returns>
private static ImageList UpdateListDetails(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Updating details for list {listId}.", true);
listDetails.Name = "Swimsuits and sports";
var result = client.ListManagementImageLists.Update(
listId.ToString(), "application/json", listDetails);
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
建立方法以擷取清單的詳細資料
將下列方法新增至 Program 類別。
/// <summary>
/// Gets the details for an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <returns>The response object from the operation.</returns>
private static ImageList GetListDetails(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Getting details for list {listId}.", true);
var result = client.ListManagementImageLists.GetDetails(listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
建立方法以重新整理清單的搜尋索引
將下列方法新增至 Program 類別。 每當您更新清單時,都必須先重新整理搜尋索引,才能使用清單來過濾影像。
/// <summary>
/// Refreshes the search index for an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <returns>The response object from the operation.</returns>
private static RefreshIndex RefreshSearchIndex(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Refreshing the search index for list {listId}.", true);
var result = client.ListManagementImageLists.RefreshIndexMethod(listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
建立方法以依據清單比對影像
將下列方法新增至 Program 類別。
/// <summary>
/// Matches images against an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
/// <param name="imagesToMatch">The images to screen.</param>
private static void MatchImages(
ContentModeratorClient client, int listId,
IEnumerable<string> imagesToMatch)
{
foreach (var imageUrl in imagesToMatch)
{
WriteLine();
WriteLine($"Matching image {imageUrl} against list {listId}.", true);
var result = client.ImageModeration.MatchUrlInput(
"application/json", new BodyModel("URL", imageUrl), listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
}
}
建立方法以從清單中刪除所有影像
將下列方法新增至 Program 類別。
/// <summary>
/// Deletes all images from an image list.
/// </summary>
/// <param name="client">The Content Modertor client.</param>
/// <param name="listId">The list identifier.</param>
private static void DeleteAllImages(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Deleting all images from list {listId}.", true);
var result = client.ListManagementImage.DeleteAllImages(listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
}
建立方法以刪除清單
將下列方法新增至 Program 類別。
/// <summary>
/// Deletes an image list.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <param name="listId">The list identifier.</param>
private static void DeleteCustomList(
ContentModeratorClient client, int listId)
{
WriteLine();
WriteLine($"Deleting list {listId}.", true);
var result = client.ListManagementImageLists.Delete(listId.ToString());
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
}
建立方法以擷取所有影像清單的識別碼
將下列方法新增至 Program 類別。
/// <summary>
/// Gets all list identifiers for the client.
/// </summary>
/// <param name="client">The Content Moderator client.</param>
/// <returns>The response object from the operation.</returns>
private static IList<ImageList> GetAllListIds(ContentModeratorClient client)
{
WriteLine();
WriteLine($"Getting all image list IDs.", true);
var result = client.ListManagementImageLists.GetAllImageLists();
Thread.Sleep(throttleRate);
WriteLine("Response:");
WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
return result;
}
新增程式碼以模擬影像清單的使用
將以下程式碼新增至 Main 方法。 此程式碼會模擬許多您在定義和管理清單,以及使用清單來過濾影像時,會執行的作業。 記錄功能可讓您查看對 Content Moderator 服務發出的 SDK 呼叫所產生的回應物件。
// Create the text writer to use for logging, and cache a static reference to it.
using (StreamWriter outputWriter = new StreamWriter(OutputFile))
{
writer = outputWriter;
// Create a Content Moderator client.
using (var client = Clients.NewClient())
{
// Create a custom image list and record the ID assigned to it.
var creationResult = CreateCustomList(client);
if (creationResult.Id.HasValue)
{
// Cache the ID of the new image list.
int listId = creationResult.Id.Value;
// Perform various operations using the image list.
AddImages(client, listId, Images.Sports.Urls, Images.Sports.Label);
AddImages(client, listId, Images.Swimsuit.Urls, Images.Swimsuit.Label);
GetAllImageIds(client, listId);
UpdateListDetails(client, listId);
GetListDetails(client, listId);
// Be sure to refresh search index
RefreshSearchIndex(client, listId);
// WriteLine();
WriteLine($"Waiting {latencyDelay} minutes to allow the server time to propagate the index changes.", true);
Thread.Sleep((int)(latencyDelay * 60 * 1000));
// Match images against the image list.
MatchImages(client, listId, ImagesToMatch);
// Remove images
RemoveImages(client, listId, Images.Corrections);
// Be sure to refresh search index
RefreshSearchIndex(client, listId);
WriteLine();
WriteLine($"Waiting {latencyDelay} minutes to allow the server time to propagate the index changes.", true);
Thread.Sleep((int)(latencyDelay * 60 * 1000));
// Match images again against the image list. The removed image should not get matched.
MatchImages(client, listId, ImagesToMatch);
// Delete all images from the list.
DeleteAllImages(client, listId);
// Delete the image list.
DeleteCustomList(client, listId);
// Verify that the list was deleted.
GetAllListIds(client);
}
}
writer.Flush();
writer.Close();
writer = null;
}
Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
執行程式並檢閱輸出
每次您執行應用程式時,清單識別碼和影像內容識別碼都會有所不同。 程式所寫入的記錄檔會包含下列輸出:
Creating list MyList.
Response:
{
"Id": 169642,
"Name": "MyList",
"Description": "A sample list",
"Metadata": {
"Key One": "Acceptable",
"Key Two": "Potentially racy"
}
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png to list 169642 with label Sports.
Response:
{
"ContentId": "169490",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "233"
},
{
"Key": "ImageSizeInBytes",
"Value": "2945548"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_b4d3e20a-0751-4760-8829-475e5da33ce8"
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample6.png to list 169642 with label Sports.
Response:
{
"ContentId": "169491",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "215"
},
{
"Key": "ImageSizeInBytes",
"Value": "2440050"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_cc1eb6af-2463-4e5e-9145-2a11dcecbc30"
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample9.png to list 169642 with label Sports.
Response:
{
"ContentId": "169492",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "98"
},
{
"Key": "ImageSizeInBytes",
"Value": "1631958"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_01edc1f2-b448-48cf-b7f6-23b64d5040e9"
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample1.jpg to list 169642 with label Swimsuit.
Response:
{
"ContentId": "169493",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "27"
},
{
"Key": "ImageSizeInBytes",
"Value": "17280"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_41f7bc6f-8778-4576-ba46-37b43a6c2434"
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample3.png to list 169642 with label Swimsuit.
Response:
{
"ContentId": "169494",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "129"
},
{
"Key": "ImageSizeInBytes",
"Value": "1242855"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_61a48f33-eb55-4fd9-ac97-20eb0f3622a5"
}
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png to list 169642 with label Swimsuit.
Unable to add image to list. Caught Microsoft.CognitiveServices.ContentModerator.Models.APIErrorException: Operation returned an invalid status code 'Conflict'
Adding https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png to list 169642 with label Swimsuit.
Response:
{
"ContentId": "169495",
"AdditionalInfo": [
{
"Key": "Source",
"Value": "169642"
},
{
"Key": "ImageDownloadTimeInMs",
"Value": "65"
},
{
"Key": "ImageSizeInBytes",
"Value": "1088127"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_1c1f3de4-58b9-4aa8-82fa-1b0f479f6d7c"
}
Getting all image IDs for list 169642.
Response:
{
"ContentSource": "169642",
"ContentIds": [
169490,
169491,
169492,
169493,
169494,
169495
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_0d017deb-38fa-4701-a7b1-5b6608c79da2"
}
Updating details for list 169642.
Response:
{
"Id": 169642,
"Name": "Swimsuits and sports",
"Description": "A sample list",
"Metadata": {
"Key One": "Acceptable",
"Key Two": "Potentially racy"
}
}
Getting details for list 169642.
Response:
{
"Id": 169642,
"Name": "Swimsuits and sports",
"Description": "A sample list",
"Metadata": {
"Key One": "Acceptable",
"Key Two": "Potentially racy"
}
}
Refreshing the search index for list 169642.
Response:
{
"ContentSourceId": "169642",
"IsUpdateSuccess": true,
"AdvancedInfo": [],
"Status": {
"Code": 3000,
"Description": "RefreshIndex successfully completed.",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_c72255cd-55a0-415e-9c18-0b9c08a9f25b"
}
Waiting 0.5 minutes to allow the server time to propagate the index changes.
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample1.jpg against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_ec384878-dbaa-4999-9042-6ac986355967",
"CacheID": null,
"IsMatch": true,
"Matches": [
{
"Score": 1.0,
"MatchId": 169493,
"Source": "169642",
"Tags": [],
"Label": "Swimsuit"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_e9db4b8f-3067-400f-9552-d3e6af2474c0",
"CacheID": null,
"IsMatch": true,
"Matches": [
{
"Score": 1.0,
"MatchId": 169490,
"Source": "169642",
"Tags": [],
"Label": "Sports"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample5.png against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_25991575-05da-4904-89db-abe88270b403",
"CacheID": null,
"IsMatch": false,
"Matches": [],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_c65d1c91-0d8a-4511-8ac6-814e04adc845",
"CacheID": null,
"IsMatch": true,
"Matches": [
{
"Score": 1.0,
"MatchId": 169495,
"Source": "169642",
"Tags": [],
"Label": "Swimsuit"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Removing entry for https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png (ID = 169495) from list 169642.
Response:
""
Refreshing the search index for list 169642.
Response:
{
"ContentSourceId": "169642",
"IsUpdateSuccess": true,
"AdvancedInfo": [],
"Status": {
"Code": 3000,
"Description": "RefreshIndex successfully completed.",
"Exception": null
},
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_b55a375e-30a1-4612-aa7b-81edcee5bffb"
}
Waiting 0.5 minutes to allow the server time to propagate the index changes.
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample1.jpg against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_00544948-2936-489c-98c8-b507b654bff5",
"CacheID": null,
"IsMatch": true,
"Matches": [
{
"Score": 1.0,
"MatchId": 169493,
"Source": "169642",
"Tags": [],
"Label": "Swimsuit"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample4.png against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_c36ec646-53c2-4705-86b2-d72b5c2273c7",
"CacheID": null,
"IsMatch": true,
"Matches": [
{
"Score": 1.0,
"MatchId": 169490,
"Source": "169642",
"Tags": [],
"Label": "Sports"
}
],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample5.png against list 169642.
Response:
{
TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_22edad74-690d-4fbc-b7d0-bf64867c4cb9",
"CacheID": null,
"IsMatch": false,
"Matches": [],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Matching image https://moderatorsampleimages.blob.core.windows.net/samples/sample16.png against list 169642.
Response:
{
"TrackingId": "WE_f0527c49616243c5ac65e1cc3482d390_ContentModerator.Preview_abd4a178-3238-4601-8e4f-cf9ee66f605a",
"CacheID": null,
"IsMatch": false,
"Matches": [],
"Status": {
"Code": 3000,
"Description": "OK",
"Exception": null
}
}
Deleting all images from list 169642.
Response:
"Reset Successful."
Deleting list 169642.
Response:
""
Getting all image list IDs.
Response:
[]
下一步
針對這個及其他適用於 .NET 的 Content Moderator 快速入門取得 Content Moderator .NET SDK 和 Visual Studio 解決方案,並開始進行您的整合。