Facebook Graph API 与喜欢的帖子不同

Posted

技术标签:

【中文标题】Facebook Graph API 与喜欢的帖子不同【英文标题】:Facebook Graph API unlike a liked post 【发布时间】:2013-02-08 05:50:37 【问题描述】:

我的应用中有一个方法允许用户“喜欢”他/她的新闻提要中的帖子。它是通过使用HttpMethod.POST 的简单图形请求完成的。但是当我尝试使用HttpMethod.DELETE 执行“不同”操作时,我收到一个错误回调:

02-08 00:35:57.298: I/Detail(2628): Response:  responseCode: 403, graphObject: null, error: 
HttpStatus: 403, errorCode: 200, errorType: OAuthException, errorMessage: (#200) 
Feed story publishing to other users is disabled for this application, isFromCache:false

现在我认为这与最近尝试使所有与 Facebook 集成的应用程序使用所有 Facebook 外观对话框和样式有关,但我可能错了。这是让我怀疑的roadmap post:

移除通过 Graph API 向朋友墙发帖的功能我们将 删除通过图表发布到用户朋友墙上的功能 API。具体来说,针对 [user_id]/feed 的帖子 [user_id] 是 不同于会话用户,或者 stream.publish 调用 target_id 用户与会话用户不同,会失败。如果你 想要允许人们发布到他们朋友的时间线,调用 饲料对话框。通过用户提及标签包含朋友的故事或 动作标记将显示在朋友的时间线上(假设 朋友批准标签)。有关详细信息,请参阅此博文。

关于我可能做错什么的任何想法,或者 Facebook 只是在毁了我?谢谢!

编辑:这是我用来运行请求的代码。

Request likeRequest = new Request(Utility.fbSession, null, null, null, new Request.Callback() 
    @Override
    public void onCompleted(Response response) 
        String responseString = response.toString();
        Log.i("Detail", responseString);
        updateDetail();
    
);
HttpMethod nextLikeCall = HttpMethod.DELETE;
likeRequest.setHttpMethod(nextLikeCall);
likeRequest.setGraphpath(itemId+"/likes");
likeRequest.executeAsync();

【问题讨论】:

对我来说似乎工作得很好。除了,我使用的是较旧的 SDK V 2.x。我昨天在这里发布了一个关于喜欢和“不喜欢”cmets 的问题的答案:***.com/a/14749927/450534。看看它是否适合你。您将不得不更改评论的特定部分,但帖子和 cmets 的代码是相同的。 根据错误代码,这似乎是权限问题,但我设置了 publish_stream 权限。 您是否在图形浏览器中尝试过您的确切请求? developers.facebook.com/tools/explorer你描述的场景应该可行。 我在图形浏览器中得到了相同的响应。 POST (like) 工作正常,但 DELETE (unlike) 给我错误。 @Wenger 你有想过这个吗?我有完全相同的问题。喜欢可以正常工作,但不喜欢会引发同样的错误。 【参考方案1】:

当您从图表数据中获取帖子 ID 时,其格式应为:XXXXX_YYYYY。 XXXXXX 只是用户 ID,而 YYYYY 是实际的帖子 ID。您需要做的是仅提取并使用图表为您提供的帖子 ID 的 YYYYY 部分。所以你想发送graph.facebook.com/YYYYY/likes而不是graph.facebook.com/XXXXX_YYYYY/likes。这将适用于喜欢和不喜欢,您可以先在图形资源管理器中进行测试,然后再将子字符串提取方法组合在一起。

不确定如何在 android 上提取字符串的一部分,但我知道在 Objective-C/ios 中,可以这样做(代码未经测试,供参考/想法):

SString *actualPostIdStr;      //The String we will put the actual postId in
NSString *oldIdStr          =   //<the string in format XXXXX_YYYYY>
NSInteger charCount         =   [oldIdStr length]; //get the length of the original XXXXX_YYYYY string
NSRange fRangeCount         =   [oldIdStr rangeOfString:@"_"]; //get count of characters to remove (XXXXXX)


if (fRangeCount.location != NSNotFound)
    NSInteger startingPos   =   fRangeCount.location + 1; //get the starting character position of the actual postId
    actualPostIdStr         =   [[oldIdStr substringWithRange:NSMakeRange(startingPos, charCount - startingPos)] copy];

希望这会有所帮助。

编辑: 好的,所以我整天都在玩点赞……似乎这种方法有时不起作用,但这完全取决于您尝试喜欢/不喜欢的图形对象的类型。例如......普通的状态帖子,这种方法非常有效。但是,当我尝试为带有消息/故事帖子对象的照片点赞时遇到了问题。事实证明,在这种带有照片的帖子对象的图表数据中,除了状态帖子图表数据中的普通“id”之外,还有一个名为“object_id”的附加参数。在这种情况下,对于照片和故事帖子,您需要传递“object_id”,保持不变以成功取消喜欢。

这个混乱似乎要么是 FB 端的错误,要么他们正在更改并禁止来自图形 api 的喜欢/不喜欢,只是忘记/还没有告诉我们 :) 希望是前者。同时,您只需要使用我上面的答案,但只需确保您使用可以找到的尽可能多的不同类型的帖子对象进行测试,并在不同的 id (“id”的一部分)时使用 if 条件...“object_id”...等)是必需的。

【讨论】:

这有点道理。今晚我得试试。谢谢! 对。 “object_id”是您获取链接到给定帖子的照片的高分辨率数据和其他详细信息的地方。我想使用它而不是帖子 ID 确实有意义。 @Wenger 是的,但是根据你的制作,有很多对象只有“id”而没有“object_id”......我一直在使用上面的条件最好抓住“object_id”并退回到提取“id”的有用部分,到目前为止它工作得很好。当你有机会检查时,告诉我这是否对你有用。 是的,我目前还有其他问题(摆脱我的启动屏幕让找出身份验证成为一场噩梦)。但是一旦我完成了,我会试一试的。【参考方案2】:

有时Daniel McCarthy 的方法不起作用。在这种情况下,我们需要获取 Graph API 请求 XXX_YYYY,找到字段 object_id 与此 object_id 不同。

【讨论】:

以上是关于Facebook Graph API 与喜欢的帖子不同的主要内容,如果未能解决你的问题,请参考以下文章

来自 facebook graph api 的可共享帖子网址

Facebook 分享图标对于通过 Graph API 发布的帖子不可见

Facebook Graph API:提要中缺少帖子

PHP Facebook Graph API 和完整或更大尺寸的帖子图像

Facebook Graph API:发布包含多个视频和照片的帖子

Instagram 的帖子未显示在 Facebook Open Graph API 上