【问题标题】:Upload video using LinkedIn V2 API使用 LinkedIn V2 API 上传视频
【发布时间】:2019-09-19 05:59:29
【问题描述】:

我正在尝试使用 LinkedIn API V2 上传视频,但我无法将视频成功发布到我的 LinkedIn 个人帐户。 请帮忙。

从 LinkedIn API 返回以下响应:

SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

$person_id=LINKEDIN_ACCOUNT_ID;
$access_token= LINKEDIN_ACCESS_TOKEN;

$share_text='Video Upload and Share Text';
$author = "urn:li:person:".$person_id;

$r_url='https://api.linkedin.com/v2/assets?action=registerUpload';

$r_params = array(
    'registerUploadRequest'=>array(
        'recipes'=>array('urn:li:digitalmediaRecipe:feedshare-video'),                  
        'owner' => $author,
    )
);

$handle = curl_init();
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($handle, CURLOPT_URL, $r_url);
curl_setopt($handle, CURLOPT_VERBOSE, FALSE);
$header = array();
$header[] ='Authorization : Bearer '.$access_token;
$header[] = 'Content-Type: application/json; charset=UTF-8';

curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode($r_params));
$json1 = curl_exec($handle);
$json1=json_decode($json1,true);

if($json1['value']['uploadMechanism']['com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest']['uploadUrl']){
    $target_url=$json1['value']['uploadMechanism']['com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest']['uploadUrl'];

    $return_header=$json1['value']['uploadMechanism']['com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest']['headers'];
    $parts = parse_url($target_url);
    parse_str($parts['query'], $query);

    $amz_signature=$query['X-Amz-Signature'];

    $target_header=array();

    $target_header[]='Host: video-uploads-prod.s3-accelerate.amazonaws.com';
    $target_header[]="Content-Type:".trim($return_header['Content-Type']);

    $target_header[]="x-amz-server-side-encryption:".trim($return_header['x-amz-server-side-encryption']);
    $target_header[]='x-amz-server-side-encryption-aws-kms-key-id:'.trim($return_header['x-amz-server-side-encryption-aws-kms-key-id']);


    $video_path = DIR_PATH_TO_VIDEO_FILE.'example_video.mp4';

    $post_data=array('file'=>$video_path);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL,$target_url);
    curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $target_header);

    curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($video_path));

    $json2=curl_exec ($ch);
    curl_close ($ch);

    $json2=json_decode($json2,true);

    $media_id=str_replace('urn:li:digitalmediaAsset:','', $json1['value']['asset']);

    $return_data=array();
    $check_url = 'https://api.linkedin.com/v2/assets/'.$media_id;

    $handle = curl_init();
    curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($handle, CURLOPT_HEADER, FALSE);
    curl_setopt($handle, CURLOPT_URL, $check_url);
    $header = array();
    $header[] ='Authorization : Bearer '.$access_token;
    $header[] = 'Content-Type: application/json; charset=UTF-8';
    curl_setopt($handle, CURLOPT_HTTPHEADER,$header);
    $return_data= curl_exec($handle);
    $return_data= json_decode($return_data,true);


    $author = "urn:li:person:".$person_id;

    $post_url = 'https://api.linkedin.com/v2/ugcPosts';
    $media_data=array();
    $media_data[0]=array(
            'status'=>'READY',
            'description'=>array('text'=>'Official LinkedIn Blog'),
            'media'=>$media_id,
            'title'=>array('text'=>"Official LinkedIn Blog"),
        );

    $params = array(
        'author' => $author,
        'lifecycleState' => 'PUBLISHED',
        'specificContent' => array(
            'com.linkedin.ugc.ShareContent' => array(
                'shareCommentary' => array(
                    'text' => "Video media set in post",
                ),
                'shareMediaCategory' => 'VIDEO',
                'media'=>$media_data,
                'originalUrl'=>'https://www.google.com'
            )
        ),
        'visibility' => array(
            'com.linkedin.ugc.MemberNetworkVisibility' => 'PUBLIC'
        )
    );


    $handle = curl_init();
    curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($handle, CURLOPT_URL, $post_url);
    curl_setopt($handle, CURLOPT_VERBOSE, FALSE);
    curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode($params));
    $header = array();
    $header[] ='Authorization : Bearer '.$access_token;
    $header[] = 'Content-Type: application/json; charset=UTF-8';
    $header[] = 'X-Restli-Protocol-Version:2.0.0';
    curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
    $json3 = curl_exec($handle);
    $json3=json_decode($json3);

我需要将视频帖子成功上传到 LinkedIn 帐户,但我也无法从 LinkedIn 文档中理解这一点。我已经尝试了很多但没有成功。 请有成功上传V2视频的人帮忙。

【问题讨论】:

  • 我现在面临同样的问题
  • 我得到了解决方案。正在努力。
  • 您找到了什么解决方案? @AlainVanderbroeck
  • 查看我的答案以解决您的问题。但是 LinkedIn 还不支持视频上传。因此,当 LinkedIn 支持视频时,我的代码将起作用。
  • 在 LinkedIn 支持视频上传之前,请参阅 Augustine 的答案以获取解决方法

标签: php api post linkedin linkedin-api


【解决方案1】:

嗨linkedin还没有发布视频上传。您可以使用文章EP(“shareMediaCategory”:“ARTICLE”)发送视频到linkedin

【讨论】:

  • 嗨奥古斯丁。为什么 LinkedIn 有它的文档,但它还不支持?您确定不支持视频上传吗?你怎么知道的?
  • 我在某处读过,但我不记得链接了。我也在搜索视频上传。现在我使用文章发布。所以我将生成一个动态的视频页面。所以它会让视频预览。我们应该生成相应视频的图像。你也可以检查缓冲区来检查这个。
  • 好的,谢谢您的回答。我当然相信你,因为我的 POC 不起作用。 LinkedIn 指的是 API 支持的堆栈溢出。但是没有人打电话肯定告诉我它不工作,显然没有人知道它什么时候工作。我认为这不是应该的方式。我对此感到沮丧。
  • 您提到的解决方案当然有效。这是一个不错的选择。
  • @Alain 很高兴听到。引用此 url 以生成视频video.buffer.com/v/5ccc172be34b015c107cf2e7 的动态页面。您是否获得了管理公司页面发布的权限?
【解决方案2】:

我使用LinkedIn API from Zoonman 来做客户端发布请求,但这超出了问题的范围。

因为我无法让 php curl 函数正常工作,所以我使用命令行界面来执行请求,它可以正常工作!请参阅下面的代码。

但是。甚至很难上传作品。当我请求获取上传状态时,它仍然是“WAITING_UPLOAD”。所以我认为@augustine jenin 是对的,它还不受支持。 (2019 年 5 月)

<?php
// first register upload
$data = [
	"registerUploadRequest" => [
		"recipes" => [
			"urn:li:digitalmediaRecipe:feedshare-video"
		],
		"owner" => "urn:li:organization:" . $liPageId,
		"serviceRelationships"=> [
			[
				"relationshipType"=> "OWNER",
				"identifier" => "urn:li:userGeneratedContent"
			]
		]
	]
];
    
$register = $client->post('assets?action=registerUpload', $data);

// get upload url and header
$uploadUrl = $register["value"]["uploadMechanism"]["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]["uploadUrl"];
$headers = $register["value"]["uploadMechanism"]["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"]["headers"];
    
$curlHeaders = "";
foreach($headers as $htype => $header) {
	$curlHeaders .= ' -H "' . $htype . ':' . $header . '"';
}

// go upload the image to the url
$filePath = "/path/to/your/file";

$command = '/usr/bin/curl -v';
$command .= $curlHeaders;
$command .= ' --upload-file \'' . $filePath . '\' \'' . $uploadUrl . '\'';

// try it yourself by running this on the command line
//echo $command;

shell_exec($command);

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2019-07-11
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多