我通过开放图形对象API创建对象,并将它们附加到已发布的故事中。创建了对象和故事,FB返回id,好像一切正常。
然而,在提交对象/故事以供审阅时,结果发现有两个对象(不同的对象类型),即使我只发出一个HTTP POST请求。
背景
请求详细信息:
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\"}"
预期结果
实际结果
在用户Feed和对象浏览器中只显示了一个故事,但审稿人告诉我们以下内容: 当用户触发操作时,您的操作会生成多个已发布的故事。用户不应对为单个应用内操作发布的多个故事感到惊讶。我采取的行动产生了一个“帖子”和一个“myaction”的故事。
我们看了一下(Open Graph - > Types),结果发现每次我们发出这个请求时,会出现一个'Object'类型的对象,并且会自动创建/定义一个'Post'类型的动作!这必须是审稿人抱怨的内容,但我们无法弄清楚我们做错了什么!
非常感谢任何关于如何解决这个问题的建议。
使用Open Graph API资源管理器时完全相同的问题
事实证明,通过Facebook Graph API资源管理器创建对象时会发生同样的事情。执行此操作时,“对象”对象和“发布”操作突然出现在“打开图形”下 - >类型。现在我看到了这个问题的以下原因:
通过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对象会自动显示为一个开放的图形对象。
答案 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
}];