使用Facebook Graph API获取本人原账号音视频帖URL遇无数据问题
问题描述
用户最初询问是否可通过Facebook Graph API抓取非本人公共账号下所有视频和照片帖子的URL,后说明目标账号实际为自己曾拥有的账号。用户编写了Python代码尝试实现需求,但调用接口后始终无法获取返回数据中的data字段,导致照片和视频URL列表为空,用户认为已配置好所需权限,疑惑问题产生的原因。
用户提供的代码如下:
#url = "https://www.facebook.com/profile.php?id=myid&sk=videos" access_token = "mytoken" import requests user_id = "myid" def retrieve_urls(access_token, user_id): url = f"https://graph.facebook.com/v7.0/{user_id}/posts?fields=attachments&access_token={access_token}" print(url) response = requests.get(url) data = response.json() video_urls = [] photo_urls = [] if 'data' in data: for post in data['data']: if 'attachments' in post: for attachment in post['attachments']['data']: if attachment['type'] == 'video': video_urls.append(attachment['media']['source']) elif attachment['type'] == 'photo': photo_urls.append(attachment['media']['image']['src']) else: print("notta") return photo_urls, video_urls photo_urls, video_urls = retrieve_urls(access_token, user_id) print("Photo URLs:", photo_urls) print("Video URLs:", video_urls) #myid/target id and mytoken have been replaced that is not the issue. #I never received the 'data' therefore all my lists were returned empty. I do not understand why. I believe I have all the permissions.
排查与解决方案
- API版本过时:你使用的Graph API v7.0属于老旧废弃版本,权限规则和响应格式已发生变化,建议更换为最新稳定版本(如v18.0),保障兼容性和功能支持。
- 权限与账号状态验证:
- 确认
access_token是否包含user_posts权限,且该token是通过目标账号(你曾拥有的账号)授权生成;若账号当前已不属于你管理,即使曾拥有,权限也可能已失效。 - 检查目标账号隐私设置:如果账号设置了严格的隐私权限,API无法获取公开范围外的内容。
- 确认
- 打印错误信息:你的代码仅判断
data是否存在,未处理错误场景。当无data返回时,JSON中大概率包含error字段,打印该字段可直接定位问题(如权限不足、用户ID无效、API版本错误等)。 - 更换精准端点:
/posts端点返回所有类型帖子,过滤附件效率低。针对视频和照片建议使用专门端点:- 获取视频:
/{user_id}/videos - 获取照片:
/{user_id}/photos
这些端点直接返回对应类型内容,无需额外过滤附件。
- 获取视频:
优化后的代码示例
import requests access_token = "mytoken" user_id = "myid" api_version = "v18.0" def retrieve_media_urls(access_token, user_id, api_version): photo_urls = [] video_urls = [] # 获取照片 photo_url = f"https://graph.facebook.com/{api_version}/{user_id}/photos?fields=images&access_token={access_token}" photo_response = requests.get(photo_url) photo_data = photo_response.json() if 'error' in photo_data: print(f"照片接口错误: {photo_data['error']}") elif 'data' in photo_data: for photo in photo_data['data']: # 取分辨率最高的图片链接 photo_urls.append(photo['images'][0]['source']) # 获取视频 video_url = f"https://graph.facebook.com/{api_version}/{user_id}/videos?fields=source&access_token={access_token}" video_response = requests.get(video_url) video_data = video_response.json() if 'error' in video_data: print(f"视频接口错误: {video_data['error']}") elif 'data' in video_data: for video in video_data['data']: video_urls.append(video['source']) return photo_urls, video_urls photo_urls, video_urls = retrieve_media_urls(access_token, user_id, api_version) print("Photo URLs:", photo_urls) print("Video URLs:", video_urls)
内容的提问来源于stack exchange,提问作者A New Soul
相关产品推荐
相关产品推荐

