بهعنوان بخشی از جعبه ایمنی حریم خصوصی ، کروم TURTLEDOVE را پیشنهاد کرد - یک API درون مرورگر که هدف آن این است که به تبلیغکنندگان و شرکتهای فناوری تبلیغات اجازه دهد بدون تکیه بر کوکیهای شخص ثالث، آگهیهای هدفمند گروه مورد علاقه را نشان دهند، بنابراین از کاربران در برابر ردیابی بینسایتی محافظت میکنند. قبل از اینکه Chrome TURTLEDOVE را پیادهسازی کند، تیم Google RTB یک شبیهسازی API TURTLEDOVE در سمت سرور ارائه میکند که به شرکای RTB خود (خریداران مجاز و شرکای مناقصه باز) اجازه میدهد تا با API آزمایش کنند. این شبیهسازی به شرکا و Google اجازه میدهد تا در مورد کارایی جریان به سبک TURTLEDOVE بیاموزند، بازخورد مربوطه را در مورد بهبودهای بالقوه API در انجمنهای عمومی ایجاد کنند، و انتقال به حمایت از تبلیغات شخصیشده را بدون اتکا به کوکیهای شخص ثالث تسهیل کنند.
در مرحله اول شبیه سازی، مناقصه گران میزبان عضویت گروه ذینفع هستند. مناقصهدهندگان همچنین از طریق یک API عملکردهای پیشنهادی را پیش از موعد به Google ارائه میکنند. در زمان ارائه خدمات، Google هر درخواست پیشنهادی را در محدوده شبیه سازی به دو درخواست تقسیم می کند: یک درخواست متنی و یک درخواست مبتنی بر علاقه. درخواست متنی مشابه درخواست پیشنهاد فعلی خواهد بود، اما بدون شناسه های کاربر (مانند google_user_id
، hosted_match_data
) موجود است. درخواستهای گروه علاقهمندی حاوی هیچ اطلاعات متنی نیستند و فقط شامل فیلدهای شناسایی کاربر هستند (با توجه به کنترلهای حریم خصوصی موجود). پیشنهادهای گروه مورد علاقه حاوی مقدار CPM نیستند، اما در عوض به یک تابع مناقصه اشاره می کنند که Google در یک محیط sandbox در سمت سرور اجرا می کند. مزایده به طور معمول با پیشنهادات متنی و پیشنهادات محاسبه شده توسط توابع مناقصه اجرا می شود.
در مرحله اول شبیه سازی، گوگل شناسه های کاربری مستعار را بر اساس درخواست های مبتنی بر علاقه ارسال می کند. هدف این است که کار اجرا را از هر دو طرف به حداقل برسانیم تا بتوانیم آزمایشات را زودتر شروع کنیم. وجود شناسههای کاربر در درخواستهای مبتنی بر علاقه، مشمول حفاظتها و کنترلهای حریم خصوصی موجود خواهد بود (مانند زمانی که کاربر از تبلیغات شخصیشده منصرف میشود).
جریان
- RTB Bidder برای ایجاد، نگهداری و میزبانی گروههای علاقهمند برای هر تبلیغکننده و عضویت کاربر در آن گروههای علاقه، با تبلیغکنندگان کار میکند.
- هنگامی که کاربر از یک صفحه وب ناشر بازدید می کند، مرورگر کاربر تگ تبلیغات Google را دانلود می کند. مرورگر کاربر از پلتفرم ناشر گوگل درخواست تبلیغ می کند.
- مناقصه RTB یک یا چند تابع مناقصه (به عنوان توابع جاوا اسکریپت) را پیش از موعد در اختیار Google قرار می دهد. (به بخش: توابع مناقصه مراجعه کنید).
- برای بخش کوچکی از درخواستهای مربوط به آزمایش، Google درخواستهای پیشنهادی متنی جداگانه و درخواستهای پیشنهادی مبتنی بر علاقه را برای هر داوطلب شرکتکننده در آزمایش ارسال میکند (به بخش: درخواستهای پیشنهادی مراجعه کنید).
- پیشنهاد دهنده از شناسه کاربری مستعار موجود در درخواست پیشنهاد گروه ذینفع استفاده می کند و آن را به گروه های ذینفع مربوطه ترسیم می کند. پیشنهاد دهنده RTB پاسخ های پیشنهادی متنی و پاسخ های پیشنهادی مبتنی بر علاقه را برمی گرداند (به بخش: پاسخ های پیشنهادی مراجعه کنید).
- پاسخهای پیشنهادی متنی مشابه پاسخ پیشنهادی امروز با پیشنهادهای متنی صفر یا بیشتر خواهد بود. علاوه بر آن، پاسخ پیشنهاد متنی میتواند سیگنالهای متنی سفارشی پیشنهاددهنده را حمل کند که به عنوان ورودی به تابع مناقصه ارائه میشود.
- پاسخهای پیشنهادی مبتنی بر علاقه، پیشنهادی را مشخص نمیکنند، بلکه نام تابع مناقصه را مشخص میکنند. Google تابع مناقصه را برای دریافت پیشنهاد اجرا می کند.
Google یک مزایده سمت سرور با نامزدهای زیر اجرا می کند:
- پیشنهادات از پاسخ متنی.
- پیشنهادات از پاسخ گروه ذینفع با قیمت های پیشنهادی محاسبه شده با اجرای توابع مناقصه.
- پیشنهادهای منظم از سایر مناقصه گران.
توجه داشته باشید که این حراج همان حراج امروز است.
گوگل یک تبلیغ برنده را به مرورگر کاربر برمی گرداند که به طور معمول رندر می شود.
توابع مناقصه
توابع مناقصه، توابعی هستند که توسط پیشنهاد دهندگان ارائه می شوند که ارزش پیشنهادی را برای یک آگهی مبتنی بر گروه علاقه مندی و یک جایگاه آگهی برمی گرداند. در پیشنهاد اصلی TURTLEDOVE ، این تابع در مرورگر کاربر ذخیره می شود. در این شبیهسازی، پیشنهاد دهندگان قبل از ارائه آگهی، توابع مناقصه را با استفاده از یک API در Google آپلود میکنند. در طول ارائه آگهی، پاسخ گروه علاقهمندی نام تابع پیشنهادی را مشخص میکند. Google آن تابع پیشنهاد قیمت را در یک محیط sandbox اجرا می کند تا مقدار پیشنهادی را بدست آورد. این ارزش پیشنهادی مبتنی بر بهره در حراجی مشابه پیشنهاد متنی وارد خواهد شد.
رابط تابع مناقصه
تابع مناقصه باید یک تابع بدون عارضه جانبی خالص باشد که در جاوا اسکریپت پیاده سازی شده و در یک جعبه ایمنی ارائه شده توسط تبادل اجرا می شود. یک تابع مناقصه به شبکه، فضای ذخیرهسازی یا سایر اشکال ورودی/خروجی دسترسی ندارد و نمیتواند هیچ حالتی را بین فراخوانها برای درخواستهای مختلف پیشنهادی حفظ کند. تابع مناقصه به صورت الگوریتمی بر اساس ترکیبی از دادههای متنی و دادههای گروه علاقه، CPM قیمت پیشنهادی را برای یک نامزد آگهی معین محاسبه و برمیگرداند.
یک تابع پیشنهاد باید بپذیرد و با یک شی خالی به عنوان پارامتر ورودی آن اجرا شود - یک ورودی خالی برای توابع پیشنهادی در طول مقداردهی اولیه یک بار آنها ارائه می شود. در زمان شروع، یک عکس فوری از تابع bidding ایجاد می شود و چند بار فراخوانی می شود تا به کامپایلر JIT (فقط در زمان) اجازه دهد نقاط داغ در کد را بهینه کند.
/**
* Returns a bid price CPM for a given ad candidate.
*
* @param {Object} inputs an object with the
* following named fields:
* - openrtbContextualBidRequest or googleContextualBidRequest
* - customContextualSignal
* - interestBasedBidData
*/
function biddingFunction(inputs) {
...
return inputs.interestBasedBidData.cpm
* inputs.customContextualSignals.placementMultiplier;
}
فیلدهای نامگذاری شده در inputs
، آرگومان شیء شامل (با پیشرفت آزمایش تغییر میکند):
openrtbContextualBidRequest | (JS Object) درخواست پیشنهاد متنی در پروتکل OpenRTB. پیشنهاد دهندگانی که از پروتکل RTB خریداران مجاز استفاده می کنند باید این ورودی را نادیده بگیرند و نباید از آن در عملکردهای پیشنهادی خود استفاده کنند. |
googleContextualBidRequest | (JS Object) درخواست پیشنهاد متنی در پروتکل Google Authorized Buyers. پیشنهاد دهندگانی که از پروتکل OpenRTB استفاده می کنند باید این ورودی را نادیده بگیرند و نباید از آن در عملکردهای پیشنهادی خود استفاده کنند. |
customContextualSignal | (JS Object) داده های سفارشی ارائه شده توسط پیشنهاد دهنده در پاسخ پیشنهادی متنی. مناقصه گزار فرمت را تعیین می کند. |
interestBasedBidData | (JS Object) داده های سفارشی ارائه شده توسط مناقصه گزار در پاسخ پیشنهادی گروه ذینفع. مناقصه گزار فرمت را تعیین می کند. |
مدیریت عملکردهای مناقصه از طریق یک API
این منبع آزمایشی API به پیشنهاد دهندگان اجازه می دهد تا توابع پیشنهاد قیمت را در Google آپلود کنند و این توابع را مدیریت کنند.
نقطه پایانی سرویس پایه: https://realtimebidding.googleapis.com
منبع: تابع مناقصه
{
"name": string,
"biddingFunction": string
}
فیلد، name
، نام تابع مناقصه را نشان میدهد، باید از این فرمت پیروی کند: bidders/{bidderAccountId}/biddingFunctions/{biddingFunctionName}
، جایی که biddingFunctionName
توسط پیشنهاد دهنده انتخاب میشود.
فیلد biddingFunction
کد منبع جاوا اسکریپت تابع bidding با شرایط زیر است:
- حجم کمتر از 5 مگابایت
- الزامات رابط تابع Bidding را دنبال می کند.
- باید اجرای بدون هیچ ورودی را در طول ایجاد اولیه در جعبه شنی پشتیبانی کند.
مثال:
{
"name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
"biddingFunction": "(function(inputs) {return 1.23;})"
}
ایجاد یک تابع مناقصه
یک تابع مناقصه برای استفاده در پاسخهای گروه علاقهمند در حدود یک ساعت پس از تماس موفقیتآمیز CreateBiddingFunction API در دسترس خواهد بود.
POST https://realtimebidding.googleapis.com/v1alpha/{parent=bidders/*}/biddingFunctions
پارامترهای مسیر
parent | رشته در قالب bidders/{bidderAccountId} |
بدنه: تابع مناقصه برای ایجاد
{
"name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
"biddingFunction": "(function(inputs) {return 1.23;})"
}
پاسخ (عملکرد مناقصه)
{
"name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
"biddingFunction": "(function(inputs) {return 1.23;};)"
}
فهرست کردن توابع مناقصه موجود
GET https://realtimebidding.googleapis.com/v1alpha/bidders/{bidderAccountId}/biddingFunctions
پارامترهای مسیر
parent | رشته در قالب bidders/{bidderAccountId} . |
پارامترهای پرس و جو
pageToken | رمز رشته ای که صفحه ای از نتایجی را که سرور باید برگرداند را شناسایی کند. این مقدار از پاسخ تماس قبلی ListBiddingFunctions دریافت میشود، اگر نتایج در یک صفحه قرار نگیرند. |
واکنش
{
"biddingFunctions": [
{
object (BiddingFunction)
}
],
"nextPageToken": string
}
تماس مثال
GET https://realtimebidding.googleapis.com/v1alpha/bidders/123456789/biddingFunctions
تغییرات پروتکل RTB شبیه سازی TURTLEDOVE
پروتکل RTB خریداران مجاز
درخواست های پیشنهادی
یک درخواست پیشنهادی متنی در آزمایش مشابه درخواستهای پیشنهاد قیمت معمولی است اما با شناسههای کاربر مستعار ویرایش شده است.
// All fields will be filled unless otherwise specified.
message BidRequest {
// Fields below would not be populated in the experiment
optional string google_user_id = ...;
optional uint32 cookie_version = ...;
optional int32 cookie_age_seconds = ...;
optional bytes hosted_match_data = ...;
optional string session_id = ...;
// Contextual fields below will be populated
optional string publisher_id = ...;
optional string url = ...;
...
message Mobile {
// Device advertising identifiers below would not be populated
// in the contextual requests in the experiment
optional bytes encrypted_advertising_id = ...;
optional bytes advertising_id = ...;
...
optional bytes encrypted_hashed_idfa = ...;
optional bytes hashed_idfa = ...;
...
}
...
message AdSlot {
message MatchingAdData {
repeated int64 billing_id = ...;
...
}
...
}
repeated AdSlot adslot = ...;
...
}
مثلا:
{
id: "_\321\326\000\n\301\207\n\323\n\227",
ip: "S\030\347",
user_agent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
publisher_country: "RU",
geo_criteria_id: 9061060,
adslot: [{
id: 1,
ad_block_key: 3613182520,
width: [240,200,120],
height: [400,200,240],
matching_ad_data: [{
billing_id: [923487589],
minimum_cpm_micros: 850000
}]
}]
}
یک درخواست مبتنی بر علاقه در آزمایش حاوی شناسههای کاربر مستعار متعارف، مشروط به همه حفاظتها و کنترلهای حریم خصوصی موجود است، اما حاوی اطلاعات متنی (URL صفحه، شناسه ناشر، و غیره) نخواهد بود.
// Most fields would not be populated in the experiment unless otherwise specified.
message BidRequest {
// Will be provided, subject to the existing privacy controls.
optional string google_user_id = ...;
optional uint32 cookie_version = ...;
optional int32 cookie_age_seconds = ...;
optional bytes hosted_match_data = ...;
message AdSlot {
// Will be filled.
repeated int32 width = ...;
repeated int32 height = ...;
optional ConsentedProvidersSettings consented_providers_settings = ...;
optional bool regs_gdpr = ...;
optional bool regs_lgpd = ...;
message MatchingAdData {
// Will be filled.
repeated int64 billing_id = ...;
...
}
...
}
repeated AdSlot adslot = ...;
...
}
مثلا:
id: "_\322\207\000\003\320\n\031\177C\307\215\035"
adslot {
id: 1
width: 1200
height: 60
consented_providers_settings {
consented_providers: 292
tcf_consent_string: "CO-eDrRO-eDrREkAAAAAAAAeYwf95y3p-wzhheMCY70-vv__7v3ff_3g"
}
regs_gdpr: true
matching_ad_data {
billing_id: 9833784997
}
}
google_user_id: "ABCDEF1"
hosted_match_data: "ABCABCABC2"
پاسخ های پیشنهادی
یک پاسخ پیشنهادی متنی میتواند حاوی دادههای متنی سفارشی و ویژه پیشنهاددهنده در قالب دلخواه باشد که بعداً به تابع مناقصه ارسال میشود.
message BidResponse {
message Ad {
message AdSlot {
required int64 max_cpm_micros = ...;
...
}
repeated AdSlot adslot = ...;
...
}
repeated Ad ad = ...;
// Contains contextual signals that will be passed to the bidding function.
// This can be any JSON value. For example:
// {"foo": "bar", "base": [1, 2, 3]}
optional google.protobuf.Value custom_contextual_signal = ...;
...
}
مثلا،
ad {
html_snippet: "<iframe src=\"http://example.com/something" width=\"300\" height=\"250\" scrolling=\"no\" frameBorder=\"0\" ></iframe>"
adslot {
id: 1
max_cpm_micros: 100000
billing_id: 1234567890
}
click_through_url: "https://www.example.com.pl"
attribute: 47
buyer_creative_id: "FFI399F3HI9HFH"
width: 300
height: 250
impression_tracking_url: "http://example.com/impression"
}
custom_contextual_signal {
struct_value {
fields {
name: "string_data_name"
value {
string_value: "string_value_1"
}
}
fields {
name: "bool_data_name"
value {
bool_value: true
}
}
}
}
processing_time_ms: 1
یک پیشنهاد مبتنی بر گروه ذینفع
هر پیشنهاد در پاسخ پیشنهاد پیشنهادی گروه ذینفع حاوی یک ارجاع به تابع مناقصه با نام خود خواهد بود. توابع مناقصه توسط یک مناقصه گزار زودتر از موعد ارائه می شود.
// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
message BidResponse {
// Ad HTML code that will be rendered normally upon winning.
optional string html_snippet = ...;
message Ad {
message AdSlot {
// Should not be populated for interest group-based bids.
required int64 max_cpm_micros = ...;
...
}
repeated AdSlot adslot = ...;
// Will be filled.
// This is the bidding function name that references a bidding function
// that is provided ahead of time through Bidding functions API resource.
optional string bidding_function_name = ...;
// Contains interest group-related data that will be passed
// to the bidding function. This can be any JSON value.
optional google.protobuf.Value interest_group_data = ...;
...
}
repeated Ad ad = ...;
...
}
مثلا:
ad {
html_snippet: "<iframe src=\"http://example.com/something" width=\"300\" height=\"250\" scrolling=\"no\" frameBorder=\"0\" ></iframe>"
adslot {
id: 1
max_cpm_micros: 0
billing_id: 1234567890
bidding_function_name: "bidders/123/biddingFunctions/my_bidding_function_1"
interest_group_data {
struct_value {
fields {
name: "string_data_name"
value {
string_value: "string_value_1"
}
}
fields {
name: "bool_data_name"
value {
bool_value: true
}
}
}
}
}
click_through_url: "https://www.example.com.pl"
attribute: 47
buyer_creative_id: "FFI399F3HI9HFH"
width: 300
height: 250
impression_tracking_url: "http://example.com/impression"
}
processing_time_ms: 1
OpenRTB
درخواست های پیشنهادی
درخواست متنی (در JSON)
// All fields will be filled unless otherwise specified.
{
// Fields below would not be populated in the experiment
"user": {...}
"device": {
// Fields below would not be populated in the experiment
"ifa": ...
"dpidsha1": ...
"dpidmd5": ...
// Other fields will not be affected by the experiment
...
}
// Other fields will not be affected by the experiment
...
}
درخواست مبتنی بر علاقه (در JSON)
// Most fields would not be populated in the experiment unless otherwise specified.
{
// Will be provided, subject to the existing privacy controls.
"user": {
"id": "BFEUKH3"
"buyeruid": "FEI3F3I29"
"ext": {
"consented_providers": [ 292 ]
"tcf_consent_string": "CO-eDrRO-eDrREkAAilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g"
}
}
"imp": {
// Will be provided, subject to the existing privacy controls.
"banner": {
"w": ...
"h": ...
}
"ext": {
// Will be provided, subject to the existing privacy controls.
"billing_id": [...]
// Other fields will not be provided by the experiment
...
}
}
}
پاسخ های پیشنهادی
یک پاسخ پیشنهادی متنی میتواند حاوی دادههای زمینهای سفارشی و خاص باشد که بعداً به تابع مناقصه ارسال میشود.
// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
{
...
"seatbid": [{
"bid": [...],
...
}],
...
"ext": {
// Contains contextual signals that will be passed to the bidding function.
// This signal can be any JSON blob. For example:
// {"foo", "bar", "base": [1, 2, 3]}
"custom_contextual_signal": ...
}
}
پاسخ پیشنهادی مبتنی بر گروه ذینفع
هر پیشنهاد در پاسخ پیشنهاد پیشنهادی گروه ذینفع حاوی یک ارجاع به تابع مناقصه با نام خود خواهد بود. توابع مناقصه توسط یک مناقصه گزار زودتر از موعد ارائه می شود.
// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
{
"bid": [{
"id": ...
...
"ext": {
// This is the bidding function name that references a bidding function
// that is provided ahead of time through Bidding functions API resource.
"bidding_function_name": ...
// Contains interest group related data that will be passed to the
// bidding function.
// This signal can be any JSON blob. For example:
// {"foo", "bar", "base": [1, 2, 3]}
"interest_group_data": ...
}
}
...
]
}