使用Python调用Facebook Graph API上传Reels时遇未授权错误
问题描述
使用Python调用Facebook Graph API上传Reel时,持续触发未授权错误,错误信息如下:
{"debug_info":{"retriable":false,"type":"NotAuthorizedError","message":"用户未被授权执行此请求"}}
已为应用和页面授予所有可见权限,相关代码及输出如下:
用户提供的代码
import requests import os import json Title ="Title of the video" title = Title description = title source = f"F:\proj_ytTofb\downloads\{Title}.mp4" files = {'source': open(source, 'rb')} file_size = os.path.getsize(source) print("File Size is :", file_size, "bytes") def Initialize(): url = f"https://graph.facebook.com/v13.0/{page_id}/video_reels?upload_phase=start" payload = { 'access_token': token, } r = requests.post(url, data = payload) return r.json()["video_id"] video_id=Initialize() print(video_id) def Upload(): url = f"https://rupload.facebook.com/video-upload/v15.0/{video_id}" payload ={ 'access_token': token, 'offset': 0, 'file_size': file_size, } r = requests.post(url, files=files, data=payload) return r.text print(Upload())
输出结果
{"debug_info":{"retriable":false,"type":"NotAuthorizedError","message":"User not authorized to perform this request"}}
排查与解决建议
权限与令牌校验
- 确认使用页面访问令牌:上传Reel需要
pages_manage_posts、pages_read_engagement、video_upload权限,且必须是页面令牌(而非用户令牌)。可通过Graph API Explorer生成长期有效页面令牌,避免令牌过期。 - 检查应用访问范围:若应用处于开发模式,仅管理员、测试用户可调用API,需确保当前账号在测试用户列表内;若要面向所有用户使用,需提交Facebook审核并切换至上线模式。
- 确认使用页面访问令牌:上传Reel需要
API版本一致性
代码中初始化请求用v13.0版本,上传请求用v15.0版本,版本不匹配可能导致权限校验逻辑异常。建议统一使用较新的稳定版本(如v18.0),上传端点需对应版本格式:https://rupload.facebook.com/video-upload/v18.0/{video_id}上传请求格式修正
上传阶段的offset和file_size需通过请求头传递,而非表单参数;同时需确保文件流指针在起始位置(可重新打开文件或调用seek(0))。
修正后的代码示例
import requests import os # 替换为实际的页面ID和页面访问令牌 page_id = "YOUR_PAGE_ID" token = "YOUR_PAGE_ACCESS_TOKEN" Title = "视频标题" # 转义Windows路径的反斜杠 source = f"F:\\proj_ytTofb\\downloads\\{Title}.mp4" file_size = os.path.getsize(source) print("文件大小:", file_size, "字节") def Initialize(): url = f"https://graph.facebook.com/v18.0/{page_id}/video_reels?upload_phase=start" payload = {'access_token': token} r = requests.post(url, data=payload) response_data = r.json() # 增加错误处理,避免初始化失败直接崩溃 if 'video_id' not in response_data: print("初始化失败:", response_data) return None return response_data["video_id"] video_id = Initialize() if not video_id: exit() print("获取到视频ID:", video_id) def Upload(): url = f"https://rupload.facebook.com/video-upload/v18.0/{video_id}" headers = { 'X-FB-Offset': '0', 'X-FB-File-Size': str(file_size), 'Authorization': f"Bearer {token}" } # 重新打开文件,确保读取指针在起始位置 with open(source, 'rb') as file_stream: r = requests.post(url, headers=headers, data=file_stream) return r.text print("上传结果:", Upload())
内容的提问来源于stack exchange,提问作者Rezwoan Faisal
相关产品推荐
相关产品推荐

