FLEDGE API 開發人員指南

本文適用對象

本文提供目前實驗性 Protected Audience API 疊代的技術參考資料。

什麼是 Protected Audience?

Protected Audience API 是一項 Privacy Sandbox 提案,其設計目的是提供再行銷和自訂目標對像用途,讓第三方無法利用該 API 追蹤使用者的跨網站瀏覽行為。這個 API 可讓瀏覽器在裝置端競價,針對使用者造訪過的網站選擇相關廣告。

Protected Audience 是可在 TURTLEDOVE 提案系列中導入 Chromium 的第一個實驗。

下圖概略說明 FLEDGE 生命週期:

概略說明 FLEDGE 生命週期各階段的插圖
FLEDGE 生命週期。

如何試用 Protected Audience?

Protected Audience 示範

如需在廣告主和發布商網站進行基本 Protected Audience 部署的逐步操作說明,請前往 Protect-audience-demo.web.app

這部示範影片會說明示範程式碼的運作方式,以及如何使用 Chrome 開發人員工具進行 Protected Audience 偵錯。

參加 Protected Audience 來源試用

Privacy Sandbox 關聯性與評估的來源試用已在電腦版 Chrome Beta 101.0.4951.26 以上版本中,針對 Protected Audience、TopicsAttribution Reporting API 提供。

如要參與計畫,請註冊來源試用權杖

成功註冊試用後,您可以在提供有效試用權杖的頁面上試用 Protected Audience JavaScript API,例如要求瀏覽器加入一或多個興趣群組,然後執行廣告競價來選取並顯示廣告。

Protected Audience 示範提供了端對端 Protected Audience 部署的基本範例。

針對您要執行 Protected Audience API 程式碼的每個網頁,提供試用權杖:

  • 做為 <head> 的中繼標記:

    <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">

  • 做為 HTTP 標頭:

    Origin-Trial: TOKEN_GOES_HERE

  • 透過程式輔助方式提供權杖:

    const otMeta = document.createElement('meta');
    otMeta.httpEquiv = 'origin-trial';
    otMeta.content = 'TOKEN_GOES_HERE';
    document.head.append(otMeta);
    

執行 Protected Audience 程式碼的 iframe (例如興趣群組擁有者的 navigator.joinAdInterestGroup() 呼叫) 必須提供與來源相符的權杖。

提出的第一個 Protected Audience 來源試用詳細資料」提供有關首次試用目標的詳細資料,並解釋支援的功能。

使用 chrome://flags 或功能旗標進行測試

您可以在電腦版 Chrome Beta 101.0.4951.26 以上版本中,針對單一使用者測試 Protected Audience: * 啟用 chrome://flags/#privacy-sandbox-ads-apis 即可。 * 透過指令列設定旗標。

在 iframe 或 Fenced 頁框中顯示廣告

視已設定的標記而定,廣告可以在 <iframe><fencedframe> 中顯示。

如要使用 <fencedframe> 顯示廣告,請按照下列步驟操作:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,FencedFrames

如要使用 <iframe> 顯示廣告,請按照下列步驟操作:

--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,AllowURNsInIframes --disable-features=FencedFrames

加入 BiddingAndScoringDebugReportingAPI 標記,啟用暫時性偵錯損失/勝出回報方法

想瞭解如何透過指令列在執行 Chrome 和其他以 Chromium 為基礎的瀏覽器時設定標記,請參閱這篇文章。如需 Protected Audience 標記的完整清單,請前往 Chromium 程式碼搜尋

最新版本的 Chrome 支援哪些功能?

Protected Audience 目前已在 Chromium 的功能旗標後方提供,做為第一個測試 Protected Audience 提案的下列功能:

  • 興趣群組:由瀏覽器儲存,其中包含設定廣告出價和算繪作業的相關中繼資料。
  • 買方 (需求端平台或廣告主) 的裝置端出價:依據已儲存的興趣群組和賣方的信號。
  • 賣方 (賣方平台或發布商) 的裝置端廣告選擇:根據買方的競價出價和中繼資料。
  • 在 Fenced Frames 暫時放鬆版本顯示廣告:允許在網路存取及記錄廣告時。

API 說明會進一步說明功能支援與限制。

興趣群組權限

Protected Audience 目前實作的預設設定,允許從網頁上的任何位置 (甚至是跨網域 iframe) 呼叫 joinAdInterestGroup()。日後,如果網站擁有者有時間調整跨網域 iframe 權限政策,計劃就會依照前述說明,禁止跨網域 iframe 的呼叫。

鍵/值服務

在 Protected Audience 廣告競價中,瀏覽器可以存取鍵/值服務,此服務會傳回簡單的鍵/值組合,為廣告買方提供資訊 (例如剩餘的廣告活動預算)。Protected Audience 提案要求此伺服器「不執行事件層級記錄」,並且根據這些要求沒有其他副作用。

您現在可以在 Privacy Sandbox GitHub 存放區中取得 Protected Audience 鍵/值服務程式碼。Chrome 和 Android 開發人員可使用這項服務。請參閱公告網誌文章瞭解最新狀態。如要進一步瞭解 Protected Audience 鍵/值服務,請參閱 API 說明信任模型說明

初始測試作業則會使用「自備伺服器」模型。長遠來看,廣告技術都必須使用在可信任的執行環境上執行的開放原始碼 Protected Audience 鍵/值服務,才能擷取即時資料。

為確保生態系統有足夠的時間進行測試,我們預計在第三方 Cookie 淘汰後,才會要求使用開放原始碼鍵/值服務或 TEE。我們會在轉換作業開始前,向開發人員發出重大通知,協助他們開始測試及採用。

偵測功能支援

使用 API 前,請先檢查瀏覽器是否支援該 API,以及文件是否提供此功能:

'joinAdInterestGroup' in navigator &&
  document.featurePolicy.allowsFeature('join-ad-interest-group') &&
  document.featurePolicy.allowsFeature('run-ad-auction') ?
  console.log('navigator.joinAdInterestGroup() is supported on this page') :
  console.log('navigator.joinAdInterestGroup() is not supported on this page');

如何停用 Protected Audience?

您可以以網站擁有者或個別使用者的身分封鎖 Protected Audience API 的存取權。

網站如何控制存取權?

Protected Audience 最終將要求網站設定權限政策,以便使用 Protected Audience 功能。這有助於確保在未經網站同意的情況下,任何第三方無法使用這個 API。不過,為了在首次來源試用期間進行測試,系統會預設免除這項要求。如果網站想在測試期間明確停用 Protected Audience 功能,可以使用相關權限政策封鎖存取權。

兩種 Protected Audience 權限政策可獨立設定: * join-ad-interest-group 可啟用/停用在興趣群組中新增瀏覽器的功能 * run-ad-auction 可啟用/停用執行裝置端競價的功能

如要完全停用第一方情境的 Protected Audience API 存取權,請在 HTTP 回應標頭中指定下列權限政策:

Permissions-Policy: join-ad-interest-group=(), run-ad-auction=()

您可以在 iframe 元素中加入下列 allow 屬性,停止在 iframe 中使用 API:

<iframe src="https://example.com" allow="join-ad-interest-group 'none'; run-ad-auction 'none'"></iframe>

提議的第一個 Protected Audience 來源試用權限政策」一節提供更多詳細資訊。

使用者選擇拒絕

使用者可以透過下列任一機制封鎖 Protected Audience API 和其他 Privacy Sandbox 功能的存取權:

  • 在 Chrome 設定中,依序前往「設定」 >「安全性與隱私權」 >「Privacy Sandbox」,即可停用 Privacy Sandbox 試用功能。您也可以在 chrome://settings/adPrivacy 找到此服務。
  • 在 Chrome 設定中停用第三方 Cookie:依序前往「設定」 >「安全性與隱私權」
  • 將「Cookie 和其他網站資料」設為 chrome://settings/cookies 中的「封鎖第三方 Cookie」或「封鎖所有 Cookie」。
  • 使用無痕模式。

Protected Audience 說明頁面會提供 API 設計元素的詳細資訊,並說明 API 如何致力達成隱私權目標

對 Protected Audience 工作小程式進行偵錯

自 Chrome Canary 98.0.4718.0 起,您可以運用 Chrome 開發人員工具中的 Protected Audience 工作小程式偵錯。

首先,請前往「Sources」面板的「Event Listener Breakpoints」窗格,透過新類別設定中斷點。

Chrome Canary 中的開發人員工具螢幕截圖,醒目顯示「來源」面板中的「事件監聽器中斷點」窗格。在「廣告競價小程式」下方選取「出價方出價階段開始」。

當中斷點觸發時,執行作業會在 Worklet 指令碼頂層的第一個陳述式之前暫停。您可以使用一般中斷點或步驟指令,取得出價/評分/報表函式。

即時 Worklet 指令碼也會顯示在「Threads」面板下方。

Chrome Canary 中的開發人員工具螢幕截圖,醒目顯示「Source」面板中的「Threads」窗格,顯示目前暫停的 Worklet 指令碼。

由於部分 Worklet 可能會平行執行,因此多個執行緒最終可能處於「已暫停」狀態。您可以使用執行緒清單切換執行緒,並視需要重新啟用或仔細檢查。

觀察 Protected Audience 事件

您可以透過 Chrome 開發人員工具的「應用程式」面板觀察 Protected Audience 興趣群組和競價事件。

當您使用已啟用 Protected Audience 的瀏覽器造訪 Protected Audience 示範購物網站時,開發人員工具會顯示 join 事件的相關資訊。

Chrome Canary 中的開發人員工具應用程式面板,顯示 Protected Audience 興趣群組加入事件的相關資訊。

現在,如果您透過已啟用 Protected Audience 的瀏覽器造訪 Protected Audience 示範發布商網站,開發人員工具就會顯示 bidwin 事件的相關資訊。

Chrome Canary 中的開發人員工具應用程式面板,顯示 Protected Audience 競價出價和勝出事件的相關資訊。

Protected Audience API 的運作方式為何?

在本例中,某位使用者瀏覽了客製化自行車製造商的網站,然後造訪新聞網站,並看到自行車製造商推出的新單車廣告。

1. 使用者造訪廣告主網站

插圖顯示使用者透過筆電的瀏覽器造訪客製化自行車製造商網站。

假設使用者造訪了客製化自行車製造商的網站 (此範例中的廣告客戶),並在產品頁面展示手工鋼腳踏車的產品頁面。這提供了再行銷商機,

2. 使用者的瀏覽器會要求新增興趣群組

插圖:顯示使用者正在使用筆記型電腦的瀏覽器查看網站。瀏覽器正在執行 JavaScript 程式碼 joinAdInterestGroup()。

說明部分: 瀏覽器記錄興趣群組

廣告主的需求端平台 (或廣告客戶本身) 會呼叫 navigator.joinAdInterestGroup(),要求瀏覽器將興趣群組新增至瀏覽器所屬的群組清單。在這個範例中,群組名稱為 custom-bikes,擁有者為 dsp.example。興趣群組擁有者 (在本例中為 DSP) 將是步驟 4 所述的廣告競價中的買方。興趣群組成員資料會儲存在瀏覽器和使用者的裝置上,不會與瀏覽器廠商或任何人共用。

joinAdInterestGroup()」要求取得以下權限: * 造訪的網站 * 興趣群組擁有者

舉例來說,如果沒有 dsp.example 權限,malicious.example 就無法使用 dsp.example 做為擁有者呼叫 joinAdInterestGroup()

造訪網站的權限

相同來源:根據預設,系統會從造訪網站的相同來源發出 joinAdInterestGroup() 呼叫 (也就是與目前頁面的頂層頁框相同),間接授予權限。網站可以使用 Protected Audience 的權限政策標頭 join-ad-interest-group 指令停用 joinAdInterestGroup() 呼叫。

跨來源:只有在受造訪的網站設有允許從跨來源 iframe 呼叫 joinAdInterestGroup() 的權限政策時,才能從與目前網頁不同的來源呼叫 joinAdInterestGroup()

興趣群組擁有者的權限

系統會從與興趣群組擁有者相同的 iframe 呼叫 joinAdInterestGroup(),以隱含方式授予興趣群組擁有者權限。舉例來說,dsp.exampleiframe 可以針對 dsp.example 擁有的興趣群組呼叫 joinAdInterestGroup()

我們的提案是 joinAdInterestGroup() 可以在擁有者網域的網頁或 iframe 中執行,或是委派給使用 .well-known 網址上清單提供的其他網域。

使用 navgator.joinAdInterestGroup()

以下舉例說明此 API 的使用方式:

const interestGroup = {
  owner: 'https://dsp.example',
  name: 'custom-bikes',
  biddingLogicUrl: ...,
  biddingWasmHelperUrl: ...,
  dailyUpdateUrl: ...,
  trustedBiddingSignalsUrl: ...,
  trustedBiddingSignalsKeys: ['key1', 'key2'],
  userBiddingSignals: {...},
  ads: [bikeAd1, bikeAd2, bikeAd3],
  adComponents: [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2],
};

navigator.joinAdInterestGroup(interestGroup, 7 * kSecsPerDay);

傳遞至函式的 interestGroup 物件大小不得超過 50 KB,否則呼叫會失敗。第二個參數可指定興趣群組的持續時間,上限為 30 天。連續呼叫會覆寫先前儲存的值。

興趣群組屬性

屬性 必要 範例 角色
owner 必要 'https://dsp.example' 興趣群組擁有者的來源。
name 必要 'custom-bikes' 興趣群組的名稱。
biddingLogicUrl** 選填* 'https://dsp.example/bid/custom-bikes/bid.js' Worklet 中用於出價 JavaScript 的網址。
biddingWasmHelperUrl** 選填* 'https://dsp.example/bid/custom-bikes/bid.wasm' 源自 biddingLogicUrl 的 WebAssembly 程式碼網址。
dailyUpdateUrl** 選用 'https://dsp.example/bid/custom-bikes/update' 傳回 JSON 以更新興趣群組屬性的網址。 (請參閱更新興趣群組)。
trustedBiddingSignalsUrl** 選用 'https://dsp.example/trusted/bidding-signals' 發送給出價方受信任伺服器鍵/值要求的基準網址。
trustedBiddingSignalsKeys 選用 ['key1', 'key2' ...] 向鍵/值受信任伺服器發出的要求鍵。
userBiddingSignals 選用 {...} 擁有者可在出價時使用的其他中繼資料。
ads 選填* [bikeAd1, bikeAd2, bikeAd3] 可能為這個興趣群組顯示的廣告。
adComponents 選用 [customBike1, customBike2, bikePedal, bikeFrame1, bikeFrame2] 由多個區塊組成的廣告元件。

* 除了 ownername 以外,所有屬性均為選用屬性。biddingLogicUrlads 為選用屬性,但如要參與競價,此為必要屬性。在某些情況下,建立興趣群組時可能會缺少這些屬性:舉例來說,興趣群組擁有者可能會想將瀏覽器加入興趣群組,以納入尚未放送的廣告活動、日後用於其他用途,或是暫時用盡廣告預算。

** biddingLogicUrlbiddingWasmHelperUrldailyUpdateUrltrustedBiddingSignalsUrl 網址的來源必須與擁有者相同。adsadComponents 網址沒有這類限制。

更新興趣群組屬性

dailyUpdateUrl 會指定網路伺服器,以便傳回定義興趣群組屬性的 JSON,對應傳遞至 navigator.joinAdInterestGroup() 的興趣群組物件。為群組擁有者提供一種機制,可定期更新興趣群組的屬性。在目前的實作項目中,您可以變更下列屬性:

  • biddingLogicUrl
  • biddingWasmHelperUrl
  • trustedBiddingSignalsUrl
  • trustedBiddingSignalsKeys
  • ads
  • priority

系統不會覆寫 JSON 中未指定的任何欄位,僅會更新 JSON 中指定的欄位,呼叫 navigator.joinAdInterestGroup() 則會覆寫任何現有的興趣群組。

我們會盡可能提供更新,但可能會在以下情況下失敗: * 網路要求逾時 (目前為 30 秒)。* 其他網路問題。 * JSON 剖析失敗。

如果您耗費太多連續更新時間,也可以取消更新作業,但這並不對已取消 (剩餘) 的更新施加任何頻率限制。更新頻率上限為每天一次。系統會在一小時後重試因網路錯誤而失敗的更新,而因網際網路連線中斷而失敗的更新,則會在重新連線後立即重試。

手動更新

目前影格來源擁有的興趣群組更新可透過 navigator.updateAdInterestGroups() 手動觸發。頻率限制可避免更新太常發生:重複的呼叫 navigator.updateAdInterestGroups() 會在頻率限制期間 (目前為一天) 過後,才執行任何動作。如果再次呼叫同一個興趣群組 ownernamenavigator.joinAdInterestGroup(),系統會重設頻率限制。

自動更新

競價完成後,其中載入的所有興趣群組都會自動更新,適用頻率限制與手動更新相同。對於每個擁有至少一個興趣群組參與競價的每位擁有者,這就像是從來源與擁有者相符的 iframe 呼叫 navigator.updateAdInterestGroups()

為興趣群組指定廣告

adsadComponents 物件包含廣告素材的網址,以及可選擇在出價時使用的任意中繼資料。例如:

{
  renderUrl: 'https://cdn.example/.../bikeAd1.html',
  metadata: bikeAd1metadata // optional
}

買方如何出價?

興趣群組擁有者提供的 biddingLogicUrl 指令碼必須包含 generateBid() 函式。當廣告空間賣方呼叫 navigator.runAdAuction() 時,如果瀏覽器所屬的興趣群組受邀出價,系統會針對該群組所屬的各個興趣群組呼叫 generatedBid() 函式。也就是說,系統會針對每個候選廣告呼叫一次 generateBid()。賣方針對傳遞至 navigator.runAdAuction() 的競價設定參數提供 decisionLogicUrl 屬性。這個網址中的程式碼必須包含 scoreAd() 函式,此函式會針對競價中的每個出價方執行,才能為 generateBid() 傳回的每項出價評分。

廣告空間買家提供的 biddingLogicUrl 指令碼必須包含 generateBid() 函式。系統會針對每個候選廣告呼叫一次此函式。runAdAuction() 會個別檢查每則廣告及其關聯出價和中繼資料,然後為廣告指派期望性分數。

generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  ...
  return {
    ad: adObject,
    bid: bidValue,
    render: renderUrl,
    adComponents: [adComponentRenderUrl1, ...]
   };
}

generateBid() 採用下列引數:

  • interestGroup
    廣告買方傳遞至 joinAdInterestGroup() 的物件。(興趣群組可以透過 dailyUpdateUrl 更新)。

  • auctionSignals
    廣告空間賣方傳遞至 navigator.runAdAuction()競價設定引數屬性。這可提供頁面內容的相關資訊 (例如廣告大小和發布商 ID)、競價類型 (最高價或第二高價) 和其他中繼資料。

  • perBuyerSignals
    auctionSignals 一樣,競價設定引數的屬性是由賣方傳遞至 navigator.runAdAuction() 的屬性,如果賣方本身是「賣方平台」,就會對買方伺服器執行即時出價呼叫並傳遞回應,或是發布商頁面直接與買方伺服器聯絡,藉此提供來自買方伺服器的內容相關信號。如果確實如此,買方可能會希望在 generateBid() 內檢查這些信號的加密簽名,避免遭到竄改。

  • trustedBiddingSignals
    物件的索引鍵為興趣群組的 trustedBiddingSignalsKeys,且值會在 trustedBiddingSignals 要求中傳回。

  • browserSignals
    瀏覽器建構的物件,可能包含頁面內容相關資訊 (例如目前頁面的 hostname,賣方可能會設為假資訊) 和興趣群組本身的資料 (例如群組先前贏得競價的時間記錄,用於允許裝置端展示頻率上限)。

browserSignals 物件包含下列屬性:

{
  topWindowHostname: 'publisher.example',
  seller: 'https://ssp.example',
  joinCount: 3,
  bidCount: 17,
  prevWins: [[time1,ad1],[time2,ad2],...],
  wasmHelper: ... /* WebAssembly.Module object based on interest group's biddingWasmHelperUrl. */
  dataVersion: 1, /* Data-Version value from the buyer's Key/Value service response(s). */
}

如要計算 bid 值,generateBid() 中的程式碼可以使用函式參數的屬性。例如:

function generateBid(interestGroup, auctionSignals, perBuyerSignals,
    trustedBiddingSignals, browserSignals) {
  return {
    ...
    bid: auctionSignals.is_above_the_fold ? perBuyerSignals.atf_value : perBuyerSignals.btf_value,
    ...
  }
}

generateBid() 會傳回包含四個屬性的物件:

  • ad
    與廣告相關的任意中繼資料,例如賣方預期瞭解此出價或廣告素材的資訊。賣方](/privacy-sandbox/resources/glossary#ssp)會在競價和決策廣告素材中使用這項資訊。賣方會在競價和決策邏輯中使用這項資訊。

  • bid
    將參加競價的數字數值,賣方必須在比較不同買方的出價,因此出價必須屬於某些賣方選擇的單位 (例如「每千美元」)。如果出價為零或負數,這個興趣群組就完全不會參與賣方競價。買方可以利用這個機制,針對廣告是否能夠顯示的位置導入任何廣告客戶規則。

  • render
    要用於顯示廣告素材的網址清單或網址清單,(請參閱 API 說明中的「以多個要素撰寫的廣告」)。這個值必須與興趣群組所定義廣告的其中一個 renderUrl 相符。

  • adComponents
    選用清單,最多列出 20 個元件,用於由多個區塊組成的廣告。這些元件來自傳遞至 navigator.joinAdInterestGroup() 的興趣群組引數的 adComponents 屬性。

要求瀏覽器退出興趣群組

興趣群組擁有者可以要求將瀏覽器從興趣群組中移除。換句話說,瀏覽器會要求瀏覽器從所屬興趣群組清單中移除。

navigator.leaveAdInterestGroup({
  owner: 'https://dsp.example',
  name: 'custom-bikes'
});

如果使用者返回的網站要求瀏覽器新增興趣群組,興趣群組擁有者可以呼叫 navigator.leaveAdInterestGroup() 函式,要求瀏覽器移除興趣群組。廣告的程式碼也可以針對其興趣群組呼叫這個函式。

3. 使用者造訪銷售廣告空間的網站

插圖:顯示使用者正在使用筆電的瀏覽器造訪新聞網站。網站有空白的廣告版位。

之後,他造訪了銷售廣告空間的網站,在這個範例中為新聞網站。該網站提供廣告空間,並且使用即時出價,透過程式輔助方式銷售廣告空間。

4. 瀏覽器進行廣告競價

插圖:顯示使用者正在使用筆電的瀏覽器查看新聞網站。使用 Protected Audience API 的廣告競價。

說明部分: 賣方執行裝置端競價

廣告競價可能是由發布商的賣方平台或發布商本身執行。競價的目的是為目前頁面上的單一可用廣告版位選取最合適的廣告。競價會將瀏覽器所屬的興趣群組,以及廣告空間買方和鍵/值服務中的賣方資料納入考量。

廣告空間賣方透過呼叫 navigator.runAdAuction() 向使用者的瀏覽器發出廣告請求來發起廣告競價。

例如:

const auctionConfig = {
  seller: 'https://ssp.example',
  decisionLogicUrl: ...,
  trustedScoringSignalsUrl: ...,
  interestGroupBuyers: ['https://dsp.example', 'https://buyer2.example', ...],
  auctionSignals: {...},
  sellerSignals: {...},
  sellerTimeout: 100,
  perBuyerSignals: {
    'https://dsp.example': {...},
    'https://another-buyer.example': {...},
    ...
  },
  perBuyerTimeouts: {
    'https://dsp.example': 50,
    'https://another-buyer.example': 200,
    '*': 150,
    ...
  },
  componentAuctions: [
    {
      'seller': 'https://some-other-ssp.example',
      'decisionLogicUrl': ...,
      ...
    },
    ...
  ]
};

const auctionResultPromise = navigator.runAdAuction(auctionConfig);

runAdAuction() 會傳回承諾,可解析為代表廣告競價結果的 URN (urn:uuid:<something>)。只有在將這個參數傳遞至圍欄頁框進行算繪時,瀏覽器才能進行解碼:發布商頁面無法檢查勝出的廣告。

decisionLogicUrl 指令碼會一次考量每則廣告及其關聯出價和中繼資料,然後為它指派數值分數。

auctionConfig 個房源

屬性 必要 範例 角色
seller 必要 'https://ssp.example' 賣方的來源。
decisionLogicUrl 必要 'https://ssp.example/auction-decision-logic.js' 競價 Worklet JavaScript 的網址。
trustedScoringSignalsUrl 選用 'https://ssp.example/scoring-signals' 賣家受信任伺服器的網址。
interestGroupBuyers* 必要 ['https://dsp.example', 'https://buyer2.example', ...] 要求在競價中出價的所有興趣群組擁有者的來源。
auctionSignals 選用 {...} 賣方的頁面內容、競價類型等相關資訊
sellerSignals 選用 {...} 根據發布商設定、內容相關廣告請求等信號收集的資訊
sellerTimeout 選用 100 賣方 scoreAd() 指令碼的執行階段上限 (毫秒)。
perBuyerSignals 選用 {'https://dsp.example': {...},
  'https://another-buyer.example': {...},
...}
每個特定買家 (經由其伺服器) 的網頁相關比對內容訊號。
perBuyerTimeouts 選用 50 特定買家 generateBid() 指令碼的執行階段上限 (毫秒)。
componentAuctions 選用 [{'seller': 'https://www.some-other-ssp.com',
  'decisionLogicUrl': ..., ...},
  ...]
元件競價的其他設定。

* 賣方可以指定 interestGroupBuyers: '*',允許所有興趣群組出價。 接著,系統會根據興趣群組擁有者以外的條件決定要接受或拒絕廣告。 舉例來說,賣方可以審查廣告素材,確認是否符合政策。

** 目前的 Protected Audience 實作不支援 additionalBids。詳情請參閱 Protected Audience 說明中的「競價參與者」一節。

系統如何選擇廣告?

decisionLogicUrl 中的程式碼 (傳遞至 runAdAuction() 的競價設定物件屬性) 必須包含 scoreAd() 函式。系統會針對每則廣告執行一次此程序,以判斷其合適度。

scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) {
  ...
  return desirabilityScoreForThisAd;
}

scoreAd() 採用下列引數: * adMetadata
買方提供的任意中繼資料。 * bid
數值。 * auctionConfig
傳遞至 navigator.runAdAuction() 的競價設定物件。 * trustedScoringSignals
在競價期間從賣方受信任伺服器擷取的值,代表賣方的廣告看法。 * browserSignals
瀏覽器建構的物件,包含瀏覽器可知的資訊,以及賣方競價指令碼可能想要驗證的資訊:

{
  topWindowHostname: 'publisher.example',
  interestGroupOwner: 'https://dsp.example',
  renderUrl: 'https://cdn.example/render',
  adComponents: ['https://cdn.com/ad-component-1', ...],
  biddingDurationMsec: 12,
  dataVersion: 1 /* Data-Version value from the seller's Key/Value service response. */
}

競價開始前,賣方為可用的廣告版位找出最適合的內容相關廣告。scoreAd() 邏輯的其中一部分是拒絕任何無法超越內容比對勝出者的廣告。

5. 賣方和參與的買方收到「鍵/值」服務的即時資料

插圖:顯示使用者正在使用筆電的瀏覽器查看新聞網站。使用 Protected Audience API 進行廣告競價,並邀請參與者透過鍵/值服務取得資料。

說明部分: 從 Protected Audience 鍵/值服務擷取即時資料

在廣告競價期間,廣告空間賣方可以使用傳遞至 navigator.runAdAuction()競價設定引數 trustedScoringSignalsUrl 屬性,以及 ads 中所有興趣群組中全部項目的 renderUrl 屬性所提供的鍵,向鍵/值服務發出要求,藉此取得特定廣告素材的即時資料。adComponents

同樣地,廣告空間買方可以使用傳送至 navigator.joinAdInterestGroup() 的興趣群組引數的 trustedBiddingSignalsUrltrustedBiddingSignalsKeys 屬性,向鍵/值服務要求即時資料。

瀏覽器呼叫 runAdAuction() 時,瀏覽器會向每個廣告買方的受信任伺服器發出請求。該要求的網址看起來會像這樣:

https://kv-service.example/getvalues?hostname=publisher.example&keys=key1,key2
  • 基準網址來自 trustedBiddingSignalsUrl
  • hostname 是由瀏覽器提供。
  • keys 值取自 trustedBiddingSignalsKeys

這項要求的回應為 JSON 物件,提供每個鍵的值。

6. 放送勝出的廣告

插圖:顯示使用者正在使用筆電的瀏覽器查看新聞網站。畫面上隨即會顯示腳踏車廣告 (8 折優惠),上方有一個鎖頭,表示廣告是在圍欄頁框中顯示。

說明部分: 瀏覽器顯示勝出的廣告

如前文所述:runAdAuction() 傳回的承諾會解析為 URN,並傳遞至圍欄頁框進行轉譯,且網站會顯示勝出的廣告。

7. 系統記錄競價結果

說明部分: 事件層級報表 (目前)

賣方回報結果

說明部分: 產生轉譯的賣方報表

decisionLogicUrl 中提供的賣家 JavaScript (也可提供 scoreAd()) 可包含 reportResult() 函式,用於回報競價結果。

reportResult(auctionConfig, browserSignals) {
  ...
  return signalsForWinner;
}

傳遞到這個函式的引數如下:

  • auctionConfig
    傳遞至 navigator.runAdAuction() 的競價設定物件。

  • browserSignals
    由瀏覽器建構的物件,可提供競價相關資訊。例如:

    {
      'topWindowHostname': 'publisher.example',
      'interestGroupOwner': 'https://dsp.example',
      'renderUrl': 'https://cdn.example/url-of-winning-creative.wbn',
      'bid:' <bidValue>,
      'desirability': <winningAdScore>
    }
    

此函式的傳回值會做為得標出價方的 reportWin() 函式的 sellerSignals 引數使用。

勝出出價方報表結果

說明部分: 有關顯示和廣告事件的買方報表

得標出價方的 JavaScript (也可提供 generateBid()) 可包含 reportWin() 函式,以便回報競價結果。

reportWin(auctionSignals, perBuyerSignals, sellerSignals, browserSignals) {
  ...
}

傳遞到這個函式的引數如下:

  • auctionSignalsperBuyerSignals
    傳送給 generateBid() 的相同值,以供得標出價方使用。
  • sellerSignals
    reportResult() 的傳回值,可讓賣方有機會將資訊傳遞給買方。
  • browserSignals
    由瀏覽器建構的物件,可提供競價相關資訊。 例如:

    {
      'topWindowHostname': 'publisher.example',
      'seller': 'https://ssp.example',
      'interestGroupOwner': 'https://dsp.example',
      'interestGroupName': 'custom-bikes',
      'renderUrl': 'https://cdn.example/winning-creative.wbn',
      'bid:' <bidValue>
    }
    

暫時損失/勝出報表導入

Chrome 暫時提供兩種競價報表的方式:

  • forDebuggingOnly.reportAdAuctionLoss()
  • forDebuggingOnly.reportAdAuctionWin()

這些方法都採用單一引數:競價完成後要擷取的網址。可在 scoreAd()generateBid() 中多次呼叫這些參數,並使用不同的網址引數。

Chrome 只會在競價執行完畢時傳送偵錯損失/勝出報表。如果競價已取消 (例如因為新的導覽),就不會產生報表。

根據預設,如果啟用 chrome://flags/#privacy-sandbox-ads-apis,Chrome 就能使用這些方法。不過,如果您是透過指令列旗標執行 Chrome 來啟用 Protected Audience,就必須加入 BiddingAndScoringDebugReportingAPI 標記來明確啟用這些方法。如未啟用這個標記,則方法仍可使用,但不會執行任何動作。

8. 系統記錄一次廣告點擊

插圖:使用者在新聞網站上點按單車廣告 (位於新聞網站) 的廣告,在有圍欄的頁框中點擊,並為賣方和買家提供報表資料。

系統會回報在圍欄頁框中顯示的廣告點擊次數。如要進一步瞭解運作方式,請參閱「Fenced Frames Ads Reporting」一文。



下圖概略說明 Protected Audience 廣告競價的各個階段:

插圖:概略說明 Protected Audience 廣告競價的各個階段


Protected Audience 和 TURTLEDOVE 有何差異?

Protected Audience 是可在 TURTLEDOVE 提案系列中導入 Chromium 的第一個實驗。

Protected Audience 遵循 TURTLEDOVE 的大原則。有些線上廣告是鎖定可能感興趣的使用者,向曾與廣告客戶或廣告聯播網互動的使用者顯示廣告。向來,廣告主知道特定使用者在瀏覽網站時,對他們而言是對當今網路安全的首要考量。

TURTLEDOVE 計畫旨在提供新的 API 來因應這個使用情境,同時提供一些重要的隱私權進展:

  • 瀏覽器 (而非廣告客戶) 會記錄廣告客戶認為使用者感興趣的資訊。
  • 廣告客戶可以根據使用者的興趣放送廣告,但無法將興趣搭配使用者的其他相關資訊 (特別是目標對像或造訪的網頁) 結合使用。

Protected Audience 由 TURTLEDOVE 和一系列相關提案進行修改,以便為使用 API 的開發人員提供更好的服務:

  • SPARROWCriteo 提議在信任的執行環境 (TEE) 中執行新增 (「總機」) 服務模型。Protected Audience 對 TEE 的使用有限度,可用於即時查詢資料和匯總報表。
  • NextRoll 的 TERN 和 Magnite 的 PARRROT 提案說明瞭買方和賣方在裝置端競價中面臨的不同角色。Protected Audience 的廣告出價/評分流程是以此為基礎。
  • RTB House 的依據結果產品層級 TURTLEDOVE 修改作業改善了裝置端競價的匿名模型和個人化功能
  • PARAKEET 是 Microsoft 針對類似 TURTLEDOVE 型廣告服務的提案,該提案依賴於瀏覽器與廣告技術供應商之間在 TEE 中執行的 Proxy 伺服器,以匿名處理廣告請求並強制執行隱私權屬性。Protected Audience 尚未採用這個 Proxy 模式。我們將 PARAKEET 和 Protected Audience 的 JavaScript API 整合,以支援日後的工作,進一步結合這兩項提案的最佳功能。

Protected Audience 尚未防止網站的廣告聯播網知道使用者會看到哪些廣告。我們預計會逐步修改 API,使其更加私密。

可以使用哪些瀏覽器設定?

使用者可以在 chrome://settings/adPrivacy 中啟用或停用頂層設定,藉此調整是否參與 Chrome 的 Privacy Sandbox 試用計畫。在初始測試期間,使用者可以使用此概略 Privacy Sandbox 設定來停用 Protected Audience。Chrome 計劃讓使用者在瀏覽過的網站,查看及管理興趣群組清單。就像 Privacy Sandbox 技術本身,使用者設定也會參考使用者、監管機構和其他機構的意見回饋。

隨著 Protected Audience 提案的進展,我們將繼續根據測試和意見回饋,持續更新 Chrome 中可用的設定。 我們計劃在未來提供更精細的設定,協助您管理 Protected Audience 和相關資料。

使用者在無痕模式下瀏覽內容時,API 呼叫端無法存取群組成員,使用者清除網站資料後,API 呼叫端就會移除成員資格。



互動並提供意見

取得支援

如要提出實作相關問題、關於示範說明文件相關問題,請在 privacy-sandbox-dev-support 存放區中開啟新問題。請務必為 Protected Audience 選取問題範本。 * 前往 GitHub 上的示範程式碼存放區回報問題。 * 如需關於如何透過 API 滿足用途的一般問題,請在提案存放區中回報問題

如果您在 Chrome 中導入 Protected Audience API 時發生錯誤和問題: * 針對 API 回報的現有問題。 * 前往 crbug.com/new 回報新問題。

取得最新消息

瞭解詳情


相片由 Ray HennessyUnsplash 提供。