【问题标题】:Spring Social Facebook: How to get big photo from Post?Spring Social Facebook:如何从 Post 获取大图?
【发布时间】:2016-05-10 09:56:58
【问题描述】:

Post 对象有一个属性 getPicture()。这包含一个非常小 (130 × 130) 图像的 URL。

如何获得 Facebook 帖子的大图?

示例网址:

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

替换 url 中的 s130x130 没有帮助,因为这在新的 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);

但是现在我得到一个 byte[] 而不是一个 url,所以现在我必须将图像存储在某个地方:(

【问题讨论】:

  • 你用 FeedOperations() 解决问题了吗?

标签: java spring-social-facebook


【解决方案1】:

我没有得到任何直接的方法来使用 Spring Social 框架获取 Facebook 帖子的 full_picture。我使用 Facebook 的图形 API 来获得全貌。我添加的代码仅供参考。您需要根据需要进行自定义。

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 代码转换为您需要的格式。或者您也可以使用下面的DeserializingPosts 类将其转换为PagedList&lt;Post&gt;

@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";
    }

}

【讨论】:

    【解决方案2】:

    使用 ImageType.LARGE 代替 ImageType.NORMAL 它返回 CustomMultipartFile

    【讨论】:

    • 我们如何获得 facebook.feedOperations()。因为它只返回小图片。并且没有设置 ImageType 的选项。 Maven org.springframework.socialspring-social-facebook2.0.3.RELEASE
    • @AwanishKumar 你解决了这个问题吗?我现在面临同样的事情。
    • ImageType 是 Spring social 的 Facebook API 中的枚举。更多参考:cleanbugs.com/item/412720/…
    • @KavishMittal 是的,是的,但是如果我得到 facebook.feedOperations() 我怎样才能得到正常大小的图像?
    • @Deniel Henao:我使用自定义代码解决了这个问题。我正在添加代码作为参考的答案,您可以根据需要进行自定义。
    猜你喜欢
    • 2014-02-24
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2013-04-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多