Извлечение сторонних сообщений из API Facebook Graph

я в процессе создания приложения вкладки Facebook для клиента, который извлекает и отображает сообщения со страницы Facebook. Приложение также предлагает возможность добавлять новые сообщения на страницу и комментировать существующие сообщения. Это достигается с помощью API Facebook Graph (через PHP SDK).

у меня все работает, но столкнулись с проблемой, связанной с постинга из моего приложения. Когда пользователь отправляет сообщение, оно отправляется в API Graph через следующее запрос.

$facebook->api([PAGE_ID]/feed', 'POST', array(
    'message' => [MESSAGE]
));

этот запрос успешен, и сообщение появляется на соответствующей странице Facebook с "Via my app name" под ним.

когда я затем запрашиваю список сообщений на странице через API (запрос ниже), вышеупомянутый пост не появляется.

$posts = $facebook->api([PAGE_ID].'/feed');

у меня есть сильное чувство, что это связано с тем, что сообщение от стороннего приложения. Я слышал, что Facebook "понижает" сторонние сообщения, чтобы поощрять использование своих собственных платформа. Все сообщения, которые были размещены непосредственно через Facebook появляются.

однако должен быть способ получить такие сообщения.

обновление для Fisch ниже

когда я делаю сообщение в API, возвращается следующий идентификатор сообщения:

112706495458566_468411663221379

однако, когда я делаю запрос API для него:

$facebook->api('112706495458566_468411663221379');

я получаю следующий ответ:

{
    "error": {
        "message": "Unsupported get request.",
        "type": "GraphMethodException",
        "code": 100
    }
}

однако, когда я делаю тот же запрос, но с идентификатором сообщения, уже включенным в запрос /feed.

$facebook->api('112706495458566_457890310940181');

я получаю следующий ответ.

{
    "id": "112706495458566_457890310940181",
    "from": {
        "category": "Local business",
        "name": "Genting Casino Southport",
        "id": "112706495458566"
    },
    "story": ""Very well done to ste,..." on their own status.",
    "privacy": {
        "value": ""
    },
    "type": "status",
    "application": {
        "name": "Mobile",
        "id": "2915120374"
    },
    "created_time": "2012-11-25T22:12:21+0000",
    "updated_time": "2012-11-25T22:12:21+0000",
    "comments": {
        "count": 0
    }
}

поэтому по какой-то причине Facebook даже не позволяет мне искать сообщение по его идентификатору.

обновление #2

в моем поиске ответа на этот вопрос я наткнулся на исследование, которое усиливает мои предыдущие подозрения о "весе", назначенном стороннему приложению посты.

из отчета EdgeRank Checker: "когда объект создается в Facebook, ему присваивается вес. Мы считаем, что Facebook стратегически уменьшил вес объектов, созданных через API. Причина этой стратегии заключается в том, чтобы поощрять создание большего количества контента на платформе Facebook. Это в конечном итоге увеличивает ценность их платформы при увеличении ad впечатления."

http://adage.com/article/digitalnext/posting-facebook-truth-party-applications/229694

это может объяснить, почему сообщения не передаются в ответе API /feed или / posts.

однако это не объясняет, почему API даже не вернет сообщение по его идентификатору (см. обновление выше).

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

обновление #3

основываясь на комментариях ниже, я теперь пытаюсь сделать то же самое, но используя учетную запись Facebook, которая не является владельцем приложения или фактически имеет какое-либо отношение администратора к любой странице на Facebook (моя личная учетная запись Facebook).

я авторизовал приложение с помощью диалогового окна oAuth и приняты следующие permisions:

  • почта
  • user_birthday
  • publish_stream

С моим блестящим новым токеном доступа я делаю следующий запрос API:

$post = $facebook->api('112706495458566/feed', 'POST', array(
    'message' => 'this is a test'
));

на что я получаю следующий ответ:

array(1) {
    ["id"] => string(31) "112706495458566_470663409662871"
}

затем я проверяю фактическую страницу Facebook, сообщение, которое я только что отправил, появилось из моей учетной записи пользователя Facebook, как ожидалось.

затем я делаю следующее запрос на выборку всех постов на странице:

$posts = $facebook->api('112706495458566/feed');

к которому я получаю длинный массив всех сообщений на странице (которые я не буду публиковать здесь). Однако сообщение, которое я только что отправил (и получил идентификатор обратно), не появляется.

затем я делаю прямой запрос на этот пост, используя идентификатор, который был возвращен запросом POST.

$post = $facebook->api('112706495458566_470663409662871');

который выдает следующее исключение (согласно предыдущей попытке).

GraphMethodException: Unsupported get request.

чтобы повторить, это попытка использовала учетную запись, которая полностью не связана с приложением или любой из страниц, для которых мы пытаемся получить данные. Учетная запись также никогда не контактировала с приложением (т. е. это был первый раз, когда разрешения были приняты и сгенерирован ключ oAuth).

3 ответов


используйте комбинацию Yahoo Query Language и .ajax() для данных соскоб Канал Facebook Feed.

преимущество о данных-выскабливание LIVE Facebook Веб-страница участника is не нужно ключ токена, чтобы получить последние каналы в реальном времени!

HTML-код:

<div id="results"></div>

jQuery:

$.ajax({
    url: "http://query.yahooapis.com/v1/public/yql",
    dataType: "jsonp",
    success: function(data) {
        console.log(data.query.results.json);
        $.each(data.query.results.json.entries, function(i, v) {
            $('#results').append(data.query.results.json.entries[i].content + '<br /><br />');
        });
    },
    data: {
        q: 'select * from json where url="https://www.facebook.com/feeds/page.php?id=112706495458566&format=json"',
        format: "json"
    }
});

демо: вдохновленный этим онлайн учебник.

jsFiddle Facebook для


EDIT:нажмите на изображение для пересмотренного jsFiddle со стилем


дополнительные:

чтобы дополнить мой ответ выше, вот квази-связанный jsfiddle под названием:

учебник jsFiddle: создание динамических Div (Теперь Еще Лучше!)

в этом уроке показано, как преобразовать разметку HTML, чтобы она стала "шаблоном", который готов к использованию с jQuery в качестве объекта, который затем может быть правильно добавлен на веб-страницу.


Дэн, я пробовал это-

  1. опубликовать фид из приложение на страницу

    POST: "PAGE_ID/feed"
    message: "hi"
    

    результат: После Успешного

  2. запросить список сообщений на странице

    GET: "PAGE_ID/feed"
    

    результат: все сообщения на странице в т. ч. вышеупомянутый пост.


почему это сработало?

потому что запрос GET было сделано с использованием маркера доступа пользователя, который является администратором приложения, через которое было опубликовано сообщение.

вывод

Я пробовал все случаи и окончательный вывод заключается в том, чтобы получить каналы страницы в т. ч., которые размещены на некоторых APP, вы должны использовать маркер доступа admin приложения (не большая проблема); другое вы просто получите остальные каналы.


когда вы делаете сообщение через API, Facebook возвращает вам идентификатор этого сообщения. Вы можете сохранить эти идентификаторы, а затем запросить их позже с помощью graph API или FQL