Search code examples
phplinkedin-api

Post in linkedin using API in php


How can I post on LinkedIn with image in my profile? I have managed to upload a text post, but I need the solution for image post.

Here is the code snippet which I am using for text post,

$post_url = "https://api.linkedin.com/v2/ugcPosts";
$post_headers = [
"Authorization: Bearer $access_token",
"Content-Type: application/json",
];

$post_data = [
"author" => "urn:li:person:$person_urn",
"lifecycleState" => "PUBLISHED",
"specificContent" => [
"com.linkedin.ugc.ShareContent" => [
    "shareCommentary" => [
        "text" => "My post content...",
    ],
    "shareMediaCategory" => "TEXT"
],
],
"visibility" => [
"com.linkedin.ugc.MemberNetworkVisibility" => "PUBLIC",
],
];

$post_response = publishPost($post_url, json_encode($post_data), 
$post_headers);

Solution

  • To post with an image you have to upload the image first and get the asset from LinkedIn. Call the below API for that,

    $upload_url = "https://api.linkedin.com/v2/assets?action=registerUpload";
    $upload_headers = [
    "Authorization: Bearer $access_token",
    "Content-Type: application/json",
    ];
    
    $upload_data = [
    "registerUploadRequest" => [
    "owner" => "urn:li:person:$person_urn",
    "recipes" => ["urn:li:digitalmediaRecipe:feedshare-image"],
    "serviceRelationships" => [
        [
            "identifier" => "urn:li:userGeneratedContent",
            "relationshipType" => "OWNER",
        ],
    ],
    "supportedUploadMechanism" => ["SYNCHRONOUS_UPLOAD"],
    ],
    ];
    
    $upload_response = sendCurlRequest($upload_url, 
    json_encode($upload_data), $upload_headers);
    $upload_response = json_decode($upload_response, true);
    
    if (empty($upload_response["value"]["uploadMechanism"]. 
    ["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]. 
    ["uploadUrl"])) {
    die("Failed to register upload.");
    }
    
    $image_upload_url = $upload_response["value"]["uploadMechanism"]. 
    ["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]. 
    ["uploadUrl"];
    $asset = $upload_response["value"]["asset"]; // LinkedIn's asset URL
    

    Upload the Image Binary:

    $image_headers = [
    "Authorization: Bearer $access_token",
    "Content-Type: application/octet-stream",
    ];
    
    $image_binary = file_get_contents('your_image.jpg'); // Read your image file
    callCurlRequest($image_upload_url, $image_binary, $image_headers, true);
    

    Now you can publish the Post with that Image, use the asset URL obtained earlier to attach the image to the post.

    $post_url = "https://api.linkedin.com/v2/ugcPosts";
    $post_headers = [
    "Authorization: Bearer $access_token",
    "Content-Type: application/json",
    ];
    
    $post_data = [
    "author" => "urn:li:person:$person_urn",
    "lifecycleState" => "PUBLISHED",
    "specificContent" => [
    "com.linkedin.ugc.ShareContent" => [
        "shareCommentary" => [
            "text" => "Your post content with image...",
        ],
        "shareMediaCategory" => "IMAGE",
        "media" => [
            [
                "status" => "READY",
                "description" => [
                    "text" => "Image description...",
                ],
                "media" => $asset,
                "title" => [
                    "text" => "Shared via My App",
                ],
            ],
        ],
    ],
    ],
    "visibility" => [
    "com.linkedin.ugc.MemberNetworkVisibility" => "PUBLIC",
    ],
    ];
    
    $post_response = sendCurlRequest($post_url, json_encode($post_data), 
    $post_headers);