サポートされているベンダーの統合
この記事では、Tealium iQ Consent IntegrationsでサポートされているCMPについて説明し、Consent Integrationsの構成を完了するために必要なベンダー固有の情報を簡単に収集する方法について説明します。
仕組み
Tealium iQ Consent Integrationsは、さまざまな同意管理プラットフォーム(CMP)との統合をサポートしています。サポートされている同意管理プラットフォーム(CMP)またはウェブページのユーザーインターフェースから関連するベンダー固有の情報にアクセスできます。このドキュメンテーションを信頼性が高く、ユーザーフレンドリーに保つため、このセクションでは、ウェブページからベンダー固有の情報を取得する手順のみをカバーしています。各パートナーCMPのユーザーインターフェースでベンダーIDと目的を取得する手順については、各CMPのドキュメンテーションを参照してください。
ウェブページから関連する情報を取得するには、次の手順に従ってください:
- CMPが実装されているウェブサイトを訪れます。
- すべてのトラッキングを承認します。
- 開発者ツールのJavaScriptコンソールを開きます。
- 下記のコードスニペットからCMP固有のコードをコンソールに貼り付けます。
- 表示されたベンダーID、目的キー、目的名をConsent Integrationに入力します。
同意決定を更新した後、最新の解釈を見るためにコードを再貼り付けてください。
統合固有の指示とコードスニペット
Cookiebot
このスニペットをcookiebot.comまたはあなたのウェブサイトでテストし、統合に必要な情報を取得し、互換性を確認するために仕組みのセクションの指示に従ってください。
;(function cookiebotIntegration (window) {
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {}
window.tealiumCmpIntegration.cmpName = 'Cookiebot'
window.tealiumCmpIntegration.cmpIntegrationVersion = 'v1.0.0'
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList
// Should return a boolean, true if the CMP is running the 'Opt-in' model (GDPR style)
function cmpCheckIfOptInModel () {
if (!window.Cookiebot || !window.Cookiebot.regulations || typeof window.Cookiebot.regulations.gdprApplies !== 'boolean') return false
return Cookiebot.regulations.gdprApplies
}
// Should return some CMP-specific raw object (must be an object) that contains the needed information about the decision.
// This output is used as the cmpRawOutput argument in functions below.
function cmpFetchCurrentConsentDecision () {
if (!window.Cookiebot || typeof window.Cookiebot.hasResponse !== 'boolean') return false
return cmpRawOutput = window.Cookiebot.consent;
}
// Should return a string that helps Tealium iQ confirm that it's got the right CMP configuration (and not one from some other page / customer of the CMP)
function cmpFetchCurrentLookupKey() {
if (!window.Cookiebot || typeof window.Cookiebot.serial !== 'string') return false
return Cookiebot.serial
}
// Should return a boolean - true if the raw decision meets our expectations for the CMP
function cmpCheckForWellFormedDecision (cmpRawOutput) {
return typeof cmpRawOutput === 'object' && typeof cmpRawOutput.stamp ==='string'
}
// Should return a boolean - true if the consent decision was explicitly made by the user
function cmpCheckForExplicitConsentDecision (cmpRawOutput) {
// The only way we can tell if the decision is explicit in this example is to check if an opt-out cookie is set
return cmpRawOutput.method === 'explicit'? true : false;
}
// Should return an array of consented vendors/purposes - these should match the Purposes in Tealium iQ exactly
function cmpConvertResponseToGroupList(cmpRawOutput) {
var consentDecision = []
// very simple check for a non-empty opt-out cookie to determine if tags that sell data are allowed
if (cmpRawOutput.necessary) {
consentDecision.push('necessary') // we don't see a cookie, so we have to assume selling/sharing data is fine
}
if (cmpRawOutput.preferences) {
consentDecision.push('preferences') // we don't see a cookie, so we have to assume selling/sharing data is fine
}
if (cmpRawOutput.marketing) {
consentDecision.push('marketing') // we don't see a cookie, so we have to assume selling/sharing data is fine
}
if (cmpRawOutput.statistics) {
consentDecision.push('statistics') // we don't see a cookie, so we have to assume selling/sharing data is fine
}
return consentDecision
}
// You shouldn't need to change this function, or anything below it
function cmpCheckForTiqConsent (cmpRawOutput, tiqGroupName) {
// treat things we don't understand as an opt-out
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false
tiqGroupName = tiqGroupName || 'tiq-group-name-missing'
var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput)
return allowedGroups.indexOf(tiqGroupName) !== -1
}
})(window)
/*
// Debugging / development output - uncomment this block, then paste/repaste this entire template on your test pages
var outputString = `${tealiumCmpIntegration.cmpCheckIfOptInModel() ? 'Opt-in' : 'Opt-out'} Model
Checks:
- id: ${tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- well-formed: ${tealiumCmpIntegration.cmpCheckForWellFormedDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- explicit: ${tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- group list: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToGroupList(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
`
console.log(outputString);
*/
Didomi
このスニペットをdidomi.ioまたはあなたのウェブサイトでテストし、上記の指示に従って互換性を確認し、統合に必要な情報を取得します。
Didomiの統合では、ベンダーを目的として使用します。
Didomiは暗黙的に同意された目的やベンダーを返さない、これは既知のバグです。このバグが修正されるまでの間、この統合は無条件にalways_consented
目的キーを出力の同意決定に追加し、暗黙的なトリガリングを許可します。
;(function didomiIntegration (window) {
// CMP specific functionality and labels
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {}
window.tealiumCmpIntegration.cmpName = 'Didomi'
window.tealiumCmpIntegration.cmpIntegrationVersion = 'didomi-1.0.1'
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList
window.tealiumCmpIntegration.cmpConvertResponseToLookupObject = cmpConvertResponseToLookupObject
function cmpCheckIfOptInModel () {
if (!window.Didomi || typeof window.Didomi.getConfig !== 'function') return false
return window.Didomi.getConfig().notice.type === 'optin'
}
function cmpFetchCurrentConsentDecision () {
if (!window.Didomi || typeof window.Didomi.getUserStatus !== 'function') return false
if (typeof window.Didomi.getConfig !== 'function') return false
var cmpRawOutput = {}
cmpRawOutput.userStatus = window.Didomi.getUserStatus()
cmpRawOutput.vendorInfo = window.Didomi.getVendors()
cmpRawOutput.shouldConsentBeCollected = window.Didomi.shouldConsentBeCollected()
return cmpRawOutput
}
function cmpFetchCurrentLookupKey () {
if (!window.Didomi || typeof window.Didomi.getConfig !== 'function') return ''
var id = window.Didomi.getConfig().app.deploymentId
return id || ''
}
function cmpCheckForWellFormedDecision (cmpRawOutput) {
// treat things we don't understand as an opt-out
if (typeof cmpRawOutput !== 'object') return false
if (typeof cmpRawOutput.userStatus !== 'object') return false
// do more checks than strictly necessary to confirm expectations
if (typeof cmpRawOutput.userStatus.purposes !== 'object') return false
if (typeof cmpRawOutput.userStatus.vendors !== 'object') return false
if (typeof cmpRawOutput.userStatus.purposes.global !== 'object') return false
if (typeof cmpRawOutput.userStatus.vendors.global !== 'object') return false
if (toString.call(cmpRawOutput.userStatus.purposes.global.enabled) !== '[object Array]') return false
if (toString.call(cmpRawOutput.userStatus.vendors.global.enabled) !== '[object Array]') return false
if (typeof cmpRawOutput.vendorInfo !== 'object') return false
if (typeof cmpRawOutput.shouldConsentBeCollected !== 'boolean') return false
return true
}
function cmpCheckForExplicitConsentDecision (cmpRawOutput) {
// treat things we don't understand as an opt-out
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false
return cmpRawOutput.shouldConsentBeCollected === false // false after an explicit decision is made
}
function cmpConvertResponseToGroupList (cmpRawOutput) {
// Didomi handles checking each vendor's required purposes
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return []
// enforce strings, even for IAB vendor ids
const decision = cmpRawOutput.userStatus.vendors.global.enabled.map(function (vendorId) {
return String(vendorId)
})
decision.push('always_consented')
return decision
}
function cmpConvertResponseToLookupObject (cmpRawOutput) {
var allowedVendors = cmpConvertResponseToGroupList(cmpRawOutput)
var allVendors = cmpRawOutput.vendorInfo
var lookupObject = {}
// WORKAROUND to allow implicit triggering until the Didomi bug is fixed
lookupObject.always_consented = 'Always consented (to allow strictly needed triggering)'
allVendors.forEach(function (vendorObject) {
if (allowedVendors.indexOf(String(vendorObject.id)) === -1) return
lookupObject[vendorObject.id] = vendorObject.name || 'iab-vendor-' + vendorObject.id
})
return lookupObject
}
function cmpCheckForTiqConsent (cmpRawOutput, tiqGroupName) {
// treat things we don't understand as an opt-out
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false
tiqGroupName = tiqGroupName || 'tiq-group-name-missing'
var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput)
return allowedGroups.indexOf(tiqGroupName) !== -1
}
})(window)
// デバッグ/開発出力 - 同意状態を変更するたびにテストページに統合を再貼り付けます
var outputString = `CMP Found: ${window.tealiumCmpIntegration.cmpName} (${window.tealiumCmpIntegration.cmpCheckIfOptInModel() ? 'Opt-in' : 'Opt-out'} Model)
Checks:
- id: ${window.tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- well-formed: ${window.tealiumCmpIntegration.cmpCheckForWellFormedDecision(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- explicit: ${window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- group list: ${JSON.stringify(window.tealiumCmpIntegration.cmpConvertResponseToGroupList(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
- name lookup: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToLookupObject(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()), null, 6)}
`
console.log(outputString)
デジタルコントロールルーム
このスニペットをdigitalcontrolroom.comまたはあなたのウェブサイトでテストして、How it works sectionの指示に従って互換性を確認し、統合に必要な情報を取得します。
;(function digitalControlRoom(window) {
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {};
window.tealiumCmpIntegration.cmpName = 'Digital Control Room';
window.tealiumCmpIntegration.cmpIntegrationVersion = 'v1.0.0';
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel;
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision;
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey;
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision;
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision;
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent;
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList;
function cmpCheckIfOptInModel() {
return (
window._cookiereports &&
window._cookiereports.panels &&
window._cookiereports.panels[0].consent &&
window._cookiereports.panels[0].consentExplicit
);
}
// This output is used as the cmpRawOutput argument in functions below.
function cmpFetchCurrentConsentDecision() {
if (!window._cookiereports) {
return {};
}
var levels = window._cookiereports.loadConsent();
levels[1] = true;
var output = { "levels": levels };
output.panels = window._cookiereports.panels;
return output;
}
// Should return a string that helps Tealium iQ confirm that it's got the right CMP configuration (and not one from some other page / customer of the CMP)
function cmpFetchCurrentLookupKey() {
if (window._cookiereports && window._cookiereports.panels && window._cookiereports.panels.length > 0)
return window._cookiereports.panels[0].storagekey;
return "";
}
function cmpCheckForWellFormedDecision(cmpRawOutput) {
if (typeof cmpRawOutput.levels !== "object" || cmpRawOutput.levels === null || typeof cmpRawOutput.panels !== "object" || cmpRawOutput.panels === null) {
return false;
}
return true;
}
// Should return a boolean - true if the consent decision was explicitly made by the user
function cmpCheckForExplicitConsentDecision(cmpRawOutput) {
if (cmpRawOutput && cmpRawOutput.panels)
return cmpRawOutput.panels[0].consentDecisionIsExplicit();
return false;
}
function cmpConvertResponseToGroupList(cmpRawOutput) {
if (!cmpCheckForWellFormedDecision(cmpRawOutput)) {
return ["1"];
}
var levels = cmpRawOutput.levels;
var consentDecision = [];
for (var key in levels) {
if (levels.hasOwnProperty(key)) {
if (levels[key] === true) {
consentDecision.push(key);
}
}
}
return consentDecision;
}
// この関数やそれ以下のものを変更する必要はありません
function cmpCheckForTiqConsent(cmpRawOutput, tiqGroupName) {
// 理解できないものはオプトアウトとして扱います
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false;
tiqGroupName = tiqGroupName || "tiq-group-name-missing";
var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput);
return allowedGroups.indexOf(tiqGroupName) !== -1;
}
})(window);
// デバッグ/開発用の出力 - このブロックのコメントを外し、テストページにこのテンプレート全体を貼り付け/再貼り付けします
/*
var outputString = `${tealiumCmpIntegration.cmpCheckIfOptInModel() ? "Opt-in" : "Opt-out"} Model
Checks:
- id: ${tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- well-formed: ${tealiumCmpIntegration.cmpCheckForWellFormedDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- explicit: ${tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- group list: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToGroupList(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
`;
console.log(outputString);
*/
OneTrust
このスニペットをhttps://onetrust.comまたはあなたのウェブサイトでテストし、上記の指示に従って 互換性を確認し、統合に必要な情報を取得します。
OneTrustは、ベンダーIDに-test
を追加することで構成をプレビューするテストモードを提供しています。統合を簡素化するため、OneTrust Consent IntegrationsはベンダーIDから-test
接尾辞を削除します。シームレスな統合のために、統合を構成する際にTealium iQ Consent Integrations UIに-test
なしのベンダーIDを入力してください。たとえあなたがページ上で-test
接尾辞を使用していてもです。Tealium iQ UIとアクティブな統合間でベンダーIDが一致しないと、Tealium iQタグ管理はページ上でクッキーを構成したりタグをトリガーしたりすることができません。
;(function oneTrust(window) {
// 名前/IDの挙動の簡単な調整を可能にします
var useNamesInsteadOfKeys = false;
// 期待されるベンダーIDの安全性チェックを回避し、リスクを増大させる代わりに構成を簡素化することを許可します
var disableVendorIdValidation = false;
// CMP特有の機能とラベル
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {};
window.tealiumCmpIntegration.cmpName = "OneTrust";
window.tealiumCmpIntegration.cmpIntegrationVersion = "onetrust-2.0.2";
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision;
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey;
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel;
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision;
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision;
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent;
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList;
window.tealiumCmpIntegration.cmpConvertResponseToLookupObject = cmpConvertResponseToLookupObject;
function cmpCheckIfOptInModel() {
var decision = cmpFetchCurrentConsentDecision();
if (decision && decision.ConsentModel && decision.ConsentModel.Name === "opt-out") {
return false;
}
return true;
}
function cmpFetchCurrentConsentDecision() {
if (!window.OneTrust || typeof window.OneTrust.GetDomainData !== "function") return false;
var cmpRawOutput = window.OneTrust.GetDomainData();
cmpRawOutput.dataLayer = window.dataLayer;
return cmpRawOutput;
}
function cmpFetchCurrentLookupKey() {
// 2022年末からの新しいバージョンのOneTrustでは、cctIdが定義されていない
// しかし、このHTML属性はOneTrustが伝える方法です
var scrapeOneTrustVendorId = function () {
var allScripts = document.getElementsByTagName("script");
var re = /\/otSDKStub\.js(\?.*)*$/;
for (var i = 0; i < allScripts.length; i++) {
var isOneTrustScript = re.test(allScripts[i].src); // nullになることがあります
if (isOneTrustScript) {
var fullVendorId = allScripts[i].getAttribute("data-domain-script"); // スクリプトから解析します
return fullVendorId.split("-test")[0];
}
}
return "error-not-found";
}
if (disableVendorIdValidation) {
// ただし、アクティブになると予想されるベンダーIDを返します
return (window.tealiumCmpIntegration && window.tealiumCmpIntegration.map && Object.keys(window.tealiumCmpIntegration.map)[0]) || "(Vendor ID check disabled)";
}
return scrapeOneTrustVendorId();
}
function cmpCheckForWellFormedDecision(cmpRawOutput) {
// 理解できないものはオプトアウトとして扱います
if (typeof cmpRawOutput !== "object") return false;
if (toString.call(cmpRawOutput.Groups) !== "[object Array]") return false;
if (toString.call(cmpRawOutput.dataLayer) !== "[object Array]") return false;
return true;
}
function cmpCheckForExplicitConsentDecision(cmpRawOutput) {
// 理解できないものは暗黙的として扱います
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false;
return window.OneTrust && typeof window.OneTrust.IsAlertBoxClosed === "function" && window.OneTrust.IsAlertBoxClosed();
}
function cmpConvertResponseToLookupObject(cmpRawOutput) {
// オブジェクトの配列からオブジェクトへの変換を簡単に検索できるようにします
var decisionString = "";
var foundOneTrustEntry = false;
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return {};
for (var i = cmpRawOutput.dataLayer.length - 1; i >= 0; i--) {
if (["OneTrustGroupsUpdated", "OneTrustLoaded"].indexOf(cmpRawOutput.dataLayer[i].event) !== -1) {
decisionString = cmpRawOutput.dataLayer[i].OnetrustActiveGroups;
foundOneTrustEntry = true;
break;
}
}
var permittedPurposeIds = decisionString.split(",").filter(function (group) {
return group !== "";
});
// CUSTOM - SPAの場合のフォールバック。1000以上のイベントがdataLayerにプッシュされ、決定がもう利用できない場合(Googleは配列を切り捨てます)
if (decisionString === "" && cmpRawOutput.dataLayer.length === 1000 && foundOneTrustEntry === false) {
permittedPurposeIds = window.tealiumConsentRegister && window.tealiumConsentRegister.getCurrentDecision();
}
var permittedPurposesWithNames = {};
cmpRawOutput.Groups.forEach(function (groupInfo) {
if (permittedPurposeIds.indexOf(groupInfo.OptanonGroupId) !== -1) {
permittedPurposesWithNames[groupInfo.OptanonGroupId] = groupInfo.GroupName || "ERROR-MISSING";
}
})
return permittedPurposesWithNames; // keys are IDs, values are names
}
function cmpConvertResponseToGroupList(cmpRawOutput) {
var permittedPurposesWithNames = cmpConvertResponseToLookupObject(cmpRawOutput);
var keysOrValues = useNamesInsteadOfKeys ? "values" : "keys";
return Object[keysOrValues](permittedPurposesWithNames); // keys are IDs, values are names
}
function cmpCheckForTiqConsent(cmpRawOutput, tiqGroupName) {
// 理解できないものはオプトアウトとして扱います
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false;
tiqGroupName = tiqGroupName || "tiq-group-name-missing";
var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput);
return allowedGroups.indexOf(tiqGroupName) !== -1;
}
})(window);
/*
// デバッグ/開発出力 - 同意状態を変更するたびにテストページに統合を再貼り付けてください
var outputString = `CMP Found: ${window.tealiumCmpIntegration.cmpName} (${window.tealiumCmpIntegration.cmpCheckIfOptInModel() ? "Opt-in" : 'Opt-out'} Model)
チェック:
- id: ${window.tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- well-formed: ${window.tealiumCmpIntegration.cmpCheckForWellFormedDecision(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- explicit: ${window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- group list: ${JSON.stringify(window.tealiumCmpIntegration.cmpConvertResponseToGroupList(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
- name lookup: ${JSON.stringify(window.tealiumCmpIntegration.cmpConvertResponseToLookupObject(window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision()), null, 6)}
`
console.log(outputString)
*/
Opt-out Cookie + GPC
この統合は、CCPA/CPRAのような非常にシンプルなオプトアウトモデルをサポートすることを目指しています。Vendor IDフィールドをオプトアウトクッキーの名前として解釈し、大文字と小文字を区別します。このクッキーが任意の値で見つかった場合、またはGlobal Privacy Control (GPC)のオプトアウト信号が見つかった場合、ユーザーはオプトアウトしたとみなされます。
統合で使用され、デフォルトのPurpose Groupに含まれるPurpose Keysは次のとおりです。
no-selling
- ユーザーのオプトアウト信号に関係なく許可するタグ。これらのタグはデータを販売/共有しないか、法務チームなどが厳密に必要と判断しています。yes-selling
- ユーザーがオプトアウトした後の追跡を規制またはポリシーが禁止しているため、オプトアウトユーザーに対してブロックするタグ。
TrustArc
このスニペットをtrustarc.comまたはあなたのウェブサイトでテストして、互換性をチェックし、統合に必要な情報を取得します。How it works sectionの指示に従ってください。
;(function trustarc (window) {
// CMP specific functionality and labels
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {}
window.tealiumCmpIntegration.cmpName = 'TrustArc'
window.tealiumCmpIntegration.cmpIntegrationVersion = 'trustarc-1.0.3'
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList
window.tealiumCmpIntegration.cmpConvertResponseToLookupObject = cmpConvertResponseToLookupObject
function cmpCheckIfOptInModel () {
var modeCookieValue = (truste && truste.util && typeof truste.util.readCookie === 'function' && truste.util.readCookie('notice_behavior')) || 'expressed|eu' // default to strict EU rules if no cookie
return modeCookieValue.indexOf('expressed') === 0
}
function cmpFetchCurrentConsentDecision () {
if (!window.truste || !window.truste.util || typeof window.truste.util.readCookie !== 'function') return false
""
var cookieValue = window.truste.util.readCookie(truste.eu.COOKIE_GDPR_PREF_NAME) || '0,'
// if we're in the opt-out model and it's an implicit decision, we should allow all tags to fire
var map = (window.tealiumCmpIntegration && window.tealiumCmpIntegration.map && Object.keys(window.tealiumCmpIntegration.map)[0] && window.tealiumCmpIntegration.map[Object.keys(window.tealiumCmpIntegration.map)[0]]) || {}
if (cmpCheckIfOptInModel() === false && cmpCheckForExplicitConsentDecision() === false) {
cookieValue = Object.keys(map).join(',') // all purpose keys that have been added in the UI are returned as consented
}
return {
cookie: cookieValue
}
}
function cmpFetchCurrentLookupKey () {
// just return whatever Vendor ID is expected be active to short-circuit the ID-based double check for now
return (window.tealiumCmpIntegration && window.tealiumCmpIntegration.map && Object.keys(window.tealiumCmpIntegration.map)[0]) || '(Vendor ID check disabled)'
}
function cmpCheckForWellFormedDecision (cmpRawOutput) {
// treat things we don't understand as an opt-out
if (typeof cmpRawOutput !== 'object') return false
if (typeof cmpRawOutput.cookie !== 'string') return false
return true
}
function cmpCheckForExplicitConsentDecision (cmpRawOutput) {
if (!window.truste || !window.truste.util || typeof window.truste.util.readCookie !== 'function') return false
return typeof window.truste.util.readCookie(truste.eu.COOKIE_GDPR_PREF_NAME) === 'string'
}
function cmpConvertResponseToLookupObject (cmpRawOutput) {
if (!cmpCheckForWellFormedDecision(cmpRawOutput)) return []
const cookieConsentValues = cmpRawOutput.cookie.split(':')[0].split(',')
const extraSplit = []
cookieConsentValues.forEach((el) => {
if (!el) return
extraSplit.push.apply(extraSplit, el.split('|'))
})
const trustArcMap = {
0: 'Required',
1: 'Functional',
2: 'Personalization/Advertising'
}
const output = {}
extraSplit.forEach((key) => {
if (key !== '') {
output[key] = trustArcMap[key] || 'Category name unknown'
}
})
return output
}
function cmpConvertResponseToGroupList (cmpRawOutput) {
var permittedPurposesWithNames = cmpConvertResponseToLookupObject(cmpRawOutput)
var keysOrValues = 'keys'
return Object[keysOrValues](permittedPurposesWithNames) // keys are IDs, values are names
}
function cmpCheckForTiqConsent (cmpRawOutput, tiqGroupName) {
// treat things we don't understand as an opt-out
if (cmpCheckForWellFormedDecision(cmpRawOutput) !== true) return false
tiqGroupName = tiqGroupName || 'tiq-group-name-missing'
var allowedGroups = cmpConvertResponseToGroupList(cmpRawOutput)
return allowedGroups.indexOf(tiqGroupName) !== -1
}
})(window)
// デバッグ/開発出力 - このコードのコメントを外し、同意状態を変更するたびにテストページのコンソールに統合を貼り付けて、公開せずにテストします
var outputString = `CMP Found: ${window.tealiumCmpIntegration.cmpName} (${window.tealiumCmpIntegration.cmpCheckIfOptInModel() ? 'Opt-in' : 'Opt-out'} Model)
チェック:
- id: ${tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- well-formed: ${tealiumCmpIntegration.cmpCheckForWellFormedDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- explicit: ${tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- group list: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToGroupList(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()))}
- name lookup: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToLookupObject(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()), null, 6)}
${tealiumCmpIntegration.cmpCheckIfOptInModel() === false && tealiumCmpIntegration.cmpCheckForExplicitConsentDecision() === false ? '(All purposes are consented in opt-out mode with an implicit decision, but the full purpose list can\'t be shown in this debug output for technical reasons.)' : ''}
`
console.log(outputString)
Usercentrics
あなたのウェブサイトでこのスニペットをテストして、互換性をチェックし、統合に必要な情報を取得します。How it worksセクションの指示に従ってください。 Usercentrics統合では、VendorsをPurposesとして使用します。
;(function usercentricsBrowserSdkV2 (window) {
// CMP特定の機能とラベル
window.tealiumCmpIntegration = window.tealiumCmpIntegration || {}
window.tealiumCmpIntegration.cmpName = 'Usercentrics Browser SDK'
window.tealiumCmpIntegration.cmpIntegrationVersion = 'usercentrics-1.0.3'
function cmpFetchCurrentConsentDecision () {
if (!window.UC_UI || typeof window.UC_UI.getServicesBaseInfo !== 'function') return false
var cmpRawOutput = window.UC_UI.getServicesBaseInfo()
return cmpRawOutput
}
function cmpFetchCurrentLookupKey () {
return (window.UC_UI && typeof window.UC_UI.getSettingsCore === 'function' && window.UC_UI.getSettingsCore().id) || ''
}
// 現時点ではUsercentricsのopt-Inモデルのみをサポートし、必要に応じて追加できます
function cmpCheckIfOptInModel () {
return window.UC_UI && typeof window.UC_UI.isConsentRequired === 'function' && window.UC_UI.isConsentRequired() === true
}
function cmpCheckForWellFormedDecision (cmpRawOutput) {
// 理解できないものはopt-outとして扱う
if (toString.call(cmpRawOutput) !== '[object Array]') return false
// 最初のエントリをすべてのプロキシとして使用する
if (cmpRawOutput && cmpRawOutput[0] && typeof cmpRawOutput[0].name === 'string') {
return true
}
return false
}
function cmpCheckForExplicitConsentDecision (cmpRawOutput) {
// 理解できないものはopt-outとして扱う
if (toString.call(cmpRawOutput) !== '[object Array]') return false
// 最初のエントリをすべてのプロキシとして使用する
var consentHistory = (cmpRawOutput && cmpRawOutput[0] && cmpRawOutput[0].consent && cmpRawOutput[0].consent.history) || []
var lastHistoryEntryType = (consentHistory && consentHistory.length && consentHistory[consentHistory.length - 1].type) || ''
if (lastHistoryEntryType === 'explicit') {
return true
}
return false
}
function cmpCheckForTiqConsent (cmpRawOutput, tiqGroupName) {
var foundOptIn = false
// 理解できないものはopt-outとして扱う
if (toString.call(cmpRawOutput) !== '[object Array]') return false
// マッピングが見つかった場合はそれを使用し、マッピングで指定されていない場合はフォールバック(Usercentricsのデフォルト値)を使用する
tiqGroupName = tiqGroupName || 'tiq-group-name-missing'
// ベンダーがオブジェクトである場合はチェックし、少なくとも1つを探す
cmpRawOutput.forEach(function (tagInfo) {
if ((tagInfo.consent && tagInfo.consent.status === true) && tagInfo.name === tiqGroupName) {
foundOptIn = true
}
})
return foundOptIn
}
function cmpConvertResponseToGroupList (cmpRawOutput) {
var vendorArray = []
cmpRawOutput && cmpRawOutput.forEach(function (tagConsent) {
if (tagConsent.consent && tagConsent.consent.status === true) {
vendorArray.push(tagConsent.name)
}
})
return vendorArray
}
window.tealiumCmpIntegration.cmpFetchCurrentConsentDecision = cmpFetchCurrentConsentDecision
window.tealiumCmpIntegration.cmpFetchCurrentLookupKey = cmpFetchCurrentLookupKey
window.tealiumCmpIntegration.cmpCheckIfOptInModel = cmpCheckIfOptInModel
window.tealiumCmpIntegration.cmpCheckForWellFormedDecision = cmpCheckForWellFormedDecision
window.tealiumCmpIntegration.cmpCheckForExplicitConsentDecision = cmpCheckForExplicitConsentDecision
window.tealiumCmpIntegration.cmpCheckForTiqConsent = cmpCheckForTiqConsent
window.tealiumCmpIntegration.cmpConvertResponseToGroupList = cmpConvertResponseToGroupList
})(window)
var outputString = `${tealiumCmpIntegration.cmpName} - ${tealiumCmpIntegration.cmpCheckIfOptInModel() ? 'Opt-in' : 'Opt-out'} モデル
チェック:
- ベンダーID: ${tealiumCmpIntegration.cmpFetchCurrentLookupKey()}
- 適切に形成された決定: ${tealiumCmpIntegration.cmpCheckForWellFormedDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- 明示的な決定: ${tealiumCmpIntegration.cmpCheckForExplicitConsentDecision(tealiumCmpIntegration.cmpFetchCurrentConsentDecision())}
- 同意した目的: ${JSON.stringify(tealiumCmpIntegration.cmpConvertResponseToGroupList(tealiumCmpIntegration.cmpFetchCurrentConsentDecision()).sort(),null, 8)}
`
console.log(outputString)
カスタムインテグレーションテンプレート
カスタムインテグレーションテンプレートとその使用方法についての詳細は、カスタムインテグレーションを参照してください。
このページはお役にたちましたでしょうか?
ご意見有難うございます。
最終更新日 :: 2024年October月11日