Como exibir ou bloquear anúncios Adsense personalizados com base no consentimento para IAB TCF v2.0 com Quantcast Choice?
Escolhi o Quantcast Choice como plataforma de gerenciamento de consentimento para meu site. No entanto, com sua solução básica, os anúncios do Google Adsense ainda são veiculados aos visitantes antes que eles dêem o seu consentimento para o fornecedor relacionado (Google). Há 2 dias há um aviso no Adsense confirmando este problema e após um período de carência de 90 dias nenhum anúncio será veiculado mais. A mensagem de erro: " 2.1a: a tag ou SDK não está recebendo uma string TC devido ao status do CMP ser stub, carregamento ou erro. "
Não estou familiarizado com scripts, mas parece que tenho que usar alguns para fazer o Quantcast Choice realmente funcionar. Basicamente, preciso saber como:
- não veicular nenhum anúncio do Google antes do consentimento do visitante para o Google
- veicular anúncios personalizados após consentimento
- veicular anúncios não personalizados sem consentimento
O que aprendi até agora:
Antes do consentimento do visitante, posso adicionar este script ao meu código do Google Adsense para não exibir nenhum anúncio:
<script>(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=1;</script>
Nenhum problema até agora. No entanto, devo ser capaz de saber se um visitante deu consentimento para o fornecedor Google. O ID de fornecedor do Google no TCF v2.0 é 755. Encontrei a seguinte mistura de código e texto em uma das páginas Quantcast, mas não sei como usar isso. Devo colocar isso em minhas páginas da web dentro do script Quantcast Choice ou ...? (fonte com link abaixo)
{{QC - __cmpConsents.iabVendorConsentIds}} matches the regular expression (^|,)755(,|$).
Portanto, se o ID 755 for encontrado, devo ligar para:
(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=0
e se o ID 755 não for encontrado, devo ligar para:
(adsbygoogle=window.adsbygoogle||[]).requestNonPersonalizedAds=1
(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=0
Mas como faço essas "ligações"?
Acho que entendi as etapas a seguir, mas não sei como implementar essas etapas e conectar os pontos. Qualquer ajuda seria muito apreciada!
Fontes que usei:
- https://support.google.com/adsense/answer/9042142
- https://help.quantcast.com/hc/en-us/articles/360051794434
Exemplo de um site que parece fazer o que desejo: carscoops.com
Respostas
Eu recomendaria uma solução muito simples. Com o TCF 2.0, você não precisa configurar manualmente os parâmetros do Adsense (anúncios personalizados, etc.) com base em um determinado consentimento. Você só precisa garantir que começará a carregar anúncios após o consentimento ser carregado com sucesso. A biblioteca do Adsense lê as sequências de consentimento automaticamente e exibe anúncios de acordo com um determinado consentimento.
Exemplo de código para integração do Quantcast Choices com o 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>
Apenas para ajudar todos a entender, o erro 2.1a Google IAB TCF v2 é provavelmente causado por Google Advertise Product Tags sendo adicionadas ao site antes que um consentimento do usuário tenha sido definido / estabelecido. Este é um pequeno vídeo que mostra o comportamento esperado, os anúncios não carregam até que o usuário dê consentimento. Se você vir anúncios sendo carregados em segundo plano antes de um usuário selecionar seu consentimento, você está recebendo erros 2.1a porque está adicionando tags do Google sem esperar pelo consentimento.
A solução para isso irá variar dependendo de como você está adicionando tags de produto de publicidade do Google ao seu site, mas espero que as informações abaixo e o exemplo do Adsense ajudem.
Gerenciador de tags do Google
Se estiver usando o Gerenciador de tags do Google para adicionar tags Choice e Google ao seu site, você pode usar o guia aqui https://help.quantcast.com/hc/en-us/articles/360051794434 e https://help.quantcast.com/hc/en-us/articles/360051794434-TCF-v2-GTM-Implementation-Guide-IAB-Vendor-Tag-Blocking como referências.
Exemplo específico do Adsense
Pegando o exemplo de https://support.google.com/adsense/answer/9042142 Acredito que é assim que você precisaria refazer o exemplo para aguardar os sinais de consentimento adequados do Quantcast Choice TCF v2.0.
Não tive a chance de testar isso completamente, então, por favor, me avise se você tiver algum problema com o código e eu atualizarei o exemplo.
VEJA ABAIXO ESTE BLOCO DE CÓDIGO PARA VERIONS ATUALIZADAS
<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: nova versão atualizada adicionada (18 de agosto)
Esta pode ser uma versão melhor do que a anterior. Novamente, isso não foi testado, portanto, teste e forneça feedback se estiver tendo problemas. As principais diferenças com esta versão atualizada são:
Não estamos mais verificando tcData.purpose.consents [3] e tcData.purpose.consents [4], em vez disso, estamos contando com o Google para decidir entre exibir anúncios personalizados ou não.
Nós não adicionamos https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.jspara a página até que tenhamos consentimento, evitando que quaisquer cookies indesejados sejam adicionados até termos certeza de que temos consentimento para fazê-lo. Isso também nos permitiu remover o (adsbygoogle = window.adsbygoogle || []). PauseAdRequests = 1; itens também
<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>