[Ruby] 使用 API 获取 Facebook 广告数据

寻技术 Ruby编程 2023年08月06日 163

环境

红宝石 2.6.6
导轨 6.0.4.7
Gem facebookbusiness(Meta官方发布的SDK)
(※如果你用google搜索,gem 'facebook_ads' 等会出现,但请注意不是那个)
API 版本 v14.0(2022 年 8 月最新)

你想做的事

  1. 获取所有已通过 Meta for Developer 上的应用程序权限的广告帐户
  2. 获取每个广告帐户昨天的效果(展示次数、点击次数、费用等)

    一点商业背景

    我们公司在网络广告方面投入了很多精力,如果我们把所有业务的facebook广告账户加起来,我们大约有80个账户,包括我们不使用的那些。 (和广告公司一样)

    过去,每个账户的负责人每天都要手动将信息输入到谷歌电子表格中,通过链接数据透视表和工作表进行汇总,并目视检查,这使得工作相当复杂。这次的背景是通过点击 facebook api 将其自动化到电子表格的输入。

    在本文中,我将解释如何调用 facebook 信息。

    前提

    1. 为开发者制作 Meta 应用

    如果您还没有,请创建访问令牌和应用程序机密。这里有很多日文文章,所以你不应该有任何麻烦。

    2. 了解 Facebook 的广告管理架构

    有用户,有广告账号,里面有campaign,有ad set等,了解imp,click,cost等PPC广告的基本结构和基本术语。好。

    以这些知识为前提,我会告诉你如何真正从facebook的API的概念上来。

    首先,Facebook 的 API 是什么?

    ・关键词是“node”和“edge”

    了解更多信息官方文件我会留给你,但粗略地说......

    节点:对象(接口),例如“用户”或“广告帐户”

    任何熟悉 Javascript 的人都会熟悉 DOM 节点的概念。

    边缘:连接物体的东西

    DB 关系和 JOIN 等概念。比如你想调用一个广告账号中的(多个)campaign,你可以写成AdAccount.campaigns这样调用,但是这个点下面的部分是边缘。该边可以调用链接到链中对象的对象。

    ・在 Ruby 中,您可以使用宝石“facebookbusiness”点击

    这个 Gem 允许你像对象和方法一样处理上述节点和边,而不是 http 请求⇔响应的形式。

    顺便一提,facebook 端的 Gem 自动更新总是命中最新的 API 版本所以,基本上维护只需要更换access_token。

    准备

    首先准备gem并安装它。

    宝石文件
    gem 'facebookbusiness'
    

    初始设定

    facebook_api.rb
    require 'facebookbusiness'
    
    class FacebookAPI
    	def initialize
    		# facebook APIの初期設定
        FacebookAds.configure do |config|
          config.access_token = '<発行したアクセストークン>'
          config.app_secret = '<発行したアプリ・シークレット>'
        end
    	end
    end
    

    * 在凭证中酌情包括令牌和其他项目。顺便说一句,有“短期”(1-2 小时内到期)和“长期”(2 个月)访问令牌。过去,可以从长期访问令牌发行无限期令牌,但现在似乎不可能。

    1:获取您的账户信息

    user = FacebooAd::User.get('me')
    #<FacebookAds::User {:id=>"me"}>
    

    这里有两点

    1)“我”被视为特殊节点

    用户信息通常使用 .get(id) 访问,但通过指定节点“me”,API 端将通过查看请求时附加的访问令牌和应用程序机密自动拉取它。

    2) 在这个阶段我还没有点击 API

    简单写“get”不会命中API,API会在发送需要获取特定信息的消息的时机命中。

    user = FacebooAd::User.get('me')
    user.name
    # "寺尾 たくみ"
    

    对象持有的信息,例如name,称为字段。你可以在官方文档中查看这个,如果你查看gem的内容,

    用户.rb
    module FacebookAds
    	class User < AdObject
    		field :about, 'string'
        field :age_range, 'AgeRange'
        field :birthday, 'string'
        field :cover, 'UserCoverPhoto'
        field :currency, 'Currency'
        field :education, { list: 'object' }
        field :email, 'string'
        field :favorite_athletes, { list: 'Experience' }
        field :favorite_teams, { list: 'Experience' }
        field :first_name, 'string'
        field :gender, 'string'
        field :hometown, 'Page'
        field :id, 'string'
    		...
    		...
    		...
    	end
    end
    

    由于它们像这样排列成一排,因此您可以从该列表中搜索您想要的信息。不要害怕git克隆宝石.

    此外,由于大多数对象都继承自 AdObject 类,因此您可以使用各种方便的方法。

    user = FacebookAds::User.get('me')
    user.load! # 今すぐAPIを叩いて自身のインスタンスを書き換える
    user
    #<FacebookAds::User {:id=>"<自分のアカウントID>"}>
    
    user = FacebookAds::User.get('me',['name', 'id']) # argにほしいフィールドを配列でもたせる
    user.load!
    user.inspect
    #<FacebookAds::User {:id=>"<自分のアカウントID>", :name=>"寺尾 たくみ"}>
    
    user.to_hash
    #{:id=>"<自分のアカウントID>", :name=>"寺尾 たくみ"}
    

    不要害怕git克隆宝石.

    2:获取与您的帐户关联的广告帐户

    这次我想要的是与用户关联的所有广告帐户。在此处检查宝石的边缘。

    用户.rb
    class User < AdObject
    	### 略 ###
    	has_edge :accounts do |edge|
        edge.get 'Page' do |api|
          api.has_param :is_place, 'bool'
          api.has_param :is_promotable, 'bool'
        end
    	...
    	end
    
    	### 略 ###
    	
    	has_edge :adaccounts do |edge|
        edge.get 'AdAccount'
      end
    end
    

    有两个类似帐户的,但上面的一个可能是 Facebook 页面。原来广告账号在底部是adaccounts

    user = FacebookAds::User.get('me')
    user.adaccounts
    #<#<Class:0x0000aaaaf8eaea18>:0x0000aaaafa39f210
     @name=:adaccounts,
     @node=#<FacebookAds::User {:id=>"me"}>,
     @options={},
     @should_delegate=false>
    

    在这个阶段,它是一个普通对象,其节点(=object)是用户,边名@name 是 adaccounts。

    user.adaccounts.all # allですべて取り出す
    
    #[#<FacebookAds::AdAccount {:account_id=>"xxx", :id=>"yyy"}>,
     #<FacebookAds::AdAccount {:account_id=>"xxx", :id=>"yyy"}>,
     #<FacebookAds::AdAccount {:account_id=>"xxx", :id=>"yyy"}>,
     #<FacebookAds::AdAccount {:account_id=>"xxx", :id=>"yyy"}>]
    

    为了查看所有的内容,需要打API,所以取pp的结果是名为AdAccount的对象及其字段(id)如上图。

    3:获取您的广告帐户数据

    现在我们有了广告帐户的对象,我们要调用有关帐户执行情况的数据。 (展示次数、点击次数、费用等)

    此数据位于另一个名为 AdInsights 的对象的字段中,因此我使用我的广告帐户中的 Edge 连接到 AdInsights。

    user.adaccounts.each do |account|
    	fields = %w[account_id account_name impressions inline_link_clicks spend]
    	account.insights(fields: fields).each do |insight|
    		insight.inspect
    	end
    end
    #<FacebookAds::AdsInsights {:account_id=>"xx", :account_name=>"なまえ", :impressions=>"1000", :inline_link_clicks=>"100", :spend=>"10000", :date_start=>"2022-07-06", :date_stop=>"2022-08}>
    

    关键是边缘也可以指定为字段。既然已经成功调用了数据,

    insight.impressions
    # 1000
    
    insight.spend
    # 10000
    

    等等,随心所欲地使用它。但是,如果您尝试引用无法获取的值,则 AdObject 具有的#load! 将失败,因此请小心。特别是数值为0就不能取数值,所以如果要取便宜的瓷砖...

    insight[:impressions]
    # 1000
    
    insight.[:spend]
    # 10000
    
    insight[:conversions]
    # nil
    

    你可以用这样的符号来调用它。

    4:添加参数缩小条件

    默认情况下,之前调用的数据调用了一个月的聚合数据。但是,我只想调用昨天的总数并每天管理批次...因此,我们通过添加参数来缩小范围。

    请注意,AdInsights 对象负责 API 之间的洞察 API,因此您应该参考该文档参考。

    ・图​​形API
    ・洞察API
    ・营销API

    由于分为三个API,你应该寻找你想要的对象的API并查看参考。

    fields = %w[account_id account_name impressions inline_link_clicks spend]
    target_date = '2022-08-05'
    time_range = { 'since': target_date, 'until': target_date }
    
    account.insights({ fields: fields, time_range: time_range}).each do |insights|
    	insights.inspect
    end
    

    这一次,我们只用 time_range 调用了昨天的数据。如果设置了字段,请将它们插入花括号中。

    综上所述

    国内关于facebook的API的资料很少,尤其是取广告账号信息的那个……我希望这篇文章能帮助那些挑战 Facebook 的 API 的人。

原创声明:本文系作者授权九品源码发表,未经许可,不得转载;

原文地址:https://www.19jp.com/show-308623765.html

关闭

用微信“扫一扫”