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

使用Python调用Dailymotion API生成报告时遇权限及类型错误求助

排查Dailymotion API报告生成权限错误及代码修复

核心问题分析

  • API明确返回权限错误:Not authorized to access askPartnerReportFile field,说明当前认证账号无调用该接口的权限。
  • 代码未处理API错误响应,直接尝试访问None类型的askPartnerReportFile字段,触发TypeError: 'NoneType' object is not subscriptable。

权限问题排查步骤

  • 确认账号身份:askPartnerReportFile是Dailymotion合作伙伴专属接口,普通创作者账号无法访问,需核实账号是否属于合作伙伴计划。
  • 补充OAuth授权范围:当前密码模式授权未指定权限scope,需添加对应报告权限的scope(如partner_reports),修改授权请求参数。
  • 后台验证权限:登录Dailymotion后台确认账号是否启用报告生成功能,或联系官方支持确认权限状态。

代码健壮性修复

1. 修复create_report_request函数(处理API错误与空值)

def create_report_request(access_token, dimensions, metrics, start_date, end_date, product, filters = None):
    '''
    Creating a report request
    '''
    reportRequest = """
    mutation ($input: AskPartnerReportFileInput!) {
        askPartnerReportFile(input: $input) {
            reportFile {
                reportToken
            }
        }
    }
    """
    response = requests.post(
        'https://graphql.api.dailymotion.com',
        json={
            'query': reportRequest,
            'variables': {
                'input': {
                    'metrics': metrics,
                    'dimensions': dimensions,
                    'filters': filters,
                    'startDate': start_date,
                    'endDate': end_date,
                    'product': product,
                }
            }
        },
        headers={'Authorization': 'Bearer ' + access_token}
    )
    print(response.status_code)
    response_data = response.json()
    
    # 优先处理API返回的错误信息
    if 'errors' in response_data and response_data['errors']:
        error_msg = '\n'.join([err['message'] for err in response_data['errors']])
        raise Exception(f"API Error: {error_msg}")
    
    if response.status_code != 200 or not 'data' in response_data:
        raise Exception('Invalid response')
    
    # 安全获取报告数据,避免空值报错
    report_file_data = response_data['data'].get('askPartnerReportFile')
    if not report_file_data:
        raise Exception("Failed to create report request: No report data returned")
    
    report_token = report_file_data.get('reportFile', {}).get('reportToken')
    if not report_token:
        raise Exception("Failed to retrieve report token")
    
    return report_token

2. 修复get_access_token函数(添加权限scope)

def get_access_token(app_key, app_secret, username, password):
    '''
    Authenticate on the API in order to get an access token
    '''
    response = requests.post('https://graphql.api.dailymotion.com/oauth/token', data={
        'client_id': app_key,
        'client_secret': app_secret,
        'username': username,
        'password': password,
        'grant_type': 'password',
        'version': '2',
        'scope': 'partner_reports'  # 添加合作伙伴报告权限
    })

    if response.status_code != 200 or not 'access_token' in response.json():
        raise Exception('Invalid authentication response')

    return response.json()['access_token']

额外建议

  • 使用.get()方法访问字典字段:避免链式访问导致的空值报错,提升代码容错性。
  • 修正参数格式:metrics=('VIEWS',)需保留逗号,确保传递的是元组类型。
  • 添加日志记录:在关键步骤记录请求与响应信息,便于后续问题排查。

内容的提问来源于stack exchange,提问作者Ali Poyraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:00:58