सुरक्षित ऐप्लिकेशन सिग्नल के डेवलपर की गाइड

Protected App Signals API को आज़माने में डेवलपर की मदद करने के लिए, इस दस्तावेज़ में एपीआई सरफ़ेस के सभी एपीआई के बारे में बताया गया है. साथ ही, एक टेस्ट एनवायरमेंट सेट अप करें. साथ ही, कॉन्फ़िगरेशन के उदाहरण और स्क्रिप्ट.

वर्शन इतिहास

जनवरी 2024

पीएसए एमवीपी रिलीज़ का समर्थन करने वाली डेवलपर की गाइड की पहली रिलीज़

मार्च 2024

Android API के M-2024-05 वर्शन के साथ काम करने के लिए, एपीआई में बदलाव किए गए हैं अप्रैल 2024 में सर्वर साइड कॉम्पोनेंट की रिलीज़. सबसे ज़्यादा ध्यान देने लायक बदलाव:

  • उपयोगकर्ता के डिवाइस पर एपीआई के लिए ज़रूरी अनुमतियों के बारे में जानकारी जोड़ी गई
  • डिवाइस पर सिग्नल का कोटा मैनेज करने के बारे में जानकारी जोड़ी गई
  • generateBid सिग्नेचर को अपडेट किया गया. इसमें कॉन्टेक्स्ट से जुड़े बदलाव किए गए हैं विज्ञापन वापस पाने और इग्रेस डेटा ट्रैफ़िक की सुविधा
  • reportWin दस्तावेज़ अपडेट किए गए, जिसमें इग्रेस डेटा ट्रैफ़िक भी शामिल है
  • Ad Retrieval API का दस्तावेज़ अपडेट करने की सुविधा की मदद से, BYOS विज्ञापन ऐक्सेस करने की सुविधा को हटाना इसके बाद, विज्ञापन को वापस पाने के यूडीएफ़ (यूडीएफ़) का दस्तावेज़ तैयार करना होगा.

एपीआई की खास जानकारी

Protected सिग्नल API के प्लैटफ़ॉर्म में, अलग-अलग तरह के एपीआई के अलग-अलग सबसेट शामिल होते हैं सिस्टम:

  • Android API:
    • सिग्नल क्यूरेशन एपीआई, इसमें ये शामिल हैं:
    • अपडेट सिग्नल एपीआई
    • सिग्नल एन्कोडिंग एपीआई
    • Protected नीलामी Support API: SDK टूल, इसका इस्तेमाल सुरक्षित नीलामी के लिए करता है Protected ऐप्लिकेशन का इस्तेमाल करने वाले बिडिंग और नीलामी (B&A) सर्वर पर नीलामी सिग्नल.
  • सर्वर-साइड एपीआई:
    • Protected नीलामी API: बिडिंग में चल रही JS स्क्रिप्ट की सीरीज़ और नीलामी करने वाले सर्वर. इस एपीआई की मदद से, सेलर और खरीदार संरक्षित नीलामी लागू करेगा.
    • Ad Retrieval API: टारगेट किए गए विज्ञापनों की सूची उपलब्ध कराने की ज़िम्मेदारी खरीदार की बिडिंग को उपलब्ध कराई गई काम की और उपयोगकर्ता की जानकारी सर्वर.

Android क्लाइंट

क्लाइंट-साइड पर, ऐप्लिकेशन के सुरक्षित सिग्नल वाले प्लैटफ़ॉर्म में तीन कैटगरी होती हैं अलग-अलग एपीआई:

  • अपडेट सिग्नल: यह एक Android System API है, जिसकी मदद से इन डिवाइसों पर सिग्नल चुने जा सकते हैं डिवाइस.
  • सिग्नल को कोड में बदलने का तरीका: एक JavaScript API, जो सर्वर पर क्लिक करें.
  • सुरक्षित नीलामी से जुड़ी सहायता: किसी सुरक्षित नीलामी को लागू करने में मदद करने वाला एपीआई बिडिंग और नीलामी सर्वर पर नीलामी. यह एपीआई, खास तौर पर इनके लिए नहीं बनाया गया है Protected ऐप्लिकेशन सिग्नल के साथ-साथ इसका इस्तेमाल, Protected ऐप्लिकेशन के लिए नीलामियों में मदद करने के लिए भी किया जाता है Audience API.

अपडेट सिग्नल एपीआई

अपडेट सिग्नल एपीआई की मदद से, विज्ञापन टेक्नोलॉजी से जुड़ी सेवाओं के ज़रिए उपयोगकर्ता और खरीदार की ओर से ऐप्लिकेशन से मिलते-जुलते सिग्नल. एपीआई, डेलिगेशन मॉडल पर काम करता है. कॉलर एक यूआरआई देता है, जिससे फ़्रेमवर्क संबंधित यूआरएल को फ़ेच करता है नीलामी में इस्तेमाल करने के लिए, सिग्नल और उन सिग्नल को कोड में बदलने का लॉजिक.

एपीआई के लिए, android.permission.ACCESS_ADSERVICES_PROTECTED_SIGNALS की ज़रूरत है अनुमति.

updateSignals() एपीआई, JSON ऑब्जेक्ट हासिल करेगा से जानकारी मिलती है, जिसमें बताया जाता है कि कौनसे सिग्नल जोड़ने या हटाने हैं और उनकी तैयारी कैसे करनी है नीलामी के लिए उन सिग्नलों का इस्तेमाल करें.

Executor executor = Executors.newCachedThreadPool();
ProtectedSignalsManager protectedSignalsManager
     =  ProtectedSignalsManager.get(context);

// Initialize a UpdateSignalsRequest
UpdateSignalsRequest updateSignalsRequest = new
  UpdateSignalsRequest.Builder(Uri.parse("https://example-adtech1.com/signals"))
      .build();

OutcomeReceiver<Object, Exception> outcomeReceiver = new OutcomeReceiver<Object, Exception>() {
  @Override
  public void onResult(Object o) {
    //Post-success actions
  }

  @Override
  public void onError(Exception error) {
    //Post-failure actions
  };

// Call updateSignals
protectedSignalsManager.updateSignals(updateSignalsRequest,
    executor,
    outcomeReceiver);

प्लैटफ़ॉर्म, फ़ेच करने के अनुरोध में दिए गए यूआरआई को एचटीटीपीएस का अनुरोध भेजता है सिग्नल अपडेट हो जाते हैं. सिग्नल अपडेट के साथ-साथ, रिस्पॉन्स में एंडपॉइंट जो रॉ सिग्नल को कन्वर्ज़न में बदलने के लिए, एन्कोडिंग लॉजिक होस्ट करता है कोड में बदला गया पेलोड. सिग्नल के अपडेट, JSON फ़ॉर्मैट में होने चाहिए और में ये कुंजियां हो सकती हैं:

JSON ऑब्जेक्ट के लिए टॉप लेवल कुंजियां, पांच में से किसी एक निर्देश से मेल खानी चाहिए:

कुंजी

जानकारी

put

इससे नया सिग्नल जुड़ता है और मौजूदा सिग्नल को एक ही पासकोड से ओवरराइट कर दिया जाता है. वैल्यू

यह एक JSON ऑब्जेक्ट है, जिसमें कुंजियां, उस कुंजी से जुड़ी बेस 64 स्ट्रिंग होती हैं जिसे रखना होता है. साथ ही, वैल्यू, डाली जाने वाली वैल्यू के हिसाब से बेस 64 स्ट्रिंग होती हैं.

append

सिग्नल की टाइम सीरीज़ में नए सिग्नल/सिग्नल जोड़ता है. साथ ही, सबसे पुराने सिग्नल को हटाता है

अगर सीरीज़ का साइज़ तय की गई ज़्यादा से ज़्यादा सीमा से ज़्यादा हो, तो नई सीरीज़ बनाने के लिए सिग्नल मिलते हैं. इसके लिए वैल्यू एक JSON ऑब्जेक्ट है, जिसमें कुंजियां जोड़ने के लिए, उससे जुड़ी बेस 64 स्ट्रिंग हैं और वैल्यू दो फ़ील्ड वाले ऑब्जेक्ट हैं: "values" और "maxSignals" में से किसी एक को शामिल करना चाहिए.

"values": टाइम सीरीज़ में जोड़ने के लिए सिग्नल वैल्यू से जुड़ी बेस 64 स्ट्रिंग की सूची.

"maxSignals": इस टाइम सीरीज़ में इस्तेमाल की जा सकने वाली वैल्यू की ज़्यादा से ज़्यादा संख्या. अगर

पासकोड से जुड़े सिग्नल की मौजूदा संख्या, max सिग्नल से ज़्यादा हो जाने पर, सबसे पुराने सिग्नल हटा दिए जाएंगे. ध्यान दें कि किसी कुंजी को डालने के बाद जोड़ा जा सकता है. ध्यान दें कि तय संख्या से ज़्यादा वैल्यू जोड़ने पर, नतीजे नहीं मिलेंगे.

put_if_not_present

नया सिग्नल सिर्फ़ तब जोड़ा जाता है, जब उसी पासकोड वाला कोई सिग्नल पहले से मौजूद न हो. इसके लिए वैल्यू, एक JSON ऑब्जेक्ट है. इसमें पासकोड, 64 स्ट्रिंग के तौर पर होते हैं, जो उस पासकोड से मिलते-जुलते होते हैं जिसे रखना है. साथ ही, वैल्यू, डाली जाने वाली वैल्यू के हिसाब से बेस 64 स्ट्रिंग होती हैं.

remove

किसी कुंजी के सिग्नल को हटा देता है. इसकी वैल्यू, सिग्नल की कुंजियों से जुड़ी बेस 64 स्ट्रिंग की सूची है, जिसे मिटाना चाहिए.

update_encoder

एंडपॉइंट को अपडेट करने के लिए कार्रवाई करता है. साथ ही, एक यूआरआई देता है, जिसका इस्तेमाल किया जा सकता है

का इस्तेमाल करें. अपडेट की कार्रवाई देने के लिए, "कार्रवाई" सब-की है और

फ़िलहाल, सिर्फ़ "रजिस्ट्रेंट" वैल्यू का इस्तेमाल किया जा सकता है जो पहली बार दिए जाने पर एन्कोडर एंडपॉइंट को रजिस्टर करेगा या दिए गए नए एंडपॉइंट से मौजूदा एंडपॉइंट को ओवरराइट कर देगा. "रजिस्टर करें" के लिए, एंडपॉइंट देना ज़रूरी है कार्रवाई.एन्कोडर एंडपॉइंट देने के लिए "एंडपॉइंट" सब-की है और इसका मान यूआरआई है

स्ट्रिंग डालें.

JSON के अनुरोध का सैंपल कुछ ऐसा दिखेगा:

{
    "put": {
        "AAAAAQ==": "AAAAZQ==",
        "AAAAAg==": "AAAAZg=="
    },
    "append": {
        "AAAAAw==": {
            "values": [
                "AAAAZw=="
            ],
            "max_signals": 3
        }
    },
    "put_if_not_present": {
        "AAAABA==": "AAAAaQ==",
        "AAAABQ==": "AAAAag=="
    },
    "update_encoder": {
        "action": "REGISTER",
        "endpoint": "https://adtech1.com/Protected App Signals_encode_script.js"
    }
}

सिग्नल के लिए, डिवाइस का कोटा 10 से 15 केबी के बीच होगा. कोटा के बाद तय सीमा से ज़्यादा हो गया है. PPAPI, FIFO रणनीति का इस्तेमाल करके सिग्नल को बाहर कर देगा. निकालने की प्रोसेस इससे कम अंतराल के लिए, कोटा को थोड़ा सा बढ़ा दिया जाएगा निकालने की प्रक्रिया को कम करने के लिए किया जा सकता है.

सिग्नल एन्कोडिंग एपीआई

खरीदारों को Java Script फ़ंक्शन उपलब्ध कराना होगा, ताकि Protected के दौरान सर्वर को भेजे जाने वाले डिवाइस पर सेव किए गए सिग्नल नीलामी. खरीदार, उस यूआरएल को जोड़कर यह स्क्रिप्ट उपलब्ध करा सकते हैं जहां यह हो सकता है "update_encoder" कुंजी का इस्तेमाल करने पर फ़ेच किया गया के किसी भी जवाब में अपडेट सिग्नल एपीआई अनुरोध. स्क्रिप्ट में यह हस्ताक्षर होगा:

function encodeSignals(signals, maxSize) {
  let result = new Uint8Array(maxSize);
  // first entry will contain the total size
  let size = 1;
  let keys = 0;
  
  for (const [key, values] of signals.entries()) {
    keys++;
    // In this encoding we only care about the first byte
    console.log("key " + keys + " is " + key)
    result[size++] = key[0];
    result[size++] = values.length;
    for(const value of values) {
      result[size++] = value.signal_value[0];
    }
  }
  result[0] = keys;
  
  return { 'status': 0, 'results': result.subarray(0, size)};
}

signals पैरामीटर, कुंजियों से बनाया गया मैप है जो 4 साइज़ के UInt8Arrays के रूप में होता है सुरक्षित ऐप्लिकेशन सिग्नल ऑब्जेक्ट की सूची में जोड़ दिया जाएगा. हर सुरक्षित ऐप्लिकेशन सिग्नल ऑब्जेक्ट में तीन फ़ील्ड:

  • signal_value: एक UInt8Array, जो सिग्नल की वैल्यू दिखाता है.
  • creation_time: वह संख्या जो सिग्नल के बनने का समय दिखाती है Epoch-सेकंड.
  • package_name: बनाए गए पैकेज के नाम को दिखाने वाली स्ट्रिंग की ज़रूरत नहीं है.

maxSize पैरामीटर वह संख्या है जो अरे के सबसे बड़े साइज़ के बारे में बताती है डालें.

फ़ंक्शन को एक ऑब्जेक्ट में दो फ़ील्ड का आउटपुट देना चाहिए:

  • status: अगर स्क्रिप्ट सही से चली गई, तो यह 0 होनी चाहिए.
  • results: लंबाई का UInt8Array होना चाहिए, जो maxSize से कम या उसके बराबर हो. यह कलेक्शन, नीलामी के दौरान सर्वर को भेजा जाएगा और इसे prepareDataForAdRetrieval स्क्रिप्ट.

एन्कोडिंग की मदद से, विज्ञापन टेक्नोलॉजी को फ़ीचर इंजीनियरिंग के शुरुआती चरण में मदद मिलती है. जहां वे रॉ सिग्नल को कंप्रेस करने जैसे बदलाव कर सकते हैं अपने हिसाब से बनाए गए लॉजिक के आधार पर लागू किए गए वर्शन. ध्यान दें कि ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई), विज्ञापन टेक्नोलॉजी से जुड़ी सुरक्षित नीलामी कस्टम लॉजिक के पास, जनरेट किए गए सिग्नल पेलोड को पढ़ने का ऐक्सेस होगा एन्कोडिंग कस्टम लॉजिक, जिसे उपयोगकर्ता के तय किया गया फ़ंक्शन (यूडीएफ़), जो खरीदार के B&A TEE में चल रहा है कोड में बदले गए सिग्नल और काम के अन्य सिग्नल को पढ़ने का ऐक्सेस होगा विज्ञापन चुनने के लिए प्रकाशक ऐप्लिकेशन से मिला है (विज्ञापन पाना और बिडिंग).

सिग्नल को कोड में बदलने का तरीका

हर घंटे, ऐसे खरीदार जिन्होंने अपने रजिस्टर किए गए रजिस्ट्रेशन के साथ एन्कोडिंग लॉजिक दिया है सिग्नल के सिग्नल, नीलामी पेलोड में एन्कोड किए जाएंगे.बाइट नीलामी के पेलोड की कैटगरी, डिवाइस पर बनी रहती है. साथ ही, इसे एन्क्रिप्ट (सुरक्षित) किया जाता है और विक्रेता, विज्ञापन चुनने के डेटा के हिस्से के तौर पर इकट्ठा करेंगे. इस डेटा को भी इसमें शामिल किया जाएगा सुरक्षित नीलामी के दायरे में आता है. परीक्षण के लिए, आप इस एन्कोडिंग को बाहर ट्रिगर कर सकते हैं निम्न आदेश चलाकर इसकी प्रति घंटे की फ़्रीक्वेंसी है:

adb shell cmd jobscheduler run -f com.google.android.adservices.api 29
एन्कोडर लॉजिक का वर्शन

जब विज्ञापन टेक्नोलॉजी से जुड़ी प्रोसेस के कस्टम एन्कोडर लॉजिक को डाउनलोड करने का अनुरोध किया जाता है, तो एंडपॉइंट रिस्पॉन्स हेडर में वर्शन नंबर के साथ जवाब दे सकता है. यह वर्शन डिवाइस पर एन्कोडर लॉजिक के साथ ही मौजूद रहती है. रॉ सिग्नल कोड में बदला जाता है और कोड में बदला गया पेलोड, इसके लिए इस्तेमाल किए गए वर्शन के साथ बना रहता है एन्कोडिंग यह वर्शन सुरक्षित मोड में, B&A सर्वर पर भी भेजा जाता है नीलामी, ताकि विज्ञापन टेक्नोलॉजी से जुड़ी सेवा देने वाली कंपनियां, बिडिंग और कोड में बदलने के लॉजिक को अलाइन कर सकें. वर्शन है.

Response header for providing encoder version : X_ENCODER_VERSION

सुरक्षित नीलामी सहायता API

डिवाइस के मामले में, Protected ऐप्लिकेशन सिग्नल के लिए नीलामी चलाना जिस तरह से सुरक्षित ऑडियंस के लिए नीलामी की जाती है.

बिडिंग और नीलामी से जुड़ी सेवाएं

सर्वर साइड एपीआई में ये शामिल हैं:

  • सुरक्षित नीलामी वाला एपीआई: यह JS फ़ंक्शन या यूडीएफ़ की ऐसी सीरीज़ है जिसे खरीदार और सेलर, अपने मालिकाना हक वाले B&A कॉम्पोनेंट पर डिप्लॉय कर सकते हैं. इससे बिडिंग और नीलामी के तरीके को तय करने में मदद मिलती है.
  • Ad Retrieval API: खरीदार, REST एंडपॉइंट लागू करके, इस एपीआई को लागू कर सकते हैं. इस एंडपॉइंट पर, Protected App Signal नीलामी के लिए, ज़रूरी कीवर्ड के विज्ञापन उपलब्ध कराने होंगे.

सुरक्षित नीलामी API

सुरक्षित नीलामी एपीआई में JS API या यूडीएफ़ शामिल होते हैं, जिन्हें खरीदार और विक्रेता अनुमति देते हैं का इस्तेमाल नीलामी और बिडिंग के लॉजिक को लागू करने के लिए किया जाता है.

खरीदार विज्ञापन टेक्नोलॉजी के यूडीएफ़
ReadyDataForAdRetrieval यूडीएफ़

TEE की मदद से विज्ञापन दिखाने के लिए, Protected ऐप्लिकेशन सिग्नल का इस्तेमाल करने से पहले विज्ञापन वापस पाने की सेवा, खरीदारों को ऐप्लिकेशन के सुरक्षित सिग्नल की सुविधा को डिकोड करना और तैयार करना होगा साथ ही, अन्य डेटा भी शामिल करना होगा. खरीदार prepareDataForAdRetrieval यूडीएफ़ आउटपुट यह है विज्ञापन रिकवरी सेवा को पास किया गया बिडिंग के लिए, टॉप के कैंडिडेट विज्ञापन वापस पाएं.

// Inputs
// ------
// encodedOnDeviceSignals: A Uint8Array of bytes from the device.
// encodedOnDeviceSignalsVersion: An integer representing the encoded
//   version of the signals.
// sellerAuctionSignals: Information about auction (ad format, size) derived
//                       contextually.
// contextualSignals: Additional contextual signals that could help in
//                    generating bids.
//
// Outputs
// -------
// Returns a JSON structure to be used for retrieval.
// The structure of this object is left to the adtech.
function prepareDataForAdRetrieval(encodedOnDeviceSignals,encodedOnDeviceSignalsVersion,sellerAuctionSignals,contextualSignals) {
   return {};
}
जनरेट बिड यूडीएफ़

शीर्ष के उम्मीदवार के विज्ञापनों को दिखाए जाने के बाद, विज्ञापन उम्मीदवारों को खरीदार का कस्टम बिडिंग का लॉजिक, generateBid UDF:

// Inputs
// ------
// ads: Data string returned by the ads retrieval service. This can include Protected App Signals
//   ads and related ads metadata.
// sellerAuctionSignals: Information about the auction (ad format, size),
//                       derived contextually
// buyerSignals: Any additional contextual information provided by the buyer
// preprocessedDataForRetrieval: This is the output of this UDF.
function generateBid(ads, sellerAuctionSignals, buyerSignals,
                    preprocessedDataForRetrieval,
                    rawSignals, rawSignalsVersion) {
    return { "ad": <ad Value Object>,
             "bid": <float>,
             "render": <render URL string>,
             'adCost': <optional float ad cost>,
             "egressPayload": <limitedEgressPayload>,
             "temporaryUnlimitedEgressPayload": <temporaryUnlimitedEgressPayload>
    };
}

इस फ़ंक्शन का आउटपुट किसी विज्ञापन उम्मीदवार के लिए एक बोली है, जिसे दिखाया जाता है के तौर पर, ProtectedAppSignalsAdWithBidMetadata. यह फ़ंक्शन दो अरै भी दिखा सकता है, जिन्हें reportWin को पास किया जाएगा मॉडल ट्रेनिंग चालू करने के लिए (इग्रेस डेटा ट्रैफ़िक और मॉडल ट्रेनिंग के बारे में ज़्यादा जानकारी के लिए) पीएसए की जानकारी देने वाला रिपोर्टिंग सेक्शन देखें)

रिपोर्टविन यूडीएफ़

नीलामी खत्म होने पर, नीलामी सेवा, reportWin यूडीएफ़ का इस्तेमाल करके, बीकन रजिस्टर और खरीदारों के लिए (यह एक जैसा है) reportWin फ़ंक्शन का इस्तेमाल सुरक्षित ऑडियंस के लिए किया जाता है). क्लाइंट के विज्ञापन रेंडर हो जाने के बाद, डिवाइस इसे पिंग करेगा. इस तरीके का हस्ताक्षर करीब-करीब Protected Audience से मेल खाता है version में बदलाव करें. इसमें दो अतिरिक्त पैरामीटर egressPayload और शामिल नहीं होंगे temporaryUnlimitedEgressPayload जिनका इस्तेमाल मॉडल ट्रेनिंग चालू करने के लिए किया जाता है और जिन्हें generateBid से मिले नतीजों से जानकारी अपने-आप भर जाती है.

// Inputs / Outputs
// ----------------
// See detailed documentation here.
function reportWin(auctionSignals, perBuyerSignals, signalsForWinner,
                   buyerReportingSignals,
                   egressPayload, temporaryUnlimitedEgressPayload) {
  // ...
}
सेलर ऐड टेक यूडीएफ़
स्कोरविज्ञापन यूडीएफ़

इस यूडीएफ़ का इस्तेमाल करके, सेलर यह चुनते हैं कि कौनसे विज्ञापन दिखाए जाएं नीलामी जीत जाएगा.

function scoreAd(adMetadata, bid, auctionConfig,
                 trustedScoringSignals, bid_metadata) {
  // ...
  return {desirability: desirabilityScoreForThisAd,
              allowComponentAuction: true_or_false};
}
रिपोर्ट के नतीजे यूडीएफ़

इस यूडीएफ़ में, सेलर को (आखिर में) इवेंट लेवल करने की अनुमति मिलती है जीतने वाले विज्ञापन के बारे में जानकारी शामिल करना.

function reportResult(auctionConfig, reporting_metadata) {
  // ...
  registerAdBeacon({"click", clickUrl,"view", viewUrl});
  sendReportTo(reportResultUrl);
  return signalsForWinner;
}

विज्ञापन हटाने का एपीआई

MVP रिलीज़ में, विज्ञापन वापस पाने की सेवा, खरीदार के ज़रिए मैनेज और होस्ट की जाएगी सेवा और बोली-प्रक्रिया सेवा इस सेवा से विज्ञापन उम्मीदवारों को फिर से हासिल करती हैं. अप्रैल 2024 से, विज्ञापन वापस पाने वाला सर्वर किसी भरोसेमंद नेटवर्क से कनेक्ट होना चाहिए एक्ज़ीक्यूशन एनवायरमेंट (TEE) और GRPC/प्रोटो इंटरफ़ेस दिखाएगा. ऐड टेक कंपनियों को यह सर्वर सेट अप करना होगा और B&A के हिस्से के तौर पर इसका यूआरएल देना होगा स्टैक डिप्लॉयमेंट. टीईई में चल रही इस सेवा को लागू करना Privacy Sandbox GitHub और बाकी के दस्तावेज़ के तौर पर हम यह मान रहे हैं कि डिप्लॉयमेंट में इसी कोड का इस्तेमाल किया जा रहा है.

अप्रैल 2024 से, B&A वर्शन, कॉन्टेक्स्ट के हिसाब से पाथ विज्ञापन के साथ काम करते हैं वापस पाना. इस मामले में, बिडिंग सर्वर को नीलामी के प्रासंगिक हिस्से के दौरान आरटीबी सर्वर से भेजे जाने वाले विज्ञापन-आइडेंटिफ़ायर. आइडेंटिफ़ायर को TEE KV सर्वर पर भेजा जाएगा, ताकि वे सभी विज्ञापन फ़ेच कर सकें बिडिंग के दौरान इस्तेमाल की जाने वाली मिलती-जुलती जानकारी (उदाहरण के लिए, ad-render-url, मेटाडेटा, और विज्ञापन एम्बेड करने की जानकारी जिनका इस्तेमाल टॉप-के चुनें). इस दूसरे पाथ को डिप्लॉय किया गया है, ताकि हम यहां सिर्फ़ टीईई के आधार पर कॉन्फ़िगर करने के बारे में जानकारी दें विज्ञापन वापस पाने के इस्तेमाल का उदाहरण.

यूडीएफ़ को हैंडल करने का अनुरोध
function HandleRequest(requestMetadata, preparedDataForAdRetrieval,
                      deviceMetadata, contextualSignals) {
    return adsMetadataString;
}

कहां:

  • requestMetadata: JSON. यूडीएफ़ को किए गए हर अनुरोध का सर्वर मेटाडेटा. अभी के लिए खाली करें.
  • preparedDataForAdRetrieval: इस फ़ील्ड का कॉन्टेंट, विज्ञापन पर निर्भर करता है डेटा वापस पाने की रणनीति तय की. प्रासंगिक विज्ञापन प्राप्ति के मामले में , यह पैरामीटर इसमें डिवाइस से मिलने वाले रॉ सिग्नल शामिल होंगे और इन्हें बिडिंग सेवा. विज्ञापन हटाने वाले सर्वर का इस्तेमाल करके टीईई विज्ञापन वापस पाने के मामले में, इस पैरामीटर में, prepareDataForAdRetrieval यूडीएफ़ का नतीजा शामिल होगा. ध्यान दें: इस चरण में, Protected ऐप्लिकेशन सिग्नल को डिकोड किया जाएगा और एन्क्रिप्ट नहीं किया जाएगा.
  • deviceMetadata: JSON ऑब्जेक्ट जिसमें डिवाइस का मेटाडेटा है. इसे विक्रेता की विज्ञापन सेवा से फ़ॉरवर्ड किया गया है. ज़्यादा जानकारी के लिए, बेड ऐंड ब्रेकफ़ास्ट वाला दस्तावेज़ देखें.
    • X-Accept-Language: डिवाइस पर इस्तेमाल की जाने वाली भाषा.
    • X-User-Agent: डिवाइस पर इस्तेमाल किया गया उपयोगकर्ता एजेंट.
    • X-BnA-Client-IP: डिवाइस का आईपी पता.
  • contextualSignals: कॉन्टेक्स्चुअल बिडिंग से जनरेट हुई आर्बिट्रेरी स्ट्रिंग सर्वर को एक ही DSP से ऑपरेट किया जाता है. यूडीएफ़ उम्मीद करती है कि वह स्ट्रिंग डालें और उसका इस्तेमाल करें. काम के सिग्नल में, एमएल जैसी कोई भी जानकारी हो सकती है का उपयोग करके पास की गई सुरक्षित एम्बेडिंग के लिए मॉडल वर्शन जानकारी सुरक्षित ऐप्लिकेशन सिग्नल.

यूडीएफ़ को सफलता मिलने पर स्ट्रिंग देखनी चाहिए. स्ट्रिंग बिडिंग सर्वर, जो इसके बाद इसे generateBid यूडीएफ़ को पास करता है. हालांकि, स्ट्रिंग एक सामान्य स्ट्रिंग हो सकती है, ज़्यादातर मामलों में स्ट्रिंग सीरियल ऑब्जेक्ट, जिसका स्कीमा हर विज्ञापन टेक्नोलॉजी से खुद तय किया जाता है. स्कीमा पर कोई पाबंदी तब तक नहीं होती, जब तक कि AdTech की generateBid लॉजिक, स्ट्रिंग को पहचानकर उसका इस्तेमाल कर सकता है.

डेवलपमेंट के लिए अपने सिस्टम को सेट अप करें

Android

अपना Android डेवलपमेंट एनवायरमेंट सेट अप करने के लिए, आपको ये काम करने होंगे:

  1. कोई ऐसा एम्युलेटर (पसंदीदा) या फ़िज़िकल डिवाइस बनाएं जिस पर 'डेवलपर के लिए झलक' 10 इमेज चल रही हो
  2. इन्हें चलाएं:
adb shell am start -n com.google.android.adservices.api/com.android.adservices.ui.settings.activities.AdServicesSettingsMainActivity

इसके बाद, ऐप्लिकेशन के सुझाए गए विज्ञापनों को दिखाने की सहमति देने के लिए दिखाया गया विकल्प चुनें.

  1. काम के एपीआई चालू करने के लिए, नीचे दिया गया कमांड चलाएं. आपको इसे कभी-कभी फिर से चलाना पड़ सकता है, क्योंकि बंद किया गया डिफ़ॉल्ट कॉन्फ़िगरेशन समय-समय पर सिंक होता रहेगा.
adb shell device_config put adservices fledge_custom_audience_service_kill_switch false;  adb shell device_config put adservices fledge_select_ads_kill_switch false; adb shell device_config put adservices fledge_on_device_auction_kill_switch false; adb shell device_config put adservices fledge_auction_server_kill_switch false; adb shell "device_config put adservices disable_fledge_enrollment_check true";  adb shell device_config put adservices ppapi_app_allow_list '\*'; adb shell device_config put adservices fledge_auction_server_overall_timeout_ms 60000;
  1. डिवाइस रीस्टार्ट करें.
  2. अपने 'नीलामी के मुख्य सर्वर' पर ले जाने के लिए, डिवाइस की नीलामी वाली कुंजियों को बदलें. गलत कुंजियों को कैश मेमोरी में सेव होने से रोकने के लिए, नीलामी चलाने से पहले यह चरण ज़रूरी है.

बोली और नीलामी से जुड़ी सेवाएं

B&A सर्वर सेट अप करने के लिए, सेल्फ़-सर्व के लिए सेटअप दस्तावेज़.

यह दस्तावेज़ इस बात पर फ़ोकस करेगा कि खरीदार के लिए खास सर्वर को कैसे कॉन्फ़िगर करें, क्योंकि सेलर को कोई बदलाव करने की ज़रूरत नहीं है.

ज़रूरी शर्तें

B&A सर्विस स्टैक को डिप्लॉय करने से पहले, विज्ञापन टेक्नोलॉजी के खरीदार को ये काम करने होंगे:

  • पक्का करें कि उन्होंने खुद की टीईई विज्ञापन वापस पाने की सेवा डिप्लॉय की हो (यहां देखें काम की जानकारी का सेक्शन).
  • पक्का करें कि विज्ञापन टेक्नोलॉजी में सभी ज़रूरी यूडीएफ़ मौजूद हों (prepareDataForAdRetrieval, generateBid, reportWin, HandleRequest) परिभाषित और होस्ट किया गया है.

यह समझना कि Protected Audience के साथ सुरक्षित नीलामी का इस्तेमाल कैसे किया जाता है बेड ऐंड ब्रेकफ़ास्ट से भी मदद मिलेगी. हालांकि, ऐसा करना ज़रूरी नहीं है.

टेराफ़ॉर्म का कॉन्फ़िगरेशन

ऐप्लिकेशन के सुरक्षित सिग्नल की सुविधा का इस्तेमाल करने के लिए, विज्ञापन टेक्नोलॉजी को ये शर्तें पूरी करनी होंगी:

  • B&A में Protected ऐप्लिकेशन सिग्नल की सुविधा चालू करें.
  • ऐसे यूआरएल एंडपॉइंट दें जिनसे prepareDataForAdRetrieval, generateBid और reportWin के लिए नए यूडीएफ़ फ़ेच किए जा सकें.

इसके अलावा, इस गाइड में यह भी माना गया है कि विज्ञापन टेक्नोलॉजी को रीमार्केटिंग के लिए सभी मौजूदा कॉन्फ़िगरेशन फ़्लैग सेट करना जारी रहेगा रीमार्केटिंग नीलामी को हमेशा की तरह.

खरीदार विज्ञापन तकनीकी कॉन्फ़िगरेशन

उदाहरण के तौर पर, इस डेमो फ़ाइल का इस्तेमाल करके, खरीदारों को नीचे दिए गए फ़्लैग सेट करने होंगे:

  • सुरक्षित ऐप्लिकेशन सिग्नल चालू करें: सुरक्षित ऐप्लिकेशन सिग्नल इकट्ठा करने के लिए चालू की गई है डेटा शामिल है.
  • सुरक्षित ऐप्लिकेशन सिग्नल के यूआरएल: सुरक्षित ऐप्लिकेशन सिग्नल के यूआरएल पर सेट किए जाते हैं सर्वर.

विज्ञापन टेक्नोलॉजी को, प्लेसहोल्डर में सही यूआरएल को इन यूआरएल से बदलना चाहिए फ़ील्ड:

module "buyer" {
  # ... More config here.

  runtime_flags = {
    # ... More config here.

    ENABLE_PROTECTED_APP_SIGNALS                  = "true"
    PROTECTED_APP_SIGNALS_GENERATE_BID_TIMEOUT_MS = "60000"
    TEE_AD_RETRIEVAL_KV_SERVER_ADDR               = "<service mesh address of the instance>"
    AD_RETRIEVAL_TIMEOUT_MS                       = "60000"
    BUYER_CODE_FETCH_CONFIG                       = <<EOF
    {
        "protectedAppSignalsBiddingJsUrl": "<URL to Protected App Signals generateBid UDF>",
        "urlFetchTimeoutMs": 60001, # This has to be > 1 minute.
        "urlFetchPeriodMs": 13000000,
        "prepareDataForAdsRetrievalJsUrl": "<URL to the UDF>"
    }
    EOF

  }  # runtime_flags

}  # Module "buyer"

विक्रेता विज्ञापन तकनीकी कॉन्फ़िगरेशन

इस डेमो फ़ाइल का इस्तेमाल करके, सेलर को फ़्लैग करने की ज़रूरत नहीं है. (ध्यान दें: सिर्फ़ सुरक्षित ऐप्लिकेशन सिग्नल से जुड़े कॉन्फ़िगरेशन को हाइलाइट किया गया है यहां देखें). AdTech को यह पक्का करना होगा कि वे प्लेसहोल्डर:

module "seller" {
  # ... More config here.

  runtime_flags = {
    # ... More config here.

    ENABLE_PROTECTED_APP_SIGNALS                  = "true"

    SELLER_CODE_FETCH_CONFIG                           = <<EOF
  {
    "urlFetchTimeoutMs": 60001, # This has to be > 1 minute.
    "urlFetchPeriodMs": 13000000,
    "protectedAppSignalsBuyerReportWinJsUrls": {"<Buyer Domain>": "URL to reportWin UDF"}
  }
  EOF

  }  # runtime_flags

}  # Module "seller"

केवी और विज्ञापन रिकवरी सेवाएं

विज्ञापन वापस पाने के लिए चुनी गई रणनीतियों के आधार पर, सिस्टम केवी सेवा के एक या दो इंस्टेंस के डिप्लॉयमेंट की ज़रूरत होगी. हम इन बातों का ध्यान रखेंगे केवी इंस्टेंस का इस्तेमाल किया जाएगा. Ad Retrieval Server और इंस्टेंस से, ताकि कॉन्टेक्स्ट के हिसाब से पाथ का इस्तेमाल किया जा सके KV Lookup Server के तौर पर वापस पाना.

दोनों मामलों में सर्वर का डिप्लॉयमेंट, KV सर्वर GitHub, दोनों मामलों में अंतर यह है कि लुकअप केस, किसी अतिरिक्त कॉन्फ़िगरेशन के बिना बॉक्स से बाहर काम करता है. डेटा वापस पाने के लिए, HandleRequest यूडीएफ़ को डिप्लॉय करना ज़रूरी है, ताकि इसे लागू किया जा सके वापस लाने का लॉजिक. ज़्यादा जानकारी के लिए, KV सर्वर पर देखें शामिल होने की गाइड देखें. ध्यान दें कि B&A में दोनों सेवाएं और बिडिंग सेवा के तौर पर, एक ही सर्विस मेश में डिप्लॉय किया जा सकता है.

सेटअप का उदाहरण

यहां दी गई स्थिति देखें: विज्ञापन टेक्नोलॉजी से जुड़ी, Protected App Signals API का इस्तेमाल करना उपयोगकर्ता के ऐप्लिकेशन के इस्तेमाल के आधार पर, काम के सिग्नल सेव करता है. हमारे उदाहरण में, सिग्नल जो कई ऐप्लिकेशन से की गई इन-ऐप्लिकेशन खरीदारी को दिखाती है. इस दौरान नीलामी, एन्क्रिप्ट किए गए सिग्नल इकट्ठा करके उन्हें सुरक्षित नीलामी में पास किया जाता है B&A में चल रहे हैं. B&A में चल रहे खरीदार के यूडीएफ़, विज्ञापन फ़ेच करने के लिए सिग्नल का इस्तेमाल करते हैं और बिड का हिसाब लगा सकते हैं.

[खरीदार] सिग्नल के उदाहरण

0 कुंजी और 1 वैल्यू के साथ सिग्नल जोड़ता है.

{
  "put": {
    "AA==": "AQ=="
  },
  "update_encoder": {
    "action": "REGISTER",
    "endpoint": "https://example.com/example_script"
  }
}

1 की और 2 वैल्यू के साथ सिग्नल जोड़ता है.

{
  "put": {
    "AQ==": "Ag=="
  },
  "update_encoder": {
    "action": "REGISTER",
    "endpoint": "https://example.com/example_script"
  }
}

[खरीदार] एन्कोडर का उदाहरण

हर सिग्नल को दो बाइट में एन्कोड करता है. इनमें से पहला बाइट इसका पहला बाइट होता है और दूसरा बाइट, सिग्नल वैल्यू का पहला बाइट होता है.

function encodeSignals(signals, maxSize) {
  // if there are no signals don't write a payload
  if (signals.size === 0) {
      return {};
  }

  let result = new Uint8Array(signals.size * 2);
  let index = 0;
  
  for (const [key, values] of signals.entries()) {
    result[index++] = key[0];
    result[index++] = values[0].signal_value[0];
  }
  
  return { 'status': 0, 'results': result};
}

[खरीदार] ReadyDataForAdRetrieval का उदाहरण

/**
 * `encodedOnDeviceSignals` is a Uint8Array and would contain
 * the app signals emanating from device. For purpose of the
 * demo, in our sample example, we assume that device is sending
 * the signals with pair of bytes formatted as following:
 * "<id><In app spending>". Where id corresponds to an ad category
 * that user uses on device, and the in app spending is a measure
 * of how much money the user has spent in this app category
 * previously. In our example, id of 0 will correspond to a
 * fitness ad category and a non-zero id will correspond to
 * food app category -- though this info will be useful
 * later in the B&A pipeline.
 *
 * Returns a JSON object indicating what type of ad(s) may be
 * most relevant to the user. In a real setup ad techs might
 * want to decode the signals as part of this script.
 *
 * Note: This example script makes use of only encoded device signals
 * but adtech can take other signals into account as well to prepare
 * the data that will be useful down stream for ad retrieval and
 * bid generation. The max length of the app signals used in this
 * sample example is arbitrarily limited to 4 bytes.
 */
function prepareDataForAdRetrieval(encodedOnDeviceSignals,
                                   encodedOnDeviceSignalsVersion,
                                   sellerAuctionSignals,
                                   contextualSignals) {
  if (encodedOnDeviceSignals.length === 0 || encodedOnDeviceSignals.length > 4 ||
      encodedOnDeviceSignals.length % 2 !== 0) {
     throw "Expected encoded signals length to be an even number in (0, 4]";
  }

  var preparedDataForAdRetrieval = {};
  for (var i = 0; i < encodedOnDeviceSignals.length; i += 2) {
    preparedDataForAdRetrieval[encodedOnDeviceSignals[i]] = encodedOnDeviceSignals[i + 1];
  }
  return preparedDataForAdRetrieval;
}

[खरीदार] विज्ञापन वापस पाने के लिए यूडीएफ़ का सैंपल

हमारे उदाहरण में, विज्ञापन पुनर्प्राप्त करने वाला सर्वर मेटाडेटा (यानी हर विज्ञापन के लिए आईडी नहीं है, लेकिन इसमें हर एक के लिए दूसरा डेटा हो सकता है जो (बाद में) टॉप के विज्ञापन उम्मीदवारों में से हर एक के लिए)

function HandleRequest(requestMetadata, protectedSignals, deviceMetadata,
                      contextualSignals) {
 return "[{\"adId\":\"0\"},{\"adId\":\"1\"}]"

[खरीदार] generateBid का उदाहरण

/**
 * This script receives the data returned by the ad retrieval service
 * in the `ads` argument. This argument is supposed to contain all
 * the Protected App Signals related ads and the metadata obtained from the retrieval
 * service.
 *
 * `preparedDataForAdRetrieval` argument contains the data returned
 * from the `prepareDataForAdRetrieval` UDF.
 *
 * This script is responsible for generating bids for the ads
 * collected from the retrieval service and ad techs can decide to
 * run a small inference model as part of this script in order to
 * decide the best bid given all the signals available to them.
 *
 * For the purpose of the demo, this sample script assumes
 * that ad retrieval service has sent us most relevant ads for the
 * user and this scripts decides on the ad render URL as well as
 * what value to bid for each ad based on the previously decoded
 * device signals. For simplicity sake, this script only considers
 * 2 types of app categories i.e. fitness and food.
 *
 * Note: Only one bid is returned among all the
 * input ad candidates.
 */
function generateBid(ads, sellerAuctionSignals, buyerSignals, preparedDataForAdRetrieval) {
  if (ads === null) {
    console.log("No ads obtained from the ad retrieval service")
    return {};
  }     
        
  const kFitnessAd = "0";
  const kFoodAd = "1";
  const kBuyerDomain = "https://buyer-domain.com";
        
  let resultingBid = 0;
  let resultingRender = kBuyerDomain + "/no-ad";
  for (let i = 0 ; i < ads.length; ++i) {
    let render = "";
    let bid = 0;
    switch (ads[i].adId) {
      case kFitnessAd:
        render = kBuyerDomain + "/get-fitness-app";
        bid = preparedDataForAdRetrieval[kFitnessAd];
        break;
      case kFoodAd:
        render = kBuyerDomain + "/get-fastfood-app";
        bid = preparedDataForAdRetrieval[kFoodAd];
        break;
      default:
        console.log("Unknown ad category");
        render = kBuyerDomain + "/no-ad";
        break;
    }
    console.log("Existing bid: " + resultingBid + ", incoming candidate bid: " + bid);
    if (bid > resultingBid) {
      resultingBid = bid;
      resultingRender = render;
    }
  }
  return {"render": resultingRender, "bid": resultingBid};
}

[खरीदार] reportWin का उदाहरण

reportWin का यूडीएफ़ खरीदार को रिपोर्ट करता है कि उसने नीलामी जीत ली है.

function reportWin(auctionSignals, perBuyerSignals, signalsForWinner,
                                       buyerReportingSignals, directFromSellerSignals,
                                       egressPayload,
                                       temporaryUnlimitedEgressPayload) {
  sendReportTo("https://buyer-controlled-domain.com/");
  registerAdBeacon({"clickEvent":"https://buyer-controlled-domain.com/clickEvent"});
  return;
}

[विक्रेता] KV सर्वर सेटअप

विक्रेताओं को KV सर्वर में स्कोरिंग सिग्नल सेट अप करना होगा, ताकि मैपिंग जो विज्ञापन रेंडर यूआरएल से लेकर उनसे जुड़े स्कोरिंग सिग्नल तक उपलब्ध होते हैं, उदाहरण के लिए: अगर https:/buyer-domain.com/get-fitness-app और खरीदार को https:/buyer-domain.com/get-fastfood-app लौटाए गए थे, विक्रेता के पास नीचे दिए गए, अनुरोध किए जाने पर स्कोरिंग सिग्नल के रिस्पॉन्स का उदाहरण दिया गया है: https://key-value-server-endpoint.com?client_type=1&renderUrls=<render-url-returned-by-the-buyer> पर GET का इस्तेमाल करके SFE:

{
   "renderUrls" : {
      "https:/buyer-domain.com/get-fitness-app" : [
         "1",
         "2"
      ],
      "https:/buyer-domain.com/get-fastfood-app" : [
         "3",
         "4"
      ]
   }
}

[विक्रेता] स्कोरविज्ञापन का उदाहरण

/**
 * This module generates a random desirability score for the Protected App
 * Signals ad in this example. In a production deployment,
 * however, the sellers would want to use all the available signals to generate
 * a score for the ad.
 */
function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}

function scoreAd(adMetadata, bid, auctionConfig,
                                   trustedScoringSignals, deviceSignals,
                                   directFromSellerSignals) {
  return {
    "desirability": getRandomInt(10000),
    "allowComponentAuction": false
  };
}

[सेलर] reportनतीजे का उदाहरण

function reportResult(auctionConfig, sellerReportingSignals, directFromSellerSignals){
  let signalsForWinner = {};
    sendReportTo("https://seller-controlled-domain.com");
    registerAdBeacon({"clickEvent":
                    "https://seller-controlled-domain.com/clickEvent"});
    return signalsForWinner;
}

सैंपल ऐप्लिकेशन

यहां एक उदाहरण के तौर पर बताया गया है कि एपीआई का इस्तेमाल करके, ऐसा ऐप्लिकेशन कैसे बनाया जा सकता है जो जैसा कि ऊपर बताया गया है, हमने एक Protected App Signal सैंपल ऐप्लिकेशन बनाया है जो आपको डेटा स्टोर करने की इस सैंपल जगह में मिल सकता है.