[英]Using the Facebook graph API how do I tell if a user is online or not?
[英]How does Facebook Graph API Pagination works and how to iterate facebook user feed with it?
我有一個facebook Graph API調用來獲取Facebook用戶提要:
dynamic myFeed = await fb.GetTaskAsync(
("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," +
"message,type,created_time,likes,comments")
.GraphAPICall(appsecret_proof));
以上返回了一些最新的用戶帖子,其中包括21個或22個帖子,但不是完整的用戶帖子列表。 我搜索了一種使用facebook分頁迭代用戶提要的方法,我最終找到了適用於facebook Offset分頁的解決方案。
dynamic myFeed = await fb.GetTaskAsync(
("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," +
"message,type,created_time,likes,comments")
.GraphAPICall(appsecret_proof), new {limit = "1000", offset = "21" });
這讓我更接近我想要實現的目標,但我認為這不是理想的做法,也不會返回所有用戶帖子。 有沒有解決方法? 請幫忙。
PS:我正在使用Facebook C#SDK。
更新1:根據傑里米的回答。 似乎facebook光標分頁是我的要求唯一正確的選項。 我想知道C#facebook sdk是否提供任何功能來迭代下一個邊緣,這樣我就可以在一個電話中獲得所有的帖子,這有什么可能的解決方案嗎? PS:我已經多次通過facebook API文檔,我知道Nodes,Edges和Fields到底是什么,唯一不幸的是facebook還不支持C#SDK,我無法找到適當的文檔Facebook C#SDK也是。
首先是一些術語:
節點 - 基本上是“事物”,例如用戶,照片,頁面,評論
邊緣 - “事物”之間的聯系,例如Page's Photos或Photo's Comments
字段 - 有關這些“事物”的信息,例如某人的生日或頁面的名稱
當您向節點或邊緣發出API請求時,通常不會在單個響應中收到該請求的所有結果。 這是因為某些響應可能包含數千個對象,因此默認情況下大多數響應都是分頁的。
要獲得用戶的所有帖子,您有3個選項:
基於游標的分頁
基於游標的分頁是最有效的分頁方法,應盡可能使用。 游標是指隨機字符串,用於標記數據列表中的特定項目。 除非刪除此項,否則光標將始終指向列表的同一部分,但如果刪除項,則無效。 因此,您的應用不應存儲任何舊游標或假設它們仍然有效。
在讀取支持光標分頁的邊時,您將看到以下JSON響應:
{
"data": [
... Endpoint data is here
],
"paging": {
"cursors": {
"after": "MTAxNTExOTQ1MjAwNzI5NDE=",
"before": "NDMyNzQyODI3OTQw"
},
"previous": "https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw"
"next": "https://graph.facebook.com/me/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE="
}
}
要獲得用戶的所有帖子,您可以繼續瀏覽“下一個”邊緣(插入新項目)。 當我將整個組轉儲到RDBMS進行統計分析時,我就是這樣做的。 通常你會看到你已經遇到的節點的邊緣,這就是我提到UPSERT的原因(如果存在則更新,否則插入)。
基於時間的分頁
時間分頁用於使用指向數據列表中特定時間的Unix時間戳來瀏覽結果數據。
使用使用基於時間的分頁的端點時,您將看到以下JSON響應:
{
"data": [
... Endpoint data is here
],
"paging": {
"previous": "https://graph.facebook.com/me/feed?limit=25&since=1364849754",
"next": "https://graph.facebook.com/me/feed?limit=25&until=1364587774"
}
}
要獲得所有用戶帖子,請不斷回顧。 此方法將按順序為您提供帖子,但可能希望它們通過FaceBooks邊緣算法按順序返回。
基於偏移量的分頁
當您不關心年表並且只想要返回特定數量的對象時,可以使用偏移分頁。 僅當邊緣不支持光標或基於時間的分頁時才應使用此選項。
所以你在Offset中發現的是你最接近你想要的股票標准分頁。 然而:
所有API調用都不支持基於偏移的分頁。 為了獲得一致的結果,我們建議您使用我們在響應中返回的上一個/下一個鏈接進行分頁。
您可以在FB API文檔中閱讀所有這些內容。
https://developers.facebook.com/docs/graph-api/overview/
https://developers.facebook.com/docs/graph-api/using-graph-api/
最后,在做了一些研究和閱讀一些博客后,我發現Facebook沒有直接的API CAlls
來一次獲取所有用戶饋送帖子。 為了實現該功能,要么必須按照Jeremy Thomson的建議進行無限滾動,要么迭代不同的facebook數據頁,而不管edge
支持哪種facebook pagination
類型。 至於我想要一個沒有用戶干擾/動作的過程,我肯定會選擇使用while
循環遍歷facebook數據頁面的第二個選項。 要做到這一點,我們首先需要兩個最重要的參數(facebook access_token
+(facebook appsecret_proof
),如下所述:
var appsecret_proof = access_token.GenerateAppSecretProof();
var fb = new FacebookClient(access_token);
值得記住的點:facebook
access_token
是由HttpContext
類生成的。
facebook API
調用將獲得用戶前25個饋線帖子,如下所示:
dynamic myFeed = await fb.GetTaskAsync(
("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," +
"message,type,created_time,likes,comments")
.GraphAPICall(appsecret_proof));
上面的API
調用返回會生成一個Json
數組,並且應該通過Model View
屬性進行水合,如下所示:
var postList = new List<FacebookPostViewModel>();
foreach (dynamic post in myFeed.data)
{
postList.Add(DynamicExtension.ToStatic<FacebookPostViewModel>(post));
}
直到這里一切都很清楚,最重要的部分肯定是取得所有Facebook用戶的帖子現在正在行動。 為此,我們需要將string
NextPageUri
設置為空,如下所示:
string NextPageURI = string.Empty;
最后一部分是檢查是否有另一個數據頁面,如果是,則應迭代並將數據添加到View Model
直到沒有頁面提升,如下所示:
while (myFeed.paging != null && myFeed.paging.next != null)
{
NextPageURI = myFeed.paging.next;
var nextURL = GetNextPageQuery(NextPageURI, access_token);
dynamic nextPagedResult = await fb.GetTaskAsync(nextURL.GraphAPICall(appsecret_proof));
foreach (dynamic post in nextPagedResult.data)
{
postList.Add(DynamicExtension.ToStatic<FacebookPostViewModel>(post));
}
}
這有助於我擺脫面臨的問題。 但是我還有另一個任務可以繼續。 這是獲取帖子的速度,如果帖子超過30k需要10分鍾,這對我來說並不理想。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.