Facebook广告投放数据API对接流程

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者:zhu6201976

一、需求背景

App在Facebook、Google等巨头进行广告投放,想要拿到实时广告投放效果数据,如曝光、点击、花费、触达等核心指标并进行分析,可对接官方API实现。因对接过程十分复杂,此处以Facebook为例,进行简单记录。

二、对接流程

1.文档地址

https://developers.facebook.com/docs/marketing-api/insights

2. access_token获取

a. 创建App https://developers.facebook.com/apps

b. 添加产品

  • 点击进入某个App --> Add products to your app --> Marketing API --> Set up

  • 点击左下角Marketing API --> Tools --> 勾选token权限 --> Get Token 即可生成一个长效token,有效期2个月,过期后需要重新生成 步骤相同

c. 查看access_token有效期(可选)

复制保存步骤2生成的token,查看有效期。

地址:https://developers.facebook.com/tools/debug/accesstoken

如图所示,通过此种方式,可以获取到一个有效期2个月的长效access_token。

三、示例代码

获取到长效access_token后,我们可以开始请求广告数据了。

    def __init__(self, **kwargs):super().__init__(**kwargs)self.api_url = 'https://graph.facebook.com'self.api_version = 'v19.0'

1. 获取所有广告账号adaccount

    def start_requests(self):page = 1url = f'{self.api_url}/{self.api_version}/me/adaccounts?'params = {'fields': 'id,name','access_token': self.access_token}url = f'{url}{urlencode(params)}'yield scrapy.Request(url, meta={'page': page}, priority=1, callback=self.parse_adaccounts)

通过该API,可以获取到所有广告账号,分页返回,每页25条。fields字段控制返回的字段,此处为account_id、account_name。

后续翻页控制代码:

resp_str = resp.body.decode('utf-8', 'ignore')
resp_dict = json.loads(resp_str)
next_url = resp_dict.get('paging', {}).get('next')
if next_url:page += 1yield scrapy.Request(next_url, meta={'page': page}, priority=1, callback=self.parse_adaccounts)

2. 获取广告账号广告量

为什么要获取广告账号广告量?因为如果某个广告账号下根本没有投放广告,则无需后续请求,提高效率,减少请求次数。

    def get_adaccount_ads_volume_req(self, ad_account_id, ad_account_name):"""构造账号广告量查询请求https://developers.facebook.com/docs/marketing-api/insights-api/ads-volume:param ad_account_id::return:"""url = f'{self.api_url}/{self.api_version}/{ad_account_id}/ads_volume?'params = {'access_token': self.access_token}url = f'{url}{urlencode(params)}'return scrapy.Request(url,meta={'ad_account_id': ad_account_id,'ad_account_name': ad_account_name},priority=2,callback=self.parse_adaccount_ads_volume)

解析账号广告量响应代码:

        resp_str = resp.body.decode('utf-8', 'ignore')resp_dict = json.loads(resp_str)# self.logger.info(f'{method_name} {ad_account_id} {resp_dict}')ads_volume = resp_dict.get('data', [])self.logger.info(f'{method_name} {ad_account_id} 提取到 {len(ads_volume)} ads_volume')for volume in ads_volume:ads_running_or_in_review_count = volume.get('ads_running_or_in_review_count', 0)if ads_running_or_in_review_count > 0:yield self.get_campaigns_req(ad_account_id, ad_account_name, page=1)

3. 获取广告账号所有campaign

    def get_campaigns_req(self, ad_account_id, ad_account_name, page):"""构造启动campaigns请求:param ad_account_id::param ad_account_name::param page::return:"""url = f'{self.api_url}/{self.api_version}/{ad_account_id}/campaigns?'params = {'effective_status': "['ACTIVE', 'PAUSED']",'fields': 'id,name','access_token': self.access_token,}url = f'{url}{urlencode(params)}'return scrapy.Request(url,meta={'ad_account_id': ad_account_id,'ad_account_name': ad_account_name,'page': page},priority=2,callback=self.parse_get_campaigns)

4. 对campaign聚合获取所有广告

该步骤非常重要,我们无需通过完整路径:adaccount --> campaign --> adset --> ads 获取到广告数据,可以利用API的level进行聚合,直接在campaign层级获取到所有广告投放数据。如下所示:

    def ad_insights_req(self, ad_account_id, ad_account_name, ad_campaign_id, ad_campaign_name, d_str, page):url = f'{self.api_url}/{self.api_version}/{ad_campaign_id}/insights?'params = {'level': 'ad','fields': 'adset_id,adset_name,ad_id,ad_name,impressions,clicks,unique_clicks,spend,reach,cpc,cpm,cpp,ctr,' +'date_start,date_stop,actions,action_values',# 'date_preset': 'today',  # today,yesterday,last_7d,last_30d,...'time_range': '{"since":' + f'"{d_str}"' + "," + '"until":' + f'"{d_str}"' + "}",'access_token': self.access_token,}url = f'{url}{urlencode(params)}'return scrapy.Request(url,meta={'ad_account_id': ad_account_id,'ad_account_name': ad_account_name,'ad_campaign_id': ad_campaign_id,'ad_campaign_name': ad_campaign_name,'d_str': d_str,'page': page},priority=3,callback=self.parse_ad_insights)

 5. 解析广告数据

        for ad in ads:ad_insights_item = FbAdInsightsItem()ad_insights_item['ad_account_id'] = ad_account_idad_insights_item['ad_account_name'] = ad_account_namead_insights_item['ad_campaign_id'] = ad_campaign_idad_insights_item['ad_campaign_name'] = ad_campaign_namead_insights_item['ad_set_id'] = ad.get('adset_id', '')ad_insights_item['ad_set_name'] = ad.get('adset_name', '')ad_insights_item['ad_id'] = ad.get('ad_id', '')ad_insights_item['ad_name'] = ad.get('ad_name', '')ad_insights_item['impressions'] = ad.get('impressions', '')ad_insights_item['clicks'] = ad.get('clicks', '')ad_insights_item['unique_clicks'] = ad.get('unique_clicks', '')ad_insights_item['spend'] = ad.get('spend', '')ad_insights_item['reach'] = ad.get('reach', '')ad_insights_item['cpc'] = ad.get('cpc', '')ad_insights_item['cpm'] = ad.get('cpm', '')ad_insights_item['cpp'] = ad.get('cpp', '')ad_insights_item['ctr'] = ad.get('ctr', '')ad_insights_item['date_start'] = ad.get('date_start', '')ad_insights_item['date_stop'] = ad.get('date_stop', '')

一键三连,有需要的请私聊获取详细源码。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VM虚拟机Linux系统Redhat7.4版本进行网络配置

日常中自己搭建的虚拟机一般用到两种网络方式,第一种是仅主机模式、还有一种是NAT模式。 1、仅主机模式:可以和自己本地电脑,或者虚拟机和虚拟机之间进行网络通信,相当于一个局域网,是不能连接外网的。 2、NAT模式&a…

26、链表-环形链表II

思路: 这道题就是判断链表中是否有环,首先使用集合肯定可以快速地解决,比如通过一个set集合遍历,如果遍历过程中有节点在set中已经存在那么说明存在环。返回这个节点即可 第二种方式就是通过快慢指针方式寻找环。如何做呢&#xf…

Unity 获取RenderTexture像素颜色值

拿来吧你~ 🦪功能介绍🌭Demo 🦪功能介绍 💡不通过Texture2D 而是通过ComputerShader 提取到RenderTexture的像素值,效率有提升哦! 💡通过扩展方法调用,方便快捷:xxxRT.G…

DRF多表关联的序列化和反序列化

DRF多表关联的序列化和反序列化 目录 DRF多表关联的序列化和反序列化序列化定制字段source一对多的序列化 多表关联的序列化方式1:在表模型中定义方法方式2:定制返回格式SerializerMethodField方式3:子序列化 多表关联的反序列化反序列化保存…

安达发|电子行业智能生产排程计划的实施

随着科技的不断发展,电子行业正面临着巨大的变革。在这个过程中,智能生产排程计划的实施成为了提高生产效率、降低成本的关键因素。本文将详细介绍电子行业智能生产排程计划的实施方法、优势以及可能遇到的挑战。 一、实施方法 1. 数据采集与分析&#x…

0101tomcat部署war访问mysql失败-容器间通信-docker项目部署

文章目录 一、简介二、部署1、mysql数据迁移2、docker部署redis3、docker部署tomcat并运行war包 三、报错四、解决1 分析2 解决 结语 一、简介 最近参与开发一个项目,其中一部分系统需要迁移。从阿里云迁移到实体服务器,使用docker部署。系统使用Java语…

【STK】手把手教你利用STK进行导弹和反导仿真03 - STK/MMT模块02 导弹飞行工具用户界面

MFT导弹飞行工具是MMT模块中的核心部分,它提供多级导弹飞行轨迹,易于在STK中分析和可视化。对于一个特定的导弹模型,可通过定义发射点和打击点及轨迹类型,生成飞行轨迹和飞行数据。 MFT提供代表多种导弹类型和性能参数的导弹数据库…

Windows server SMB服务 文件夹访问缓慢 解决方法

Windows server用了很久,一直有个问题没有解决,就是用手机访问SMB时,文件夹列出速度非常慢,今天去翻阅了一下官方文档,找到了解决办法。 更改注册表SMB服务的工作进程数 HKLM\System\CurrentControlSet\Control\Sessi…

使用Riverpod在Flutter中创建Todo列表

使用Riverpod在Flutter中创建Todo列表 视频 https://youtu.be/mlbeSD1KSIo https://www.bilibili.com/video/BV1jj42197c8/ 前言 原文 https://ducafecat.com/blog/flutter-todo-list-with-riverpod-guide-02 学习如何使用Riverpod在Flutter中构建一个功能完整的Todo列表应用…

MySQL前缀索引(3/16)

前缀索引 前缀索引:MySQL支持前缀索引,允许定义字符串的一部分作为索引。如果不指定前缀长度,索引将包含整个字符串。前缀索引可以节省空间,但可能会增加查询时的记录扫描次数(因为会查询到多个前缀相同的数据&#x…

动态规划原理及其在优化问题中的应用解析

动态规划原理及其在优化问题中的应用解析 一、最优子结构二、重叠子问题三、何时使用动态规划法四、伪代码示例五、C代码示例七、详细说明动态规划原理7.1、最优子结构7.2 重叠子问题7.3 动态规划的实现 八、结论 动态规划是一种解决优化问题的方法,它通过将原问题分…

JavaScript代码挑战

让我们回到朱莉娅和凯特关于狗的研究。这次,他们想把狗的年龄转换成人的年龄,并计算出研究中狗的平均年龄。 创建一个函数 “calcAverageHumanAge”,该函数接受一个狗的年龄数组(‘age’),并按顺序执行以下…