You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用Facebook Graph API上传Reels时遇未授权错误

Facebook Graph API上传Reel时的NotAuthorizedError问题解决

问题描述

使用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"}}

排查与解决建议

  • 权限与令牌校验

    1. 确认使用页面访问令牌:上传Reel需要pages_manage_posts、pages_read_engagement、video_upload权限,且必须是页面令牌(而非用户令牌)。可通过Graph API Explorer生成长期有效页面令牌,避免令牌过期。
    2. 检查应用访问范围:若应用处于开发模式,仅管理员、测试用户可调用API,需确保当前账号在测试用户列表内;若要面向所有用户使用,需提交Facebook审核并切换至上线模式。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:10:32