Facebook对象API - 创建的重复对象

时间:2013-07-08 13:37:21

标签: facebook facebook-opengraph

我通过开放图形对象API创建对象,并将它们附加到已发布的故事中。创建了对象和故事,FB返回id,好像一切正​​常。

然而,在提交对象/故事以供审阅时,结果发现有两个对象(不同的对象类型),即使我只发出一个HTTP POST请求。

背景

  • 我们的应用正在使用命名空间'mynamespace'
  • 我们创建了一个名为“myobject”的自定义打开图形对象
  • 我们创建了一个名为“myaction”的自定义开放图表操作

请求详细信息:

1)首先我们创建一个对象:

POST /me/objects/mynamespace:myobject HTTP/1.1\r\nConnection: close\r\nHost: graph.facebook.com\r\nContent-Length: LENGTH\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n

URI解码的http body:

access_token=TOKEN&object={"url":"http://url.com","title":"My title","image":"https://imageurl.com","description":"My description"}

响应:

"{\"id\":\"123456789\"}"

2)然后我们创建一个故事(引用了这个对象):

POST /me/mynamespace:myaction HTTP/1.1\r\nConnection: close\r\nHost: graph.facebook.com\r\nContent-Length: LENGHT\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n

URI解码的http body:

access_token=TOKEN&myobject=123456789&fb:explicitly_shared=true&message=User generated message

响应:

"{\"id\":\"12121212121\"}"

预期结果

  • mynamespace类型的一个对象:应创建myobject
  • mynamespace类型的一个故事:应该创建myaction

实际结果

  • mynamespace类型的一个对象:myobject已创建
  • mynamespace类型的一个故事:创建了myaction
  • 创建了一个Object类型的对象(根据评论者的说法)
  • 创建一个Post类型的操作(根据评论者)

在用户Feed和对象浏览器中只显示了一个故事,但审稿人告诉我们以下内容: 当用户触发操作时,您的操作会生成多个已发布的故事。用户不应对为单个应用内操作发布的多个故事感到惊讶。我采取的行动产生了一个“帖子”和一个“myaction”的故事。

我们看了一下(Open Graph - > Types),结果发现每次我们发出这个请求时,会出现一个'Object'类型的对象,并且会自动创建/定义一个'Post'类型的动作!这必须是审稿人抱怨的内容,但我们无法弄清楚我们做错了什么!

非常感谢任何关于如何解决这个问题的建议。

使用Open Graph API资源管理器时完全相同的问题

事实证明,通过Facebook Graph API资源管理器创建对象时会发生同样的事情。执行此操作时,“对象”对象和“发布”操作突然出现在“打开图形”下 - >类型。现在我看到了这个问题的以下原因:

  • 对象/动作/故事以某种方式设置错误
  • 审稿人认为这实际上不是
  • 时的问题
  • 这是一个FB小虫

通过Graph API资源管理器创建的对象

通过Graph API资源管理器创建对象时,这是结果对象:

{
  "id": "4324324234234234", 
  "url": "http://url.com", 
  "type": "mynamespace:myaction", 
  "title": "My title", 
  "image": [
    {
      "url": "https://imageurl.com"
    }
  ], 
  "description": "My description", 
  "updated_time": "2013-07-09T14:14:38+0000", 
  "created_time": "2013-07-09T14:14:38+0000", 
  "application": {
    "id": "432423423423", 
    "name": "appname", 
    "url": "https://www.facebook.com/apps/appurl"
  }, 
  "is_scraped": false, 
  "post_action_id": "23423423423423423"
}

'post_action_id'看起来很奇怪,当我请求那个对象时:

{
  "id": "423423423423", 
  "from": {
    "name": "My name", 
    "id": "234234"
  }, 
  "start_time": "2013-07-09T14:14:38+0000", 
  "end_time": "2013-07-09T14:14:38+0000", 
  "publish_time": "2013-07-09T14:14:38+0000", 
  "application": {
    "name": "appname", 
    "namespace": "mynamespace", 
    "id": "432423423423"
  }, 
  "data": {
    "object": {
      "id": "4324324234234234", 
      "url": "http://url.com", 
      "type": "mynamespace:myaction", 
      "title": "My title"
    }
  }, 
  "type": "og.posts", 
  "likes": {
    "count": 0, 
    "can_like": true, 
    "user_likes": false
  }, 
  "comments": {
    "count": 0, 
    "can_comment": true, 
    "comment_order": "chronological"
  }
}

对象已经有一个相关的og.posts对象的事实必须才是评论认为的问题。我仍然不明白为什么这个og.posts对象会自动显示为一个开放的图形对象。

2 个答案:

答案 0 :(得分:0)

这里的问题是,当用户点击您网站上的“和平”按钮时,会发布两个Open Graph操作,这违反了我们的政策 - 一个用户操作不应发布多个故事。如果您以Open Graph Test User身份登录并检查活动日志,您将看到以下两个已发布的具有相同时间戳的操作:

https://www.facebook.com/100006264788511/activity/1388570951361718 https://www.facebook.com/100006264788511/activity/1388570924695054

您确定您的代码在发布操作时只调用了一次图谱API吗?

答案 1 :(得分:0)

我不确定这会如何映射到您的POST,但我在iOS上处理相同的问题,问题是发布对象和操作。如果在操作的字段object上设置other(而不是在发布后设置objectId),则只创建一个活动。 就我而言,而不是:

NSMutableDictionary<FBOpenGraphObject> *object = [FBGraphObject openGraphObjectForPost];
object.provisionedForPost = YES;
object[@"title"] = @"Title";
object[@"type"] = @"video.other";
object[@"url"] = url;
[FBRequestConnection startForPostOpenGraphObject:object
                               completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
    if (!error && [result objectForKey:@"id"]) {
        NSString* objectId = [result objectForKey:@"id"];
        id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
        action[@"explicitly_shared"] = @"true";
        action[@"other"] = objectId;
        [FBRequestConnection startForPostWithGraphPath:@"me/myNamespace:post"
                                           graphObject:action
                                     completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
         {
             // handle success and failures
         }];
    }
}];

我必须这样做:

NSMutableDictionary<FBOpenGraphObject> *object = [FBGraphObject openGraphObjectForPost];
object.provisionedForPost = YES;
object[@"title"] = @"Title";
object[@"type"] = @"video.other";
object[@"url"] = url;
id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
action[@"explicitly_shared"] = @"true";
action[@"other"] = object;
[FBRequestConnection startForPostWithGraphPath:@"me/myNamespace:post"
                                   graphObject:action
                             completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
    // handle success and failures
}];