如何通过Facebook Marketing API分页获取广告定向兴趣全量列表?
解决Facebook Marketing API全量兴趣列表获取的分页问题
我之前帮不少开发者踩过这个API的坑,你遇到的328条结果限制,核心原因其实是两个:API默认分页的游标没正确用起来,以及兴趣本身是层级结构,得递归遍历子分类才能拿到全量数据。下面一步步给你拆解解决方法:
1. 先搞定基础分页:用游标替代传统页码
Facebook Graph API的分页逻辑不是靠page参数,而是依赖返回结果里的paging.cursors中的after值。你之前的分页失败大概率是没抓对这个游标:
- 第一次调用时,一定要把
limit拉到最大(adinterest类型单次最多返回1000条),调用示例:GET /v18.0/search?type=adinterest&q=&limit=1000&access_token=你的令牌 - 拿到返回的JSON后,找到
paging.cursors.after这个字段,把它作为下一次调用的after参数:GET /v18.0/search?type=adinterest&q=&limit=1000&after=上一次的游标值&access_token=你的令牌 - 重复这个过程,直到返回的结果里没有
paging.cursors.after,说明顶层兴趣已经全部获取完了。
⚠️ 划重点:默认不带limit的话,API只会返回300-350条左右的结果,这就是你拿到328条的直接原因——没触发完整的分页流程。
2. 递归遍历子兴趣:拿到全量数据的关键
Facebook的兴趣是树状层级结构,比如顶层的「科技」下面有「人工智能」,「人工智能」下面还可能有「大模型」这类细分兴趣。默认的/search调用只返回顶层和一级子兴趣,要拿到全量得这么做:
- 对每一条获取到的兴趣,检查
children字段是否为true; - 如果是,用该兴趣的
id作为parent_id参数再次调用API:GET /v18.0/search?type=adinterest&q=&limit=1000&parent_id=目标兴趣ID&access_token=你的令牌 - 对返回的子兴趣重复上述检查和调用,直到所有层级的兴趣都被遍历完。
3. 常见坑点排查
- 权限验证:确保你的access token有
ads_management或business_management权限,并且关联了有效的广告账户; - API版本:尽量用最新的API版本(比如v18.0),旧版本的分页逻辑可能有差异;
- 速率限制:Facebook API有调用频次限制,别一次性猛发请求,建议每次调用间隔1-2秒,避免被限流。
最后给你一段伪代码逻辑,帮你理清完整流程:
def fetch_all_interests(parent_id=None, after_cursor=None): # 组装请求参数 params = { "type": "adinterest", "q": "", "limit": 1000, "access_token": "你的令牌" } if parent_id: params["parent_id"] = parent_id if after_cursor: params["after"] = after_cursor # 发起请求 response = requests.get("https://graph.facebook.com/v18.0/search", params=params) interest_data = response.json() # 保存当前页的兴趣数据(这里替换成你的存储逻辑) save_to_database(interest_data["data"]) # 处理分页:如果有下一页游标,继续调用 if "paging" in interest_data and "cursors" in interest_data["paging"] and "after" in interest_data["paging"]["cursors"]: fetch_all_interests(parent_id, interest_data["paging"]["cursors"]["after"]) # 处理子兴趣:如果当前兴趣有子分类,递归调用 for interest in interest_data["data"]: if interest.get("children"): fetch_all_interests(interest["id"]) # 启动全量兴趣获取 fetch_all_interests()
按照这个逻辑走,就能拿到完整的Facebook广告定向兴趣列表了。
内容的提问来源于stack exchange,提问作者Moisés Torres García




