Невозможно опубликовать изображения на странице организации с помощью LinkedIn API v2 ugcPosts в PHP - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать модуль, в котором я мог бы автоматически публиковать на своей странице организации Linkedin всякий раз, когда я создаю контент. Я могу опубликовать обычный текстовый контент, однако, если я пытаюсь загрузить изображение, я получаю сообщение об ошибке

Ошибка сервера: POST https://api.linkedin.com/v2/ugcPosts привело к ответу 500 Server Error: {"message": «Внутренняя ошибка сервера», «статус»: 500}

Я использую приведенный ниже фрагмент кода

$text = 'Posting Via Linkedin v2 API'."\n\n".'#some #hash #tag';
$body = json_encode(
                     [
                       'author' => 'urn:li:organization:'.LINKEDIN_COMPANY_ID,
                       'lifecycleState' => 'PUBLISHED',
                       'specificContent' => [                                                            
                                             'com.linkedin.ugc.ShareContent' =>  [                                                                                                   
                                       'media' => [                                                                                                                                                            
                                          'media' =>  'urn:li:digitalmediaAsset:C5622AQHPNf2EmHoEyQ',                                                                                                                                                 
                                          'status' => 'READY',                                                                                                                       
                                                  ],                                                                                              
                                       'shareCommentary' => [                                                                                                                                                 
                                                              'text' => $text                                                                                                                      
                                                            ],                                                                                    
                                       'shareMediaCategory' => 'URN_REFERENCE'                                                                                                           
                                                                                        ]
                                                  ],
                                        'visibility' => [                         
                                               'com.linkedin.ugc.MemberNetworkVisibility' => 'PUBLIC'
                                                        ],
                                     ], true
                                 );
try
    {
        $client1 = new Client(['base_uri' => 'https://api.linkedin.com']);
        $response = $client1->request('POST', '/v2/ugcPosts', [                                                                                        
                                           'headers' => [                                                                             
                                                "Authorization" => "Bearer ".LINKEDIN_ACCESS_TOKEN,                                                                                                              
                                                "Content-Type"  => "application/json",                                                                         
                                                "x-li-format"   => "json",                                                                                      
                                                "X-Restli-Protocol-Version" => "2.0.0",                                                                                              
                                                        ],
                                            'body' => $body,
                                                              ]
                                      );

        if($response->getStatusCode() == 201)
            echo $response->getheaders()['X-RestLi-Id'][0];

        elseif($response->getStatusCode() !== 201)
            echo 'Error: '. $response->getLastBody()->errors[0]->message;
    }
catch(Exception $e)
    { echo $e->getMessage(); }

Я использую приведенные ниже области, когда я завершил аутентификацию

define ('LINKEDIN_SCOPES', 'r_emailaddress, r_basicprofile, w_member_social, w_organization_social, rw_organization_admin');

Я использую приведенный ниже код для загрузки изображения на сервер, который отлично работает, когда я получаю цифровой идентификатор актива в ответ, который я вставил в код выше

function curl($url, $parameters, $content_type, $post = true)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($post) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
        }
        curl_setopt($ch, CURLOPT_POST, $post);
        $headers = [];
        $headers[] = "Content-Type: {$content_type}";
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        $result = curl_exec($ch);
        return $result;
    }

$prepareUrl = "https://api.linkedin.com/v2/assets?action=registerUpload&oauth2_access_token=".LINKEDIN_ACCESS_TOKEN;
$prepareRequest =  [
    "registerUploadRequest" => [
        "recipes" => [
            "urn:li:digitalmediaRecipe:feedshare-image"
        ],
        'owner' => 'urn:li:organization:'.LINKEDIN_COMPANY_ID,
        "serviceRelationships" => [
            [
                "relationshipType" => "OWNER",
                "identifier" => "urn:li:userGeneratedContent"
            ],
        ],
    ],
];
$prepareReponse = curl($prepareUrl,json_encode($prepareRequest), "application/json");
$uploadURL = json_decode($prepareReponse)->value->uploadMechanism->{"com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"}->uploadUrl;
echo $asset_id = json_decode($prepareReponse)->value->asset;

$client =new Client();
$client->request('PUT', $uploadURL, [
                                                                'headers' => [ 'Authorization' => 'Bearer ' . LINKEDIN_ACCESS_TOKEN],
                                                                'body' => fopen('../assets/images/authors/default.png', 'r')
                                                            ]);

Я не могу понять, что происходит не так? если я могу опубликовать обычную текстовую строку, а также если я могу загрузить изображение и получить digitalassetID, то почему оно не публикуется на странице моей организации?

...