使用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
相关产品推荐
相关产品推荐

