¿Cómo mostrar o bloquear anuncios personalizados de Adsense basados ​​en el consentimiento para IAB TCF v2.0 con Quantcast Choice?

Aug 16 2020

Elegí Quantcast Choice como la plataforma de gestión de consentimiento para mi sitio web. Sin embargo, con su solución básica, los anuncios de Google Adsense todavía se muestran a los visitantes antes de que den su consentimiento para el proveedor relacionado (Google). Desde hace 2 días, hay un aviso en Adsense que confirma este problema y, después de un período de gracia de 90 días, ya no se publicarán anuncios. El mensaje de error: " 2.1a: la etiqueta o el SDK no recibe una cadena TC debido a que el estado de CMP es stub, carga o error " .

No estoy familiarizado en absoluto con los scripts, pero parece que tengo que usar algunos para que Quantcast Choice realmente funcione. Básicamente necesito saber cómo:

  • no publicar anuncios de Google antes de que un visitante dé su consentimiento a Google
  • servir anuncios personalizados después del consentimiento
  • servir anuncios no personalizados sin consentimiento

Lo que he aprendido hasta ahora:

Antes del consentimiento de un visitante, puedo agregar este script a mi código de Google Adsense para no mostrar ningún anuncio:

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

No hay problema hasta ahora. Sin embargo, debería poder saber si un visitante ha dado su consentimiento para el proveedor Google. El ID de proveedor de Google en el TCF v2.0 es 755. Encontré la siguiente combinación de código y texto en una de las páginas de Quantcast, pero no sé cómo usarlo. ¿Debo poner esto en mis páginas web dentro del script de Quantcast Choice o ...? (fuente vinculada a continuación)

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

Entonces, si se encuentra el ID 755, debería llamar:

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

y si no se encuentra el ID 755, debería llamar:

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

Pero, ¿cómo hago estas "llamadas"?

Entonces creo que entiendo los pasos a seguir, es solo que no sé cómo implementar estos pasos y conectar los puntos. ¡Cualquier ayuda será muy apreciada!

Fuentes que he usado:

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

Ejemplo de un sitio web que parece hacer lo que quiero lograr: carscoops.com

Respuestas

3 quick Sep 18 2020 at 07:52

Recomendaría una solución mucho más sencilla. Con TCF 2.0 no tiene que configurar manualmente los parámetros de Adsense (anuncios personalizados, etc.) en función de un consentimiento dado. Solo tiene que garantizar que comienza a cargar anuncios después de que el consentimiento se cargue correctamente. La biblioteca de Adsense lee las cadenas de consentimiento automáticamente y muestra anuncios de acuerdo con un consentimiento dado.

Código de ejemplo para la integración Quantcast Choices con 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

Solo para ayudar a que todos comprendan, el error 2.1a Google IAB TCF v2 probablemente se deba a que las etiquetas de productos publicitarios de Google se agregan al sitio web antes de que se haya establecido / establecido el consentimiento del usuario. Este es un video corto que muestra el comportamiento esperado, los anuncios no se cargan hasta que el usuario ha dado su consentimiento. Si ve anuncios que se cargan en segundo plano antes de que un usuario haya seleccionado su consentimiento, entonces está recibiendo errores 2.1a porque está agregando etiquetas de Google sin esperar el consentimiento.

La solución a esto variará dependiendo de cómo agregue etiquetas de productos publicitarios de Google a su sitio, pero es de esperar que la siguiente información y el ejemplo de Adsense ayuden.

Administrador de etiquetas de Google

Si está utilizando Google Tag Manager para agregar Choice y etiquetas de Google a su sitio, puede usar la guía aquí https://help.quantcast.com/hc/en-us/articles/360051794434 y https://help.quantcast.com/hc/en-us/articles/360051794434-TCF-v2-GTM-Implementation-Guide-IAB-Vendor-Tag-Blocking como referencias.

Ejemplo específico de Adsense

Tomando el ejemplo de https://support.google.com/adsense/answer/9042142 Creo que así es como necesitaría reelaborar el ejemplo para esperar las señales de consentimiento adecuadas de Quantcast Choice TCF v2.0.

No he tenido la oportunidad de probar esto por completo, así que avíseme si tiene algún problema con el código y actualizaré el ejemplo.

VER A CONTINUACIÓN ESTE BLOQUE DE CÓDIGOS PARA VERIONES ACTUALIZADAS

<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>

Editar: Nueva versión actualizada agregada (18 de agosto)


Esta podría ser una versión mejor que la anterior. De nuevo, esto no se ha probado, así que pruébelo y envíe sus comentarios si tiene problemas. Las principales diferencias con esta versión actualizada son:
  1. Ya no estamos comprobando tcData.purpose.consents [3] y tcData.purpose.consents [4], sino que confiamos en Google para decidir entre mostrar anuncios personalizados o no.

  2. No agregamos https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.jsa la página hasta que tengamos el consentimiento, evitando que se agreguen cookies no deseadas hasta que estemos seguros de que tenemos el consentimiento para hacerlo. Esto también nos permitió eliminar (adsbygoogle = window.adsbygoogle || []). PauseAdRequests = 1; artículos también

  <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>