From c8fa08ad648862661a6a195a1b58c361e08c5d02 Mon Sep 17 00:00:00 2001 From: NeerajKrRai <55957265+NeerajKrRai@users.noreply.github.com> Date: Wed, 7 Jul 2021 14:01:27 +0100 Subject: [PATCH] Changes to support Prebid 5.0 API Change Changes for: Adapter does not seem capable of supporting advertiserDomains #6650 Support video params at the adunit level #6512 Bid adapters that support floors must support the floors module #6465 --- integrationExamples/gpt/TestAvngAdapter.html | 93 ++++ .../gpt/pbjs_video_adUnit_Avng.html | 115 +++++ modules/advangelistsBidAdapter.js | 42 +- modules/advangelistsBidAdapter.md | 15 +- modules/advangelistsBidAdapter_bkp.md | 65 +++ modules/new_adkernel.js | 456 ++++++++++++++++++ modules/old.json | 77 +++ .../modules/advangelistsBidAdapter_spec.js | 8 +- 8 files changed, 847 insertions(+), 24 deletions(-) create mode 100644 integrationExamples/gpt/TestAvngAdapter.html create mode 100644 integrationExamples/gpt/pbjs_video_adUnit_Avng.html create mode 100644 modules/advangelistsBidAdapter_bkp.md create mode 100644 modules/new_adkernel.js create mode 100644 modules/old.json diff --git a/integrationExamples/gpt/TestAvngAdapter.html b/integrationExamples/gpt/TestAvngAdapter.html new file mode 100644 index 00000000000..f3165f8d89f --- /dev/null +++ b/integrationExamples/gpt/TestAvngAdapter.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + +

Prebid.js Test

+
Div-1
+
+ +
+ + \ No newline at end of file diff --git a/integrationExamples/gpt/pbjs_video_adUnit_Avng.html b/integrationExamples/gpt/pbjs_video_adUnit_Avng.html new file mode 100644 index 00000000000..df3a621e011 --- /dev/null +++ b/integrationExamples/gpt/pbjs_video_adUnit_Avng.html @@ -0,0 +1,115 @@ + + + + + Prebid.js video adUnit example1 + + + + + + + + + + + +
+ +
+ + + + + diff --git a/modules/advangelistsBidAdapter.js b/modules/advangelistsBidAdapter.js index 746baa9ae35..ef1b9d323d5 100755 --- a/modules/advangelistsBidAdapter.js +++ b/modules/advangelistsBidAdapter.js @@ -11,7 +11,7 @@ const BIDDER_CODE = 'advangelists'; export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// 0cf8d6d643e13d86a5b6374148a4afac'; export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// 0cf8d6d643e13d86a5b6374148a4afac'; export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js'; -export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip']; +export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context']; export const DEFAULT_MIMES = ['video/mp4', 'application/javascript']; let pubid = ''; @@ -66,6 +66,7 @@ export const spec = { height: response.seatbid[0].bid[0].h, ttl: response.seatbid[0].bid[0].ttl || 60, creativeId: response.seatbid[0].bid[0].crid, + meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain }, currency: response.cur, mediaType: VIDEO, netRevenue: true @@ -92,6 +93,7 @@ export const spec = { ttl: response.seatbid[0].bid[0].ttl || 60, creativeId: response.seatbid[0].bid[0].crid, currency: response.cur, + meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain }, mediaType: BANNER, netRevenue: true } @@ -108,6 +110,16 @@ function isVideoBid(bid) { return utils.deepAccess(bid, 'mediaTypes.video'); } +function getBannerBidFloor(bid) { + let floorInfo = utils.isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'banner', size: '*' }) : {}; + return floorInfo.floor || getBannerBidParam(bid, 'bidfloor'); +} + +function getVideoBidFloor(bid) { + let floorInfo = utils.isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'video', size: '*' }) : {}; + return floorInfo.floor || getVideoBidParam(bid, 'bidfloor'); +} + function isVideoBidValid(bid) { return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement'); } @@ -198,12 +210,19 @@ function getTopWindowReferrer() { } function getVideoTargetingParams(bid) { - return Object.keys(Object(bid.params.video)) - .filter(param => includes(VIDEO_TARGETING, param)) - .reduce((obj, param) => { - obj[ param ] = bid.params.video[ param ]; - return obj; - }, {}); + const result = {}; + const excludeProps = ['playerSize', 'context', 'w', 'h']; + Object.keys(Object(bid.mediaTypes.video)) + .filter(key => !includes(excludeProps, key)) + .forEach(key => { + result[ key ] = bid.mediaTypes.video[ key ]; + }); + Object.keys(Object(bid.params.video)) + .filter(key => includes(VIDEO_TARGETING, key)) + .forEach(key => { + result[ key ] = bid.params.video[ key ]; + }); + return result; } function createVideoRequestData(bid, bidderRequest) { @@ -212,7 +231,7 @@ function createVideoRequestData(bid, bidderRequest) { let sizes = getVideoSizes(bid); let firstSize = getFirstSize(sizes); - + let bidfloor = (getVideoBidFloor(bid) == null || typeof getVideoBidFloor(bid) == 'undefined') ? 2 : getVideoBidFloor(bid); let video = getVideoTargetingParams(bid); const o = { 'device': { @@ -239,7 +258,6 @@ function createVideoRequestData(bid, bidderRequest) { }; o.site['page'] = topLocation.href; - o.site['domain'] = topLocation.hostname; o.site['search'] = topLocation.search; o.site['domain'] = topLocation.hostname; o.site['ref'] = topReferrer; @@ -267,7 +285,7 @@ function createVideoRequestData(bid, bidderRequest) { 'displaymanager': '' + BIDDER_CODE, 'displaymanagerver': '' + ADAPTER_VERSION, 'tagId': placement, - 'bidfloor': 2.0, + 'bidfloor': bidfloor, 'bidfloorcur': 'USD', 'secure': secure, 'video': Object.assign({ @@ -300,6 +318,7 @@ function createBannerRequestData(bid, bidderRequest) { let topReferrer = getTopWindowReferrer(); let sizes = getBannerSizes(bid); + let bidfloor = (getBannerBidFloor(bid) == null || typeof getBannerBidFloor(bid) == 'undefined') ? 2 : getBannerBidFloor(bid); const o = { 'device': { @@ -327,7 +346,6 @@ function createBannerRequestData(bid, bidderRequest) { o.site['page'] = topLocation.href; o.site['domain'] = topLocation.hostname; o.site['search'] = topLocation.search; - o.site['domain'] = topLocation.hostname; o.site['ref'] = topReferrer; o.site['mobile'] = isMobile() ? 1 : 0; const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0; @@ -354,7 +372,7 @@ function createBannerRequestData(bid, bidderRequest) { 'displaymanager': '' + BIDDER_CODE, 'displaymanagerver': '' + ADAPTER_VERSION, 'tagId': placement, - 'bidfloor': 2.0, + 'bidfloor': bidfloor, 'bidfloorcur': 'USD', 'secure': secure, 'banner': { diff --git a/modules/advangelistsBidAdapter.md b/modules/advangelistsBidAdapter.md index 1765241eaf3..0c36fe0cb04 100755 --- a/modules/advangelistsBidAdapter.md +++ b/modules/advangelistsBidAdapter.md @@ -42,7 +42,11 @@ var videoAdUnit = { mediaTypes: { video: { playerSize : [[320, 480]], - context: 'instream' + context: 'instream', + skip: 1, + mimes : ['video/mp4', 'application/javascript'], + playbackmethod : [2,6], + maxduration: 30 } }, bids: [ @@ -50,14 +54,7 @@ var videoAdUnit = { bidder: 'advangelists', params: { pubid: '8537f00948fc37cc03c5f0f88e198a76', - placement: 1234, - video: { - id: 123, - skip: 1, - mimes : ['video/mp4', 'application/javascript'], - playbackmethod : [2,6], - maxduration: 30 - } + placement: 1234 } } ] diff --git a/modules/advangelistsBidAdapter_bkp.md b/modules/advangelistsBidAdapter_bkp.md new file mode 100644 index 00000000000..1765241eaf3 --- /dev/null +++ b/modules/advangelistsBidAdapter_bkp.md @@ -0,0 +1,65 @@ +# Overview + +``` +Module Name: Advangelists Bidder Adapter +Module Type: Bidder Adapter +Maintainer: lokesh@advangelists.com +``` + +# Description + +Connects to Advangelists exchange for bids. + +Advangelists bid adapter supports Banner and Video ads currently. + +For more informatio + +# Sample Display Ad Unit: For Publishers +```javascript +var displayAdUnit = [ +{ + code: 'display', + sizes: [ + [300, 250], + [320, 50] + ], + bids: [{ + bidder: 'advangelists', + params: { + pubid: '0cf8d6d643e13d86a5b6374148a4afac', + placement: 1234 + } + }] +}]; +``` + +# Sample Video Ad Unit: For Publishers +```javascript + +var videoAdUnit = { + code: 'video', + sizes: [320,480], + mediaTypes: { + video: { + playerSize : [[320, 480]], + context: 'instream' + } + }, + bids: [ + { + bidder: 'advangelists', + params: { + pubid: '8537f00948fc37cc03c5f0f88e198a76', + placement: 1234, + video: { + id: 123, + skip: 1, + mimes : ['video/mp4', 'application/javascript'], + playbackmethod : [2,6], + maxduration: 30 + } + } + } + ] + }; +``` \ No newline at end of file diff --git a/modules/new_adkernel.js b/modules/new_adkernel.js new file mode 100644 index 00000000000..1bff77f29ce --- /dev/null +++ b/modules/new_adkernel.js @@ -0,0 +1,456 @@ +import * as utils from '../src/utils.js'; +import { config } from '../src/config.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { Renderer } from '../src/Renderer.js'; +import { VIDEO, BANNER } from '../src/mediaTypes.js'; +import find from 'core-js-pure/features/array/find.js'; +import includes from 'core-js-pure/features/array/includes.js'; + +const ADAPTER_VERSION = '1.16'; +const ADAPTER_NAME = 'BFIO_PREBID'; +const OUTSTREAM = 'outstream'; +const CURRENCY = 'USD'; + +export const VIDEO_ENDPOINT = 'https://reachms.bfmio.com/bid.json?exchange_id='; +export const BANNER_ENDPOINT = 'https://display.bfmio.com/prebid_display'; +export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js'; + +export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'placement', 'skip', 'skipmin', 'skipafter']; +export const DEFAULT_MIMES = ['video/mp4', 'application/javascript']; + +export const SUPPORTED_USER_IDS = [ + { key: 'tdid', source: 'adserver.org', rtiPartner: 'TDID', queryParam: 'tdid' }, + { key: 'idl_env', source: 'liveramp.com', rtiPartner: 'idl', queryParam: 'idl' }, + { key: 'uid2.id', source: 'uidapi.com', rtiPartner: 'UID2', queryParam: 'uid2' } +]; + +let appId = ''; + +export const spec = { + code: 'beachfront', + supportedMediaTypes: [ VIDEO, BANNER ], + + isBidRequestValid(bid) { + return !!(isVideoBidValid(bid) || isBannerBidValid(bid)); + }, + + buildRequests(bids, bidderRequest) { + let requests = []; + let videoBids = bids.filter(bid => isVideoBidValid(bid)); + let bannerBids = bids.filter(bid => isBannerBidValid(bid)); + videoBids.forEach(bid => { + appId = getVideoBidParam(bid, 'appId'); + requests.push({ + method: 'POST', + url: VIDEO_ENDPOINT + appId, + data: createVideoRequestData(bid, bidderRequest), + bidRequest: bid + }); + }); + if (bannerBids.length) { + appId = getBannerBidParam(bannerBids[0], 'appId'); + requests.push({ + method: 'POST', + url: BANNER_ENDPOINT, + data: createBannerRequestData(bannerBids, bidderRequest), + bidRequest: bannerBids + }); + } + return requests; + }, + + interpretResponse(response, { bidRequest }) { + response = response.body; + + if (isVideoBid(bidRequest)) { + if (!response || !response.bidPrice) { + utils.logWarn(`No valid video bids from ${spec.code} bidder`); + return []; + } + let sizes = getVideoSizes(bidRequest); + let firstSize = getFirstSize(sizes); + let context = utils.deepAccess(bidRequest, 'mediaTypes.video.context'); + let responseType = getVideoBidParam(bidRequest, 'responseType') || 'both'; + let responseMeta = Object.assign({ mediaType: VIDEO, advertiserDomains: [] }, response.meta); + let bidResponse = { + requestId: bidRequest.bidId, + bidderCode: spec.code, + cpm: response.bidPrice, + width: firstSize.w, + height: firstSize.h, + creativeId: response.crid || response.cmpId, + meta: responseMeta, + renderer: context === OUTSTREAM ? createRenderer(bidRequest) : null, + mediaType: VIDEO, + currency: CURRENCY, + netRevenue: true, + ttl: 300 + }; + + if (responseType === 'nurl' || responseType === 'both') { + bidResponse.vastUrl = response.url; + } + + if (responseType === 'adm' || responseType === 'both') { + bidResponse.vastXml = response.vast; + } + + return bidResponse; + } else { + if (!response || !response.length) { + utils.logWarn(`No valid banner bids from ${spec.code} bidder`); + return []; + } + return response + .filter(bid => bid.adm) + .map((bid) => { + let request = find(bidRequest, req => req.adUnitCode === bid.slot); + let responseMeta = Object.assign({ mediaType: BANNER, advertiserDomains: [] }, bid.meta); + return { + requestId: request.bidId, + bidderCode: spec.code, + ad: bid.adm, + creativeId: bid.crid, + cpm: bid.price, + width: bid.w, + height: bid.h, + meta: responseMeta, + mediaType: BANNER, + currency: CURRENCY, + netRevenue: true, + ttl: 300 + }; + }); + } + }, + + getUserSyncs(syncOptions, serverResponses = [], gdprConsent = {}, uspConsent = '') { + let syncs = []; + let { gdprApplies, consentString = '' } = gdprConsent; + let bannerResponse = find(serverResponses, (res) => utils.isArray(res.body)); + + if (bannerResponse) { + if (syncOptions.iframeEnabled) { + bannerResponse.body + .filter(bid => bid.sync) + .forEach(bid => { + syncs.push({ + type: 'iframe', + url: bid.sync + }); + }); + } + } else if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `https://sync.bfmio.com/sync_iframe?ifg=1&id=${appId}&gdpr=${gdprApplies ? 1 : 0}&gc=${consentString}&gce=1&us_privacy=${uspConsent}` + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `https://sync.bfmio.com/syncb?pid=144&id=${appId}&gdpr=${gdprApplies ? 1 : 0}&gc=${consentString}&gce=1&us_privacy=${uspConsent}` + }); + } + + return syncs; + } +}; + +function createRenderer(bidRequest) { + const renderer = Renderer.install({ + id: bidRequest.bidId, + url: OUTSTREAM_SRC, + loaded: false + }); + + renderer.setRender(bid => { + bid.renderer.push(() => { + window.Beachfront.Player(bid.adUnitCode, { + adTagUrl: bid.vastUrl, + width: bid.width, + height: bid.height, + expandInView: getPlayerBidParam(bidRequest, 'expandInView', false), + collapseOnComplete: getPlayerBidParam(bidRequest, 'collapseOnComplete', true), + progressColor: getPlayerBidParam(bidRequest, 'progressColor'), + adPosterColor: getPlayerBidParam(bidRequest, 'adPosterColor') + }); + }); + }); + + return renderer; +} + +function getFirstSize(sizes) { + return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined }; +} + +function parseSizes(sizes) { + return utils.parseSizesInput(sizes).map(size => { + let [ width, height ] = size.split('x'); + return { + w: parseInt(width, 10) || undefined, + h: parseInt(height, 10) || undefined + }; + }); +} + +function getVideoSizes(bid) { + return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes); +} + +function getBannerSizes(bid) { + return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes); +} + +function getOsVersion() { + let clientStrings = [ + { s: 'Android', r: /Android/ }, + { s: 'iOS', r: /(iPhone|iPad|iPod)/ }, + { s: 'Mac OS X', r: /Mac OS X/ }, + { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ }, + { s: 'Linux', r: /(Linux|X11)/ }, + { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ }, + { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ }, + { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ }, + { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ }, + { s: 'Windows Vista', r: /Windows NT 6.0/ }, + { s: 'Windows Server 2003', r: /Windows NT 5.2/ }, + { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ }, + { s: 'UNIX', r: /UNIX/ }, + { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ } + ]; + let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent)); + return cs ? cs.s : 'unknown'; +} + +function isMobile() { + return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent); +} + +function isConnectedTV() { + return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent); +} + +function getDoNotTrack() { + return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes'; +} + +function isVideoBid(bid) { + return utils.deepAccess(bid, 'mediaTypes.video'); +} + +function isBannerBid(bid) { + return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid); +} + +function getVideoBidParam(bid, key) { + return utils.deepAccess(bid, 'params.video.' + key) || utils.deepAccess(bid, 'params.' + key); +} + +function getBannerBidParam(bid, key) { + return utils.deepAccess(bid, 'params.banner.' + key) || utils.deepAccess(bid, 'params.' + key); +} + +function getPlayerBidParam(bid, key, defaultValue) { + let param = utils.deepAccess(bid, 'params.player.' + key); + return param === undefined ? defaultValue : param; +} + +function getBannerBidFloor(bid) { + let floorInfo = utils.isFn(bid.getFloor) ? bid.getFloor({ currency: CURRENCY, mediaType: 'banner', size: '*' }) : {}; + return floorInfo.floor || getBannerBidParam(bid, 'bidfloor'); +} + +function getVideoBidFloor(bid) { + let floorInfo = utils.isFn(bid.getFloor) ? bid.getFloor({ currency: CURRENCY, mediaType: 'video', size: '*' }) : {}; + return floorInfo.floor || getVideoBidParam(bid, 'bidfloor'); +} + +function isVideoBidValid(bid) { + return isVideoBid(bid) && getVideoBidParam(bid, 'appId') && getVideoBidParam(bid, 'bidfloor'); +} + +function isBannerBidValid(bid) { + return isBannerBid(bid) && getBannerBidParam(bid, 'appId') && getBannerBidParam(bid, 'bidfloor'); +} + +function getTopWindowLocation(bidderRequest) { + let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer; + return utils.parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true }); +} + +function getTopWindowReferrer() { + try { + return window.top.document.referrer; + } catch (e) { + return ''; + } +} + +function getEids(bid) { + return SUPPORTED_USER_IDS + .map(getUserId(bid)) + .filter(x => x); +} + +function getUserId(bid) { + return ({ key, source, rtiPartner }) => { + let id = utils.deepAccess(bid, `userId.${key}`); + return id ? formatEid(id, source, rtiPartner) : null; + }; +} + +function formatEid(id, source, rtiPartner) { + return { + source, + uids: [{ + id, + ext: { rtiPartner } + }] + }; +} + +function getVideoTargetingParams(bid) { + const result = {}; + const excludeProps = ['playerSize', 'context', 'w', 'h']; + Object.keys(Object(bid.mediaTypes.video)) + .filter(key => !includes(excludeProps, key)) + .forEach(key => { + result[ key ] = bid.mediaTypes.video[ key ]; + }); + Object.keys(Object(bid.params.video)) + .filter(key => includes(VIDEO_TARGETING, key)) + .forEach(key => { + result[ key ] = bid.params.video[ key ]; + }); + return result; +} + +function createVideoRequestData(bid, bidderRequest) { + let sizes = getVideoSizes(bid); + let firstSize = getFirstSize(sizes); + let video = getVideoTargetingParams(bid); + let appId = getVideoBidParam(bid, 'appId'); + let bidfloor = getVideoBidFloor(bid); + let tagid = getVideoBidParam(bid, 'tagid'); + let topLocation = getTopWindowLocation(bidderRequest); + let eids = getEids(bid); + let payload = { + isPrebid: true, + appId: appId, + domain: document.location.hostname, + id: utils.getUniqueIdentifierStr(), + imp: [{ + video: Object.assign({ + w: firstSize.w, + h: firstSize.h, + mimes: DEFAULT_MIMES + }, video), + bidfloor: bidfloor, + tagid: tagid, + secure: topLocation.protocol.indexOf('https') === 0 ? 1 : 0, + displaymanager: ADAPTER_NAME, + displaymanagerver: ADAPTER_VERSION + }], + site: { + page: topLocation.href, + domain: topLocation.hostname + }, + device: { + ua: navigator.userAgent, + language: navigator.language, + devicetype: isMobile() ? 1 : isConnectedTV() ? 3 : 2, + dnt: getDoNotTrack() ? 1 : 0, + js: 1, + geo: {} + }, + regs: { + ext: {} + }, + source: { + ext: {} + }, + user: { + ext: {} + }, + cur: [CURRENCY] + }; + + if (bidderRequest && bidderRequest.uspConsent) { + payload.regs.ext.us_privacy = bidderRequest.uspConsent; + } + + if (bidderRequest && bidderRequest.gdprConsent) { + let { gdprApplies, consentString } = bidderRequest.gdprConsent; + payload.regs.ext.gdpr = gdprApplies ? 1 : 0; + payload.user.ext.consent = consentString; + } + + if (bid.schain) { + payload.source.ext.schain = bid.schain; + } + + if (eids.length > 0) { + payload.user.ext.eids = eids; + } + + let connection = navigator.connection || navigator.webkitConnection; + if (connection && connection.effectiveType) { + payload.device.connectiontype = connection.effectiveType; + } + + return payload; +} + +function createBannerRequestData(bids, bidderRequest) { + let topLocation = getTopWindowLocation(bidderRequest); + let topReferrer = getTopWindowReferrer(); + let slots = bids.map(bid => { + return { + slot: bid.adUnitCode, + id: getBannerBidParam(bid, 'appId'), + bidfloor: getBannerBidFloor(bid), + tagid: getBannerBidParam(bid, 'tagid'), + sizes: getBannerSizes(bid) + }; + }); + let payload = { + slots: slots, + page: topLocation.href, + domain: topLocation.hostname, + search: topLocation.search, + secure: topLocation.protocol.indexOf('https') === 0 ? 1 : 0, + referrer: topReferrer, + ua: navigator.userAgent, + deviceOs: getOsVersion(), + isMobile: isMobile() ? 1 : 0, + dnt: getDoNotTrack() ? 1 : 0, + adapterVersion: ADAPTER_VERSION, + adapterName: ADAPTER_NAME + }; + + if (bidderRequest && bidderRequest.uspConsent) { + payload.usPrivacy = bidderRequest.uspConsent; + } + + if (bidderRequest && bidderRequest.gdprConsent) { + let { gdprApplies, consentString } = bidderRequest.gdprConsent; + payload.gdpr = gdprApplies ? 1 : 0; + payload.gdprConsent = consentString; + } + + if (bids[0] && bids[0].schain) { + payload.schain = bids[0].schain; + } + + SUPPORTED_USER_IDS.forEach(({ key, queryParam }) => { + let id = utils.deepAccess(bids, `0.userId.${key}`) + if (id) { + payload[queryParam] = id; + } + }); + + return payload; +} + +registerBidder(spec); diff --git a/modules/old.json b/modules/old.json new file mode 100644 index 00000000000..98fa7924437 --- /dev/null +++ b/modules/old.json @@ -0,0 +1,77 @@ +Request URL: https://nep.advangelists.com/xp/get?pubid=36b1698d957fc35f63b95c35a7938fe2 +Request Method: POST +Status Code: 200 +Remote Address: 34.197.167.170:443 +Referrer Policy: strict-origin-when-cross-origin +access-control-allow-credentials: true +access-control-allow-origin: http://localhost:9999 +access-control-expose-headers: VAST_XML_ERROR_PIXEL,Access-Control-Allow-Origin,Access-Control-Allow-Credentials,Content-Type +content-type: application/json;charset=UTF-8 +date: Mon, 28 Jun 2021 11:49:09 GMT +latency: 298 +server: Apache-Coyote/1.1 +set-cookie: avnguid=av-6389bc98-3971-477d-aa30-93b240d7f6e1; Domain=advangelists.com; Expires=Tue, 28-Jun-2022 11:49:09 GMT +xp_internal_code: 1000 +:authority: nep.advangelists.com +:method: POST +:path: /xp/get?pubid=36b1698d957fc35f63b95c35a7938fe2 +:scheme: https +accept: */* +accept-encoding: gzip, deflate, br +accept-language: en-US,en;q=0.9 +content-length: 830 +content-type: text/plain +origin: http://localhost:9999 +referer: http://localhost:9999/ +sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91" +sec-ch-ua-mobile: ?0 +sec-fetch-dest: empty +sec-fetch-mode: cors +sec-fetch-site: cross-site +user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 +pubid: 36b1698d957fc35f63b95c35a7938fe2 +{device: {langauge: "en", dnt: 0, devicetype: 2, js: 1, os: "Windows 10", h: 864, w: 1536}, at: 2,…} +at: 2 +cur: ["USD"] +device: {langauge: "en", dnt: 0, devicetype: 2, js: 1, os: "Windows 10", h: 864, w: 1536} +devicetype: 2 +dnt: 0 +h: 864 +js: 1 +langauge: "en" +os: "Windows 10" +w: 1536 +id: "2eed1fc671b169" +imp: [{id: "0", displaymanager: "advangelists", displaymanagerver: "1.0", tagId: 10931, bidfloor: 2,…}] +0: {id: "0", displaymanager: "advangelists", displaymanagerver: "1.0", tagId: 10931, bidfloor: 2,…} +bidfloor: 2 +bidfloorcur: "USD" +displaymanager: "advangelists" +displaymanagerver: "1.0" +id: "0" +secure: 0 +tagId: 10931 +video: {id: "5ceda036-1064-452f-84e4-ac02d4bb58e4", pos: 0, w: 320, h: 480,…} +h: 480 +h: 480 +id: "5ceda036-1064-452f-84e4-ac02d4bb58e4" +maxduration: 30 +mimes: ["video/mp4", "application/javascript"] +0: "video/mp4" +1: "application/javascript" +playbackmethod: [2, 6] +pos: 0 +skip: 1 +w: 320 +regs: {ext: {}} +ext: {} +site: {,…} +domain: "pandora.com" +mobile: 0 +name: "Prebid.js video adUnit example" +page: "https://www.giftandwrap.co.uk/pandora-jewellery-c90?gclid=Cj0KCQjw_dWGBhDAARIsAMcYuJwonNQrlH2nqYRuKruhdzIgAhXmNUr8HD3EawD9BWilT21-77Wmp_IaAgTfEALw_wcB" +ref: "http://localhost:9999/integrationExamples/gpt/pbjs_video_adUnit_Avng.html" +search: "" +tmax: 3000 +user: {ext: {}} +ext: {} \ No newline at end of file diff --git a/test/spec/modules/advangelistsBidAdapter_spec.js b/test/spec/modules/advangelistsBidAdapter_spec.js index 2b9615fb572..67c25721871 100755 --- a/test/spec/modules/advangelistsBidAdapter_spec.js +++ b/test/spec/modules/advangelistsBidAdapter_spec.js @@ -9,7 +9,7 @@ describe('advangelistsBidAdapter', function () { beforeEach(function () { bidRequests = [{'bidder': 'advangelists', 'params': {'pubid': '0cf8d6d643e13d86a5b6374148a4afac', 'placement': 1234}, 'crumbs': {'pubcid': '979fde13-c71e-4ac2-98b7-28c90f99b449'}, 'mediaTypes': {'banner': {'sizes': [[300, 250]]}}, 'adUnitCode': 'div-gpt-ad-1460505748561-0', 'transactionId': 'f72931e6-2b0e-4e37-a2bc-1ea912141f81', 'sizes': [[300, 250]], 'bidId': '2aa73f571eaf29', 'bidderRequestId': '1bac84515a7af3', 'auctionId': '5dbc60fa-1aa1-41ce-9092-e6bbd4d478f7', 'src': 'client', 'bidRequestsCount': 1, 'pageurl': 'http://google.com'}]; - bidRequestsVid = [{'bidder': 'advangelists', 'params': {'pubid': '8537f00948fc37cc03c5f0f88e198a76', 'placement': 1234, 'video': {'id': 123, 'skip': 1, 'mimes': ['video/mp4', 'application/javascript'], 'playbackmethod': [2, 6], 'maxduration': 30}}, 'crumbs': {'pubcid': '979fde13-c71e-4ac2-98b7-28c90f99b449'}, 'mediaTypes': {'video': {'playerSize': [[320, 480]], 'context': 'instream'}}, 'adUnitCode': 'video1', 'transactionId': '8b060952-93f7-4863-af44-bb8796b97c42', 'sizes': [], 'bidId': '25c6ab92aa0e81', 'bidderRequestId': '1d420b73a013fc', 'auctionId': '9a69741c-34fb-474c-83e1-cfa003aaee17', 'src': 'client', 'bidRequestsCount': 1, 'pageurl': 'http://google.com'}]; + bidRequestsVid = [{'bidder': 'advangelists', 'params': {'pubid': '8537f00948fc37cc03c5f0f88e198a76', 'placement': 1234}, 'crumbs': {'pubcid': '979fde13-c71e-4ac2-98b7-28c90f99b449'}, 'mediaTypes': {'video': {'playerSize': [[320, 480]], 'context': 'instream', 'skip': 1, 'mimes': ['video/mp4', 'application/javascript'], 'playbackmethod': [2, 6], 'maxduration': 30}}, 'adUnitCode': 'video1', 'transactionId': '8b060952-93f7-4863-af44-bb8796b97c42', 'sizes': [], 'bidId': '25c6ab92aa0e81', 'bidderRequestId': '1d420b73a013fc', 'auctionId': '9a69741c-34fb-474c-83e1-cfa003aaee17', 'src': 'client', 'bidRequestsCount': 1, 'pageurl': 'http://google.com'}]; }); describe('spec.isBidRequestValid', function () { @@ -87,7 +87,7 @@ describe('advangelistsBidAdapter', function () { it('should return valid video bid responses', function () { let _mediaTypes = VIDEO; const advangelistsbidreqVid = {'bidRequest': {'mediaTypes': {'video': {'w': 320, 'h': 480}}}}; - const serverResponseVid = {'cur': 'USD', 'id': '25c6ab92aa0e81', 'seatbid': [{'seat': '3', 'bid': [{'crid': '1855', 'h': 480, 'protocol': 2, 'nurl': 'http://nep.advangelists.com/xp/evt?pp=1MO1wiaMhhq7wLRzZZwwwPkJxxKpYEnM5k5MH4qSGm1HR8rp3Nl7vDocvzZzSAvE4pnREL9mQ1kf5PDjk6E8em6DOk7vVrYUH1TYQyqCucd58PFpJNN7h30RXKHHFg3XaLuQ3PKfMuI1qZATBJ6WHcu875y0hqRdiewn0J4JsCYF53M27uwmcV0HnQxARQZZ72mPqrW95U6wgkZljziwKrICM3aBV07TU6YK5R5AyzJRuD6mtrQ2xtHlQ3jXVYKE5bvWFiUQd90t0jOGhPtYBNoOfP7uQ4ZZj4pyucxbr96orHe9PSOn9UpCSWArdx7s8lOfDpwOvbMuyGxynbStDWm38sDgd4bMHnIt762m5VMDNJfiUyX0vWzp05OsufJDVEaWhAM62i40lQZo7mWP4ipoOWLkmlaAzFIMsTcNaHAHiKKqGEOZLkCEhFNM0SLcvgN2HFRULOOIZvusq7TydOKxuXgCS91dLUDxDDDFUK83BFKlMkTxnCzkLbIR1bd9GKcr1TRryOrulyvRWAKAIhEsUzsc5QWFUhmI2dZ1eqnBQJ0c89TaPcnoaP2WipF68UgyiOstf2CBy0M34858tC5PmuQwQYwXscg6zyqDwR0i9MzGH4FkTyU5yeOlPcsA0ht6UcoCdFpHpumDrLUwAaxwGk1Nj8S6YlYYT5wNuTifDGbg22QKXzZBkUARiyVvgPn9nRtXnrd7WmiMYq596rya9RQj7LC0auQW8bHVQLEe49shsZDnAwZTWr4QuYKqgRGZcXteG7RVJe0ryBZezOq11ha9C0Lv0siNVBahOXE35Wzoq4c4BDaGpqvhaKN7pjeWLGlQR04ufWekwxiMWAvjmfgAfexBJ7HfbYNZpq__', 'adid': '61_1855', 'adomain': ['chevrolet.com.ar'], 'price': 2, 'w': 320, 'iurl': 'https://daf37cpxaja7f.cloudfront.net/c61/creative_url_14922301369663_1.png', 'cat': ['IAB2'], 'id': '7f570b40-aca1-4806-8ea8-818ea679c82b_0', 'attr': [], 'impid': '0', 'cid': '61'}]}], 'bidid': '7f570b40-aca1-4806-8ea8-818ea679c82b'} + const serverResponseVid = {'cur': 'USD', 'id': '25c6ab92aa0e81', 'seatbid': [{'seat': '3', 'bid': [{'crid': '1855', 'h': 480, 'protocol': 2, 'nurl': 'http://nep.advangelists.com/xp/evt?pp=1MO1wiaMhhq7wLRzZZwwwPkJxxKpYEnM5k5MH4qSGm1HR8rp3Nl7vDocvzZzSAvE4pnREL9mQ1kf5PDjk6E8em6DOk7vVrYUH1TYQyqCucd58PFpJNN7h30RXKHHFg3XaLuQ3PKfMuI1qZATBJ6WHcu875y0hqRdiewn0J4JsCYF53M27uwmcV0HnQxARQZZ72mPqrW95U6wgkZljziwKrICM3aBV07TU6YK5R5AyzJRuD6mtrQ2xtHlQ3jXVYKE5bvWFiUQd90t0jOGhPtYBNoOfP7uQ4ZZj4pyucxbr96orHe9PSOn9UpCSWArdx7s8lOfDpwOvbMuyGxynbStDWm38sDgd4bMHnIt762m5VMDNJfiUyX0vWzp05OsufJDVEaWhAM62i40lQZo7mWP4ipoOWLkmlaAzFIMsTcNaHAHiKKqGEOZLkCEhFNM0SLcvgN2HFRULOOIZvusq7TydOKxuXgCS91dLUDxDDDFUK83BFKlMkTxnCzkLbIR1bd9GKcr1TRryOrulyvRWAKAIhEsUzsc5QWFUhmI2dZ1eqnBQJ0c89TaPcnoaP2WipF68UgyiOstf2CBy0M34858tC5PmuQwQYwXscg6zyqDwR0i9MzGH4FkTyU5yeOlPcsA0ht6UcoCdFpHpumDrLUwAaxwGk1Nj8S6YlYYT5wNuTifDGbg22QKXzZBkUARiyVvgPn9nRtXnrd7WmiMYq596rya9RQj7LC0auQW8bHVQLEe49shsZDnAwZTWr4QuYKqgRGZcXteG7RVJe0ryBZezOq11ha9C0Lv0siNVBahOXE35Wzoq4c4BDaGpqvhaKN7pjeWLGlQR04ufWekwxiMWAvjmfgAfexBJ7HfbYNZpq__', 'adid': '61_1855', 'adomain': ['chevrolet.com'], 'price': 2, 'w': 320, 'iurl': 'https://daf37cpxaja7f.cloudfront.net/c61/creative_url_14922301369663_1.png', 'cat': ['IAB2'], 'id': '7f570b40-aca1-4806-8ea8-818ea679c82b_0', 'attr': [], 'impid': '0', 'cid': '61'}]}], 'bidid': '7f570b40-aca1-4806-8ea8-818ea679c82b'}; const bidResponseVid = spec.interpretResponse({ body: serverResponseVid }, advangelistsbidreqVid); delete bidResponseVid['vastUrl']; delete bidResponseVid['ad']; @@ -99,6 +99,7 @@ describe('advangelistsBidAdapter', function () { width: serverResponseVid.seatbid[0].bid[0].w, height: serverResponseVid.seatbid[0].bid[0].h, mediaType: 'video', + meta: { 'advertiserDomains': serverResponseVid.seatbid[0].bid[0].adomain }, currency: 'USD', netRevenue: true, ttl: 60 @@ -115,7 +116,7 @@ describe('advangelistsBidAdapter', function () { }; }); - const serverResponse = {'id': '2aa73f571eaf29', 'seatbid': [{'bid': [{'id': '2c5e8a1a84522d', 'impid': '2c5e8a1a84522d', 'price': 0.81, 'adid': 'abcde-12345', 'nurl': '', 'adm': '
', 'adomain': ['advertiserdomain.com'], 'iurl': '', 'cid': 'campaign1', 'crid': 'abcde-12345', 'w': 300, 'h': 250}], 'seat': '19513bcfca8006'}], 'bidid': '19513bcfca8006', 'cur': 'USD', 'w': 300, 'h': 250}; + const serverResponse = {'id': '2aa73f571eaf29', 'seatbid': [{'bid': [{'id': '2c5e8a1a84522d', 'impid': '2c5e8a1a84522d', 'price': 0.81, 'adid': 'abcde-12345', 'nurl': '', 'adm': '
', 'iurl': '', 'cid': 'campaign1', 'crid': 'abcde-12345', 'adomain': ['chevrolet.com'], 'w': 300, 'h': 250}], 'seat': '19513bcfca8006'}], 'bidid': '19513bcfca8006', 'cur': 'USD', 'w': 300, 'h': 250}; const bidResponse = spec.interpretResponse({ body: serverResponse }, advangelistsbidreq); expect(bidResponse).to.deep.equal({ @@ -127,6 +128,7 @@ describe('advangelistsBidAdapter', function () { width: serverResponse.seatbid[0].bid[0].w, height: serverResponse.seatbid[0].bid[0].h, mediaType: 'banner', + meta: { 'advertiserDomains': serverResponse.seatbid[0].bid[0].adomain }, currency: 'USD', netRevenue: true, ttl: 60