Facebook对象API-创建重复对象

Facebook对象API-创建重复对象,facebook,facebook-opengraph,Facebook,Facebook Opengraph,我通过OpenGraph对象API创建对象,并将这些对象附加到已发布的故事中。对象和故事都被创建,FB返回id,就好像一切正常一样 然而,在提交对象/故事以供审阅时,发现创建了两个对象(不同的对象类型),尽管我只发出了一个HTTP POST请求 背景 我们的应用程序正在使用名称空间“mynamespace” 我们已经创建了一个名为“myobject”的自定义开放图形对象 我们已经创建了一个名为“myaction”的自定义打开图形操作 请求详细信息: 1) 首先,我们创建一个对象: POST

我通过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正文:

access_token=TOKEN&object={"url":"http://url.com","title":"My title","image":"https://imageurl.com","description":"My description"}
access_token=TOKEN&myobject=123456789&fb:explicitly_shared=true&message=User generated message
答复:

"{\"id\":\"123456789\"}"
"{\"id\":\"12121212121\"}"
2) 然后我们创建一个故事(引用此对象):

URI解码的http正文:

access_token=TOKEN&object={"url":"http://url.com","title":"My title","image":"https://imageurl.com","description":"My description"}
access_token=TOKEN&myobject=123456789&fb:explicitly_shared=true&message=User generated message
答复:

"{\"id\":\"123456789\"}"
"{\"id\":\"12121212121\"}"
预期结果

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

  • 创建了一个mynamespace类型的对象:myobject
  • 创建了一个mynamespace类型的故事:myaction
  • 创建了一个object类型的对象(根据reviewer)
  • 创建一个Post类型的操作(根据审阅者)
只有一个故事出现在用户提要和对象浏览器中,但评论员告诉我们: 当用户触发操作时,您的操作会生成多个已发布的故事。用户不应该对单个应用程序内操作发布的多个故事感到惊讶。我采取的行动产生了一个“帖子”和一个“我的行动”故事

我们在(Open Graph->Types)下查看了一下,发现每次我们发出请求时,都会自动创建/定义一个“object”类型的对象和一个“Post”类型的操作!这一定是评论者抱怨的,但我们还没有弄清楚我们做错了什么

任何关于如何解决这一问题的建议都将不胜感激

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

事实证明,通过Facebook Graph API explorer创建对象时会发生完全相同的情况。执行此操作时,“Object”对象和“Post”操作突然出现在Open Graph->Types下。现在我看到这个问题的原因如下:

  • 对象/动作/故事在某些方面设置不正确
  • 评论员认为这是一个问题,但事实并非如此
  • 这是一个FB错误
通过图形API浏览器创建的对象

通过Graph API explorer创建对象时,这是生成的对象:

{
  "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对象会自动显示为开放图形对象。

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


你确定你的代码在发布操作时只对Graph API进行了一次调用吗?

我不确定这将如何映射到你的帖子,但我在iOS上处理了相同的问题,问题是发布对象和操作。如果在操作的
other
字段上设置
object
(而不是过帐后的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*object=[fbGraphObjectOpenGraphObjectForPost];
object.provisionedForPost=是;
对象[@“title”]=@“title”;
对象[@“type”]=@“video.other”;
对象[@“url”]=url;
[FBRequestConnection startForPostOpenGraphObject:对象
completionHandler:^(FBRequestConnection*连接,id结果,NSError*错误)
{
如果(!error&&[result objectForKey:@“id”]){
NSString*objectId=[result objectForKey:@“id”];
id action=(id)[FBGraphObject graphObject];
操作[@“显式共享”]=@“真”;
动作[@“其他”]=objectId;
[FBRequestConnection startForPostWithGraphPath:@“me/myNamespace:post”
graphObject:动作
completionHandler:^(FBRequestConnection*连接,id结果,NSError*错误)
{
//处理成功和失败
}];
}
}];
我必须做:

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
}];
NSMutableDictionary*object=[fbGraphObjectOpenGraphObjectForPost];
object.provisionedForPost=是;
对象[@“title”]=@“title”;
对象[@“type”]=@“video.other”;
对象[@“url”]=url;
id action=(id)[FBGraphObject graphObject];
操作[@“显式共享”]=@“真”;
动作[@“其他”]=对象;
[FBRequestConnection startForPostWithGraphPath:@“me/myNamespace:post”
graphObject:动作
completionHandler:^(FBRequestConnection*连接,id结果,NSError*错误)
{
//处理成功和失败
}];

当您将对象设置为一个可公开访问的HTML页面,并在OG meta标记中包含所有相关信息时,您不必事先创建对象,然后在发布操作时只需给出该对象的URL。我们开始使用自托管对象(如您所述)但据我所知,这只有在共享可公开访问的页面(无用户身份验证)时才有效。在我们的例子中,我们共享一个url,该url应该只有在我们网站上登录的用户才能访问