【问题标题】:Image share with linkedin v2 api not posting on page feed与linkedin v2 api共享的图像未在页面提要上发布
【发布时间】:2019-07-22 18:28:01
【问题描述】:

好的,这是我的问题。要通过linkedin api分享图片帖子,您首先必须注册您的图片文件,您可以通过发送二进制文件的帖子请求来注册。然后您使用原始请求中的图像 URN 来提交您的帖子。我的请求通过,返回 201 代码(这应该是一个成功的请求),但最终没有发布图像或文本。如果我尝试只发布文本,它会起作用。我尝试使用 curl 注册我的图像,并将其发布在linkedin 上,所以我认为我没有在请求中正确发送二进制文件,这是我的请求:

            HttpClient client = HttpClientBuilder.create().build();
            HttpPut request = new HttpPut(uploadUrl);
            request.addHeader("Content-Type", "data/binary");
            request.setHeader("X-Restli-Protocol-Version", "2.0.0");
            request.setHeader("Authorization", "Bearer " + myToken);

            File file = new File(pictureUrl);

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addBinaryBody("upload-file", file);
            request.setEntity(builder.build());
            HttpResponse response = client.execute(request);

我使用此代码获得代码 201,但它仍然没有发布。 这是他们在Share API doc 上提出的请求的 curl 示例。

curl -i --upload-file /Users/peter/Desktop/superneatimage.png --header "Authorization: Bearer redacted" 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1'

你能告诉我我的 java 等价物有什么问题吗?

编辑:忘了说我什至尝试从 java 调用 curl,与我在终端中使用的代码相同,但它仍然没有工作..

        Process p;
        try {
            p = Runtime.getRuntime().exec("curl -i --upload-file" + " " + pictureUrl + " " + "--header \"Authorization: Bearer " + myToken + "\" '" + uploadUrl + "'");
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

            String line = "";
            String outputController = "";
            while ((line = reader.readLine()) != null) {
                outputController = outputController + '\n' + line;
            }
            System.out.println("out: ");
            System.out.println(outputController);
            return true;
        } catch (IOException | InterruptedException ex) {
            return false;
        }

输出返回一个空字符串。

Edit2:另一个有趣的事情是,当我执行主要请求时,我在其中发送文本和提交图像后得到的媒体骨灰盒,我再次得到 201,就像它成功一样,在响应中我什至得到帖子编号。然后我尝试使用另一个 api 端点并使用从响应中获得的 id 拉该帖子,然后我得到所有数据,就像帖子已发布一样。它甚至在 json 中说我得到生命周期已发布,并且媒体的状态为 READY。唯一与 json 不同的是,在linkedin 上的图片帖子是媒体对象有缩略图,在这种情况下他们没有,它只是一个空的 json 数组。

【问题讨论】:

    标签: java curl httprequest linkedin-api


    【解决方案1】:

    我发现 curl 到 C# 转换器 https://curl.olsh.me/ 下面是生成的代码sn-p:

    
    
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1"))
            {
                request.Headers.TryAddWithoutValidation("Authorization", "Bearer redacted"); 
    
                request.Content = new ByteArrayContent(File.ReadAllBytes("/test.png")); 
    
                var response = await httpClient.SendAsync(request);
            }
        }
    
    

    【讨论】:

      【解决方案2】:

      好的,我已经解决了,如果有人遇到同样的问题,这就是我做错了。在请求中,我添加了一个多部分来请求正文,这是错误的,您只需使用 RAW。所以不是

          File file = new File(pictureUrl);
          MultipartEntityBuilder builder = MultipartEntityBuilder.create();
          builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
          builder.addBinaryBody("upload-file", file);
          request.setEntity(builder.build());
      

      你放了

      request.setEntity(new FileEntity(new File(pictureUrl), ContentType.create(picture.getContentType())));
      

      然后一切正常。

      【讨论】:

      • 下一步该怎么做(分享帖子),它需要请求正文中的用户 ID,但我无法在后端获取它(错误 500)
      • 如果您使用api.linkedin.com/v2/ugcPosts,则不需要用户ID,您需要在作者字段中使用您的骨灰盒。 URN 的构造如下:“urn:{namespace}:{entityType}:{id}”。命名空间总是“li”,实体类型可以是“组织/个人/赞助帐户”,调用api.linkedin.com/v2/me时得到的id。我使用我的页面来分享帖子,所以我的 urn 是 urn:li:organization:myCustomId
      【解决方案3】:

      不熟悉 Java,但我在使用 Ruby 时遇到了同样的问题,我通过在请求标头中添加要上传的图像的 MIME 类型作为 Content-Type 来修复它。因此,在您的具体情况下,它将是:

      request.addHeader("Content-Type", "image/png");
      

      还可以看看我使用 Ruby 的 RestClient 和 Minimagick 的解决方案:https://stackoverflow.com/a/54902863/7844946

      【讨论】:

      【解决方案4】:

      我正在使用 kotlin 编写代码,在为同样的问题苦苦挣扎了很长时间后,我设法解决了它,对于那些遇到类似问题的人,我将在下面留下我的示例代码。对于视觉你需要提供一个直接的 URI 路径,还要注意头部结构。

      这里是代码。

      var file = File(ImageURI)
          val urls = URL(url)
          var connection: HttpsURLConnection = urls.openConnection() as HttpsURLConnection
          connection.setRequestProperty("Authorization","Bearer " + accesToken)
          connection.setRequestProperty("Content-Type", "image/png")
          connection.setRequestProperty("cache-control", "no-cache")
          connection.setRequestProperty("X-Restli-Protocol-Version", "2.0.0")
          connection.requestMethod = "POST"
          connection.doOutput = true
          connection.doInput = true
      
          var request = DataOutputStream(connection.outputStream)
          request.write(file.readBytes())
          request.flush()
      
          println("Response: "+connection.responseCode)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多