> For the complete documentation index, see [llms.txt](https://docs.exoclick.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.exoclick.com/publishers/ru/adblock/adblock-dynamic-domains-api.md).

# Как работать с API динамических доменов AdBlock

Инструменты AdBlock становятся всё более сложными, создавая серьёзные проблемы для издателей, стремящихся максимизировать доход от онлайн-рекламы. Чтобы помочь смягчить эти проблемы, этот API позволяет издателям динамически настраивать свои скрипты в зависимости от активных доменов, значительно снижая риск того, что контент будет заблокирован программами AdBlock.

Обеспечивая показ рекламы через регулярно ротируемые домены, издатели могут:

* **Сохранять источники дохода:** Предотвращать перебои, вызванные заблокированной рекламой.
* **Улучшать пользовательский опыт:** Доставлять рекламный контент без перебоев, не вызывая обнаружение AdBlock.
* **Автоматизировать управление доменами:** Избавиться от ручных обновлений благодаря автоматизированному 7-дневному жизненному циклу домена.

Новые домены генерируются каждые 3 дня и доступны через API. Срок жизни доменов составит 6 дней.

* 3 дня активно
* 3 дня устаревший

После истечения срока жизни домен будет деактивирован. Из соображений производительности рекомендуется кэшировать домен в течение 24 часов перед запросом нового домена из API.

Этот API доступен только для **Встроенный скрипт Popunders** и **In-Stream видео** зон.

## Требования

Чтобы использовать этот API, издателям необходимо:

* Выполнить **GET-запрос** к конечной точке: <https://ads.exoclick.com/adblock-domains.php>
* В ответе вы получите новый домен для показа рекламы
* Затем вы должны изменить конечную точку syndication, используемую в теге вашей рекламной зоны, на новую, указанную в ответе API.

## Шаги по внедрению

{% stepper %}
{% step %}

### Получить активный домен

Чтобы динамически получить активный домен, **вам нужно выполнить вызов API server-to-server**. Это важно, потому что вызовы API могут быть заблокированы, если они выполняются на стороне клиента.

Вот пример вызова server-to-server на PHP:

```php
<?php
function fetchAdblockDomain()
{
    $endpoint = 'https://ads.exoclick.com/adblock-domains.php';
    $ch = curl_init($endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        throw new Exception('Ошибка cURL: ' . curl_error($ch));
    }

    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode === 200) {
        return $response;
    } else {
        throw new Exception("HTTP Error: ({$httpCode}) Response: {$response}");
    }
}

try {
    echo fetchAdblockDomain();
} catch (Exception $e) {
    echo json_encode([
        'success' => false,
        'message' => $e->getMessage()
    ]);
}
?>
```

А вот ожидаемый ответ от API:

```json
{
    "success": true,
    "message": "Домен найден",
    "domain": "newsub.newdomain.com" 
}
```

{% endstep %}

{% step %}

### Обновите ваш скрипт

Используйте **домен** полученный от конечной точки для обновления домена, используемого в вашей рекламной зоне. Исходный домен зависит от рекламного формата:

* Для **In-Stream видео** зон измените *VAST Tag*:
  * **До** : `https://s.magsrv.com/v1/vast.php?t={random}&idzone={zoneId}`
  * **После** : `https://newsub.newdomain.com/v1/vast.php?t={random}&idzone={zoneId}`
* Для зон Popunder измените *syndication\_host* в встроенном скрипте:
  * **До** : `s.pemsrv.com`
  * **После** : `newsub.newdomain.com`
    {% endstep %}
    {% endstepper %}

## Обнаружение AdBlock

Чтобы определить, включено ли у пользователя расширение adblock, вам **необходимо разместить `ads.js` на стороне издателя** (ваш собственный домен/CDN) и включить его в самом начале вашего `тега body` тега.

Не **нужно** запрашивать `https://www.exoclick.com/ads.js` напрямую.

Создайте свой собственный `ads.js` файл:

1. Создайте файл с именем `ads.js` в общедоступном пути на вашем сайте (например `/js/ads.js`).
2. Добавьте в этот файл следующий код.
3. Загружайте этот файл со своей страницы до логики интеграции рекламы.

Содержимое файла-примера:

```javascript
let bait_b3j4hu231 = true;
```

Затем добавьте следующую строку в самом начале вашего `тега body` тега:

```html
<script src="/js/ads.js" type="text/javascript"></script>
```

Этот скрипт будет заблокирован AdBlock, если клиент использует его, из-за наличия ключевых слов "exoclick" и "ads". После загрузки этого скрипта фрагмент JS попытается прочитать определённую переменную. Если переменная не определена или недоступна, мы можем определить, что скрипт был заблокирован.

```html
<script src="/js/ads.js" type="text/javascript"></script>

<script>
    // Инициализируйте переменную insDomain значением по умолчанию
    let insDomain = 's.magsrv.com'; // Универсальный хост для сети
    let adb = ""; // Эта переменная может содержать "&block=1", что помогает отслеживать статистику AdBlock

    // Получение доменов AdBlock с помощью GET-запроса к PHP-файлу
    async function fetchAdblockDomains() {
        try {
            // Выполнить GET-запрос к fetchAdblockDomain.php (Шаг 3.A).
            // Это server-to-server запрос для получения домена AdBlock.
            const response = await fetch('fetchAdblockDomain.php', {
                method: 'GET', // Укажите метод GET
            });

            // Проверьте, успешен ли ответ (статус 200)
            if (!response.ok) {
                throw new Error(`HTTP error! Status: ${response.status}`);
            }

            // Разобрать ответ как JSON
            const data = await response.json();
            console.log('Данные ответа:', data); // Вывести данные ответа для отладки

            // Вызвать функцию для обработки доменов
            displayDomains(data);
        } catch (error) {
            // Записать в лог любые ошибки, возникающие во время запроса
            console.error('Ошибка при получении доменов:', error);
        }
    }
    // Обработать и отобразить домены, обновляя insDomain, если success равно true
    function displayDomains(domains) {
        console.log('Статус успеха:', domains["success"]); // Записать в лог статус успеха
        console.log('Полученный домен:', domains["domain"]); // Записать в лог полученный домен


        // Обновить переменную insDomain, если флаг success равен true
        if (domains["success"] && typeof bait_b3j4hu231 === 'undefined') {
            adb = '&block=1';
            insDomain = domains["domain"];
            console.log('Обновлённый insDomain:', insDomain); // Записать в лог обновлённое значение insDomain
        }

        // Теперь вам следует инициализировать Fluid Player, используя vast-тег:
        // const rdm = 't=' + Math.floor(Math.random() * 1000) + '&';
        // "https://" + insDomain + "/v1/vast.php?" + rdm + "idzone=ZONEID" + adb
    }

    // Автоматически вызывать fetchAdblockDomains при загрузке страницы
    window.onload = fetchAdblockDomains;
</script>
```

## Примеры интеграции

В этих двух примерах мы используем `fetchAdblockDomain.php` в качестве имени server-to-server вызова для получения домена AdBlock.

### In-Stream

Чтобы использовать динамические домены с In-Stream, обязательно **включите VAST-плеер внутрь скрипта**, иначе плеер загрузит рекламную зону In-Stream по умолчанию вместо использования обновлённого домена. В этом примере мы используем HTML5-плеер Fluidplayer.

```html
<script src="/js/ads.js" type="text/javascript"></script>

    <script>
        let insDomain = 's.magsrv.com'; // default
        let adb = '';
        const ZONE_ID_PRE_ROLL = 'XXXXXXX';

        async function fetchAndApplyAdblockDomains() {
            try {
                const response = await fetch('fetchAdblockDomain.php');
                const data = await response.json();

                console.log('Ответ:', data);

                if (data.success && typeof bait_b3j4hu231 === 'undefined') {
                    // Обнаружен AdBlock
                    adb = '&block=1';
                    insDomain = data.domain;
                    console.log('Обнаружен AdBlock: используется домен из API', insDomain);
                } else if (data.success) {
                    // AdBlock не обнаружен
                    console.log('AdBlock не обнаружен: используется домен по умолчанию');
                } else {
                    console.warn('Резервный вариант: используется домен по умолчанию из-за ошибки или отсутствия успеха');
                }
            } catch (err) {
                console.error('Ошибка при получении домена:', err);
            }

            const rdm = 't=' + Math.floor(Math.random() * 1000) + '&';

            // Инициализировать FluidPlayer
            fluidPlayer('example-player', {
                layoutControls: {
                    primaryColor: "#28B8ED",
                    controlForwardBackward: {
                        show: true,
                        doubleTapMobile: false
                    },
                    timelinePreview: {
                        file: 'thumbnails.vtt',
                        type: 'VTT'
                    }
                },
                vastOptions: {
                    adList: [
                        {
                            roll: "preRoll",
                            vastTag: `https://${insDomain}/v1/vast.php?${rdm}idzone=${ZONE_ID_PRE_ROLL}${adb}`
                        }
                    ]
                }
            });
        }

        window.onload = fetchAndApplyAdblockDomains;

    </script>
```

### Popunder

```html
<script src="/js/ads.js" type="text/javascript"></script>
<!-- Ссылка, которая вызывает popunder-->
<a href="#">Нажмите здесь</a> 
<script type="application/javascript">

    (async function () {
    let syndicationHost = 's.pemsrv.com';     
    try {
        const response = await fetch('fetchAdblockDomain.php', {
        method: 'GET', 
        })
        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
            }
        const data = await response.json();
        console.log('Данные ответа:', data);
        
        if (data.success && typeof bait_b3j4hu231 === 'undefined') {
            syndicationHost = data.domain;
        }
        else {
            console.log('AdBlock не обнаружен: используется домен по умолчанию.');
        }
    } catch (err) {
        console.error('Возврат к домену по умолчанию из-за ошибки:', err);
    }

    // Зона рекламы popunder
    function randStr(e,t){for(var n="",r=t||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",o=0;o<e;o++)n+=r.charAt(Math.floor(Math.random()*r.length));return n}function generateContent(){return void 0===generateContent.val&&(generateContent.val="document.dispatchEvent("+randStr(4*Math.random()+3)+");"),generateContent.val}try{Object.defineProperty(document.currentScript,"innerHTML",{get:generateContent}),Object.defineProperty(document.currentScript,"textContent",{get:generateContent})}catch(e){};

    var adConfig = {
    "ads_host": "a.pemsrv.com",
    "syndication_host": syndicationHost,
    "idzone": 123456789,
    "popup_fallback": false,
    "popup_force": false,
    "chrome_enabled": true,
    "new_tab": false,
    "frequency_period": 5,
    "frequency_count": 1,
    "trigger_method": 3,
    "trigger_delay": 0,
    "capping_enabled": true,
    "tcf_enabled": true,
    "only_inline": false
};

window.document.querySelectorAll||(document.querySelectorAll=document.body.querySelectorAll=Object.querySelectorAll=function(e,o,t,i,n){var r=document,a=r.createStyleSheet();for(n=r.all,o=[],t=(e=e.replace(/\[for\b/gi,"[htmlFor").split(",")).length;t--;){for(a.addRule(e[t],"k:v"),i=n.length;i--;)n[i].currentStyle.k&&o.push(n[i]);a.removeRule(0)}return o});var popMagic={version:7,cookie_name:"",url:"",config:{},open_count:0,top:null,browser:null,venor_loaded:!1,venor:!1,tcfData:null,configTpl:{ads_host:"",syndication_host:"",idzone:"",frequency_period:720,frequency_count:1,trigger_method:1,trigger_class:"",popup_force:!1,popup_fallback:!1,chrome_enabled:!0,new_tab:!1,cat:"",tags:"",el:"",sub:"",sub2:"",sub3:"",only_inline:!1,trigger_delay:0,capping_enabled:!0,tcf_enabled:!1,cookieconsent:!0,should_fire:function(){return!0},on_redirect:null},init:function(e){if(void 0!==e.idzone&&e.idzone){void 0===e.customTargeting&&(e.customTargeting=[]),window.customTargeting=e.customTargeting||null;var o=Object.keys(e.customTargeting).filter(function(e){return e.search("ex_")>=0});for(var t in o.length&&o.forEach(function(e){return this.configTpl[e]=null}.bind(this)),this.configTpl)Object.prototype.hasOwnProperty.call(this.configTpl,t)&&(void 0!==e[t]?this.config[t]=e[t]:this.config[t]=this.configTpl[t]);if(void 0!==this.config.idzone&&""!==this.config.idzone){!0!==this.config.only_inline&&this.loadHosted();var i=this;this.checkTCFConsent(function(){"complete"===document.readyState?i.preparePopWait():i.addEventToElement(window,"load",i.preparePop)})}}},getCountFromCookie:function(){if(!this.config.cookieconsent)return 0;var e=popMagic.getCookie(popMagic.cookie_name),o=void 0===e?0:parseInt(e);return isNaN(o)&&(o=0),o},getLastOpenedTimeFromCookie:function(){var e=popMagic.getCookie(popMagic.cookie_name),o=null;if(void 0!==e){var t=e.split(";")[1];o=t>0?parseInt(t):0}return isNaN(o)&&(o=null),o},shouldShow:function(e){if(e=e||!1,!popMagic.config.capping_enabled){var o=!0,t=popMagic.config.should_fire;try{e||"function"!=typeof t||(o=Boolean(t()))}catch(e){console.error("Ошибка при выполнении callback-функции should fire:",e)}return o&&0===popMagic.open_count}if(popMagic.open_count>=popMagic.config.frequency_count)return!1;var i=popMagic.getCountFromCookie(),n=popMagic.getLastOpenedTimeFromCookie(),r=Math.floor(Date.now()/1e3),a=n+popMagic.config.trigger_delay;return!(n&&a>r)&&(popMagic.open_count=i,!(i>=popMagic.config.frequency_count))},venorShouldShow:function(){return popMagic.venor_loaded&&"0"===popMagic.venor},setAsOpened:function(e){var o=e?e.target||e.srcElement:null,t={id:"",tagName:"",classes:"",text:"",href:"",elm:""};void 0!==o&&null!=o&&(t={id:void 0!==o.id&&null!=o.id?o.id:"",tagName:void 0!==o.tagName&&null!=o.tagName?o.tagName:"",classes:void 0!==o.classList&&null!=o.classList?o.classList:"",text:void 0!==o.outerText&&null!=o.outerText?o.outerText:"",href:void 0!==o.href&&null!=o.href?o.href:"",elm:o});var i=new CustomEvent("creativeDisplayed-"+popMagic.config.idzone,{detail:t});if(document.dispatchEvent(i),popMagic.config.capping_enabled){var n=1;n=0!==popMagic.open_count?popMagic.open_count+1:popMagic.getCountFromCookie()+1;var r=Math.floor(Date.now()/1e3);popMagic.config.cookieconsent&&popMagic.setCookie(popMagic.cookie_name,n+";"+r,popMagic.config.frequency_period)}else++popMagic.open_count},loadHosted:function(){var e=document.createElement("script");for(var o in e.type="application/javascript",e.async=!0,e.src="//"+this.config.ads_host+"/popunder1000.js",e.id="popmagicldr",this.config)Object.prototype.hasOwnProperty.call(this.config,o)&&"ads_host"!==o&&"syndication_host"!==o&&e.setAttribute("data-exo-"+o,this.config[o]);var t=document.getElementsByTagName("body").item(0);t.firstChild?t.insertBefore(e,t.firstChild):t.appendChild(e)},preparePopWait:function(){setTimeout(popMagic.preparePop,400)},preparePop:function(){if("object"!=typeof exoJsPop101||!Object.prototype.hasOwnProperty.call(exoJsPop101,"add")){if(popMagic.top=self,popMagic.top!==self)try{top.document.location.toString()&&(popMagic.top=top)}catch(e){}if(popMagic.cookie_name="zone-cap-"+popMagic.config.idzone,popMagic.config.capping_enabled||(document.cookie=popMagic.cookie_name+"=;expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"),popMagic.shouldShow(!0)){var e=new XMLHttpRequest;e.onreadystatechange=function(){e.readyState==XMLHttpRequest.DONE&&(popMagic.venor_loaded=!0,200==e.status?popMagic.venor=e.responseText:popMagic.venor="0")};var o="https:"!==document.location.protocol&&"http:"!==document.location.protocol?"https:":document.location.protocol;e.open("GET",o+"//"+popMagic.config.syndication_host+"/venor.php",!0);try{e.send()}catch(e){popMagic.venor_loaded=!0}}if(popMagic.buildUrl(),popMagic.browser=popMagic.browserDetector.getBrowserInfo(),popMagic.config.chrome_enabled||!popMagic.browser.isChrome){var t=popMagic.getPopMethod(popMagic.browser);popMagic.addEvent("click",t)}}},getPopMethod:function(e){return popMagic.config.popup_force||popMagic.config.popup_fallback&&e.isChrome&&e.version>=68&&!e.isMobile?popMagic.methods.popup:e.isMobile?popMagic.methods.default:e.isChrome?popMagic.methods.chromeTab:popMagic.methods.default},checkTCFConsent:function(e){if(this.config.tcf_enabled&&"function"==typeof window.__tcfapi){var o=this;window.__tcfapi("addEventListener",2,function(t,i){i&&(o.tcfData=t,"tcloaded"!==t.eventStatus&&"useractioncomplete"!==t.eventStatus||(window.__tcfapi("removeEventListener",2,function(){},t.listenerId),e()))})}else e()},buildUrl:function(){var e,o="https:"!==document.location.protocol&&"http:"!==document.location.protocol?"https:":document.location.protocol,t=top===self?document.URL:document.referrer,i={type:"inline",name:"popMagic",ver:this.version},n="";customTargeting&&Object.keys(customTargeting).length&&("object"==typeof customTargeting?Object.keys(customTargeting):customTargeting).forEach(function(o){"object"==typeof customTargeting?e=customTargeting[o]:Array.isArray(customTargeting)&&(e=scriptEl.getAttribute(o));var t=o.replace("data-exo-","");n+="&"+t+"="+e});var r=this.tcfData&&this.tcfData.gdprApplies&&!0===this.tcfData.gdprApplies?1:0;this.url=o+"//"+this.config.syndication_host+"/v1/link.php?cat="+this.config.cat+"&idzone="+this.config.idzone+"&type=8&p="+encodeURIComponent(t)+"&sub="+this.config.sub+(""!==this.config.sub2?"&sub2="+this.config.sub2:"")+(""!==this.config.sub3?"&sub3="+this.config.sub3:"")+"&block=1&el="+this.config.el+"&tags="+this.config.tags+"&scr_info="+function(e){var o=e.type+"|"+e.name+"|"+e.ver;return encodeURIComponent(btoa(o))}(i)+n+"&gdpr="+r+"&cb="+Math.floor(1e9*Math.random()),this.tcfData&&this.tcfData.tcString?this.url+="&gdpr_consent="+encodeURIComponent(this.tcfData.tcString):this.url+="&cookieconsent="+this.config.cookieconsent},addEventToElement:function(e,o,t){e.addEventListener?e.addEventListener(o,t,!1):e.attachEvent?(e["e"+o+t]=t,e[o+t]=function(){e["e"+o+t](window.event)},e.attachEvent("on"+o,e[o+t])):e["on"+o]=e["e"+o+t]},getTriggerClasses:function(){var e,o=[];-1===popMagic.config.trigger_class.indexOf(",")?e=popMagic.config.trigger_class.split(" "):e=popMagic.config.trigger_class.replace(/\s/g,"").split(",");for(var t=0;t<e.length;t++)""!==e[t]&&o.push("."+e[t]);return o},addEvent:function(e,o){var t;if("3"!=popMagic.config.trigger_method)if("2"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)if("4"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)if("5"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)popMagic.addEventToElement(document,e,o);else{var i="a"+popMagic.getTriggerClasses().map(function(e){return":not("+e+")"}).join("");t=document.querySelectorAll(i);for(var n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)}else{var r=popMagic.getTriggerClasses();popMagic.addEventToElement(document,e,function(e){r.some(function(o){return null!==e.target.closest(o)})||o.call(e.target,e)})}else{var a=popMagic.getTriggerClasses();for(t=document.querySelectorAll(a.join(", ")),n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)}else for(t=document.querySelectorAll("a"),n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)},setCookie:function(e,o,t){if(!this.config.cookieconsent)return!1;t=parseInt(t,10);var i=new Date;i.setMinutes(i.getMinutes()+parseInt(t));var n=encodeURIComponent(o)+"; expires="+i.toUTCString()+"; path=/";document.cookie=e+"="+n},getCookie:function(e){if(!this.config.cookieconsent)return!1;var o,t,i,n=document.cookie.split(";");for(o=0;o<n.length;o++)if(t=n[o].substr(0,n[o].indexOf("=")),i=n[o].substr(n[o].indexOf("=")+1),(t=t.replace(/^\s+|\s+$/g,"").)==e)return decodeURIComponent(i)},randStr:function(e,o){for(var t="",i=o||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=0;n<e;n++)t+=i.charAt(Math.floor(Math.random()*i.length));return t},isValidUserEvent:function(e){return!(!("isTrusted"in e)||!e.isTrusted||"ie"===popMagic.browser.name||"safari"===popMagic.browser.name)||0!=e.screenX&&0!=e.screenY},isValidHref:function(e){if(void 0===e||""==e)return!1;return!/\s?javascript\s?:/i.test(e)},findLinkToOpen:function(e){var o=e,t=!1;try{for(var i=0;i<20&&!o.getAttribute("href")&&o!==document&&"html"!==o.nodeName.toLowerCase();)o=o.parentNode,i++;var n=o.getAttribute("target");n&&-1!==n.indexOf("_blank")||(t=o.getAttribute("href"))}catch(e){}return popMagic.isValidHref(t)||(t=!1),t||window.location.href},getPuId:function(){return"ok_"+Math.floor(89999999*Math.random()+1e7)},executeOnRedirect:function(){try{popMagic.config.capping_enabled||"function"!=typeof popMagic.config.on_redirect||popMagic.config.on_redirect()}catch(e){console.error("Ошибка при выполнении callback при перенаправлении:",e)}},browserDetector:{browserDefinitions:[["firefox",/Firefox\/([0-9.]+)(?:\s|$)/],["opera",/Opera\/([0-9.]+)(?:\s|$)/],["opera",/OPR\/([0-9.]+)(:?\s|$)$/],["edge",/Edg(?:e|)\/([0-9._]+)/],["ie",/Trident\/7\.0.*rv:([0-9.]+)\).*Gecko$/],["ie",/MSIE\s([0-9.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["safari",/Version\/([0-9._]+).*Safari/],["chrome",/(?!Chrom.*Edg(?:e|))Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],["bb10",/BB10;\sTouch.*Version\/([0-9.]+)/],["android",/Android\s([0-9.]+)/],["ios",/Version\/([0-9._]+).*Mobile.*Safari.*/],["yandexbrowser",/YaBrowser\/([0-9._]+)/],["crios",/CriOS\/([0-9.]+)(:?\s|$)/]],isChromeOrChromium:function(){var e=window.navigator,o=(e.userAgent||"").toLowerCase(),t=e.vendor||"";if(-1!==o.indexOf("crios"))return!0;if(e.userAgentData&&Array.isArray(e.userAgentData.brands)&&e.userAgentData.brands.length>0){var i=e.userAgentData.brands,n=i.some(function(e){return"Google Chrome"===e.brand}),r=i.some(function(e){return"Chromium"===e.brand})&&2===i.length;return n||r}var a=!!window.chrome,c=-1!==o.indexOf("edg"),p=!!window.opr||-1!==o.indexOf("opr"),s=!(!e.brave||!e.brave.isBrave),g=-1!==o.indexOf("vivaldi"),l=-1!==o.indexOf("yabrowser"),d=-1!==o.indexOf("samsungbrowser"),u=-1!==o.indexOf("ucbrowser");return a&&"Google Inc."===t&&!c&&!p&&!s&&!g&&!l&&!d&&!u},getBrowserInfo:function(){var e=window.navigator.userAgent,o={name:"other",version:"1.0",versionNumber:1,isChrome:this.isChromeOrChromium(),isMobile:!!e.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WebOS|Windows Phone/i)};for(var t in this.browserDefinitions){var i=this.browserDefinitions[t];if(i[1].test(e)){var n=i[1].exec(e),r=n&&n[1].split(/[._]/).slice(0,3),a=Array.prototype.slice.call(r,1).join("")||"0";r&&r.length<3&&Array.prototype.push.apply(r,1===r.length?[0,0]:[0]),o.name=i[0],o.version=r.join("."),o.versionNumber=parseFloat(r[0]+"."+a);break}}return o}},methods:{default:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;var o=e.target||e.srcElement,t=popMagic.findLinkToOpen(o);return window.open(t,"_blank"),popMagic.setAsOpened(e),popMagic.executeOnRedirect(),popMagic.top.document.location=popMagic.url,void 0!==e.preventDefault&&(e.preventDefault(),e.stopPropagation()),!0},chromeTab:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;if(void 0===e.preventDefault)return!0;e.preventDefault(),e.stopPropagation();var o=top.window.document.createElement("a"),t=e.target||e.srcElement;o.href=popMagic.findLinkToOpen(t),document.getElementsByTagName("body")[0].appendChild(o);var i=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!0,altKey:!1,shiftKey:!1,metaKey:!0,button:0});i.preventDefault=void 0,o.dispatchEvent(i),o.parentNode.removeChild(o),popMagic.executeOnRedirect(),window.open(popMagic.url,"_self"),popMagic.setAsOpened(e)},popup:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;var o="";if(popMagic.config.popup_fallback&&!popMagic.config.popup_force){var t=Math.max(Math.round(.8*window.innerHeight),300);o="menubar=1,resizable=1,width="+Math.max(Math.round(.7*window.innerWidth),300)+",height="+t+",top="+(window.screenY+100)+",left="+(window.screenX+100)}var i=document.location.href,n=window.open(i,popMagic.getPuId(),o);popMagic.setAsOpened(e),setTimeout(function(){n.location.href=popMagic.url,popMagic.executeOnRedirect()},200),void 0!==e.preventDefault&&(e.preventDefault(),e.stopPropagation())}}};    popMagic.init(adConfig);
})();
```

## Устранение неполадок

### Домен не возвращён

Иногда конечная точка может возвращать пустые домены.

```json
{
    "success": false,
    "message": "Домен не найден"
}
```

Всегда записывайте ответ конечной точки в лог во время отладки, чтобы выявить возможные проблемы. Если success равен `false`, обратитесь в службу поддержки.

### Возвращается домен по умолчанию, несмотря на включённый AdBlock

Вот некоторые распространённые причины, по которым ваш скрипт может использовать домен по умолчанию, несмотря на включённый AdBlock:

* **ads.js не размещён на стороне издателя**. Эта интеграция требует отдачи `ads.js` с вашего собственного домена (например `/js/ads.js`). Прямой запрос `https://www.exoclick.com/ads.js` не поддерживается.
* **домен по умолчанию отображается до домена AdBlock**. Убедитесь, что скрипт, вставляющий рекламную зону на вашем сайте **всегда дожидается server-to-server вызова**. В зависимости от цепочки выполнения домен по умолчанию может быть добавлен на сайт до того, как будет возвращён домен AdBlock, что помешает вашему сайту вставить обновлённый домен.

Для получения дополнительной помощи свяжитесь со службой поддержки [здесь](https://www.exoclick.com/contact/).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.exoclick.com/publishers/ru/adblock/adblock-dynamic-domains-api.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
