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

LinkedIn API返回INVALID_CONTENT_OWNERSHIP错误(400)求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:32:47