Facebook对象API-创建重复对象
我通过OpenGraph对象API创建对象,并将这些对象附加到已发布的故事中。对象和故事都被创建,FB返回id,就好像一切正常一样 然而,在提交对象/故事以供审阅时,发现创建了两个对象(不同的对象类型),尽管我只发出了一个HTTP POST请求 背景Facebook对象API-创建重复对象,facebook,facebook-opengraph,Facebook,Facebook Opengraph,我通过OpenGraph对象API创建对象,并将这些对象附加到已发布的故事中。对象和故事都被创建,FB返回id,就好像一切正常一样 然而,在提交对象/故事以供审阅时,发现创建了两个对象(不同的对象类型),尽管我只发出了一个HTTP POST请求 背景 我们的应用程序正在使用名称空间“mynamespace” 我们已经创建了一个名为“myobject”的自定义开放图形对象 我们已经创建了一个名为“myaction”的自定义打开图形操作 请求详细信息: 1) 首先,我们创建一个对象: POST
- 我们的应用程序正在使用名称空间“mynamespace”
- 我们已经创建了一个名为“myobject”的自定义开放图形对象
- 我们已经创建了一个名为“myaction”的自定义打开图形操作
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类型的操作(根据审阅者)
- 对象/动作/故事在某些方面设置不正确
- 评论员认为这是一个问题,但事实并非如此
- 这是一个FB错误
{
"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应该只有在我们网站上登录的用户才能访问