google广告 google分析

这里写自定义目录标题

  • google广告
    • AFC类型广告
    • AFS类型广告
      • CSE广告
        • RS广告
  • google分析
      • 监听广告点击click事件(广告追踪)

google广告

AFS广告主要是指嵌入在搜索引擎上的广告,用户在进行搜索时看到的广告,与搜索关键词息息相关。
AFC广告则是展示在网页内容中的广告,与网页的文本内容相关。

AFC类型广告

**AFC广告则是展示在网页内容中的广告,与网页的文本内容相关。**
  • 当只引入AFC广告链接时<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456***" crossorigin="anonymous"></script>,会自动显示display广告,具体如何显示是产品在后台设置,我们不用管。
  • 当产品需要让我在特定位置或特定时机显示广告时,我们需要插入HTML代码块<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-123456***" data-ad-slot="8*********" data-ad-format="auto" data-full-width-responsive="true"></ins>,或者使用js插入;然后执行代码插入语句 (adsbygoogle = window.adsbygoogle || []).push({});,即可在特定位置插入广告,但该广告也不是必现,主要靠产品在后台设置。
// AFC广告
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-123456***" crossorigin="anonymous"></script>

// 方法1:广告容器
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-123456***"
     data-ad-slot="8*********"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
	// 加载广告
	<script>
	     (adsbygoogle = window.adsbygoogle || []).push({});
	</script>

// 方法2:js创建广告容器
insertGgafc() {
	// 创建广告容器:给容器设置宽度就相当于给广告设置宽度
    const adContainer = document.createElement('div');
    adContainer.className = 'middle-ad-container';
    adContainer.style.cssText = 'margin: 20px 0; max-width: 520px;';

    // 创建广告元素
    const adInsElement = document.createElement('ins');
    adInsElement.className = 'adsbygoogle';
    adInsElement.style.display = 'block';
    adInsElement.setAttribute('data-ad-client', 'ca-pub-6468790746781495');
    adInsElement.setAttribute('data-ad-slot', '6799291808');
    adInsElement.setAttribute('data-ad-format', 'auto');
    adInsElement.setAttribute('data-full-width-responsive', 'true');
    // 将广告添加到容器
    adContainer.appendChild(adInsElement);
	// 加载广告
    try {
      (adsbygoogle = window.adsbygoogle || []).push({});
    } catch (err) {
      console.error('Ad load error:', err);
      adContainer.remove();
    }
}


效果如图:
在这里插入图片描述

AFS类型广告

AFS广告主要是指嵌入在搜索引擎上的广告,用户在进行搜索时看到的广告,与搜索关键词息息相关。 AFS广告比较麻烦了

// 以下两段代码都是产品给的,直接粘贴即可

// 搜索引擎
<script async src="https://cse.google.com/cse.js?cx=c123456***"></script>
// 搜索结果容器
<div class="gcse-searchresults-only"></div>

CSE广告

CSE广告(Customer Search Engine)通常指的是客户搜索引擎广告。

// 这里无需额外添加代码,上述搜索引擎结果会自带这个CSE广告

含有赞助商广告加粗字样的结果则为CSE广告
在这里插入图片描述

RS广告

RS广告通常指的是相关搜索广告(Related Search ads),这些广告一般显示在用户进行搜索时的结果页面上,与搜索的关键词相关。

其中pubIdstyleId需要产品给我们

// RS广告
    window.__gcse = {
      parsetags: 'onload', // Defaults to 'onload'
      initializationCallback: null,
      searchCallbacks: {
        web: {
          rendered: function (gname, query, promoElts, resultElts) {
            // 移除已存在的 RS 广告
            const existingRsBox = document.getElementById('rs-box-1');
            if (existingRsBox) {
              existingRsBox.remove();
            }

            // 只在第一页显示 RS 广告
            if (isPageOne()) {
              let rsContainer = document.createElement('div');
              rsContainer.id = 'rs-box-1';
              rsContainer.style.margin = '20px 0';
              let posE = resultElts[6];
              if (posE && posE.parentNode) {
                posE.parentNode.insertBefore(rsContainer, posE);
                afsInit();
              }
            }
          },
        },
      },
    };
    function afsInit() {
      var q = gaEventUtils.getParam('q');
      if (q) {
        loadSearchAd(q);
      }
    }
    function loadSearchAd(query) {
      if (query) {
        var searchPage = getSearchUrl();
        var adPageOptions = {
          // "pubId": 'pub-9616389000213823',  // 测试
          "pubId": 'pub-123456***',
          "styleId": '8588381781',
          "query": query,
          "resultsPageBaseUrl": searchPage,
          "resultsPageQueryParam": 'q',
          "linkTarget": '_blank',
          "adsafe": 'low',
          "oe": "utf-8",
          "ie": "utf-8",
          "adPage": 1,
          "adLoadedCallback": AFSLoaded || null
        };
        let channel = gaEventUtils.getParam('channel');
        if (channel) {
          adPageOptions.channel = channel;
        }
        var test = gaEventUtils.getParam('test'); // 测试模式,需要在地址栏添加参数test=on
        if (test === 'on') {
          adPageOptions.adtest = 'on';
        }
        var adblock1 = { "container": "afs-box-1", "maxTop": 3 };
        var adblock2 = { "container": "afs-box-2", "number": 3 };
        var rsOption = { "container": "rs-box-1", "relatedSearches": 6 };
        var refer = document.referrer;
        if (refer.indexOf('https://www.adsensecustomsearchads.com') > -1 
        	|| refer.indexOf('https://syndicatedsearch.goog/') > -1)
        {
          _googCsa('ads', adPageOptions, adblock1, adblock2, rsOption);
        } else {
          // 本站跳转的
          _googCsa('ads', adPageOptions, rsOption);
        }
      }
    }
    // 获取搜索URL
    function getSearchUrl() {
      var url = `https://osontab.com/search.html?`;
      url = searchUrlAddParam(url, 'channel', gaEventUtils.getParam('channel'));
      url = searchUrlAddParam(url, 'network', gaEventUtils.getParam('network'));
      url = searchUrlAddParam(url, 'pid', gaEventUtils.getParam('pid'));
      var test = gaEventUtils.getParam('test');
      if (test === 'on') {
        url = searchUrlAddParam(url, 'test', 'on');
      }
      return url;
    }
    // 添加参数到URL
    function searchUrlAddParam(url, key, value = '') {
      if (!key || !value) {
        return url;
      }
      value = encodeURIComponent(value);
      if (url.indexOf('?') === -1) {
        url += `?${key}=${value}`;
      } else {
        if (url.indexOf('?') === (url.length - 1)) {
          url += `${key}=${value}`;
        } else {
          url += `&${key}=${value}`;
        }
      }
      return url;
    }

    let _adLoaded = false;
    function AFSLoaded(a, b, c, d) {
      if (b) {
        try {
          if (!_adLoaded) {
          // 上报事件
            // googleAnalytics('RS_Impression', { Entrance: 'Search' })
           // googleAnalytics('AD_Impression', { Entrance: 'Search' })
          }
          _adLoaded = true;
        } catch (e) {}
      }
    }

效果如图所示:
在这里插入图片描述
另外,当用户点击相关搜索中的关键词时,会跳转到新的搜索页,样式如图,有灰色加粗赞助商广告字样,即为adblock1
在这里插入图片描述

google分析

谷歌分析(Google Analytics)是一种强大的网络分析工具,帮助网站所有者和营销人员了解网站的流量和用户行为。

我们测试GA事件上报后,产品在后台才可以查看是否上报成功,这里需要注意不会立即生效,大概率需要在12h后生效

以下GA事件上报的代码是产品给的

// GA
<script async src="https://www.googletagmanager.com/gtag/js?id=G-HAHAHH***"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'G-7JJNQVM8QP');
</script>

然后我们根据约定好的埋点进行上报GA事件

投放链接格式,我们代码写完需要测试上报事件是否成功时,在地址栏输入下列格式,然后在约定好的埋点事件处触发GA上报:
网站地址:https://freefunh5.com/
参数1:channel=123
参数2(投放平台):network=tiktok
参数3:pid=123
https://freefunh5.com/?channel=2742178057&network=tiktok&pid=CSC91FBC77U2VKPC1K7G

// 这是谷歌内置方法,直接调用即可上报事件
// 事件名称和时间参数需要和产品约定好
gtag('event', 事件名称, 事件参数);

这里,我们最好封装一个自定义方法:\src\utils\gaEvent.js

const gaEventUtils = {
  // eventName:事件名
  // value:事件参数,默认为空
  googleAnalytics(eventName, value = {}) {
    console.log(eventName, value);
    // 判断用户为PC还是Mobile,方法自己写
    let type = 'Mobile' || 'PC'
    let system = 'Windows' || 'Android'

    let val = {
      // 公共属性
      channel: this.getParam('channel'),
      type: type,
      system: system,
      network: this.getParam('network')
    };
    Object.assign(val, value)
    gtag('event', eventName, val);
  },
}

// 将GA事件工具注册为全局方法
window.googleAnalytics = (eventName, value) => {
  gaEventUtils.googleAnalytics(eventName, value);
};
export default gaEventUtils;

main.js注册

import '@/utils/gaEvent' // 导入GA事件工具

调用示例

mounted() {
	// 直接调用
  googleAnalytics('Main_Page_Show')
}

监听广告点击click事件(广告追踪)

    let isBlurTriggered = false; // 击iframe位置
    function trackAdClick() {
        const activeElement = document.activeElement;
        if (!activeElement) return;

        // 检查是否是广告iframe
        if (activeElement.tagName !== 'IFRAME') return;

        // 获取广告容器
        let adContainer = null;

        // 尝试获取AFC广告容器
        adContainer = activeElement.closest('.adsbygoogle, .middle-ad-container, .afc-container');
        if (adContainer) {
            googleAnalytics('Click_AD', { ADType: 'AFC', Entrance: 'Search' });
            return;
        }

        // 尝试获取CSE广告容器
        adContainer = activeElement.closest('.gsc-adBlock, .gsc-adBlockVertical');
        if (adContainer) {
            googleAnalytics('Click_AD', { ADType: 'CSE', Entrance: 'Search' });
            return;
          }

          // 尝试获取RS广告
          adContainer = activeElement.closest('#rs-box-1')
          if (adContainer) {
            googleAnalytics('Click_AD', { ADType: 'RS', Entrance: 'Search' });
            return
        }
    }

    function initializeAdTracking() {
        // 页面即将关闭时
        window.addEventListener("beforeunload", () => {
            const activeElement = document.activeElement;
            if (activeElement?.tagName === 'IFRAME') {
                trackAdClick();
            }
        });
        // 页面失去焦点时(用户点击广告)
        window.addEventListener("blur", () => {
            const activeElement = document.activeElement;
            if (activeElement?.tagName === 'IFRAME') {
                isBlurTriggered = true;
                setTimeout(() => {
                    isBlurTriggered = false;
                }, 300);
            }
        });
        // 页面可见性改变时(广告在新窗口打开)
        window.addEventListener("visibilitychange", () => {
            if (document.visibilityState === 'hidden' && isBlurTriggered) {
                trackAdClick();
            }
        });
    }
	// 在页面加载完成后初始化广告追踪
    document.addEventListener("DOMContentLoaded", () => {
        initializeAdTracking();
    });
    //

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源免费】基于SpringBoot+Vue.JS网上摄影工作室系统(JAVA毕业设计)

本文项目编号 T 103 &#xff0c;文末自助获取源码 \color{red}{T103&#xff0c;文末自助获取源码} T103&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

基于SSM的“电器网上订购系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“电器网上订购系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页 商品类型 商品管理 订单展示 商品购物车 登录页面 …

【物联网】给EoRa Pi 烧录Meshtastic

文章目录 一、Meshtastic 是什么&#xff1f;二、Meshtastic 烧录过程1. 在线烧录工具2. 刷机进度 总结 一、Meshtastic 是什么&#xff1f; Meshtastic 是一种基于 LoRa 技术的离网通信平台。它通过低成本、低功耗的无线电设备&#xff0c;实现远距离自组网通信。可在脱离现有…

宝塔-firefox(Docker应用)-构建自己的Web浏览器

安装基础软件 宝塔中安装firefox(Docker应用) 。宝塔中需要先安装docker及docker-composefirefox配置安装 点击firefox应用&#xff0c;选择【安装配置】点击右边绿色按钮&#xff0c;进行安装&#xff0c;这一步等待docker-compose根据你的配置初始化docker应用 等待安装 …

windows 本地node版本快速升级

文章目录 前言一、前置条件二、使用步骤1.查看node 安装位置2.下载指定的node 版本3.下载后进行解压缩4. 删除覆盖原来的node文件夹内容5. 验证 总结 前言 Node.js 是一个开源、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js 基…

HTML4笔记

尚硅谷 一、前序知识 1.认识两位先驱 2.计算机基础知识 3.C/S架构与B/S架构 4.浏览器相关知识 5.网页相关概念 二、HTML简介 1.什么是HTML? 2.相关国际组织(了解) 3.HTML发展历史(了解)** 三、准备工作 1.常用电脑设置 2.安装Chrome浏览器 四、HTML入门 1.HTML初体验 2.H…

跟着逻辑先生学习FPGA-实战篇第二课 6-2 LED灯流水灯实验

** 硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad** 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 我们在《LED 灯…

【已解决】Latex中高亮段内命令(如参考文献引用、图、表格)

速览&#xff1a;解决前后图片对比拟解决的问题问题描述Latex高亮的一般做法段内有命令时候的高亮报错 问题原因 解决方案——在导言区为 \cite 等命令“注册”解决方案简要描述详细解释其他情况 速览&#xff1a;解决前后图片对比 解决前&#xff1a; 解决后&#xff1a; …

CSS中的“display“

简单记录一下&#xff0c;看图理解~&#xff08;图片来自于MDN Web&#xff09;

数字图像处理

一 形态学处理 ①二值图像 PS&#xff1a;1&#xff08;255&#xff09;代表的是白 0代表的是黑&#xff08;0就是什么都看不见&#xff0c;就是黑&#xff09; ②灰度图像 ③彩色图像 ④数学形态学基础&#xff1a;是分析几何形状和结构的数学方法&#xff0c;它建立在…

【项目日记(7)】第三层:页缓存的具体实现(上)

目录 前言1. 页缓存的具体结构2. 页缓存分配内存的全过程3. 页缓存分配内存的代码实现4. 优化代码&#xff0c;并完全脱离malloc5. 总结以及代码拓展 前言 在页缓存这一层中&#xff0c;负责给中心缓存分配大块儿的内存&#xff0c;以及合并前后空闲的内存&#xff0c;这一层为…

Python + 深度学习从 0 到 1(03 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 神经网络的数据表示 – 张量 你可能对矩阵很熟悉&a…

使用Docker-compose部署SpringCloud项目

docker编写dockfile遇到的问题&#xff1a; 需要在docker-compose.yml文件下执行命令 docker-compose.yml文件格式的问题 1和2处空2格&#xff0c;3处空1格&#xff0c;4为本地配置文件目录&#xff0c;5为docker容器的目录&#xff0c;version为自己安装的docker-compose版本 …

【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用

&#x1f31f; 关于我 &#x1f31f; 大家好呀&#xff01;&#x1f44b; 我是一名大三在读学生&#xff0c;目前对人工智能领域充满了浓厚的兴趣&#xff0c;尤其是机器学习、深度学习和自然语言处理这些酷炫的技术&#xff01;&#x1f916;&#x1f4bb; 平时我喜欢动手做实…

Tonghttpserver6.0.1.3 使用整理(by lqw)

文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装&#xff0c;启动和查看授权信息3.2一些常见的使用问题&#xff08;单机控制台&#xff09;3.3之前使用的是nginx&#xff0c;现在要配nginx.conf上的配置&#xff0c;在THS上如何配置3.4如何配置密码过…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数&#xff1a; 看看vul函数&#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移&#xff1a; 栈迁移需要用到leave ret 使用ROPgadget找地址&#xff1a; …

6.若依数据字典

数据字典 维护系统中常见的静态数据&#xff0c;例如&#xff1a;性别、状态等。 好处 不写死在页面上&#xff0c;而是通过数据库来维护&#xff0c;因为如果要修改&#xff0c;则只需要改数据库中的数据即可&#xff0c;不用每个地方都修改了。 字典类型的管理 字典数据的…

JVM学习-内存结构(二)

一、堆 1.定义 2.堆内存溢出问题 1.演示 -Xmx设置堆大小 3.堆内存的诊断 3.1介绍 1&#xff0c;2都是命令行工具&#xff08;可直接在ideal运行时&#xff0c;在底下打开终端&#xff0c;输入命令&#xff09; 1可以拿到Java进程的进程ID&#xff0c;2 jmap只能查询某一个时…

rust windwos 两个edit框

use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量&#xff0c;用于保存 Edit 控件的…

PostgreSQL 数据库连接

title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…