检查用户的Facebook个人资料是否已更新

4
我有一个需求需要下载和存储用户的Facebook图片,因为我们将其用作他们在系统中的用户账户图片,就像许多其他应用程序一样。问题是我不想每次获取活动会话时都覆盖它。我更想做的是检查一些东西,看看用户是否在上次检索它后更新了他们的个人资料图片。如果是这样,我显然希望更新我们系统中的图片以匹配Facebook上的当前图片。
我的问题是:是否有更新的时间戳或其他东西可以查看用户的Facebook个人资料图片何时更改?还有更好的方法吗?
更新:
参照@Nachi的建议,我向“/me/picture”图形端点发出了Graph API请求,并可以成功地获取到用户的个人资料图片,但是头部没有返回结束标记,请参见下面的代码。
Request.newGraphPathRequest(Session.getActiveSession(),"/me/picture",new Request.Callback() {
                @Override
                public void onCompleted(Response response) {
                    Map<String,List<String>> headers = response.getConnection().getHeaderFields();
                    for (Map.Entry<String,List<String>> entry : headers.entrySet()) {
                        Log.d(LOG_TAG,entry.getKey()+": "+entry.getValue().toString());
                    }

                    Log.d(LOG_TAG,response.getRawResponse());
                    Log.d(LOG_TAG,response.getGraphObject().toString());
                }
            }
        ).executeAsync();

更新2

我把图形请求的结尾标签改为只是“/me”,这是公共个人资料,我成功获得了ETag。

2个回答

4
您可以使用实时API获取任何更改,它支持检查个人资料图片:https://developers.facebook.com/docs/graph-api/real-time-updates/v2.1 这比定期自己检查要好得多,因为Facebook会推送更改给您,您不会遇到API限制的问题。根据我的经验,您最多在30秒内就会收到有关更改的通知,大多数情况下速度更快。

我主要需要用于Android和iOS应用程序,只需要偶尔检查。我认为实时更新可能有点过于极端了。 - StuStirling
1
这并不是非常极端,你只会在发生更改时收到通知,而且你永远不会因此遇到API限制的问题 :) - 如果你需要对变化做出反应,这绝对是最好的方式。 - andyrandy

3

是的,Facebook Graph API支持HTTP ETags。当您调用Graph API时,可以提供一个头参数,其中包含从上次调用返回的值的哈希值。如果新值未更改,服务器将返回304 Not Modified

这是一个详细的指南

  1. 当您调用Graph API时,响应标头包括ETag,其值是API调用返回的数据的哈希值。获取此ETag值并在步骤2中使用。
  2. 下一次调用相同的API时,请在请求头中包含If-None-Match请求头,并使用从步骤1中为此API调用获取的ETag值。
  3. 如果数据没有更改,则响应状态代码将是304 - Not Modified,并且不会返回任何数据。
  4. 如果数据自上次拉取以来发生了更改,则像往常一样返回数据,并提供新的ETag。获取新的ETag值并在随后的调用中使用。

感谢您的回答。请查看我的原始问题,了解尝试后的更新。 - StuStirling
这可能不适用于非 JSON 响应,如图像。您可以尝试在请求中使用 /me/picture?redirect=false - Nachi
嗨Nachi,没错,那个方法可行。我在你发帖之前就已经想出来了。我的新问题是如何将If-None-Match添加到com.facebook.Request中。有什么想法吗? - StuStirling
根据快速查看Request类,也许这样会起作用:构造一个Request对象。然后在此对象上调用toHttpConnection。最后,使用setRequestProperty(key, value)将标头添加到HttpURLConnection对象中,然后执行它。不过这似乎过于复杂,如果你发现更简单的方法,我很感兴趣听听。 - Nachi
1
我需要执行HttpURLConnection而不是Request,除非我可以将Request的连接设置回修改后的连接?我同意,这种做法很糟糕,但目前似乎找不到其他方法。 - StuStirling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接