動態

詳情 返回 返回

谷歌廣告生態指南:AdSense/GAM 接入避坑 + 填充監聽 + 問題排查

作為長期負責海外業務的開發者,公司業務中經常會和谷歌的人員有溝通。在接入谷歌廣告生態時,踩了很多坑,很多坑都是和谷歌的技術人員溝通後才發現問題的(有些最新情況和文檔不一致,很坑)。

📊 1. AdSense 與 Ad Manager 關係與定位對比

對比維度 AdSense(谷歌廣告聯盟|廣告源) Ad Manager(GAM,谷歌廣告管理平台)
🎯 核心定位 中小站點 / 個人博主的 "傻瓜式" 變現工具 中大型媒體 / 出版商的企業級廣告管理系統
👥 目標用户 個人博客、小型網站、獨立開發者 流量較大的媒體平台、電商網站、內容出版商
⚙️ 操作複雜度 極低(複製粘貼代碼 + 配置 ID,腳本動態引入) 較高(需配置廣告單元、優先級、定價,手動加載 GPT 腳本)
💰 收益模式 廣告分成(CPC/CPM),谷歌抽成後結算 自主定價 + 平台服務費,支持直客廣告 + 聯盟廣告整合
🚀 核心優勢 零維護成本、快速變現、門檻低 精細化控制、多渠道整合、收益最大化
🔄 協同關係 可作為 GAM 的 "保底廣告源" 接入 可管理 AdSense 廣告,分配優先級
🔐 域名審核規則 1. 需審核頂級域名(如 example.com),2023 年後政策:頂級域名通過後,所有子域名自動生效 2. 支持獨立頂級域名,免費域名通過率極低 3. 域名需合規(無盜版、無密碼保護) 1. 需審核綁定的頂級域名,2023 年後同 AdSense 規則:子域名無需單獨審核 2. 審核門檻更高,需提供域名所有權證明、流量合規證明 3. 支持多頂級域名管理,每個頂級域名需單獨審核,子域名自動關聯
📜 核心依賴腳本 需動態引入 adsbygoogle.js(URL:https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js),廣告代碼會自動觸發引入,無需手動加載 必須手動加載 GPT(Google Publisher Tag)腳本(URL:https://securepubads.g.doubleclick.net/tag/js/gpt.js)
🚪 接入門檻 網站內容合規、有一定訪問量(無硬性指標)、域名註冊建議滿 3 個月(通過率更高) 需申請開通,要求較高的流量規模(日均 UV10 萬 +)和合規資質,域名需完成官方驗證
📏 廣告位個數上限 1. 有明確默認限制:單頁面通常不超過 3-5 個(超量會觸發審核警告或限制) 2. 特殊頁面限制:文章詳情頁建議≤3 個,列表頁建議≤4 個 3. 違規後果:超量會被判定為 "影響用户體驗",輕則減少填充,重則封禁賬號 1. 無強制數量上限:谷歌未規定上限,由開發者自主配置 2. 核心約束:廣告位不得覆蓋核心內容或造成頁面擁擠,否則觸發合規抽查 3. 實操建議:單頁面建議控制在 5-8 個內,避免用户流失 4. 特殊規則:若接入 AdSense 作為廣告源,需遵循 AdSense 的個數限制
📄 域名驗證文件要求 1. 頂級域名根目錄需放置 ads.txt,內容包含谷歌提供的 publisher ID 驗證信息 2. 子域名建議單獨放置 ads.txt:谷歌爬蟲優先讀取子域名自身的 ads.txt 3. 缺失會導致廣告填充率驟降(谷歌無法驗證域名所有權) 1. 頂級域名根目錄需放置 ads.txt,內容包含 GAM 賬號對應的驗證信息 2. 多頂級域名需分別放置對應 ads.txt,子域名建議單獨放置 3. 若接入 AdSense 作為廣告源,需同時包含 AdSense 的驗證信息
🔗 官方文檔地址 https://support.google.com/adsense https://support.google.com/admanager

⚠️ 重要協同使用提醒

切記:要不就接入Adsense,要不就升級到GAM(沒有廣告數據源了就用GAM賬號系統關聯Adsense賬號,然後在GAM管理系統裏新建訂單項拉取Adsense的廣告源),絕不能這2個同時存在,否則域名被封了找谷歌的技術人員都不好解封。

🎯 2. AdSense 接入與廣告填充監聽

📝 接入案例 + AdSense如何判斷廣告位渲染填充成功(data-ad-status屬性)

官方參考文檔

屬性值 含義與説明
filled 表示廣告請求成功,系統已經返回廣告並在廣告單元中正常展示
unfilled 表示廣告請求未成功,系統沒有返回任何廣告,導致廣告單元為空

💻 完整接入代碼示例

html

<!DOCTYPE html>
<html>
<head>
    <title>AdSense狀態監聽</title>
    <style>
        /* 當廣告狀態為未填充時,自動隱藏廣告容器 */
        ins.adsbygoogle[data-ad-status="unfilled"] {
            display: none !important;
        }
    </style>
</head>
<body>
    <h1>AdSense狀態監聽示例</h1>
    
    <!-- 廣告容器 -->
    <div>
        <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
        <ins class="adsbygoogle"
             style="display:block"
             data-ad-client="ca-pub-XXXXXXXXXXXXXXXX(你的賬號ID)"
             data-ad-slot="xxxxxx(廣告位id)"
             data-ad-format="auto"></ins>
        <script>
            // 啓動
            (adsbygoogle = window.adsbygoogle || []).push({});
        </script>
    </div>

    <script>
        // 獲取廣告元素
        const adElement = document.querySelector('.adsbygoogle');
        
        // 設置最大等待時間(秒)
        const MAX_WAIT_TIME = 10;
        
        // 記錄開始時間
        const startTime = Date.now();
        
        // 創建觀察器監聽廣告狀態變化
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                // 檢查是否是data-ad-status屬性發生變化
                if (mutation.type === 'attributes' && mutation.attributeName === 'data-ad-status') {
                    const status = adElement.getAttribute('data-ad-status');
                    const elapsedTime = (Date.now() - startTime) / 1000;
                    
                    console.log(`[${elapsedTime.toFixed(2)}秒] 廣告狀態: ${status}`);
                    
                    // 如果廣告成功填充,停止監聽
                    if (status === 'filled') {
                        console.log('✅ 廣告填充成功!');
                        observer.disconnect(); // 停止監聽
                    }
                }
            });
        });
        
        // 開始監聽廣告元素的data-ad-status屬性變化
        observer.observe(adElement, {
            attributes: true,
            attributeFilter: ['data-ad-status']
        });
        
        // 設置超時檢查 - 10秒後檢查廣告狀態
        setTimeout(() => {
            const finalStatus = adElement.getAttribute('data-ad-status');
            const elapsedTime = (Date.now() - startTime) / 1000;
            
            console.log(`⏰ ${MAX_WAIT_TIME}秒超時檢查`);
            
            // 如果10秒後廣告仍未填充成功,記錄日誌
            if (finalStatus !== 'filled') {
                console.log('❌ 廣告未在指定時間內填充成功');
            }
            
            observer.disconnect(); // 停止監聽
        }, MAX_WAIT_TIME * 1000);
        
        console.log('開始監聽廣告狀態...');
    </script>
</body>
</html>

🛠️ 3. Ad Manager(GAM)接入和監聽廣告填充情況

💻 簡單接入案例

html

<!DOCTYPE html>
<html>
<head>
    <title>GAM廣告狀態監聽</title>
    <!-- 引入GPT庫 -->
    <script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
</head>
<body>
    <h1>GAM廣告狀態監聽示例</h1>

    <!-- 廣告位容器 -->
    <div id='div-gpt-ad-123456789-0' style='width:300px; height:250px;'>
        <script>
            // 等待GPT庫加載完畢
            window.googletag = window.googletag || {cmd: []};
            
            googletag.cmd.push(function() {
                // 定義廣告位
                var adSlot = googletag.defineSlot('/你的廣告單元ID路徑', [300, 250], 'div-gpt-ad-123456789-0');
                
                // 基於GPT庫 添加事件監聽器
                googletag.pubads().addEventListener('slotRenderEnded', function(event) {
                    // 打印廣告位信息
                    console.log('廣告位名稱:', event.slot.getSlotElementId());
                    console.log('廣告狀態:', event.isEmpty ? '未填充' : '已填充');
                });
                
                // 啓用廣告服務並刷新廣告
                googletag.enableServices();
                googletag.display('div-gpt-ad-123456789-0');
                // 可有可無
                googletag.pubads().refresh([adSlot]);
            });
        </script>
    </div>
</body>
</html>

🚫 4. 常見違規行為

  1. 🚨 在iframe頁面中二次嵌套廣告頁面
  2. 🚨 2個賬號的Adsense和GAM同時在一個網頁中加載(親測過,測試域名被封了,問了合作的谷歌人員他們也沒辦法)
  3. 🚨 一個網頁只能接入一個賬號,Adsense和GAM二選一
  4. 🚨 頻繁點擊或者用腳本就刷,很容易被檢測到
  5. 🚨 擅自修改AdSense廣告代碼;在非內容網頁(如404頁、純廣告頁)放置廣告;廣告被網頁元素遮擋等。也很容易被檢測到導致後續很難填充廣告
  6. 🚨 AdSense廣告位不要超過上限;單頁面通常不超過 3-5 個(超量會觸發審核警告或限制)

🔧 5. 廣告一直渲染不出來的排查思路

🔍 廣告代碼與容器佈局排查

首先,我們需要仔細檢查廣告代碼和容器佈局,這是最常見的問題來源。

  • 核對廣告代碼:確保網頁中嵌入的廣告代碼完全正確,並且 data-ad-client (AdSense) 或廣告單元ID (GAM) 與你後台創建的信息完全一致
  • 關注data-ad-format屬性:這個屬性控制廣告的響應式行為。如果它在移動端顯示異常,可以嘗試在 <ins> 標籤內添加 data-full-width-responsive="false" 來禁止廣告自動展開至全寬
  • 穩定廣告容器:AdSense響應式廣告會檢測其父級容器的可用寬度來調整尺寸

    • 賦予明確寬度:避免父容器寬度設置為 auto,或通過JavaScript動態調整導致初始寬度不確定。為容器設置明確的寬度(固定值或穩定的百分比)
    • 簡化定位:檢查CSS中是否有 position: absolute 等使元素脱離文檔流的定位屬性,這可能會影響廣告腳本對容器尺寸的計算
    • 留意加載時序:如果頁面佈局由JavaScript動態調整,可能會與AdSense腳本的渲染時機衝突。確保廣告容器在AdSense腳本加載前的尺寸就是穩定和正確的
  • 排除插件干擾:一些廣告攔截插件可能會阻止廣告加載。排查時,可以嘗試在瀏覽器無痕(隱私)模式下訪問網頁,或暫時禁用這類插件

📋 域名狀態與文件驗證

如果代碼和佈局檢查無誤,接下來我們需要確認你的網站和域名狀態是否一切正常。

  • 確認審核狀態

    • 對於 AdSense,務必在後台 (AdSense > 網站) 確認你的網站是否已通過審核。新添加的網站需要經過Google的審核才能開始展示廣告
    • 如果狀態是  "待審核"  或  "未就緒"  ,耐心等待即可,這可能需要幾天到數週時間
  • 驗證ads.txt文件

    • 確保你的網站根目錄(例如 https://你的域名/ads.txt)存在正確配置的 ads.txt 文件,並且文件中包含了你AdSense或GAM賬户對應的信息
    • 特別注意:如果你的AdSense後台添加的是頂級域名(如 only1u.org),那麼 ads.txt 文件必須放置在頂級域名的根目錄下。如果網站實際運行在二級域名(如 blog.only1u.org),可能需要通過服務器配置確保能通過頂級域名訪問到該文件
  • 檢查網站可訪問性:確保你的網站在不同國家和地區都能穩定訪問,且加載速度正常。Google的審核和廣告投放服務器可能位於國外,網站不穩定或無法訪問會導致審核失敗或廣告無法渲染

🛠️ 官方工具 + 客服支持

  • 查看瀏覽器控制枱:是否有廣告腳本加載錯誤(如403、500狀態碼),針對性解決。(403是最常見的一種 就是域名審核異常了)
  • 官方論壇提問:https://support.google.com/adsense/community(谷歌技術人員會回覆)
  • 聯繫谷歌客服:通過AdSense後台的"幫助"菜單提交問題,準備詳細的賬户信息和問題描述
user avatar
0 用戶, 點贊了這篇動態!

發表 評論

Some HTML is okay.