Spring Social Facebook: как получить большое фото из поста?

Объект Post имеет свойство getPicture(). Он содержит ссылку на очень маленькое (130 × 130) изображение.

Как получить общую картину поста в Facebook?

Пример URL:

https://scontent.xx.fbcdn.net/v/t1.0-0/s130x130/13173717_10209376327474891_7842199861010585961_n.jpg?oh=d244df2db666e1d3be73cb7b76060337&oe=57A64C44

Замена s130x130 в URL-адресе не помогает, потому что это не будет работать в новом Graph API.

Я пытался использовать graphApi.mediaOperations(), но не вижу метода, который принимает postId. Существует graphApi.mediaOperations().getPhotos(objectID), но этот objectID должен быть AlbumID или UserID в соответствии с документацией, и этот метод выдает исключение:

org.springframework.social.UncategorizedApiException: (#100) Tried accessing nonexisting field (photos) on node type (Photo)

Изменить: я нашел кое-что, что работает:

byte[] photo = graphApi.mediaOperations().getAlbumImage(post.getObjectId(), ImageType.NORMAL);

Но теперь я получаю байт [] вместо URL-адреса, поэтому теперь мне нужно где-то хранить изображение :(


person Roel    schedule 10.05.2016    source источник
comment
Вы решили проблему с FeedOperations()?   -  person Daniel Henao    schedule 02.08.2017


Ответы (2)


у меня не было прямого способа получить full_picture поста в Facebook с использованием Spring Social framework. Я использовал API графиков Facebook, чтобы получить полную картину. Я добавляю код только для ссылок. Вы должны быть настроены в соответствии с вашими потребностями.

FacebookTemplate facebook = new FacebookTemplate("<fb token>");

String[] ALL_POST_FIELDS = { "id", "actions", "admin_creator", "application", "caption", "created_time", "description", "from", "icon",
        "is_hidden", "is_published", "link", "message", "message_tags", "name", "object_id", "picture", "full_picture", "place", "privacy",
        "properties", "source", "status_type", "story", "to", "type", "updated_time", "with_tags", "shares", "likes.limit(1).summary(true)" };

URIBuilder uriBuilder = URIBuilder.fromUri(facebook.getBaseGraphApiUrl() + request.getAccountId() + "/posts");
uriBuilder = uriBuilder.queryParam("limit", String.valueOf(request.getRecordCount()));
uriBuilder.queryParam("fields", org.springframework.util.StringUtils.arrayToCommaDelimitedString(ALL_POST_FIELDS));
URI uri = uriBuilder.build();
LOGGER.info("facebook URL :{} ", uri);
JsonNode jsonNode = (JsonNode) facebook.getRestTemplate().getForObject(uri, JsonNode.class);
LOGGER.debug("facebook URL :{}, response: {} ", uri, jsonNode);
// you can cast jsonnode as required into your format or below line can be used to cast into PagedList<Post> format
PagedList<Post> posts = new DeserializingPosts().deserializeList(jsonNode, null, Post.class, true);

Затем код jsonNode преобразуется в требуемый формат. или вы также можете привести его к PagedList<Post>, используя ниже класс DeserializingPosts.

@Component
public class DeserializingPosts extends AbstractOAuth2ApiBinding {

    private ObjectMapper objectMapper = new ObjectMapper();

    private static final Logger LOGGER = Logger.getLogger(DeserializingPosts.class);

    public <T> PagedList<T> deserializeList(JsonNode jsonNode, String postType, Class<T> type, boolean accountFlag) {
        JsonNode dataNode = jsonNode.get("data");
        return deserializeList(dataNode, postType, type);
    }


    public <T> PagedList<T> deserializeList(JsonNode jsonNode, String postType, Class<T> type) {
        List posts = new ArrayList();
        for (Iterator iterator = jsonNode.iterator(); iterator.hasNext();) {
            posts.add(deserializePost(postType, type, (ObjectNode) iterator.next()));
        }
        if (jsonNode.has("paging")) {
            JsonNode pagingNode = jsonNode.get("paging");
            PagingParameters previousPage = PagedListUtils.getPagedListParameters(pagingNode, "previous");
            PagingParameters nextPage = PagedListUtils.getPagedListParameters(pagingNode, "next");
            return new PagedList(posts, previousPage, nextPage);
        }

        return new PagedList(posts, null, null);
    }


    public <T> T deserializePost(String postType, Class<T> type, ObjectNode node) {
        try {
            if (postType == null) {
                postType = determinePostType(node);
            }

            node.put("postType", postType);
            node.put("type", postType);
            MappingJackson2HttpMessageConverter converter = super.getJsonMessageConverter();
            this.objectMapper = new ObjectMapper();
            this.objectMapper.registerModule(new FacebookModule());
            converter.setObjectMapper(this.objectMapper);
            return this.objectMapper.reader(type).readValue(node.toString());
        } catch (IOException shouldntHappen) {
            throw new UncategorizedApiException("facebook", "Error deserializing " + postType + " post" + shouldntHappen.getMessage(),
                    shouldntHappen);
        }
    }

    private String determinePostType(ObjectNode node) {
        if (node.has("type")) {
            try {
                String type = node.get("type").textValue();
                Post.PostType.valueOf(type.toUpperCase());
                return type;
            } catch (IllegalArgumentException e) {
                LOGGER.error("Error occured while determining post type: " + e.getMessage(), e);
                return "post";
            }
        }
        return "post";
    }

}
person Awanish Kumar    schedule 03.08.2017

используйте ImageType.LARGE вместо ImageType.NORMAL, он возвращает CustomMultipartFile

person Sumit Badaya    schedule 12.07.2016
comment
Как мы могли получить для facebook.feedOperations(). так как он возвращает только маленькое изображение. И нет возможности установить ImageType. Maven ‹dependency› ‹groupId›org.springframework.social‹/groupId› ‹artifactId›spring-social-facebook‹/artifactId› ‹version›2.0.3.RELEASE‹/version› ‹/dependency› - person Awanish Kumar; 07.04.2017
comment
@AwanishKumar ты решил проблему? я сейчас сталкиваюсь с тем же. - person Daniel Henao; 29.07.2017
comment
ImageType — это перечисление в Spring API социальной сети Facebook. Дополнительные ссылки здесь: cleanbugs.com/item/412720/ - person Sumit Badaya; 29.07.2017
comment
@KavishMittal да, но если я получу facebook.feedOperations(), как я могу получить изображение нормального размера? - person Daniel Henao; 02.08.2017
comment
@Deniel Henao: я решил это, используя собственный код. Я добавляю код в качестве ответа для ссылок, вы можете настроить его в соответствии с вашими потребностями. - person Awanish Kumar; 03.08.2017
comment
String [] fields = {id, email, first_name, last_name, picture.width(500).height(500)}; return facebook.fetchObject(me, User.class, fields); - person Ashish Awasthi; 15.07.2018