2
votes

I am using the Facebook Graph API to get the news feed of a user.

My request URL is: xxxxxxxxxxxxxx/feed?fields=from,id,created_time,picture,link,object_id,message, likes.fields(id)

With the object_id, I want to get the big picture of the post, using the following url: http://graph.facebook.com/OBJECT_ID/picture?type=normal

The picture return field is always filled, but the object_id is not being returned at some posts. Why is this? I really need the high res picture, and didn't find another way to acquire this..

3
The object_id is only returned if the attachment is a facebook object (e.g. an image uploaded by the user). Some stories in feed don't have a picture at all, and some pictures are not facebook objects (e.g. thumbnails for shared links). - Ming Li
@MingLi It seems that you are right, all the posts without object_id are posted links instead of images.. Thanks, please put it in an answer so I can accept it. - harmjanr

3 Answers

1
votes

The object_id is only returned if the attachment is a facebook object (e.g. an image uploaded by the user). Some stories in feed don't have a picture at all, and some pictures are not facebook objects (e.g. thumbnails for shared links).

0
votes

Sometimes Facebook keeps a thumbnail of an image and stores an external link to the larger version of the image in the URL returned by the graph request. In order to access the images in either case, I used the code below, where smallURL is the URL returned by the graph request:

private String getRealURL(String smallURL){
   if (smallURL.contains("url=http")){
       String[] pieces = smallURL.split("url=");
       pieces[1].replace("%2F", "//");
       pieces[1].replace("%3A", ":");
       return pieces[1];           
   }
   else{
       StringBuilder stringBuilder = new StringBuilder();
       stringBuilder.setLength(0);
       stringBuilder.append("http://graph.facebook.com/");
       stringBuilder.append(item.getObjectID());
       stringBuilder.append("/picture?type=large");
       return stringBuilder.toString();
   }
}
0
votes

I also noticed that some FB posts didn't have {object_id} for large photos, but realized that the {picture} thumbnail URL contains the encoded URL of the original larger image:

https://external.xx.fbcdn.net/safe_image.php?d=AQBe9UvGd0vPbAHP&w=130&h=130&url=http%3A%2F%2Fskift.com%2Fwp-content%2Fuploads%2F2015%2F12%2Fpollution.jpg&cfs=1

--> contains -->

http://skift.com/wp-content/uploads/2015/12/pollution.jpg

So I check for {object_id}, and if not then try to extract the original URL from {picture}:

if(isset($post['object_id'])) {
    echo "http://graph.facebook.com/".$post['object_id']."/picture";
    }
    elseif(isset($post['picture'])) {
        echo urldecode(preg_replace('/&cfs.*/', '', preg_replace('/.*url=/', '', $post['picture'])));
    } 
    else {
        echo "no_large_image";
}