處理重度廣告幹擾

羅根梅雷伍德
Rowan Merewood

如果廣告在裝置上使用過多資源,會對使用者體驗造成負面影響,例如效能降低的明顯影響,以及較不明顯的後果,例如耗電或耗用頻寬不足。從主動惡意 (例如加密貨幣挖礦程式) 到含有無意錯誤或效能問題的真實內容,都包含在內。

Chrome 會限制廣告可使用的資源,並在超過限制時卸載該廣告。詳情請參閱 Chromium 網誌的公告。卸載廣告的機制為重度廣告幹預

大量廣告條件

如果使用者未與廣告互動 (例如尚未輕觸或點選廣告),廣告就符合下列任一條件:

  • 使用主要執行緒超過 60 秒
  • 在任意 30 秒視窗中使用主要執行緒超過 15 秒
  • 使用超過 4 MB 的網路頻寬

廣告頁框的任何子系 iframe 使用的所有資源,都會計入該廣告幹預的限制。請特別注意,主要執行緒的時間限制與廣告載入後經過的時間並不相同。這些限制是指 CPU 執行廣告程式碼所需的時間。

測試介入措施

Chrome 85 版已推出這項介入措施,但根據預設,為保護使用者隱私,門檻會加入一些雜訊和變數。

如果將 chrome://flags/#heavy-ad-privacy-mitigations 設為「停用」,系統會移除這些保護措施,這表示限制只會在確定範圍內,以確定性方式套用。這樣應該就能簡化偵錯和測試作業。

觸發介入措施時,您應該會看到 iframe 中有關重型廣告的內容已取代為「Ad removed」訊息。如果您點選隨附的「詳細資料」連結,系統會顯示以下訊息:「這則廣告使用過多裝置資源,因此 Chrome 已移除」

您可以前往

請注意,測試時,有許多原因可能導致系統無法實施介入措施。

  • 在相同網頁中重新載入相同廣告可避免該組合產生幹擾。清除瀏覽記錄,並使用新標記開啟網頁,可以解決這個問題。
  • 確保頁面保持焦點:在頁面背景執行 (切換至其他視窗) 會暫停頁面的工作佇列,這樣就不會觸發 CPU 介入措施。
  • 請勿在測試時輕觸或點選廣告素材,這類措施不會套用至獲得任何使用者互動的內容。

您需要做些什麼?

在網站上顯示第三方供應商的廣告

您無須採取任何行動。但請注意,使用者在您網站上看到的廣告可能會超出這個限制。

您在網站上放送第一方廣告,或是提供第三方多媒體廣告廣告

請繼續閱讀下文,確保您透過 Reporting API 執行必要的監控,以便進行重度廣告介入。

您製作廣告素材,或是您維護用來製作廣告內容的工具

請繼續閱讀本文,確保您瞭解如何測試內容的效能和資源使用問題。另請參閱所選廣告平台的相關指南,這些平台可能會提供額外的技術建議或限制,例如 Google 多媒體廣告素材規範。建議您直接在編寫工具中建立可設定的門檻,以免成效不佳的廣告跳出狂熱。

移除廣告會有什麼影響?

Chrome 中的干預功能是透過適當名稱的 Reporting API 回報,並採用 intervention 報表類型。您可以使用 Reporting API,透過向報告端點或 JavaScript 發出的 POST 要求接收介入措施相關通知。

這些報表會在含有根廣告的根層級 iframe 和其所有子項目 (例如每個幹預動作卸載的影格) 上觸發。這表示如果廣告來自第三方來源 (例如跨網站 iframe),則由第三方 (例如廣告供應商) 負責處理報表。

如要設定 HTTP 報表的網頁,回應中應包含 Report-To 標頭:

Report-To: { "url": "https://example.com/reports", "max_age": 86400 }

觸發的 POST 要求會包含類似下方的報表:

POST /reports HTTP/1.1
Host: example.com
…
Content-Type: application/report

[{
 "type": "intervention",
 "age": 60,
 "url": "https://example.com/url/of/ad.html",
 "body": {
   "sourceFile": null,
   "lineNumber": null,
   "columnNumber": null,
   "id": "HeavyAdIntervention",
   "message": "Ad was removed because its CPU usage exceeded the limit. See https://www.chromestatus.com/feature/4800491902992384"
 }
}]

JavaScript API 為 ReportingObserver 提供 observe() 方法,可用來觸發介入措施提供的回呼。您可以在報表中加入其他資訊來協助偵錯。

// callback that will handle intervention reports
function sendReports(reports) {
  for (let report of reports) {
    // Log the `report` json via your own reporting process
    navigator.sendBeacon('https://report.example/your-endpoint', report);
  }
}

// create the observer with the callback
const observer = new ReportingObserver(
  (reports, observer) => {
    sendReports(reports);
  },
  { buffered: true }
);

// start watching for interventions
observer.observe();

不過,由於介入措施會確實將網頁從 iframe 中移除,因此建議您加入錯安全機制,確保在網頁完全消失前 (例如 iframe 內的廣告) 確實能擷取到報表。因此,您可以將相同的回呼掛載至 pagehide 事件中。

window.addEventListener('pagehide', (event) => {
  // pull all pending reports from the queue
  let reports = observer.takeRecords();
  sendReports(reports);
});

提醒您,為了保護使用者體驗,pagehide 事件會限制可發生的工作量。舉例來說,如果您嘗試傳送具有報表的 fetch() 要求,系統會取消這項要求。建議您使用 navigator.sendBeacon() 傳送報表,即使如此,瀏覽器無法保證一定是如此。

JavaScript 產生的 JSON 與透過 POST 要求傳送出的 JSON 類似:

[
  {
    type: 'intervention',
    url: 'https://example.com/url/of/ad.html',
    body: {
      sourceFile: null,
      lineNumber: null,
      columnNumber: null,
      id: 'HeavyAdIntervention',
      message:
        'Ad was removed because its network usage exceeded the limit. See https://www.chromestatus.com/feature/4800491902992384',
    },
  },
];

診斷介入措施的原因

廣告素材只是網頁內容,因此請使用 Lighthouse 等工具,稽核內容的整體成效。並藉由稽核結果直接提供改善狀況的指引。您也可以參閱 web.dev/fast 集合。

在更明確的情境中測試廣告可能會有幫助。您可以使用 https://unique-ads.glitch.me 中的自訂網址選項,在現成的已加上廣告標記的 iframe 中測試這個網址。您可以使用 Chrome 開發人員工具驗證內容 已標記為廣告依序點選「轉譯」面板中的三點圖示 選單 >「更多工具」>「顯示」,然後選取「醒目顯示廣告頁框」。如果在頂層視窗或其他情境中測試內容未標記為廣告,系統就不會觸發幹預功能,但您仍可手動檢查門檻。

影格的廣告狀態也會顯示在「Elements」窗格中,並在 <iframe> 開頭標記後方加上 ad 註解。這也會顯示在「Frames」面板的「Frames」區段中,其中有廣告標記的頁框會包含「廣告狀態」屬性。

網路用量

在 Chrome 開發人員工具中開啟「Network」面板,查看廣告的整體網路活動。建議您確保勾選「Disable cache」(停用快取) 選項,才能在重複載入時取得一致的結果。

。
開發人員工具中的「網路」面板。

頁面底部的轉移值會顯示整個頁面的傳輸金額。建議您使用頂端的篩選器輸入內容,將要求限制為與廣告相關的要求。

如果您找到廣告的初始請求 (例如 iframe 的來源),也可以使用請求中的「Initiator」(啟動工具) 分頁,查看廣告觸發的所有要求。

要求的「Initiator」分頁。
要求的「發起者」分頁。

按照大小排序要求整體清單是找出超大型資源的絕佳方法。常見的錯誤包括未最佳化的圖片和影片。

依回應大小排序要求。
依回應大小排序要求。

此外,按照名稱排序是找出重複要求的絕佳方法。這可能不是觸發幹預作業的單一大型資源,而是大量重複要求超過限制的大型資源。

CPU 使用率

開發人員工具中的「效能」面板可協助診斷 CPU 使用問題。首先,請開啟「Capture Settings」選單。使用「CPU」下拉式選單,盡可能降低 CPU 速度。與高階開發機器相比,CPU 的介入措施很可能在效能較低的裝置上觸發。

在「效能」面板中啟用網路和 CPU 節流功能。
在「效能」面板中啟用網路和 CPU 節流功能。

接著,按一下「Record」按鈕即可開始記錄活動。由於長時間追蹤記錄的載入可能需要較長時間,因此建議您嘗試錄製的時間和長度。載入錄製內容後,您可以使用頂端時間軸選取錄製的一部分。聚焦於圖表上標有實黃色、紫色或綠色的區域,如文字腳本、轉譯和繪畫。

「Performance」面板中的追蹤記錄摘要。
「效能」面板中的追蹤記錄摘要。

查看底部的「Bottom-Up」、「Call Tree」和「Event Log」分頁標籤。您可以依「Self Time」和「Total Time」排序這些資料欄,找出程式碼中的瓶頸。

在「由下而上」分頁中按照自我時間排序。
「由下而上」分頁中按照「自我時間」排序。

相關來源檔案也會提供連結,您可以將其遵循「Sources」面板,檢查每一行的費用。

「來源」面板會顯示執行時間。
「來源」面板顯示的執行時間。

這裡需要留意的常見問題是經過最佳化處理的動畫,這類動畫會觸發這類動畫,觸發的持續版面配置和繪製作業,或費用極高的作業,可能隱藏在已納入的程式庫中。

如何回報錯誤介入措施

Chrome 會比對資源要求與篩選清單,將內容標記為廣告。如果已標記非廣告內容,請考慮變更該程式碼,以免比對篩選規則。如果您懷疑某些介入措施未正確套用,可以透過此範本回報問題。請確保您已擷取介入措施的示例,並提供可重現問題的範例網址。