java解析facebook的android app直投下的Referral URL

news2025/2/25 11:14:10

背景:

在facebook的应用推广中,一般使用两种方式,一种是app直投,一种是w2a。

app直投就是用户点击广告直接跳转到应用商店进行下载应用

w2a就是通过落地页方式引导用户进行应用下载

在w2a模式下,可以通过落地页链接传递很多信息,丢失率极低,在android的app直投中,facebook是通过集成Google Play Install Referrer来实现广告元数据的透传的。

android可以通过fb的sdk拿到Google Play Install Referrer的数据如下:

utm_source=apps.facebook.com
&utm_campaign=fb4a
&utm_content=%7B%22app%22%117412253453453%2C%22t%22%3A1723086075%2C%22source%22%3A%7B%22data%22%3A%22767b16f17139f42928f097aa5dcd0c682584aca809fa42a795ac3b1f9537a5eb375587ff8dfe9c53f26465c6ec1c06d665eb365acdd4de51338b8c68dc65bb52e1a57bd74f17c46f8ab6e45a801ae9a6d60b8f434817044ab5c1e8c45a4de86747e1e165c9bcb0bc354dc0571fefecaeabdc343eb26a81aa65b70455620004b54654f985f625829efc87eba3470d74c174befa3e5267b441418854ced55efe89335af17816b49b3bbc890579abcfc83d4e71cbabd06d932e7832fb80d59c1379302d6e76226440c204c1e0ba8c8d2a612ba648f0f13814fef9e347c5eb562dafb5c0e668ee2b6efa4eb0290f3b1901f4f2c469852728f53fe824774a708d749dee56241a0fc46c15e64dba20f3c1132d0318adb66c68dcc5569131cccdcd7b2a2dc6a2bc0eb0eda2bd2a8ac3c6a15ea88163aac41e2e7167b764da6f7302a786fda4c7fe768003242f91c95c2e1a8a24a5a99f155f87d546793e89a7b254222f5216e0504db1880aa69515043d584ba4056bdf93159b0a433f234150653da8bc293b0dcd7d495946fe170a314348390dbbd79a69d8d8dfe58d44d3e3291d3f913ad4e7caff375b114580430745aee778ef9078861a87868f7d99d6f8c788ae%22%2C%22nonce%22%3A%22824936fdaa16b355c76c0b1d%22%7D%7D
utm_content中的data信息就是广告的元数据信息,那这个如何去解呢?
{"app":117412253453453,
   "t":1723086075,
   "source":{
		  "data":"767b16f17139f42928f097aa5dcd0c682584aca809fa42a795ac3b1f9537a5eb375587ff8dfe9c53f26465c6ec1c06d665eb365acdd4de51338b8c68dc65bb52e1a57bd74f17c46f8ab6e45a801ae9a6d60b8f434817044ab5c1e8c45a4de86747e1e165c9bcb0bc354dc0571fefecaeabdc343eb26a81aa65b70455620004b54654f985f625829efc87eba3470d74c174befa3e5267b441418854ced55efe89335af17816b49b3bbc890579abcfc83d4e71cbabd06d932e7832fb80d59c1379302d6e76226440c204c1e0ba8c8d2a612ba648f0f13814fef9e347c5eb562dafb5c0e668ee2b6efa4eb0290f3b1901f4f2c469852728f53fe824774a708d749dee56241a0fc46c15e64dba20f3c1132d0318adb66c68dcc5569131cccdcd7b2a2dc6a2bc0eb0eda2bd2a8ac3c6a15ea88163aac41e2e7167b764da6f7302a786fda4c7fe768003242f91c95c2e1a8a24a5a99f155f87d546793e89a7b254222f5216e0504db1880aa69515043d584ba4056bdf93159b0a433f234150653da8bc293b0dcd7d495946fe170a314348390dbbd79a69d8d8dfe58d44d3e3291d3f913ad4e7caff375b114580430745aee778ef9078861a87868f7d99d6f8c788ae"
		  ,"nonce":"824936fdaa16b355c76c0b1d"
	 }
}

需要使用facebook应用中的安装引荐来源解密密钥
在这里插入图片描述

那如何来解密呢?

import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.GCMBlockCipher;
import org.bouncycastle.crypto.params.AEADParameters;
import org.bouncycastle.crypto.params.KeyParameter;
import org.dromara.hutool.core.codec.binary.HexUtil;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

public class AESGCMExample {
    private static final int GCM_NONCE_LENGTH = 12; // GCM 计数器大小
    private static final int GCM_TAG_LENGTH = 16; // GCM 验证标签大小 (128位)
    
        public static void main(String[] args) throws Exception {
				// 密钥(这个是转过hex的,所以要先转回来)
        String keyStr= "使用自己的安装引荐来源解密密钥";
        byte[] decode = HexUtil.decode(keyStr);
        // 随机数
        String nonce ="824936fdaa16b355c76c0b1d";
        SecretKeySpec key = new SecretKeySpec(decode, "AES");// 将 key 转换为SecretKey
				// 密文
        String encryptedText = "767b16f17139f42928f097aa5dcd0c682584aca809fa42a795ac3b1f9537a5eb375587ff8dfe9c53f26465c6ec1c06d665eb365acdd4de51338b8c68dc65bb52e1a57bd74f17c46f8ab6e45a801ae9a6d60b8f434817044ab5c1e8c45a4de86747e1e165c9bcb0bc354dc0571fefecaeabdc343eb26a81aa65b70455620004b54654f985f625829efc87eba3470d74c174befa3e5267b441418854ced55efe89335af17816b49b3bbc890579abcfc83d4e71cbabd06d932e7832fb80d59c1379302d6e76226440c204c1e0ba8c8d2a612ba648f0f13814fef9e347c5eb562dafb5c0e668ee2b6efa4eb0290f3b1901f4f2c469852728f53fe824774a708d749dee56241a0fc46c15e64dba20f3c1132d0318adb66c68dcc5569131cccdcd7b2a2dc6a2bc0eb0eda2bd2a8ac3c6a15ea88163aac41e2e7167b764da6f7302a786fda4c7fe768003242f91c95c2e1a8a24a5a99f155f87d546793e89a7b254222f5216e0504db1880aa69515043d584ba4056bdf93159b0a433f234150653da8bc293b0dcd7d495946fe170a314348390dbbd79a69d8d8dfe58d44d3e3291d3f913ad4e7caff375b114580430745aee778ef9078861a87868f7d99d6f8c788ae";
        byte[] decrypt = decrypt(HexUtil.decode(encryptedText), HexUtil.decode(keyStr), HexUtil.decode(nonce));
        System.out.println("Decrypted Text: " + new String(decrypt));
    }
    
    public static byte[] decrypt(byte[] EncryptedText, byte[] key, byte[] iv) {
        try {
            GCMBlockCipher cipher = new GCMBlockCipher(new AESFastEngine());
            AEADParameters parameters = new AEADParameters(new KeyParameter(key), MacBitSize, iv, null);

            cipher.init(false, parameters);
            byte[] plainBytes = new byte[cipher.getOutputSize(EncryptedText.length)];
            int retLen = cipher.processBytes(EncryptedText, 0, EncryptedText.length, plainBytes, 0);
            cipher.doFinal(plainBytes, retLen);

            return plainBytes;
        } catch (IllegalArgumentException | IllegalStateException | DataLengthException | InvalidCipherTextException ex) {
            System.out.println(ex.getMessage());
        }

        return null;
    }

}

解密出来的内容

{
    "ad_id": 广告id,
    "ad_objective_name": "推广目标",
    "adgroup_id": 广告组id,
    "adgroup_name": "广告组名称",
    "campaign_id": 推广系列id,
    "campaign_name": "推广系列名称",
    "campaign_group_id": 未知,
    "campaign_group_name": "未知",
    "account_id": 广告主账户id,
    "is_instagram": false,
    "is_an": false,
    "publisher_platform": "facebook",
    "platform_position": null
}

官方只提供了php和python的写法,我这里是写的是在java服务端的解法

关于Facebook App Ads Referral URL

https://developers.facebook.com/docs/app-ads/install-referrer/

facebook应用管理地址

https://developers.facebook.com/apps/?show_reminder=true

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Repeat方法:取模运算教材与Unity控制台输出数值不同的原因

学习该知识点的参考教材:Unity API解析/陈宏泉编著.——北京:人民邮电出版社,2014.9 编辑脚本的环境:Visual Studio 2022 在学习该本教材的第五章Mathf类的内容,通过跟随教材上的代码了解不同UnityAPI的具体用法时&a…

【数据结构】七、查找:1.查找的概念、线性结构查找(顺序、折半(二分)、插值、稠密、分块、倒排)

一、查找Search 文章目录 一、查找Search1.查找的基本概念1.1基本概念1.2算法评价标准 二、线性结构1.顺序表查找❗1.1顺序查找1.1.1算法思想1.1.2顺序查找效率分析 2.有序表查找❗2.1折半查找2.1.1算法思想2.1.2判定树构造2.1.3通过判定树进行查找效率分析2.1.4被查找概率不相…

ReactNative笔记(自用)

环境 ios更换gem镜像源: 查看当前源: gem sources -l 移除默认源: gem sources --remove https://rubygems.org/。添加新的源: 添加 Ruby China 的镜像源: gem source -a https://gems.ruby-china.com/或者添加其他镜像源。 清华大学的gem源: htt…

进阶-1.存储引擎

存储引擎 存储引擎1.MySQL体系结构2.存储引擎简介3.存储引擎特点3.1 InnoDB3.2 MyISAM3.3 Memory 4. 存储引擎选择 存储引擎 1.MySQL体系结构 2.存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现。存储引擎是基于表的,而不是基于库的&…

【数学分析笔记】第2章第1节实数系的连续性(1)

2. 数列极限 2.1 实数系的连续性 人类对数系认识的历史: 人类最早对数系的认识是自然数集合 N \mathbb{N} N,自然数系对加法和乘法是封闭的(这里的封闭是指:若 m ∈ N , n ∈ N ⇒ m n ∈ N , m n ∈ N m\in\mathbb{N},n\in\ma…

芯片用什么胶粘接牢固?​​​​​​​

芯片用什么胶粘接牢固?芯片粘接胶的牢固性对于电子产品的性能和可靠性至关重要。选择合适的胶水可以确保芯片能够稳定、可靠地固定在基板上。芯片的粘接通常涉及几种不同类型的胶水,每种胶水都有其特定的应用场景和性能特点。以下是几种常见的用于芯片粘接的胶水类…

C Primer Plus第十二章编程练习

第十二章编程练习 第一题要求我们不使用全局变量&#xff0c;修改程序12.4&#xff0c;那我们就用指针作为参数去传递变量的地址&#xff0c;去修改变量的值&#xff0c;完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> //int units 0; void critic(int …

node卸载与安装

1.直接使用卸载程序卸载 2.安装新的Node 官网下载并执行下一步直到完成 3.Idea配置不同版本的node file->settings->Languages & Frameworks->Node.js and NPM->增加带选项->选择指定版本

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录 概述&#xff1a;主要实现了在宿主机上通过8000端口传递一张图像给docker镜像&#xff0c;然后镜像中处理后&#xff0c;通过8001端口回传处理后的图像给宿主机。 第一章、构建镜像 一、dockerfile文件 1.拉取…

jQuery:配置与选择器

一&#xff0c;jQuery的配置 jQuery下载 这里以compressed为例&#xff0c;根据喜好也可以选择uncompressed版本。 进入jQuery代码中&#xff0c;右键另存为&#xff0c;保存到自己项目中&#xff1a; 导入jQuery <!DOCTYPE html> <html lang"en"><…

WO Mic 手机变身免费麦克风

目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…

ONNX深入研究(1):AI模型优化与加速方法

得益于现有的硬件和加速器&#xff0c;深度学习在 2010 年代初开始兴起&#xff0c;在这种支持下&#xff0c;研究人员和工程师提出了更复杂、更大的模型。然而&#xff0c;内存消耗和执行时间等限制仍然是一个挑战。由于计算资源的限制&#xff0c;这些挑战在工程和商业领域变…

UE5学习笔记11-为拿取武器添加动画

一、一点说明 动画实例通过扩展为所有机器上的每个字符都存在动画蓝图&#xff0c;动画实例只能访问该计算机上的变量。 二、思路 我在武器组件中有一个武器类的指针&#xff0c;判断当前指针是否为空去判断当前角色是否装备武器 三、实现 1.在角色C类中添加是否装备武器的函…

OpenCV--图片操作

一.图片旋转 图片旋转是图像处理中的一种基本操作&#xff0c;用于将图像按照指定的角度进行旋转。旋转操作在图像编辑、计算机视觉和图形学等领域中非常常见&#xff0c;通常用来调整图像的方向或在图像识别中进行数据增强。 旋转的基本原理 图片旋转涉及到将每个像素从原始…

(贪心) LeetCode 376. 摆动序列

原题链接 一. 题目描述 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2,…

电脑技巧:电脑系统盘文件清理指南

目录 一、可以安全删除的文件 1.1. 临时文件 1.2. 系统缓存文件 1.3. 回收站 1.4. 安装包缓存 1.5. 系统还原点 1.6. 已下载的更新文件 1.7. 浏览器缓存 1.8. Thumbs.db 文件 1.9. Windows日志文件 1.10. Windows.old 文件夹 二、系统文件清理注意点 三、系统文件…

推荐一款Python开源移动应用安全测试分析工具!!!

今天给大家推荐一个安全测试相关的开源项目&#xff1a;nccgroup/house 1、介绍 它是一个由 NCC Group 开发的&#xff0c;一个基于Frida和Python编写的动态运行时移动应用分析工具包&#xff0c;提供了基于 Frida 的 Web GUI 界面&#xff0c;旨在简化动态函数挂钩的过程&am…

Linux---04---Vim编辑器

一、vi/vim编辑器介绍 vi 是 visual interface 的简称&#xff0c;是Linux系统提供的一个文本编辑工具&#xff0c;可以对文件内容进行编辑&#xff0c;类似于Windows中的记事本。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c…

Using locally deployed llm with langchain‘s openai llm wrapper

题意&#xff1a;使用本地部署的LLM与Langchain的OpenAI LLM封装器 问题背景&#xff1a; I have deployed llm model locally which follows openai api schema. As its endpoint follows openai schema, I dont want to write separate inference client. 我已经本地部署了…

Mybatis框架介绍

Mybatis入门 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Jav…