github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/dmm_eikaiwa/testdata/49393_files/universe_cookie_sync.html (about) 1 <!DOCTYPE html> 2 <!-- saved from url=(0058)https://cache.send.microad.jp/js/universe_cookie_sync.html --> 3 <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4 5 <script> 6 (function () { 7 const cookieSyncUrls = [ 8 // google 9 { 10 name: "ASR-g", 11 value: "1", 12 probability: 1.0, 13 cookieSyncUrl: "//aid.send.microad.jp/g/asr" 14 }, 15 // docomo 16 { 17 name: "ASR_12", 18 value: "1", 19 probability: 1.0, 20 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=4OWYbAiDvXE&format=pixel" 21 }, 22 // adgene 23 { 24 name: "ASR_19", 25 value: "1", 26 probability: 1.0, 27 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=Utqpjbqy87I&format=pixel" 28 }, 29 // fluct 30 { 31 name: "ASR_20", 32 value: "1", 33 probability: 1.0, 34 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=wjYYWZkhlE4&format=pixel" 35 }, 36 // openx 37 { 38 name: "ASR_25", 39 value: "1", 40 probability: 1.0, 41 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=ZCWe-iOHsC0&format=pixel" 42 }, 43 // spotx 44 { 45 name: "ASR_29", 46 value: "1", 47 probability: 1.0, 48 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=LkV6T8kjJNI&format=pixel" 49 }, 50 // verizon 51 { 52 name: "ASR_30", 53 value: "1", 54 probability: 1.0, 55 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=1lEd6kdM8PY&format=pixel" 56 }, 57 // MediaNetSSP 58 { 59 name: "ASR_33", 60 value: "1", 61 probability: 1.0, 62 cookieSyncUrl: "//aid.send.microad.jp/asr?v=1&code=jG40gaTLVE0&format=pixel" 63 } 64 ] 65 66 const completedProcessIds = [] 67 68 Array.prototype.shuffle = function() { 69 const a = this.slice(); 70 for (let i = a.length - 1; i > 0; i--) { 71 const j = Math.floor(Math.random() * (i + 1)); 72 [a[i], a[j]] = [a[j], a[i]]; 73 } 74 return a; 75 } 76 77 function getRandomCookieSyncUrl() { 78 return cookieSyncUrls 79 .filter(c => isNonDormantCookie(c)) 80 .filter(c => isSelectedByProbability(c.probability)) 81 .shuffle() 82 .slice(0, 3) 83 } 84 85 function isSelectedByProbability(probability) { 86 return Math.random() <= probability 87 } 88 89 function isNonDormantCookie(cookie) { 90 return getCookieFromBrowser(cookie.name) !== cookie.value 91 } 92 93 function getCookieFromBrowser(targetKey) { 94 const cookies = document.cookie.split(";") 95 for (let cookie of cookies) { 96 const trimCookieKeyValue = cookie.replace(/^\s+|\s+$/g, ""); 97 const [cookieKey, cookieValue] = trimCookieKeyValue.split("="); 98 if (cookieKey === targetKey) { 99 return cookieValue; 100 } 101 } 102 return ""; 103 } 104 105 function getMicroadCookie() { 106 return getCookieFromBrowser("TR"); 107 } 108 109 function appendCookieSyncTag(cookieSyncUrl) { 110 const img_elem = document.createElement("img"); 111 img_elem.src = cookieSyncUrl; 112 img_elem.width = 1; 113 img_elem.height = 1; 114 img_elem.frameborder = 0; 115 img_elem.setAttribute("style", "display: none;"); 116 const body = document.getElementsByTagName("body")[0]; 117 body.insertBefore(img_elem, null); 118 } 119 120 function isSynced(processId) { 121 return (processId in completedProcessIds) 122 } 123 124 function appendCbtParam(urlString, val) { 125 const url = new URL(urlString) 126 url.searchParams.append("cbt", val) 127 return url.toString() 128 } 129 130 function startSync(cbtVal) { 131 getRandomCookieSyncUrl() 132 .map(x => appendCbtParam(document.location.protocol + x.cookieSyncUrl, cbtVal)) 133 .forEach(u => appendCookieSyncTag(u)) 134 } 135 136 function completeProcess(processId) { 137 completedProcessIds[processId] = 1 138 } 139 140 window.addEventListener('message', (messageEvent) => { 141 const processId = messageEvent.data.processId 142 if (processId === undefined || processId.length === 0) return 143 144 // 処理済みチェック 145 if (isSynced(processId)) return 146 147 // aid があるか? 148 if (!getMicroadCookie()) return 149 150 // 二重処理しないように、先に completedProcessId に processId を入れる 151 completeProcess(processId) 152 153 startSync(processId) 154 }, false); 155 156 })(); 157 </script> 158 </head> 159 <body> 160 161 162 </body></html>