Skip to content

Commit 849ae8f

Browse files
Gaudeamusidettman
authored andcommitted
mgidAdapter (prebid#3562)
* mgidAdapter * mgidAdapter description * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter test fixes * mgidAdapter gdpr + ver * test params * test params changed * revert * revert
1 parent b12e6dd commit 849ae8f

File tree

3 files changed

+576
-0
lines changed

3 files changed

+576
-0
lines changed

modules/mgidBidAdapter.js

+247
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
import {registerBidder} from 'src/adapters/bidderFactory';
2+
import * as utils from '../src/utils';
3+
import * as urlUtils from '../src/url';
4+
import { BANNER } from 'src/mediaTypes';
5+
const BIDDER_CODE = 'mgid';
6+
const ENDPOINT_URL = '//dsp.mgid.com/prebid/';
7+
8+
export const spec = {
9+
VERSION: '1.0',
10+
code: BIDDER_CODE,
11+
aliases: ['mgid'], // short code
12+
supportedMediaTypes: [BANNER],
13+
reId: /^[0-9]+$/,
14+
/**
15+
* Determines whether or not the given bid request is valid.
16+
*
17+
* @param {BidRequest} bid The bid params to validate.
18+
* @return boolean True if this is a valid bid, and false otherwise.
19+
*/
20+
isBidRequestValid: (bid) => {
21+
const banner = utils.deepAccess(bid, 'mediaTypes.banner');
22+
const sizes = utils.deepAccess(banner, 'sizes');
23+
let sizesOk = typeof (sizes) == 'object' && sizes.length > 0;
24+
for (let f = 0; sizesOk && f < sizes.length; f++) {
25+
sizesOk = sizes[f].length == 2;
26+
}
27+
return typeof (bid.params) == 'object' && !!bid.params.accountId && !!bid.params.placementId &&
28+
typeof (bid.params.accountId) == 'string' && typeof (bid.params.placementId) == 'string' &&
29+
bid.params.accountId.length > 0 && bid.params.placementId.length > 0 &&
30+
bid.params.accountId.toString().match(spec.reId) > 0 && bid.params.placementId.toString().match(spec.reId) &&
31+
typeof (banner) == 'object' && sizesOk;
32+
},
33+
/**
34+
* Make a server request from the list of BidRequests.
35+
*
36+
* @param {validBidRequests[]} - an array of bids
37+
* @return ServerRequest Info describing the request to the server.
38+
*/
39+
buildRequests: (validBidRequests, bidderRequest) => {
40+
utils.logInfo(`MGID DEBUG: buildRequests`);
41+
if (validBidRequests.length == 0) {
42+
return null;
43+
}
44+
const referer = utils.deepAccess(bidderRequest, 'refererInfo.referer');
45+
const hostname = urlUtils.parse(referer).hostname;
46+
let domain = extractDomainFromHost(hostname) || hostname;
47+
const accountId = setOnAny(validBidRequests, 'params.accountId');
48+
const muid = getLocalStorageSafely('mgMuidn');
49+
let url = (setOnAny(validBidRequests, 'params.bidUrl') || ENDPOINT_URL) + accountId;
50+
if (muid != null && typeof (muid) == 'string' && muid.length > 0) {
51+
url += '?muid=' + muid;
52+
}
53+
const page = utils.deepAccess(bidderRequest, 'refererInfo.canonicalUrl') || referer;
54+
const secure = window.location.protocol === 'https:' ? 1 : 0;
55+
const imp = validBidRequests.map((bid, id) => {
56+
const placeId = utils.deepAccess(bid, 'params.placementId');
57+
const sizes = utils.deepAccess(bid, 'mediaTypes.banner.sizes');
58+
let format = [];
59+
if (sizes.length > 1) {
60+
for (let f = 0; f < sizes.length; f++) {
61+
if (sizes[f].length == 2) {
62+
format.push({w: sizes[f][0], h: sizes[f][1]});
63+
}
64+
}
65+
}
66+
return {
67+
id: bid.bidId,
68+
tagid: placeId,
69+
banner: {
70+
w: sizes && sizes[0][0],
71+
h: sizes && sizes[0][1],
72+
format,
73+
},
74+
secure,
75+
};
76+
});
77+
78+
let ext = {mgid_ver: spec.VERSION, prebid_ver: $$PREBID_GLOBAL$$.version};
79+
let user = {};
80+
let regs = {};
81+
if (bidderRequest && bidderRequest.gdprConsent) {
82+
user.ext = {
83+
consent: bidderRequest.gdprConsent.consentString
84+
};
85+
86+
regs.ext = {
87+
gdpr: (bidderRequest.gdprConsent.gdprApplies ? 1 : 0)
88+
};
89+
}
90+
91+
const request = {
92+
id: utils.deepAccess(bidderRequest, 'bidderRequestId'),
93+
site: { domain, page },
94+
cur: ['USD'],
95+
device: {
96+
ua: navigator.userAgent,
97+
js: 1,
98+
dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
99+
h: screen.height,
100+
w: screen.width,
101+
language: getLanguage()
102+
},
103+
user,
104+
regs,
105+
ext,
106+
imp
107+
};
108+
utils.logInfo(`MGID DEBUG: buildRequests\n${request}`);
109+
return {
110+
method: 'POST',
111+
url: url,
112+
data: JSON.stringify(request),
113+
};
114+
},
115+
/**
116+
* Unpack the response from the server into a list of bids.
117+
*
118+
* @param {ServerResponse} serverResponse A successful response from the server.
119+
* @return {Bid[]} An array of bids which were nested inside the server.
120+
*/
121+
interpretResponse: (serverResponse, bidRequests) => {
122+
if (serverResponse == null || serverResponse.body == null || serverResponse.body == '' || !serverResponse.body.seatbid || !serverResponse.body.seatbid[0]) {
123+
return [];
124+
}
125+
utils.logInfo(`MGID DEBUG: interpretResponse`);
126+
const returnedBids = [];
127+
const muidn = utils.deepAccess(serverResponse.body, 'ext.muidn')
128+
if (muidn != null && typeof (muidn) == 'string' && muidn.length > 0) {
129+
setLocalStorageSafely('mgMuidn', muidn)
130+
}
131+
serverResponse.body.seatbid[0].bid.forEach((value, index) => {
132+
returnedBids.push(prebidBid(value, serverResponse.body.cur));
133+
});
134+
135+
utils.logInfo(`MGID DEBUG:\n${returnedBids}`);
136+
return returnedBids;
137+
},
138+
onBidWon: (bid) => {
139+
const cpm = bid.pbMg;
140+
if (bid.nurl != '') {
141+
bid.nurl = bid.nurl.replace(
142+
/\$\{AUCTION_PRICE\}/,
143+
cpm
144+
);
145+
pixel(bid.nurl);
146+
};
147+
if (bid.isBurl) {
148+
bid.ad = bid.ad.replace(
149+
/\$\{AUCTION_PRICE\}/,
150+
cpm
151+
);
152+
}
153+
utils.logInfo(`MGID DEBUG: onBidWon`);
154+
},
155+
getUserSyncs: (syncOptions, serverResponses) => {
156+
utils.logInfo(`MGID DEBUG: getUserSyncs`);
157+
}
158+
};
159+
160+
registerBidder(spec);
161+
162+
function setOnAny(collection, key) {
163+
for (let i = 0, result; i < collection.length; i++) {
164+
result = utils.deepAccess(collection[i], key);
165+
if (result) {
166+
return result;
167+
}
168+
}
169+
}
170+
171+
/**
172+
* Unpack the Server's Bid into a Prebid-compatible one.
173+
* @param serverBid
174+
* @return Bid
175+
*/
176+
function prebidBid(serverBid, cur) {
177+
if (cur == null || cur == '') {
178+
cur = 'USD';
179+
}
180+
const bid = {
181+
requestId: serverBid.impid,
182+
ad: serverBid.adm,
183+
cpm: serverBid.price,
184+
creativeId: serverBid.adid,
185+
currency: cur,
186+
dealId: serverBid.dealid || '',
187+
width: serverBid.w,
188+
height: serverBid.h,
189+
mediaType: 'banner',
190+
netRevenue: true,
191+
ttl: serverBid.ttl || 300,
192+
nurl: serverBid.nurl || '',
193+
isBurl: typeof (serverBid.burl) == 'string' && serverBid.burl.length > 0,
194+
};
195+
196+
return bid;
197+
}
198+
199+
function extractDomainFromHost(pageHost) {
200+
if (pageHost == 'localhost') {
201+
return 'localhost'
202+
}
203+
let domain = null;
204+
try {
205+
let domains = /[-\w]+\.([-\w]+|[-\w]{3,}|[-\w]{1,3}\.[-\w]{2})$/i.exec(pageHost);
206+
if (domains != null && domains.length > 0) {
207+
domain = domains[0];
208+
for (let i = 1; i < domains.length; i++) {
209+
if (domains[i].length > domain.length) {
210+
domain = domains[i];
211+
}
212+
}
213+
}
214+
} catch (e) {
215+
domain = null;
216+
}
217+
return domain;
218+
}
219+
220+
function pixel(url) {
221+
(document.createElement('IMG')).src = url;
222+
}
223+
224+
function getLanguage() {
225+
const language = navigator.language ? 'language' : 'userLanguage';
226+
const lang2 = navigator[language].split('-')[0];
227+
if (lang2.length == 2 || lang2.length == 3) {
228+
return lang2;
229+
}
230+
return '';
231+
}
232+
233+
function getLocalStorageSafely(key) {
234+
try {
235+
return localStorage.getItem(key);
236+
} catch (e) {
237+
return null;
238+
}
239+
}
240+
241+
function setLocalStorageSafely(key, val) {
242+
try {
243+
return localStorage.setItem(key, val);
244+
} catch (e) {
245+
return null;
246+
}
247+
}

modules/mgidBidAdapter.md

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Overview
2+
3+
```
4+
Module Name: Mgid Bidder Adapter
5+
Module Type: Bidder Adapter
6+
Maintainer: [email protected]
7+
```
8+
9+
# Description
10+
11+
One of the easiest way to gain access to MGID demand sources - MGID header bidding adapter.
12+
13+
MGID header bidding adapter connects with MGID demand sources to fetch bids for display placements
14+
15+
# Test Parameters
16+
17+
18+
300x600 banner test
19+
```
20+
var adUnits = [{
21+
code: 'div-prebid',
22+
mediaTypes: {
23+
banner: {
24+
sizes: [[300, 600]]
25+
}
26+
},
27+
// Replace this object to test a new Adapter!
28+
bids: [{
29+
bidder: 'mgid',
30+
params : {
31+
accountId : "219", //test accountId, please replace after test
32+
placementId : "331749" // 300x600 test placementId, please replace after test
33+
}
34+
}]
35+
}];
36+
```
37+
38+
300x250 banner test
39+
```
40+
var adUnits = [{
41+
code: 'div-prebid',
42+
mediaTypes: {
43+
banner: {
44+
sizes: [[300, 250]]
45+
}
46+
},
47+
// Replace this object to test a new Adapter!
48+
bids: [{
49+
bidder: 'mgid',
50+
params : {
51+
accountId : "219", //test accountId, please replace after test
52+
placementId : "331748" // 300x250 test placementId, please replace after test
53+
}
54+
}]
55+
}];
56+
```
57+
58+
# Bid Parameters
59+
## Banner
60+
61+
| Name | Scope | Type | Description | Example
62+
| ---- | ----- | ---- | ----------- | -------
63+
| `accountId` | required | String | The account ID from Mgid | "123"
64+
| `placementId` | required | String | The placement ID from Mgid | "123456"
65+
66+
67+
# Ad Unit and page Setup:
68+
69+
```html
70+
<!-- Prebid Config section -->
71+
<script>
72+
var PREBID_TIMEOUT = 2000;
73+
var adUnits = [{
74+
code: 'placement_div_id',
75+
sizes: [[300, 250]],
76+
bids: [{
77+
bidder: 'mgid'
78+
accountId : "PUT_YOUR_mgid_accountId",
79+
placementId : "PUT_YOUR_mgid_placementId",
80+
}]
81+
}];
82+
var pbjs = pbjs || {};
83+
pbjs.que = pbjs.que || [];
84+
</script>
85+
<!-- End Prebid Config section -->
86+
```

0 commit comments

Comments
 (0)