如何将带有“ -i --upload-file”的curl调用转换为PHP?

时间:2019-02-23 00:23:56

标签: linkedin linkedin-api

文档here的步骤2中引用了此调用

我正在关注文档,以通过第2版API在LinkedIn中创建图像和文本共享。按照文档中的步骤,我成功完成了每个步骤。但是,我的帖子在LinkedIn中不存在,并且无法基于API请求返回的ID通过直接链接查看

在调试中,我向https://api.linkedin.com/v2/assets/C5622AQFbyxMfU2b9zg发出了get请求。这是为了检索在第一步中创建的媒体资产(文档here)。它返回状态为“ CLIENT_ERROR”的以下json。不过,如果您查看文档,则此状态不是该字段列出的状态之一

{
    "serviceRelationships": [
        {
            "identifier": "urn:li:userGeneratedContent",
            "relationshipType": "OWNER"
        }
    ],
    "recipes": [
        {
            "recipe": "urn:li:digitalmediaRecipe:feedshare-image",
            "status": "CLIENT_ERROR"
        }
    ],
    "mediaTypeFamily": "STILLIMAGE",
    "created": 1550875198973,
    "lastModified": 1550875199857,
    "id": "C5622AQFbyxMfU2b9zg",
    "status": "ALLOWED"
}

我能够使用命令行curl成功上传文件。看来问题出在我的PHP实现上。具体来说,二进制文件的上传无法正常进行。这是我的php代码的简化表示。

    $ch = curl_init();

    $headers = [
        'Authorization: Bearer ' . $this->accessToken->access_token,
        'Cache-Control: no-cache',
        'X-RestLi-Protocol-Version: 2.0.0',
        'x-li-format: json',
        'Content-Type: ' . $this->mimetype
    ];

    $data = [
        'file' => curl_file_create($filename, $this->mimetype);
    ];

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_URL, 'https://api.linkedin.com/mediaUpload/C5622AQHSLBWkZeg-gQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJIFvVUxXl7yAAAAWkwjT0kEPKHY5BnAgXETcVQ3AbsxmvaGl6hnuECwA&app=22961836&sync=0&v=beta&ut=2RaKRdHD_OwUE1');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $result = curl_exec($ch);
    print_r($result);

1 个答案:

答案 0 :(得分:0)

我最近也遇到过同样的问题,linkedin的文档不是很有帮助。 Create an Image Share

首先要了解的是,“ curl --upload-file”使用PUT请求方法。这是我使用伪数据的方式。

$file = "/storage/media/testimg.jpg";
$uploadurl = "https://api.linkedin.com/mediaUpload/C5622AQHSLBWkZeg-gQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJIFvVUxXl7yAAAAWkwjT0kEPKHY5BnAgXETcVQ3AbsxmvaGl6hnuECwA&app=22961836&sync=0&v=beta&ut=2RaKRdHD_OwUE1";
$accesstoken = "acacdsv13rv31bv13b1cf13cf13rv13rv13vr13tb5dxvghn";
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $uploadurl);
curl_setopt($curl_handle, CURLOPT_PUT, 1);
curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, "PUT");
$fh_res = fopen($file, 'r');
curl_setopt($curl_handle, CURLOPT_INFILE, $fh_res);
curl_setopt($curl_handle, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
$headers[] = "Authorization: Bearer $accesstoken"; //linkedin says to add 'redacted' instead of access token (that's bullshit)
$headers[] = 'Connection: Keep-Alive';
$headers[] = "X-RestLi-Protocol-Version:2.0.0";
curl_setopt($curl_handle,CURLOPT_HTTPHEADER,$headers);
$rcurl = curl_exec($curl_handle);
curl_close($curl_handle);

如果转储响应$rcurl,则只会得到一个空字符串。因此,下一步就是检查上传状态,他们完全忘记了这些内容作为图像共享文档的一部分,但是可以在Check Status of Uphold

中找到

使用来自初始图像注册调用的资产变量,您检查上传的状态,直到状态检查返回AVAILABLE

$asset = "urn:li:digitalmediaAsset:C4asdfvqqrv3";
$a = explode("digitalmediaAsset:", $asset);            
$statuscheck =  make a GET curl call to the url: "/assets/" . $a[1]         
$uploadstat = $statuscheck['recipes'][0]['status'];
do{
    $statuscheck =  make a GET curl call to the url: "/assets/" . $a[1];
    $uploadstat = $statuscheck['recipes'][0]['status'];
}while($uploadstat != 'AVAILABLE');

一旦返回AVAILABLE,您现在就可以继续创建图像共享的下一步。希望这可以帮助。