2017-01-01 71 views
4

SO。 我已经陷入了一个问题,投资小时搜索互联网并没有多大帮助,认为SO总是一个不错的选择。 我有一个Facebook GraphAPI打电话让Facebook用户养活喜欢这里如下:facebook图形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分页的用户feed我最终找到了这个解决方案,它适用于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" }); 

这花了我接近我想要实现了一步,但我认为这是不这样做的理想方式,也不会返回所有用户的帖子。 有什么解决方法吗?请帮忙。

P.S:我正在使用Facebook C#SDK。

UPDATE1: 根据杰里米的回答。看起来,Facebook光标分页是我需求的唯一正确选项。我想知道C#facebook sdk是否提供了迭代Next Edges的功能,这样我就可以在一次调用中获得所有的feed帖子,是否有任何可能的解决方案呢? PS:我已经经历过很多次Facebook API文档,并且我知道节点,边缘和字段究竟是什么,唯一不幸的是Facebook尚不支持C#SDK,并且我无法找到适当的文档Facebook C#SDK也是如此。

+0

除非Graph API在最近的几个版本中发生了变化,否则它并不是真的那样工作。 Facebook的帖子是边缘,如果你想获得用户的所有帖子,你必须保持冲浪的边缘(插入新项目)。你发现的* Offset *是最接近的。您可以在FB API文档中阅读此内容。 –

回答

1

最后做了一些研究和阅读一些博客,我发现有来自Facebook没有直接API CAlls在一次获取所有用户馈线帖子后。 为了实现这个功能,任何人都必须按照Jeremy Thomson的建议进行无限滚动,或者遍历不同的Facebook数据页面,而不管edge支持哪个facebook pagination类型。至于我想要一个没有用户干扰/操作的进程,我肯定会去第二个选项,它是通过循环遍历facebook数据页面的while循环。 要做到这一点,我们首先需要我们的两个最重要的参数(脸谱access_token +(脸谱appsecret_proof),如下所述:

var appsecret_proof = access_token.GenerateAppSecretProof(); 
var fb = new FacebookClient(access_token); 

点要记住: Facebook的access_tokenHttpContext类生成。

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)); 
     } 

直到这里之前一切都清楚了,最重要的部分肯定是获取所有f acebook用户帖子现在正在运行。为此,我们需要设置一个string 为空的。这里:

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分钟,这对我来说并不理想。

+0

什么是'GetNextPageQuery'? –

+0

看起来你对我使用的是不同的API :) –

5

首先了位术语:

节点 - 基本上“事物”,诸如用户,图片,一个页面,评论
边缘 - “东西”之间的连接,例如作为页面的图片或照片的评论
领域 - 那些“东西”的信息,比如一个人的生日,或者页面

的名称当您的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=" 
    } 
} 

要获得用户的所有帖子你继续冲浪“下一个”边缘(upserting新项目) 。当我将整个团体转储到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边缘算法的顺序返回。

偏移分页基础

当你不关心年代,只想对象的具体数量返回

偏移分页都可以使用。这应该只在边缘不支持光标或基于时间的分页时才能使用。

所以你发现与胶印是最接近你会得到你想要的股票标准分页。但是:

所有API调用都不支持基于偏移的分页。为了获得一致的结果,我们建议您使用我们在回复中返回的上一个/下一个链接进行分页。

您可以在FB API文档中阅读所有这些内容。

https://developers.facebook.com/docs/graph-api/overview/
https://developers.facebook.com/docs/graph-api/using-graph-api/

+0

我已经更新了这个问题,请看看它,我真的很感激,如果我得到一个点的答案。 –

+0

底层Facebook Graph API不支持在一次调用中获取所有用户帖子,因此C#SDK无法提供该功能。我唯一能想到的就是使用WebClient和/或HTML Agility包,并滚动到用户页面的底部并将整个页面转出。不理想。 –

+0

我看过我的回答下面是 –

相关问题