Как отображать или блокировать персонализированную рекламу AdSense на основе согласия IAB TCF v2.0 с Quantcast Choice?

Aug 16 2020

Я выбрал Quantcast Choice в качестве платформы управления согласием для своего веб-сайта. Однако с их базовым решением объявления Google AdSense по-прежнему обслуживаются посетителями, прежде чем они дадут свое согласие соответствующему поставщику (Google). Уже через 2 дня в AdSense появляется уведомление, подтверждающее эту проблему, и после 90-дневного льготного периода реклама больше не будет отображаться. Сообщение об ошибке: « 2.1a: тег или SDK не получает строку TC из-за того, что состояние CMP - заглушка, загрузка или ошибка ».

Я совсем не знаком со скриптами, но мне кажется, что мне нужно использовать некоторые из них, чтобы заставить Quantcast Choice действительно работать. В основном мне нужно знать, как:

  • не показывать рекламу Google до того, как посетитель даст согласие на использование Google
  • показывать персонализированную рекламу после согласия
  • показывать неперсонализированную рекламу без согласия

Что я узнал до сих пор:

Перед согласием посетителя я могу добавить этот скрипт в свой код Google AdSense, чтобы не показывать рекламу:

<script>(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=1;</script>

Пока проблем нет. Однако тогда я смогу узнать, дал ли посетитель согласие поставщику Google. Идентификатор поставщика Google в TCF v2.0 - 755. Я нашел следующую смесь кода и текста на одной из страниц Quantcast, но не знаю, как ее использовать. Должен ли я разместить это на своих веб-страницах в сценарии Quantcast Choice или ...? (источник указан ниже)

{{QC - __cmpConsents.iabVendorConsentIds}} matches the regular expression (^|,)755(,|$).

Поэтому, если ID 755 найден, я должен позвонить:

(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=0

и если ID 755 не найден, я должен позвонить:

(adsbygoogle=window.adsbygoogle||[]).requestNonPersonalizedAds=1
(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=0

Но как мне делать эти «звонки»?

Так что я думаю, что понимаю шаги, которым нужно следовать, просто я не знаю, как реализовать эти шаги и соединить точки. Любая помощь приветствуется!

Источники, которые я использовал:

  • https://support.google.com/adsense/answer/9042142
  • https://help.quantcast.com/hc/en-us/articles/360051794434

Пример веб-сайта, который, кажется, делает то, что я хочу достичь: carscoops.com

Ответы

3 quick Sep 18 2020 at 07:52

Я бы порекомендовал гораздо более простое решение. С TCF 2.0 вам не нужно вручную настраивать параметры AdSense (персонализированная реклама и т. Д.) На основе данного согласия. Вы просто должны гарантировать, что вы начнете загружать рекламу после успешной загрузки согласия. Библиотека AdSense автоматически считывает строки согласия и отображает рекламу в соответствии с данным согласием.

Пример кода для интеграции Quantcast Choices с AdSense:

<!-- Quantcast Choice. Consent Manager Tag v2.0 (for TCF 2.0) -->
...
<!-- End Quantcast Choice. Consent Manager Tag v2.0 (for TCF 2.0) -->

<script>
__tcfapi('addEventListener', 2, function(tcData, success) {
    if (success) {
        if (tcData.eventStatus == 'useractioncomplete' || tcData.eventStatus == 'tcloaded') {
            var hasStoreOnDeviceConsent = tcData.purpose.consents[1] || false;

            if (hasStoreOnDeviceConsent) {
                var adsbygoogle_script = document.createElement('script');
                adsbygoogle_script.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
                document.head.appendChild(adsbygoogle_script);
            }
        }
    }
});
</script>
2 RyanBaron Aug 17 2020 at 17:04

Чтобы помочь всем понять, ошибка 2.1a Google IAB TCF v2, скорее всего, вызвана добавлением тегов продукта Google Advertise на веб-сайт до того, как пользовательское согласие было установлено / установлено. Это короткое видео показывает ожидаемое поведение, реклама не загружается до тех пор, пока пользователь не даст согласия. Если вы видите, что реклама загружается в фоновом режиме до того, как пользователь выбрал свое согласие, вы получаете ошибку 2.1a, потому что вы добавляете теги Google, не дожидаясь согласия.

Решение этой проблемы будет зависеть от того, как вы добавляете теги рекламных продуктов Google на свой сайт, но, надеюсь, приведенная ниже информация и пример AdSense помогут.

Диспетчер тегов Google

Если вы используете Диспетчер тегов Google для добавления тегов Choice и Google на свой сайт, вы можете воспользоваться руководством здесь. https://help.quantcast.com/hc/en-us/articles/360051794434 и https://help.quantcast.com/hc/en-us/articles/360051794434-TCF-v2-GTM-Implementation-Guide-IAB-Vendor-Tag-Blocking как ссылки.

Конкретный пример AdSense

Взяв пример из https://support.google.com/adsense/answer/9042142 Я считаю, что именно так вам нужно будет переработать пример, чтобы дождаться правильных сигналов согласия от Quantcast Choice TCF v2.0.

У меня не было возможности полностью протестировать это, поэтому сообщите мне, если у вас возникнут проблемы с кодом, и я обновлю пример.

СМОТРИТЕ НИЖЕ ЭТОЙ БЛОК КОДОВ ДЛЯ ОБНОВЛЕНИЯ ВЕРСИИ

<html>
  <head>
    <title>Your site title</title>
  </head>
  <body>

    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
    <script>
      // Initially pause adsbygoogle (wait for consent to unpause)
      (adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=1;
    </script>

    <script>
      ( function() {
        // Run this in an interval (every 0.1s) just in case we are still waiting for consent
        var cnt = 0;
        var consentSetInterval = setInterval(function(){
          cnt += 1;

          // Bail if we have not gotten a consent response after 60 seconds.
          if( cnt === 600 )
            clearInterval(consentSetInterval);

          if( typeof window.__tcfapi !== 'undefined' ) { // Check if window.__tcfapi has been set
            clearInterval( consentSetInterval );

            window.__tcfapi( 'addEventListener', 2, function( tcData,listenerSuccess ) {
              if ( listenerSuccess ) {
                if( tcData.eventStatus === 'tcloaded' || tcData.eventStatus === 'useractioncomplete' ) {
                  if ( ! tcData.gdprApplies ) {

                    // GDPR DOES NOT APPLY, UnpauseAdRequests

                    // Set request non-personalized ads to false as GDPR does not apply.
                    (adsbygoogle=window.adsbygoogle||[]).requestNonPersonalizedAds=0;

                    // Unpause ads, as GDPR does not apply.
                    (adsbygoogle = window.adsbygoogle || []).pauseAdRequests=0;

                  }
                  else {

                    // GDPR DOES APPLY

                    // Purpose 1 refers to the storage and/or access of information on a device.
                    var hasDeviceStorageAndAccessConsent = tcData.purpose.consents[1] || false;

                    // Google Requires Consent for Purpose 1
                    if (hasDeviceStorageAndAccessConsent) {
                      // GLOBAL VENDOR LIST - https://iabeurope.eu/vendor-list-tcf-v2-0/
                      // CHECK FOR GOOGLE ADVERTISING PRODUCTS CONSENT. (IAB Vendor ID 755)
                      var hasGoogleAdvertisingProductsConsent = tcData.vendor.consents[755] || false;

                      // Check if the user gave Google Advertising Products consent (iab vendor 755)
                      if(hasGoogleAdvertisingProductsConsent) {
                        var hasPersonalizedProfileConsent = tcData.purpose.consents[3] || false;
                        var hasPersonalizedAdsConsent = tcData.purpose.consents[4] || false;

                        // Check if have add personalization consent Purpose 3 and 4
                        if( hasPersonalizedAdsConsent && hasPersonalizedProfileConsent ) {
                          // Set request non-personalized ads to false.
                          (adsbygoogle=window.adsbygoogle||[]).requestNonPersonalizedAds=0;
                        }
                        else {
                          // Set request non-personalized ads to true.
                          (adsbygoogle=window.adsbygoogle||[]).requestNonPersonalizedAds=1;
                        }

                        // Unpause ads , the user has granted consent for purpose 1 and given google consent.
                        (adsbygoogle = window.adsbygoogle || []).pauseAdRequests=0;
                      }
                    }
                  }
                }
              }
            } );
          }
          cnt++;
        }, 100);
      })();
    </script>

    <!-- One test unit for GDPR -->
    <ins class="adsbygoogle"
         style="display:inline-block;width:970px;height:250px"
         data-ad-client="ca-pubxxx"
         data-ad-slot="slot_id">
    </ins>

    <!-- Another test unit for GDPR -->
    <ins class="adsbygoogle"
         style="display:inline-block;width:250px;height:250px"
         data-ad-client="ca-pubxxx"
         data-ad-slot="slot_id">
    </ins>

    <script>
      // This will trigger the ad request if ads were unpaused in the CMP consent check above.
      (adsbygoogle = window.adsbygoogle || []).push({});
    </script>

  </body>
</html>

Изменить: добавлена ​​новая обновленная версия (18 августа)


Это может быть лучшая версия, чем приведенная выше. Это снова не проверено, поэтому, пожалуйста, проверьте и оставьте отзыв, если у вас возникнут проблемы. Основные отличия этой обновленной версии:
  1. Мы больше не проверяем tcData.purpose.consents [3] и tcData.purpose.consents [4], вместо этого мы полагаемся на Google, чтобы решить, показывать ли персонализированную рекламу или нет.

  2. Мы не добавляем https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.jsна страницу до тех пор, пока мы не получим согласие, предотвращая добавление любых нежелательных файлов cookie, пока мы не будем уверены, что у нас есть согласие на это. Это также позволило нам удалить (adsbygoogle = window.adsbygoogle || []). PauseAdRequests = 1; предметы также

  <html>
    <head>
      <title>Your site title</title>
    </head>
    <body>
      <script>
        ( function() {
          var insertAdsByGoogleJs = function() {
            var element = document.createElement('script');
            var firstScript = document.getElementsByTagName('script')[0];
            var url = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js";
            element.async = true;
            element.type = 'text/javascript';
            element.src = url;
            firstScript.parentNode.insertBefore(element, firstScript);
          };
          // Run this in an interval (every 0.1s) just in case we are still waiting for consent
          var cnt = 0;
          var consentSetInterval = setInterval(function(){
            cnt += 1;
            // Bail if we have not gotten a consent response after 60 seconds.
            if( cnt === 600 )
              clearInterval(consentSetInterval);
            if( typeof window.__tcfapi !== 'undefined' ) { // Check if window.__tcfapi has been set
              clearInterval( consentSetInterval );
              window.__tcfapi( 'addEventListener', 2, function( tcData,listenerSuccess ) {
                if ( listenerSuccess ) {
                  if( tcData.eventStatus === 'tcloaded' || tcData.eventStatus === 'useractioncomplete' ) {
                    if ( ! tcData.gdprApplies ) {
                      // GDPR DOES NOT APPLY
                      // Insert adsbygoogle.js onto the page.
                      insertAdsByGoogleJs();
                    }
                    else {
                      // GDPR DOES APPLY
                      // Purpose 1 refers to the storage and/or access of information on a device.
                      var hasDeviceStorageAndAccessConsent = tcData.purpose.consents[1] || false;
                      // Google Requires Consent for Purpose 1
                      if (hasDeviceStorageAndAccessConsent) {
                        // GLOBAL VENDOR LIST - https://iabeurope.eu/vendor-list-tcf-v2-0/
                        // CHECK FOR GOOGLE ADVERTISING PRODUCTS CONSENT. (IAB Vendor ID 755)
                        var hasGoogleAdvertisingProductsConsent = tcData.vendor.consents[755] || false;
                        // Check if the user gave Google Advertising Products consent (iab vendor 755)
                        if(hasGoogleAdvertisingProductsConsent) {
                          // Insert adsbygoogle.js onto the page.
                          insertAdsByGoogleJs();
                        }
                      }
                    }
                  }
                }
              } );
            }
            cnt++;
          }, 100);
        })();
      </script>
      <!-- One test unit for GDPR -->
      <ins class="adsbygoogle"
           style="display:inline-block;width:970px;height:250px"
           data-ad-client="ca-pubxxx"
           data-ad-slot="slot_id">
      </ins>
      <!-- Another test unit for GDPR -->
      <ins class="adsbygoogle"
           style="display:inline-block;width:250px;height:250px"
           data-ad-client="ca-pubxxx"
           data-ad-slot="slot_id">
      </ins>
      <script>
        // This will trigger the ad request if ads were unpaused in the CMP consent check above.
        (adsbygoogle = window.adsbygoogle || []).push({});
      </script>
    </body>
  </html>