LinkedIn API返回INVALID_CONTENT_OWNERSHIP错误(400)求助
问题描述
使用Python Django代码调用LinkedIn API发布带图片的UGC帖子时,返回400状态码,错误码为INVALID_CONTENT_OWNERSHIP,提示"Content(s) you provided must be owned by post author"。已确认图片初始化上传的owner与发帖请求的author为同一用户URN,但错误仍触发。
解决方案
1. 统一API端点版本
当前图片初始化上传使用的是rest前缀端点,发帖使用v2端点,存在版本不一致风险。将图片上传端点切换为v2前缀:
原端点:https://api.linkedin.com/rest/images?action=initializeUpload
修改为:https://api.linkedin.com/v2/images?action=initializeUpload
2. 添加图片上传后延迟
图片PUT上传完成后,LinkedIn需要短暂时间同步资源归属状态,直接发帖可能导致资源未完成关联。在图片上传后添加2-3秒延迟:
import time # 需导入time模块 # 上传图片代码后添加 time.sleep(2)
3. 验证access_token权限
确保获取的access_token包含w_member_social权限,该权限是发布UGC内容及上传图片的必需权限,权限不足会导致资源归属关联失败。
4. 校验用户URN格式
确认user_id为LinkedIn用户的有效ID,生成的URNurn:li:person:{user_id}无拼写错误(如多余/缺失字符),严格匹配格式可避免归属识别问题。
修改后的完整代码示例
import requests import json import time def post_content(access_token, user_id, content, image_path): try: POST_URL = 'https://api.linkedin.com/v2/ugcPosts' headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", "LinkedIn-Version": "202402", "X-Restli-Protocol-Version": "2.0.0" } # 初始化图片上传 - 使用v2端点 initialize_upload_request = { "initializeUploadRequest": { "owner": f"urn:li:person:{user_id}" } } print("upload Payload:") print(json.dumps(initialize_upload_request, indent=4)) initialize_upload_response = requests.post( "https://api.linkedin.com/v2/images?action=initializeUpload", json=initialize_upload_request, headers=headers ) initialize_upload_data = initialize_upload_response.json() upload_url = initialize_upload_data['value']['uploadUrl'] image_urn = initialize_upload_data['value']['image'] # 上传图片 with open(image_path, 'rb') as file: response = requests.put(upload_url, data=file) response.raise_for_status() # 等待图片资源同步 time.sleep(2) # 发布内容 request_data = { "author": f"urn:li:person:{user_id}", "lifecycleState": "PUBLISHED", "specificContent": { "com.linkedin.ugc.ShareContent": { "shareCommentary": { "text": content }, "shareMediaCategory": "IMAGE", "media": [ { "status": "READY", "media": image_urn } ] } }, "visibility": { "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" } } print("Request Payload:") print(json.dumps(request_data, indent=4)) post_response = requests.post(POST_URL, json=request_data, headers=headers) print("exec", post_response.json()) if post_response.ok: print("Content posted successfully.") return {'success': True} else: error_message = post_response.text print(f"Failed to post content: {error_message}") return {'success': False, 'error': error_message} except Exception as e: print(f"Error posting content: {str(e)}") return {'success': False, 'error': str(e)}
额外排查步骤
若以上方法无效,可调用GET https://api.linkedin.com/v2/images/{image_urn}接口(携带相同请求头),检查返回的图片资源owner字段是否与发帖author完全一致,确认资源归属是否正确。
内容的提问来源于stack exchange,提问作者Swayanshu Mohapatra

