API объекта Facebook - созданы дубликаты объектов

Я создаю объекты через открытый объектный API-интерфейс и прикрепляю их к опубликованным материалам. И объект, и история созданы, и FB возвращает идентификаторы, как будто все работает хорошо.

Однако при отправке объекта / истории на проверку оказалось, что создаются два объекта (разных типов объектов), хотя я делаю только один 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"}

Отклик:

"{\"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:

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 (по мнению рецензента)

Только одна история появилась в пользовательском фиде и в браузере объектов, но рецензент сказал нам следующее: Ваше действие создает более одной опубликованной истории, когда пользователь запускает действие. Пользователи не должны удивляться публикации нескольких историй за одно действие в приложении. Действие, которое я предпринял, породило "пост" и "миакцию".

Мы посмотрели в (Open Graph -> Types) и оказалось, что каждый раз, когда мы делаем этот запрос, объект типа 'Object' и действие типа 'Post' автоматически создается / определяется! Это должно быть то, на что жалуется рецензент, но мы не смогли выяснить, что мы делаем неправильно!

Любые предложения о том, как это можно решить, очень приветствуются.

Точно такая же проблема при использовании проводника Open Graph API

Оказывается, что то же самое происходит при создании объекта через проводник Facebook Graph API. При этом объект "Объект" и действие "Опубликовать" неожиданно появляются в разделе "Открыть график" -> "Типы". Прямо сейчас я вижу следующие причины этой проблемы:

  • Объект / действие / история каким-то образом настроен неправильно
  • Рецензент думал, что это была проблема, когда это на самом деле не было
  • Это ошибка FB

Объект (ы), созданные с помощью Graph API Explorer

При создании объекта через 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 автоматически отображается как объект с открытым графиком.

2 ответа

Я не уверен, как это отобразится в ваших сообщениях 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
}];

Проблема здесь в том, что когда пользователь нажимает кнопку "Мир" на вашем сайте, публикуются два действия "Открыть график", и это противоречит нашей политике - одно действие пользователя не должно публиковать несколько историй. Если вы войдете в систему как тестовый пользователь Open Graph и проверите Журнал активности, вы увидите два следующих опубликованных действия с одной и той же отметкой времени:

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

Вы уверены, что ваш код делает только один вызов Graph API при публикации действия?

Другие вопросы по тегам