Facebook C # SDK: BatchAsync Получите всех друзей за последние статусы одним пакетным запросом - PullRequest
1 голос
/ 20 мая 2011

Как я могу получить последние статусы всех друзей в одном пакетном запросе? Я попробовал следующее, но это не работает:

FacebookClient _FacebookClient = new FacebookClient ( Settings.AccessToken );

FacebookClient.PostCompleted += new EventHandler<FacebookApiEventArgs> ( _FacebookClient_PostCompleted );

FacebookClient.BatchAsync
(
    new FacebookBatchParameter [ ]
    {
        new FacebookBatchParameter( HttpMethod.Get , "/me/friends" , new Dictionary<string , object> { { "fields" , "id , name , picture" } } ) { Data = new { name = "one-friend", omit_response_on_success = false } } ,
        new FacebookBatchParameter{ Parameters = new { ids = "{result=one-friend:$.data.0.id}" } },
        new FacebookBatchParameter("{result=one-friend:$.data.0.id}/statuses",  new Dictionary<string , object> { { "limit" , "1" } , { "data" , "0" } , { "fields" , "message" } } )
    }
);

1 Ответ

1 голос
/ 25 мая 2011

Я могу ответить на ваш вопрос, используя FQL, что, на мой взгляд, намного проще.Я использовал FacebookWebclient, но FacebookClient должен работать так же.

FacebookWebClient fb = new FacebookWebClient ();

string query0 = "SELECT uid2 FROM friend WHERE uid1 = me()"; //here you get the friends list
string query1 = "SELECT uid, message, status_id FROM status WHERE uid IN (SELECT uid2 FROM #query0)"; //here you get the last statuse of each friend (max 50, or max from the last 30 days)
string query2 = "SELECT uid, name FROM user WHERE uid IN (SELECT uid FROM #query1)"; //here you get the user data (in this case the name only)

dynamic result = fb.Query(query0, query1, query2); //all results
dynamic status = result[1][1]; //results of query1
dynamic friend = result[2][1]; //results of query2

for (int i = 0; i < result[1][1].Count; i++)
{
    litFeedback.Text += "<a href=\"http://www.facebook.com/profile.php?id=" + status[i].uid + "\" target=\"_blank\">" + friend[i].name + "</a> : "
        + status[i].message + "<br/>" + Environment.NewLine;
}

//if not using .net 4.0:
//var result = (IList<object>)fb.Query(query1, query2);
//var result0 = ((IDictionary<string, object>)result[0])["fql_result_set"];
//var result1 = ((IDictionary<string, object>)result[1])["fql_result_set"];

Примечание:

http://developers.facebook.com/docs/reference/fql/status/ "Таблица состояния ограничена последними 30 днями или 50 сообщениями, в зависимости от того, что больше."

И, конечно, вам нужны разрешения для: friends_status

...