> 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/ja/adblock/adblock-dynamic-domains-api.md).

# AdBlock Dynamic Domains APIの使い方

AdBlockツールはますます高度化しており、オンライン広告からの収益を最大化したいパブリッシャーにとって大きな課題となっています。これらの課題を軽減するために、このAPIでは、アクティブなドメインに基づいてスクリプトを動的に調整でき、AdBlockソフトウェアによってコンテンツがブロックされるリスクを大幅に低減します。

定期的にローテーションされるドメインを通じて広告配信を確実にすることで、パブリッシャーは次のことができます：

* **収益源を維持する：** ブロックされた広告による中断を防ぎます。
* **ユーザー体験を向上させる：** AdBlock検知を引き起こさずに、広告コンテンツをシームレスに配信します。
* **ドメイン管理を自動化する：** 自動化された7日間のドメインライフサイクルにより、手動更新を不要にします。

新しいドメインは3日ごとに生成され、APIで利用できます。ドメインのライフサイクルは6日間です。

* 3日間有効
* 3日間非推奨

ライフサイクルが終了すると、ドメインは無効化されます。パフォーマンス上の理由から、新しいドメインをAPIに要求する前に、24時間ドメインをキャッシュすることを推奨します。

このAPIは次の場合にのみ利用できます **Popunderのインラインスクリプト** と **インストリーム動画** ゾーン。

## 要件

このAPIを使用するには、パブリッシャーは次のことを行う必要があります：

* 次の **GETリクエスト** をエンドポイントに送信します: <https://ads.exoclick.com/adblock-domains.php>
* レスポンスで新しい広告配信ドメインを受け取ります
* その後、広告ゾーンタグで使用しているシンジケーションエンドポイントを、APIレスポンスで提供された新しいものに変更する必要があります。

## 実装手順

{% stepper %}
{% step %}

### 有効なドメインを取得する

有効なドメインを動的に取得するには、 **サーバー間でAPIコールを行う必要があります**。これは、クライアント側から呼び出すとAPIコールがブロックされる可能性があるため重要です。

以下は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エラー: ({$httpCode}) レスポンス: {$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 %}

### スクリプトを更新する

を使って **ドメイン** エンドポイントから返されたものを使用して、広告ゾーンで使用するドメインを更新します。元のドメインは広告フォーマットによって異なります：

* 次の **インストリーム動画** ゾーンでは次を変更します： *VASTタグ*:
  * **変更前** : `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の検出

ユーザーがアドブロック拡張機能を有効にしているかを検出するには、 **ホストする必要があります `ads.js` をパブリッシャー側で** （あなた自身のドメイン/CDN）でホストし、あなたの `body` タグの最初に含めてください。

絶対に **して** リクエスト `https://www.exoclick.com/ads.js` しないでください。

独自の `ads.js` ファイルを作成します：

1. 次の名前のファイルを作成し、 `ads.js` あなたのWebサイト上の公開パスに配置します（例： `/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 = ""; // この変数には、AdBlock統計の追跡に役立つ「&block=1」が含まれる場合があります

    // PHPファイルを使ってGETリクエストでアドブロックドメインを取得
    async function fetchAdblockDomains() {
        try {
            // fetchAdblockDomain.php にGETリクエストを実行（ステップ3.A）。
            // これは、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);
        }
    }
    // success が true の場合、ドメインを処理して表示し、insDomain を更新
    function displayDomains(domains) {
        console.log('成功ステータス:', domains["success"]); // 成功ステータスをログ出力
        console.log('取得したドメイン:', domains["domain"]); // 取得したドメインをログ出力


        // success フラグが true の場合に insDomain 変数を更新
        if (domains["success"] && typeof bait_b3j4hu231 === 'undefined') {
            adb = '&block=1';
            insDomain = domains["domain"];
            console.log('更新された insDomain:', insDomain); // insDomain の更新後の値をログ出力
        }

        // ここで vast タグを使用して Fluid Player を初期化します：
        // const rdm = 't=' + Math.floor(Math.random() * 1000) + '&';
        // "https://" + insDomain + "/v1/vast.php?" + rdm + "idzone=ZONEID" + adb
    }

    // ページ読み込み時に fetchAdblockDomains を自動的に呼び出す
    window.onload = fetchAdblockDomains;
</script>
```

## 統合例

これら2つの例では `fetchAdblockDomain.php` を、アドブロックドメインを取得するサーバー間コールの名前として使用しています。

### インストリーム

In-StreamでDynamic Domainsを使用するには、必ず **VASTプレーヤーをスクリプト内に含めてください**、そうしないと、プレーヤーは更新されたドメインを使用せず、デフォルトのインストリーム広告ゾーンを読み込みます。この例では、Fluidplayer HTML5プレーヤーを使用しています。

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

    <script>
        let insDomain = 's.magsrv.com'; // デフォルト
        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('Response:', data);

                if (data.success && typeof bait_b3j4hu231 === 'undefined') {
                    // AdBlockを検出
                    adb = '&block=1';
                    insDomain = data.domain;
                    console.log('AdBlock detected: using API domain', insDomain);
                } else if (data.success) {
                    // AdBlockなし
                    console.log('No AdBlock: using default domain');
                } else {
                    console.warn('Fallback: Using default domain due to error or no success');
                }
            } catch (err) {
                console.error('Error fetching domain:', 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>
```

### ポップアンダー

```html
<script src="/js/ads.js" type="text/javascript"></script>
<!-- ポップアンダーを起動するリンク-->
<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('Response data:', 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("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:popMagic.browser.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,"").trim())===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("リダイレクト時コールバックの実行中にエラーが発生しました:",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` サポートされていません。
* **アドブロックドメインより前にデフォルトドメインが描画されている**。サイト上で広告ゾーンを挿入するスクリプトが **必ずサーバー間コールを待つようにしてください**。実行チェーンによっては、アドブロックドメインが返される前にデフォルトドメインがサイトに追加されることがあり、その場合、Webサイトが更新されたドメインを挿入できなくなります。

さらにサポートが必要な場合は、サポートチームにお問い合わせください [こちら](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/ja/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.
