簡體   English   中英

Facebook Graph API Pagination如何工作以及如何使用它迭代facebook用戶提要?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM