Integracja z B&A jako kupujący

Usługi określania stawek i aukcji to zestaw usług dla kupujących i sprzedających reklamy, które działają w zaufanym środowisku wykonawczym (TEE), aby ułatwić przeprowadzenie aukcji z użyciem Protected Audience (PA). Z tego przewodnika dla programistów dowiesz się, jak kupujący może zintegrować się z aukcją B&A PA w Chrome.

Przegląd

Aby wziąć udział w aukcji Protected Audience API z usługami B&A, kupujący aktualizuje grupę zainteresowań, aby zoptymalizować ładunek pod kątem mniejszego opóźnienia aukcji.

Kupujący wymaga wykonania tych zadań optymalizacji ładunku:

Grupa zainteresowań w przypadku B&A

Poniżej znajdziesz przykład konfiguracji grupy zainteresowań w przypadku aukcji B&A PA z zastosowaną optymalizacją ładunku:

navigator.joinAdInterestGroup({
  name: 'example-ig',
  owner: 'https://dsp.example',

  // An ID is mapped to each render URL
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max,
      buyerReportingId: 'brid123', // Optional
      buyerAndSellerReportingId: 'bsrid123', // Optional
      selectableBuyerAndSellerReportingId: ['sbsrid123', 'sbsrid456'], // Optional
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adRenderId: 'abcdefgh'
    },
  ],

  // Flags are set to omit data in the B&A auction payload
  auctionServerRequestFlags: ['omit-ads', 'omit-user-bidding-signals'],

  // Data not included in the B&A auction payload can be fetched as trusted signals
  // The following is an example of how the keys could look, but the actual
  // implementation is up to the ad tech
  trustedBiddingSignalsKeys: [
    'exampleUserBiddingSignalsKey',
    'exampleAdRenderIdKey',
    'exampleAdMetadataKey',
    'exampleAdReportingIdKey',
  ],

  // Optionally, interest groups can be prioritized
  priority: 0.0,
});

Różnice między konfiguracjami grup zainteresowań w przypadku B&A i na urządzeniu:

Pola B&A IG IG na urządzeniu Uwzględnione w ładunku aukcji B&A
auctionServerRequestFlags Używany Nieużywane Nie
userBiddingSignals Niezalecane Używany Nie, jeśli ustawiona jest flaga omit-user-bidding-signals
adRenderId w ads i adComponents Używany Nieużywane Jeśli flaga omit-ads jest ustawiona, wartość adRenderId w parametrze ads jest dostępna tylko w parametrze browserSignals.prevWins w ładunku. Parametr adRenderId zdefiniowany w adComponents nie jest uwzględniony w ładunku.

Jeśli flaga omit-ads nie jest ustawiona, jest dostępna w przypadku browserSignals.prevWins, interestGroup.adRenderIdsinterestGroup.adComponentRenderIds.

renderURL w ads i adComponents Używany Używany Nie
metadata w ads i adComponents Nieużywane Używany Nie
Identyfikatory w raportach w usłudze ads Używany Używany Nie
  • Pole auctionServerRequestFlags umożliwia ustawianie flag, które informują przeglądarkę, aby pominęła niektóre dane w ładunku aukcji B&A.
  • Wartość userBiddingSignals można zdefiniować w grupie zainteresowań, ale zalecamy jej pominięcie za pomocą flagi omit-user-bidding-signals. Pominięte sygnały można dostarczyć za pomocą usługi K/V.
  • Pole adRenderId jest ustawiane wraz z powiązanym polem renderURL, ale tylko pole adRenderId będzie częścią ładunku aukcji B&A. Adres URL renderowania zwrócony z generateBid() później, w trakcie aukcji, musi być zgodny z adresem URL renderowania zdefiniowanym w grupie zainteresowań.
  • Identyfikatory raportowania są zdefiniowane w specyfikacji interfejsu B&A, ale nie są uwzględnione w ładunku aukcji B&A. Identyfikator raportowania zwrócony z funkcji generateBid() później, w trakcie aukcji, musi być zgodny z adresem URL renderowania zdefiniowanym w grupie zainteresowań.
  • Identyfikatory ad.metadata i raportowania nie są uwzględniane w ładunku aukcji B&A. Zamiast tego dane te są udostępniane w ramach korzystania z usługi zaufanych par klucz-wartość.

Pamiętaj, że identyfikatory renderURL i raportowania w ads są nadal zdefiniowane w konfiguracji grupy zainteresowań, chociaż nie są uwzględniane w ładunku żądania aukcji, ponieważ przeglądarka sprawdza, czy adres URL renderowania i identyfikatory raportowania zwrócone z generateBid() funkcji usługi ustalania stawek pasują do wartości zdefiniowanych w grupie zainteresowań.

joinAdInterestGroup() zadania

W przypadku połączenia joinAdInterestGroup() należy wykonać te czynności.

Ustawianie flag żądania serwera

Pole auctionServerRequestFlags w konfiguracji joinAdInterestGroup() akceptuje te flagi:

Flaga Opis
omit-user-bidding-signals Flaga omit-user-bidding-signals pomija obiekt userBiddingSignals w ładunku aukcji.

Jeśli flaga nie jest ustawiona, wartość userBiddingSignals zdefiniowana w grupie zainteresowań będzie dostępna w generateBid() w usłudze ustalania stawek.

omit-ads Flaga omit-ads informuje przeglądarkę, aby pominęła obiekty adsadComponents w ładunku aukcji.

Wartość adRenderId będzie dostępna we właściwości prevWins obiektu browserSignals.

Jeśli flaga nie jest ustawiona, pola adRenderIdsadComponentRenderIds w argumencie interestGroup funkcji generateBid() będą zawierać odpowiednie identyfikatory renderowania reklamy.

Kupującym zdecydowanie zalecamy wybranie flagi omit-ads. W przyszłości przekazywanie identyfikatorów renderowania i identyfikatorów renderowania komponentów reklamy z klienta może zostać wycofane w celu dalszej optymalizacji ładunku.

Pominięte dane są przetwarzane przez udostępnianie odpowiednich informacji w trustedBiddingSignals. Flagi można stosować pojedynczo, nie muszą być używane razem.

Przykład użycia:

navigator.joinAdInterestGroup({
  auctionServerRequestFlags: ['omit-user-bidding-signals', 'omit-ads'],
});

Ustawianie identyfikatorów renderowania reklam

Aby zmniejszyć rozmiar ładunku aukcji B&A, obiekty adsadComponents grupy zainteresowań są pomijane, a w konsekwencji nie są dostępne w funkcji generateBid() działającej w usłudze ustalania stawek.

Aby poradzić sobie z brakiem informacji o reklamie, kupujący przechowuje identyfikator (adRenderIdadComponentRenderId) powiązany z każdą reklamą w konfiguracji grupy zainteresowań. Identyfikator musi być ciągiem DOMString o długości maksymalnie 12 bajtów. Jeśli identyfikator jest zakodowany w formacie Base64, jego długość musi wynosić maksymalnie 12 bajtów.

Przykładowa grupa zainteresowań z identyfikatorami renderowania reklam:

navigator.joinAdInterestGroup({
  ads: [
    {
      renderURL: 'https://dsp.example/ad.html',
      adRenderId: '12345678' // 12 characters max
    },
  ],
  adComponents: [
    {
      renderURL: 'https://dsp.example/ad-component.html',
      adComponentRenderId: 'abcdefgh'
    },
  ],
});

adRenderId powiązane z reklamami będą dostępne w usłudze prevWins.browserSignalsgenerateBid().

Chociaż w ładunku żądania nie ma parametru renderURL, zwrócony przez generateBid() adres URL renderowania musi być zgodny z adresem URL renderowania zdefiniowanym w konfiguracji grupy zainteresowań. Technologie reklamowe mogą odsyłać metadane reklamy i inne informacje w trustedBiddingSignals, dzięki czemu podczas wykonywania generateBid() można wygenerować adres URL renderowania reklamy i adres URL renderowania komponentu reklamy na potrzeby stawki.

Ustawianie priorytetów grup zainteresowań

Chrome umożliwia kupującym nadawanie priorytetów grupom zainteresowań. Jeśli zostanie osiągnięty limit rozmiaru ładunku dla poszczególnych kupujących określony przez sprzedawcę, do odrzucenia grup zainteresowań o niższym priorytecie w przypadku jednego kupującego podczas generowania ładunku aukcji B&A dla sprzedawcy używane są wartości priorytetu grup zainteresowań. Wybierając grupy zainteresowań spośród różnych kupujących, przeglądarka podejmuje decyzję na podstawie rozmiaru serializowanego ładunku. Domyślnie każdy kupujący ma taką samą wielkość. Pamiętaj, że rzeczywiste ustalanie priorytetów odbywa się na serwerach B&A, a nie podczas generowania ładunku żądania.

Priorytet jest obliczany w momencie aukcji na podstawie wektorów priorytetów kupującego (priorityVector) i sygnałów priorytetów sprzedawcy (prioritySignals). Kupujący może zastąpić sygnały priorytetów sprzedawcy.

Właściwość Opis
Wektor priorytetu Kupujący dostarcza wektory jako wartość klucza priorityVector z usługi klucz/wartość.
Sygnały priorytetowe Sprzedawca dostarcza sygnały, ustawiając priority_signals w konfiguracji aukcji.
Zastąpienia sygnałów priorytetowych Kupujący podaje zastąpienie w polu priority_signals_overrides elementu PerBuyerConfig w konfiguracji aukcji.

Podczas aukcji przeglądarka oblicza rzadki iloczyn skalarny pasujących kluczy w priorityVectorprioritySignals na potrzeby priorytetu. Na poniższym diagramie priorytet jest obliczany przez (4 * 2) + (3 * -1), co daje 8 + -3, więc priorytet tej grupy zainteresowań w momencie aukcji wynosi 5.

Każdy klucz w wektorze priorytetu i obiektach sygnałów priorytetu jest mnożony przez siebie, a następnie wyniki są sumowane w celu obliczenia priorytetu.
Rysunek 1. Obliczanie priorytetu na podstawie wektorów kupującego i sygnałów sprzedawcy

W przypadku B&A do ustalania priorytetów można też używać dodatkowych sygnałów:

Signal Opis
deviceSignals.one Wartość zawsze wynosi 1 i jest przydatna do dodawania stałej do iloczynu skalarnego.
deviceSignals.ageInMinutes Wartość opisuje wiek grupy zainteresowań (czas od ostatniego dołączenia do grupy zainteresowań) w minutach jako liczbę całkowitą z przedziału od 0 do 43 200.
deviceSignals.ageInMinutesMax60 Wartość ta jest taka sama jak sygnał ageInMinutes, ale jej maksymalna wartość to 60. Jeśli grupa ma więcej niż godzinę, zwracana jest wartość 60.
deviceSignals.ageInHoursMax24 Wartość opisuje wiek grupy zainteresowań w godzinach, maksymalnie 24 godziny. Jeśli grupa ma więcej niż 1 dzień, zwracana jest wartość 24.
deviceSignals.ageInDaysMax30 Wartość ta określa wiek grupy zainteresowań w dniach, maksymalnie 30 dni. Jeśli grupa ma więcej niż 30 dni, zwracana jest wartość 30.

Więcej informacji znajdziesz w wyjaśnieniu na GitHubie.

Konfigurowanie zaufanych sygnałów do określania stawek

Ponieważ niektóre dane zostaną pominięte w ładunku aukcji B&A, możesz użyć usługi klucz/wartość, aby dostarczyć pominięte dane jako zaufane sygnały do określania stawek do funkcji generateBid().

Usługa K/V może dostarczać te pominięte dane:

  • userBiddingSignals jeśli jest używany przez kupującego.
  • metadata powiązany z każdą reklamą.
  • adRenderId powiązany z każdą reklamą.
  • Identyfikator raportu
Pominięte dane z grupy zainteresowań mogą być wysyłane na serwer zbierania danych kupującego. Serwer zbierający dane przesyła je do usługi klucz/wartość, a później przeglądarka wczytuje te dane z tej usługi.
Ilustracja 2. Przykład konfiguracji zaufanych sygnałów

Jednym z możliwych rozwiązań jest umieszczenie unikalnego identyfikatora w kluczach sygnałów zaufanego określania stawek, a następnie wysłanie powiązanych danych na serwer, aby można je było załadować do usługi klucz/wartość. Jednak rzeczywista implementacja zależy od technologii reklamowej, a interfejs API nie jest normatywny.

Poniższy przykład opisuje jedno z możliwych rozwiązań:

const ad1RenderURL = 'https://dsp.example/ad-1.html';
const ad2RenderURL = 'https://dsp.example/ad-2.html';
const ad1RenderId = 'render-id-1';
const ad2RenderId = 'render-id-2';
const ad1ReportingId = 'reporting-id-1';
const ad2ReportingId = 'reporting-id-2';

// Generate a unique identifier
const id = crypto.randomUUID();

// Define the keys with the unique ID
const trustedSignalsKeyForIG = `interest-group-${id}`

// Set the keys in the interest group
navigator.joinAdInterestGroup({
  // …
  ads: [
    {
      renderURL: ad1RenderURL,
      adRenderId: ad1RenderId,
      buyerReportingId: ad1ReportingId
    },
    {
      renderURL: ad2RenderURL,
      adRenderId: ad2RenderId,
      buyerReportingId: ad2ReportingId
    },
  ],
  trustedBiddingSignalsKeys: [
    trustedSignalsKeyForIG
  ]
});

// Send the associated data to your server to be loaded into the Key/Value Service
fetch('https://dsp.example/kv/load', {
  method: 'POST',
  body: JSON.stringify({
    id,
    [trustedSignalsKeyForIG]: {
      userBiddingSignals: {
        favoriteColor: 'blue'
      },
      ads: [
        {
          renderURL: ad1RenderURL,
          adRenderId: ad1RenderId,
          buyerReportingId: ad1ReportingId,
          metadata: {
            color: 'red'
          }   
        },
        {
          renderURL: ad2RenderURL,
          adRenderId: ad2RenderId,
          buyerReportingId: ad2ReportingId,
          metadata: {
            color: 'blue'
          }   
        },
      ]
    }
  })
});

W tym przykładzie dla grupy zainteresowań zdefiniowano unikalny identyfikator, który staje się częścią klucza zaufanych sygnałów. Klucz grupy zainteresowań i powiązane z nim wartości są wysyłane na Twój serwer, aby można je było załadować do usługi klucz/wartość. W późniejszym czasie podczas aukcji przeglądarka pobiera sygnały zaufane i udostępnia je w funkcji generateBid() kupującego.

W razie potrzeby zwracanie sygnału aktualizacji grupy zainteresowań z K/V

updateIfOlderThanMs Klucz do sygnałów zaufanych jest używany do aktualizowania grupy zainteresowań wcześniej niż w przypadku zwykłego interwału dziennego. Jeśli grupa zainteresowań nie została dołączona ani zaktualizowana w okresie przekraczającym wartość w milisekundach zwróconą dla klucza updateIfOlderThanMs, zostanie zaktualizowana za pomocą mechanizmu updateURL. Pamiętaj, że Chrome nie będzie aktualizować grup zainteresowań częściej niż raz na 10 minut.

Jeśli aukcja B&A zwróci zwycięską reklamę, która nie pasuje do żadnej z reklam zdefiniowanych w grupie zainteresowań przechowywanej w przeglądarce, przeglądarka zakończy aukcję niepowodzeniem. Mechanizm updateIfOlderThanMs może być przydatny w zapewnieniu, że przeglądarka i aukcja B&A są zgodne co do zestawu reklam w grupie zainteresowań.

Więcej informacji znajdziesz w tym wyjaśnieniu.

generateBid() zadania

W przypadku połączenia generateBid() należy wykonać te czynności.

Odczytywanie sygnałów przeglądarki

Obiekt browserSignals przekazywany do wywołania generateBid() B&A wygląda tak:

{
  topWindowHostname: 'advertiser.example',
  seller: 'https://ssp.example',
  topLevelSeller: 'https://ssp-top.example',
  joinCount: 5,
  bidCount: 24,
  recency: 1684134092,

  // prevWins is [timeInSeconds, adRenderId]
  prevWins: [
    [9342, 'render-id-1'],
    [1314521, 'render-id-2']
  ],

  // Compiled WebAssembly code
  wasmHelper: WebAssembly.Module

  // Data-Version value from K/V response, if available
  dataVersion: 1,
}

browserSignals dostępne są te zmodyfikowane lub nowe właściwości:

Właściwość Opis
prevWins prevWins to tablica krotek czasu i reklamy. Czas ten oznacza liczbę sekund, które upłynęły od poprzedniego zwycięstwa powiązanej reklamy w ciągu ostatnich 30 dni.

Został on zmodyfikowany, aby zwracać obiekt adRenderId zamiast obiektu ad.

wasmHelper Skompilowany obiekt kodu dostarczonego z biddingWasmHelperURL.
dataVersion Zaufany serwer może opcjonalnie uwzględnić numeryczny nagłówek odpowiedzi Data-Version, który będzie dostępny w generateBid().

Więcej informacji znajdziesz w wyjaśnieniu na GitHubie.

Zwróć adres URL renderowania z generateBid()

Ponieważ obiekt ads jest pomijany w ładunku aukcji B&A, adres URL renderowania zwrócony z generateBid() musi zostać ponownie utworzony. Sposób odtwarzania adresu URL renderowania zależy od Twojej implementacji, a zwrócony adres URL musi być zgodny z adresem URL renderowania zdefiniowanym w grupie zainteresowań.

Jednym z możliwych rozwiązań jest zachowanie podstawowego adresu URL i wypełnienie szablonu informacjami z pól interestGrouptrustedBiddingSignals.

W tym przykładzie definiujemy 4 reklamy na podstawie koloru i produktu:

await navigator.joinAdInterestGroup({
  ads: [
    { renderURL: 'https://dsp.example/red-shirt-ad.html', adRenderId: 'arid1'},
    { renderURL: 'https://dsp.example/blue-shirt-ad.html', adRenderId: 'arid2'},
    { renderURL: 'https://dsp.example/red-pants-ad.html', adRenderId: 'arid3'},
    { renderURL: 'https://dsp.example/blue-pants-ad.html', adRenderId: 'arid4'},
  ],
  trustedBiddingSignalKeys: [
    'userBiddingSignals-someUniqueId',
    // ...and more
  ]
})

Następnie wysyłamy ulubiony kolor użytkownika i informacje o produkcie, które mają zostać załadowane do usługi klucz/wartość:

fetch('https://dsp.example/kv/load', {
  body: JSON.stringify({
    'userBiddingSignals-someUniqueId': {
      favoriteColor: 'blue',
      favoriteProduct: 'shirt'
    }
  })
})

Później, gdy aukcja jest przeprowadzana, zaufane sygnały określania stawek stają się dostępne w generateBid(), a te informacje można wykorzystać do odtworzenia adresu URL:

function generateBid(..., trustedBiddingSignals, browserSignals) {
  const { userBiddingSignals } = trustedBiddingSignals
  const { favoriteColor, favoriteProduct } = userBiddingSignals

  return {
    bid: 1,
    render: `https://dsp.example/${favoriteColor}-${favoriteProduct}-ad.html`
  }
}

Zwróć identyfikatory raportowania z generateBid()

Identyfikatory raportowania nie są uwzględniane w ładunku aukcji B&A, dlatego stają się dostępne dla generateBid() dzięki sygnałom licytowania zaufanego. Po ustaleniu, którego identyfikatora raportowania użyć, wybrany identyfikator raportowania jest zwracany z generateBid(). Zwrócone identyfikatory muszą być zgodne z identyfikatorami zdefiniowanymi w grupie zainteresowań.

W tym przykładzie wybrano reklamę 1, a powiązany z nią identyfikator renderowania został zwrócony z generateBid():

generateBid(..., trustedBiddingSignals, ) {
  const { ad1ReportingId, ad2reportingId } = trustedBiddingSignals;
  // ...
  return {
    bid: 1,
    render: 'https://dsp.example/ad-1.html'
    buyerReportingId: ad1reportingId
  }
}

Zwrócony identyfikator raportowania staje się dostępny w okresie od reportWin() do buyerReportingSignals:

reportWin(..., buyerReportingSignals) {
  const { buyerReportingId } = buyerReportingSignals;
}

Jeśli funkcja generateBid() nie zwraca wartości buyerReportingId, wartość interestGroupName jest dostępna w buyerReportingSignals zamiast w buyerReportingId.

Więcej informacji znajdziesz w przewodniku po identyfikatorach raportowania.

Dalsze kroki

Dostępne są te zasoby:

Więcej informacji

Masz pytania?