Facebook Graph or FQL for retrieving posts? - facebook

I know there are many posts on this topic, but I've been really pouring over this one lately and wanted to hear the conclusion of some others who have been doing the same. I started just using the Graph API using the Graph style of getting data...
$facebook->api('/me/posts');
The problem is, it seemed pretty sluggish, but it was reliable. When I set a limit of 100 posts per query, I received those 100 posts, and was even given a friendly little paging link to get the next set.
But like I said, the query was sluggish, so I tried out FQL, which seemed to process things much faster, and gave me a far stronger bit of control over the data I was requesting, and gave me some real freedoms in what data I wanted specifically. But FQL sucks on reliability. I could craft a query asking for 1000 results and only get 93 results. I read that facebook grabs the 1000 then takes out the ones I shouldn't be seeing for various reasons, and gives me the left overs, which makes any sort of stepping difficult, and the results, while a little faster, pretty inaccurate.
$query = 'SELECT post_id, actor_id, comment_info, created_time, description_tags, like_info, message, message_tags, place, share_count, source_id, tagged_ids, type, with_location, with_tags FROM stream WHERE (type=46 OR type=56 OR type=80 OR type=128 OR type=247 OR type=285) AND source_id = me() AND (actor_id = me() OR actor_id IN(SELECT uid1 FROM friend WHERE uid2=me()) ) AND created_time > '.strtotime("-1 year") .' LIMIT 50000
That massive query only did get me 95 posts, and managed to get almost six months back in time.
I'll admit I'm still picking up the very finer in's and outs of FQL, but SQL is something I'm well versed in.
So my question is, should I stick with the tediousness of FQL and keep fine tuning those requests, or should I just come to terms with the lack of control and slightly slower speeds of using the friendly facebook Graph?

Related

Get posts from multiple pages

I'm trying to fetch most recent posts of several pages using facebook FQL. Here is my query:
# https://developers.facebook.com/tools/explorer/145634995501895/?fql=SELECT%20message%20FROM%20stream%20WHERE%20source_id%20in%20(755751084454823%2C%20616632928446954)
SELECT message FROM stream WHERE source_id in (755751084454823, 616632928446954)
And it returns 0 results. On the other hand, sending exact same query but for a single page ID returns posts for that given query properly. So, those two queries works great:
# https://developers.facebook.com/tools/explorer/145634995501895/?fql=SELECT%20message%20FROM%20stream%20WHERE%20source_id%20in%20(616632928446954)
SELECT message FROM stream WHERE source_id in (616632928446954)
# https://developers.facebook.com/tools/explorer/145634995501895/?fql=SELECT%20message%20FROM%20stream%20WHERE%20source_id%20in%20(755751084454823)
SELECT message FROM stream WHERE source_id in (755751084454823)
I can't quite understand why it behaves like that. Any help much appreciated.
To get posts from multiple Pages, use separate calls to the feed endpoint with the Graph API. Example code for this can be found in the docs:
https://developers.facebook.com/docs/graph-api/reference/v2.6/page/feed
You can use Batch Request to make those calls faster, it will take as long as the slowest API call in the batch: https://developers.facebook.com/docs/graph-api/making-multiple-requests
FQL is deprecated and will stop working in August 2016. You canĀ“t use it in new Apps anymore.

FQL/GRAPH Api Logic

I have a logic problem I can't seem to solve (might be possible).
Example:
I am inside 100 facebook groups
I need the 10 lastest posts of EACH group I am in.
That's pretty much it but I can't seem to find a way to do this without making a foreach loop calling the api over and over again, if I had a couple hundred more groups it would be impossible.
PS: I'm using FQL atm but am able to use graph, I've coded this in like 3 different ways but no success.
This is the farthest I could get:
SELECT actor_id,source_id FROM stream WHERE source_id IN (select gid from group_member where uid = me())
It only returns from one page, maybe there's no way to return all of this without a foreach asking for each groups 10 lastest messages.
There's no need to use FQL of batching. This can be done with a simple Graph API request IMHO:
GET /me/groups?fields=id,name,feed.fields(id,message).limit(10)
This will return 10 posts for each of your groups. In case there too much data to be returned, try setting the limit parameter for the base query as well:
GET /me/groups?fields=id,name,feed.fields(id,message).limit(10)&limit=20
Then, you'll get a next field in the result JSON. By calling the URL contained in this field, you'll get your next results. Do this until the result is empty, then you reached the end.
You can use batch calls, described here https://developers.facebook.com/docs/graph-api/making-multiple-requests/
Using batch requests, you can request upto 50 calls in one go. Note than batch request doesn't increase the rate limits, so if you make 50 requests in batch, it will be considered as 50 calls, and not one. However you will get the response in a shorter time.
If you think you're making too many calls, you should put some delay in between calls and avoid rate limiting.

Getting all events given a certain filter criteria on Facebook

I'm trying to get events in Facebook that have a certain phrase or description in them. I'd like to not have the results filtered or limited, as the phrase is fairly specific.
As an example, the phrase I'm looking for is "UMvC3" (short for Ultimate Marvel vs. Capcom 3).
That said, I could run an FQL query (and subsequently enrich with a call to the Graph API, like so):
select eid from event where contains("umvc3") and start_time >= now()
order by update_time desc
This will give me upcoming events with "umvc3" in them as well as only ones occurring in the future (I'm not concerned with past events).
However, the selection is severely limited. For example, the following isn't returned in the search results:
https://www.facebook.com/events/595137740538545/
It clearly has "umvc3" in the description text.
I can perform a search using the Graph API, but that doesn't return the above result either. Additionally, I can't filter using the Graph API on the start_time or order the results in a manner where I can stop processing the result set once I get to a certain point.
Finally, there is the Public Feed API, which will give me the entire firehose (which isn't filterable, like Twitter's, unfortunately), so I'll have to filter in real-time, which could be near impossible.
That said, am I approaching this the wrong way, or is there no way to really get a comprehensive, exact set of results from the Facebook API for events?
Note: I'm using the access_token provided by the Graph Explorer in the tools section.
The description column of Event FQL table isn't indexable, thus the freestyle search on not indexable columns won't give any result.
The results you see by running the query you suggested gives only events where the 'umvc3' is in the name column, which is indexable.
The only option is to ask facebook for fulltext indexing this column which apparently won't happen. They surely won't open any column for using clause like 'LIKE' since the query execution will take a lot of time.
And the answer from Facebook developer: https://stackoverflow.com/a/5824449/334522

The limit of Facebook's graph api "limit" parameter

I'm fetching a large amount of comments from a public page using Facebook's Graph API.
By default facebook returns 25 comments per response, and uses paging. This causes the need for multiple requests, which is uneccesery as I know ahead there will be a lot of comments.
I read about the "limit" parameter that you can pass to ask for a certain amount of items per response.
I was wondering, what is the limit of that parameter? I'm assuming I can't pass &limit=10000.
There's a different way for fetching comments:
https://graph.facebook.com/<PAGE_ID>_<POST_ID>/comments?limit=500
The maximum value for the limit parameter is 500.
yes, with limit parameter you can pass what number of certain resource you want in one call. default limit is 25.
for ex. if you want 100 comment in one call for a post having id POST_ID, you can query like this:
https://graph.facebook.com/POST_ID?fields=comments.limit(100)
I think they have changed this. For /feed? I only get 200-225 posts back but for comments I get as many as 2000 back
Old question, but this is in the current Facebook documentation in case anyone finds this question via search (emphasis mine):
Some edges may also have a maximum on the limit value for performance reasons. In all cases, the API returns the correct pagination links.
In other words, even if you specify a limit above what's allowed by the endpoint, the "pagination.previous" and "pagination.next" elements will always provide the correct URL to resume where it left off.
I would recommend you to use FQL instead.
FQL provide a more flexible approach where you can combine data types (posts, users, pages, etc..) as you please. You can also query for comments belonging to a list of stories instead of just one limiting your number of requests even more.
There are a couple of drawbacks though:
1. There is a limit on 5000 comments. Here you would use a query looking something like: "SELECT id, ...... FROM comments, ... WHERE parent_id in (1,2,3....) ORDER BY time LIMIT 0, 5000". Even though you split this up in several queries with "LIMIT 0, 1000", "LIMIT 1000, 1000", LIMIT 2000, 1000, etc.., you would never get anything over 5000 comments("LIMIT 5000, 1000" would return empty).
2. All real requests made on Facebooks server counts as one request. You can send of something that is actually a combination of requests, this will be counted as multiple requests.
3. Facebook does not like to heavy requests. You can end up with getting blocked for a shorter time periods(minutes -> hours, not days). If this happens, act on it.

FQL query response randomly omits some results

I'm trying to make a simple "only status updates, nothing else" app (since FB doesn't seem too interested in this sort of thing). However, my queries seem to omit some results:
"select status_id,uid,time,message from status where uid in (select uid2 from friend where uid1= $my_id) ORDER BY time DESC LIMIT 25", for instance, when I last tested it, only returned 21 results (and yes, I've got enough friends who have made enough updates that there are definitely more than 25 historical statuses).
This is with the PHP API, by way of Heroku, but I've had similar issues for a while, going back to before FBML was deprecated, with basically the same query.
I haven't tested enough to determine absolutely that this is the case, but it seems only to return one status per user (if Bob posted six updates, it only returns his newest status and ignores the previous ones).
Is this a known issue/bug? Any workarounds?
facebook trades accuracy for performance it has been always the case , so it usually returns a limited number of results per query
It's probably because a user has not given access for a friends apps to access their posts. Apparently making an FQL request, facebook does the initial request, including your limit param. Then it filters the list removing anything that you don't have permissions to see. Hence receiving less than 25 results.