Dependent FQL query with Facebook Batch Request - facebook-graph-api

I amusing Facebook's Batch method unfortunately the second query does not work once there are 2 0r more results from the first query. I am trying to get the ids of people who liked a post.
batch:[{
"method":"GET",
"name":"get-stream",
"omit_response_on_success": false,
"relative_url":wallid+"/feed?date_format=U&limit=2"
},{
"method":"POST",
"depends_on":"get-stream",
"relative_url":'method/fql.query?query=SELECT+user_id+FROM+like+WHERE+post_id= {result=get-stream:$.data.*.id}'
}]

Shouldn't it be:
WHERE+post_id+in+({result=get-stream:$.data.*.id})
There at the end? Or if you really want just one post to be involved set the limit to 1?

Related

Instagram Graph API - Fetch media insights metric when a user switched from personal to business account

I'm looking for a way to fetch Media Insights metrics in Instagram Graph API (https://developers.facebook.com/docs/instagram-api/reference/media/insights) with a nested query based on the userId, even when a client switched from a Personal to a Business account.
I use this nested query to fetch all the data I need : https://graph.facebook.com/v3.2/{userId}?fields=followers_count,media{media_type,caption,timestamp,like_count,insights.metric(reach, impressions)} (this part causes the error: insights.metric(reach, impressions) - it works however for an account that has always been a Business one)
However, because some media linked to the userId were posted before the user switched to a Business account, instead of returning the data only for the media posted after, the API returns this error:
{
"error": {
"message": "Invalid parameter",
"type": "OAuthException",
"code": 100,
"error_data": {
"blame_field_specs": [
[
""
]
]
},
"error_subcode": 2108006,
"is_transient": false,
"error_user_title": "Media Posted Before Business Account Conversion",
"error_user_msg": "The media was posted before the most recent time that the user's account was converted to a business account from a personal account.",
"fbtrace_id": "Gs85pUz14JC"
}
}
Is there a way to know, thru the API, which media were created before and after the account switch from Personal to Business? Or is there a way to fetch the date on which the account was switched?
The only way I currently see to get the data I need is to use the /media edge and query insights for each media until I get an error. Then I would get approximately the date I need. However, this is not optimized at all since we are rate limited to 200 calls per user per hour.
I have the same problem.
For now, I'm Switch between queries (if first have error)
"userId"?fields=id,media.limit(100){insights.metric(reach, impressions)}
"userId"?fields=id,media.limit(100)
I show the user all insights in zero.
I don't know if they're the best alternative, like identify the time of conversion to business and get the post between this range of DateTime
I got the same problem and solved it like this:
Use the nested query just like you did, including insights.metric
If the error appears, do another call without insights.metric - to at least get all other data
For most accounts, it works and there is no additional API call. For the rest, i just cannot get the insights and i have to live with it, i guess - until Facebook/IG fixes the issue.
I got the same problem and solved it like this:
Step1: Convert your Instagram account to a Professional account.
Step2: Then According to Error Post a new post on Instagram and get their Post-ID.
Step3: Then try to get a request using that Post-ID.
{Post-ID}?fields=comments_count,like_count,timestamp,insights.metric(reach,impressions)
curl -i -X GET "https://graph.facebook.com/v12.0/{Post-ID}?fields=comments_count%2Clike_count%2Ctimestamp%2Cinsights.metric(reach%2Cimpressions)&access_token={access_token}"
For more: insights
Here is the relevant logic from a script that can handle this error while still doing a full import. It works by reducing the requested limit to 1 once the error is encountered. It will keep requesting insights until it encounters the error again, then removes insights from the fields and returns to the requested limit.
limit = 50
error_2108006 = False
metrics = 'insights.metric%28impressions%29%2C' # Must be URL encoded for replacement
url = '/PAGE_ID/media?fields=%sid,caption,media_url,media_type&limit=%s' % (metrics, limit)
# While we have more pages
while True:
# Make your API call to Instagram
posts = get_posts_from_instagram(url)
# Check for error 2108006
if posts == 2108006:
# First time getting this error, keep trying to get insights but one by one
if error_2108006 is False:
error_2108006 = True
url = url.replace('limit={}'.format(limit), 'limit=1')
continue
# Not the first time. Strip out insights and return to desired limit.
url = url.replace(metrics, '')
url = url.replace('limit=1', 'limit='.format(limit))
continue
# Do something with the data
for post in posts:
continue
# If there are more pages, fetch the next URL
if 'paging' in posts and 'next' in posts['paging']:
url = posts['paging']['next']
continue
# Done
break

Instagram Business Discovery API Pagination Token not working?

I am trying to use Instagram Business Discovery API to get post statistics from a certain public page.
Take Bath and Body Works (https://www.instagram.com/bathandbodyworks) for example.
GET graph.facebook.com
17895695668004550?fields=business_discovery.username(bathandbodyworks){followers_count,media_count,media{timestamp,like_count,comments_count}}
This will give me the following response:
{
"business_discovery": {
"followers_count": 3526159,
"media_count": 3536,
"media": {
"data": [
{
"timestamp": "2018-05-16T20:00:54+0000",
"like_count": 28925,
"comments_count": 530,
"id": "17917935010179826"
},
(24 posts data omitted...)
"paging": {
"cursors": {
"after": "QVFIUlBNak5fNTc3eThl..." (a very long string)
}
}
}
Now, this only gives me the most recent 25 posts, which I believe is the limit per request set by Facebook.
What should I do if I want to load the next 25 posts?
In YouTube Data API there is also a limit per request of 50, but a "nextPageToken" is provided to load the next 50 post. I assume this is the same case here?
I also found in this Facebook API document that maybe I can add a cursor string like: &after=QVFIUlBNak5fNTc3eThl...,
but this doesn't work.
Any suggestions would be appreciated, thank you!
The pagination with business_discovery is a bit different from Facebook
pagination.
There's no next and previous url's.
You need to add, after cursor as this example:
https://graph.facebook.com/v2.12/xxxx?fields=business_discovery.username(jacqehoward){id,name,username,website,profile_picture_url,biography,followers_count,media_count,media.after(QVFIUlZA5aTR5NTE4Y24tNW90VGZAPTVBtb0NpOEFPTlNLeklmVTEtUDZAfVnE0YnBhUVNOQ3BDaktzNHJBTENhTmVYLUV2SGJPZAVAxZA09hQ2NhUGdnUGFjMTNn){id,caption,comments_count,like_count,media_type,media_url,owner,timestamp}}
Note:
media.after(after_cursor){media_fields}
And if you want to paginate through business_discovery to the end you must add after cursors until there's only response with previous cursor. This is the mark that you reached the first post.

Microsoft Academic API, Knowledge graph search -- error 500/503

I'm using the graph search method of the Microsoft Academic API to retrieve paper information using the following query:
POST https://westus.api.cognitive.microsoft.com/academic/v1.0/graph/search?mode=json
Content-Type: application/json
Host: westus.api.cognitive.microsoft.com
Ocp-Apim-Subscription-Key: my-api-key
{
"path": "/paper",
"paper": {
"select": [
"PublishYear",
"CitationCount",
"ConferenceSeriesID",
"JournalID",
"AuthorIDs",
"AffiliationIDs",
"AuthorSequenceNumbers",
"OriginalAffiliations",
"NormalizedAffiliations",
"Keywords",
"FieldOfStudyIDs",
"ReferenceIDs",
"CitationIDs",
"OriginalTitle",
"NormalizedTitle",
"DOI",
"OriginalVenue",
"NormalizedVenue"
],
"type": "Paper",
"id": [2059999322, 1993355715, ...]
}
}
For this query, I'm getting one of three responses: 200 OK, 500 internal error, or 503 unavailable (same query and same list of IDs). I just tried to run this query (with the two IDs I listed in the example) five times, out of that, I got 3 correct responses, and 2 errors. Is there something in my request that's causing this or is this an error in the service?
My second question is, is there a limit on how many IDs can I submit in one query? I tried to look for this information on the documentation page, but couldn't find anything (just a rate limit in terms of how many queries can be sent per time, but nothing related to query size).
EDIT:
Response I'm getting with error 500 (using the query above):
{
'Error':
{
'Message': 'Something went wrong, if the error continue please contact us',
'Code': 'InternalError'
}
}
Response that comes with error 503 is empty for me.
I think I found what the problem is. In case anyone ever has the same issue, it seems it's certain IDs that return an error. I narrowed my set of ~150k IDs to 20 which always fail. The trouble is if an erroneous ID gets mixed in a large batch of IDs which are fine, the whole request fails.

display most commented (on facebook) "article"

i have set of articles on my website where people can comment using facebook.
The fix is I have to find the most commented article and show, say 5 of them, on webpage.
I have tried looking into facebook api, and googled it out for 2-3 days without having any luck.please help
You can query this info from the Facebook API - I'll explain the process to do it, but I'm not a django expert, so you'll need to turn this into Python.
Basically, you need to grab the URLs for each of your articles and hit the Graph API requesting the comments and a summary of them for that URL like this: https://graph.facebook.com/comments/?ids=YOUR-URL&summary=1
Change the YOUR-URL part of the above to the link you want to check. You can even specify more than one link at at time if you like: https://graph.facebook.com/comments/?ids=YOUR-URL1,YOUR-URL2&summary=1
So if you query the example.com comments:
Hit this URL https://graph.facebook.com/comments/?ids=http://example.com/comments&summary=1
You should get back some JSON data which looks like this (I trimmed the middle bit):
{
"http://example.com/comments": {
"comments": {
"data": [
...
],
"paging": {
"cursors": {
"after": "NDc4OQ==",
"before": "NDgyMg=="
},
"next": "https://graph.facebook.com/10150107083136229/comments?summary=1&limit=25&after=NDc4OQ\u00253D\u00253D"
},
"summary": {
"order": "ranked",
"total_count": 4822
}
}
}
}
In the "summary" section you can see there is a total_count which is the number of comments made on that URL.
So your process will be:
Loop through all the links you want to check
Hit the Facebook Graph API for that URL Extract the total_count response in the JSON and
store it (perhaps in a table)
Order the results on the number of comments descending, limiting to
only the first 5 results (if you're using MySQL then something like
SELECT * FROM whatever ORDER BY total_count DESC LIMIT 5)

Facebook Graph API - get ID for a URL?

This seems like a pretty obvious, basic thing to expect from the Graph API, but I'm having serious difficulty with it. All I want to do is get the ID for any particular URL. They have a method for this:
https://graph.facebook.com/?ids=http://www.imdb.com/title/tt0117500/
And that works great. But if I try another URL, say for my blog,
https://graph.facebook.com/?ids=http://dusda.vox.com
it doesn't give me back a numerical ID like all of the examples do. Instead, this:
{"http:\/\/dusda.vox.com":{"id":"http:\/\/dusda.vox.com"}}
If I try to use that "id", I get jack (probably because the query string looks impossible to parse):
Request: https://graph.facebook.com/http://dusda.vox.com/likes
Response: {"id":"http:\/\/dusda.vox.com\/likes"}
So what's up with this? Is the Graph API just selectively reliable, or am I misunderstanding something? I've tried it on URLs that I know are popular on Facebook, too, and I've gotten mixed results.
Try FQL for this;
http://graph.facebook.com/fql?q=select%20url%2C%20id%2C%20type%2C%20site%20from%20object_url%20where%20url%20%3D%20%22http%3A%2F%2Fkriek.hu%2F%22
returns:
{
"data": [
{
"url": "http://kriek.hu/",
"id": 497425470154,
"type": "link",
"site": "kriek.hu"
}
]
}
For more information, see object_url.
I hope it helps!
The ID is given by Facebook only to pages which have a fbshare/like button. Else the API returns the number of shares and the request URL.
If I use the facebook object debugger page I can scrape every url, for example:
https://developers.facebook.com/tools/debug/og/object?q=ddnl.de
The page give me back an url with ID and so I can get every needed parameters.
In this case https://graph.facebook.com/10150164108649475
But I don't get this ID or url with FQL or otherwise?
Very old question, but here's what I found works for me as none of the answers here really resolved my issue:
If you have a custom object tied to a url, the method suggested by Pepe only gives the id FB assigns to the url where type=link. (Which is not tied to any comments)
In my case, I need my custom object id so that I could pull associated comments from it. You can get the object id using FQL by doing a select on 'comments_fbid' from the 'link_stat' table. (This will return the object id even if no comments have been added so it should work for other cases)
api.facebook.com
At this time no of the suggested solutions work for all urls. Only the Debugger is able to get the Graph ID correctly
For example
Debugger:
https://developers.facebook.com/tools/debug/og/object?q=http%3A%2F%2Fwww.amazon.de%2Fgp%2Fproduct%2F3810510793%2F
For URL:
www.amazon.de/gp/product/3442465583/
Result:
https://graph.facebook.com/10150771435736113
{
"url": "http://www.amazon.de/dp/3810510793/ref=tsm_1_fb_lk",
"type": "book",
"title": "Die unwahrscheinliche Pilgerreise des Harold Fry: Roman",
"image": [
{
"url": "http://ecx.images-amazon.com/images/I/51I4E81xrRL._SL160_.jpg"
}
],
"description": "Die unwahrscheinliche Pilgerreise des Harold Fry: Roman",
"site_name": "Amazon.de",
"updated_time": "2012-12-19T16:54:27+0000",
"id": "10150771435736113",
"application": {
"id": "164734381262",
"name": "Amazon",
"url": "https://www.facebook.com/apps/application.php?id=164734381262"
}
}
I had the same problem here, I was trying to get the same data IMDB gets. After almost bang my head against the wall, I decided to look at the facebook's js function. And look what I get, the explanation is on the link.
Getting limited data from a page which has a Facebook ID
Peace