Изображение поделиться с api linkedin v2 не публикуется в фиде страниц - PullRequest
0 голосов
/ 28 февраля 2019

Хорошо, так что это моя проблема. Чтобы поделиться сообщением с изображением с помощью 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с этим кодом, но он по-прежнему не публикуется.Это пример curl-запроса, который они дают на Share API doc .

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?

Редактировать: Забыл сказать, что я даже пытался вызвать curl из Java, тот же код, который я использовал в терминале, иэто все еще не работало ..

        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 и извлекать это сообщение, используя идентификатор, полученный из ответа, и я получаю все данные, как сообщение опубликовано.В json даже говорится, что я получаю, что жизненный цикл ИЗДАН и статус СМИ ГОТОВ.Единственное, что отличается от json-сообщения с изображением, которое находится на linkedin, - это то, что у медиа-объекта есть миниатюры, а в этом случае их нет, это просто пустой массив json.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Хорошо, я решил, если кто-то сталкивается с той же проблемой, это то, что я сделал не так.В запросе я добавил multipart к телу запроса, это неправильно, вы просто идете в 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())));

, а затем все идет хорошо.

0 голосов
/ 28 февраля 2019

Не знаком с Java, но у меня возникла та же проблема с использованием Ruby, и я исправил ее, добавив MIME-тип изображения, которое я загружал в качестве Content-Type, в заголовки запроса.Так что в вашем конкретном случае это будет:

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

Также взгляните на мое решение, используя Ruby's RestClient и Minimagick: https://stackoverflow.com/a/54902863/7844946

...