Отправка объекта в Facebook через открытый график не работает, но затем работает после тестирования URL в отладчике объектов Facebook?

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

У меня уже есть токен доступа пользователя.

Теги на странице, которую я пытаюсь отправить, URL-адрес page_url:

<meta property="fb:app_id"      content="my_app_id" /> 
<meta property="og:type"        content="my_namespace:my_object" /> 
<meta property="og:title"       content="some string" /> 
<meta property="og:description" content="some other string" /> 
<meta property="og:image"       content="some_image_url" />
<meta property="og:locale"      content="en_US" />
<meta property="og:url"         content="page_url" />   

Rails-код для отправки URL-адреса, запущенный с main_page:

begin
    fb_post = RestClient.post 'https://graph.facebook.com/me/my_namespace:do', :access_token=>user.get_facebook_auth_token, :my_object=>"page_url"
rescue StandardError => e
    p 'e.response is'
    p e.response
end

Выход

2011-11-02T02:42:14+00:00 app[web.1]: "e.response is"
2011-11-02T02:42:14+00:00 app[web.1]: "{\"error\":{\"message\":\"(#3502) Object at URL page_url has og:type of 'website'. The property 'my_object' requires an object of og:type 'my_namespace:my_object'.\",\"type\":\"OAuthException\"}}"

Действительно странная вещь заключается в том, что после получения этой ошибки, если я тестирую page_url на отладчике объектов, он проходит без каких-либо ошибок / предупреждений, og:type правильный тип и примечание 'website', а затем запустить тот же код Rails, что и выше, будет работать нормально.

Я пробовал без og:url тег и происходит то же самое.

ОБНОВИТЬ:

Согласно ответу Igy, я попытался отделить процесс очистки объекта от процесса создания действия. Итак, до того, как действие было передано для нового объекта, я запустил обновление объекта с scrape=true,

begin
    p 'doing fb_update'
    fb_update = RestClient.post 'https://graph.facebook.com', :id=>page_url, :scrape => true
    p 'fb_update is'
    p fb_update
rescue StandardError => e
    p 'e.response is'
    p e.response
end

Выход

2011-11-05T13:27:40+00:00 app[web.1]: "doing fb_update"
2011-11-05T13:27:50+00:00 app[web.1]: "fb_update is"
2011-11-05T13:27:50+00:00 app[web.1]: "{\"url\":\page_url,\"type\":\"website\",\"title\":\page_url,\"updated_time\":\"2011-11-05T13:27:50+0000\",\"id\":\id_here}"

Странно то, что тип websiteи заголовок является URL страницы. Опять же, я проверил как в отладчике HTML, так и в отладчике Facebook, и тип и заголовок в них верны.

3 ответа

Решение

Я сталкиваюсь с той же проблемой.

Единственный способ успешно опубликовать действия для пользовательских типов объектов, которые я определил, - это сначала вручную проверить URL объекта с помощью отладчика объектов, а затем опубликовать действие над этим объектом через мое приложение.

Даже использование linter API - которое Facebook предлагает здесь - выдает мне ошибку.

curl -X POST \
     -F "id=my_custom_object_url" \
     -F "scrape=true" \
     "https://graph.facebook.com"

Похоже, что только инструмент отладчика действительно корректно обрабатывает страницу.

Обратите внимание, что у меня не было этой проблемы при использовании предопределенного типа объекта, такого как "веб-сайт":

<meta property="og:type" content="website" />

Эта проблема, по-видимому, влияет только на пользовательские типы объектов.

ОБНОВЛЕНИЕ (С РЕШЕНИЕМ):

Я наконец понял это. Проблема фактически возникла из-за неспособности моего приложения обрабатывать два одновременных HTTP-запроса. (К сведению: я использую Heroku для развертывания приложения Rails.) Когда вы отправляете запрос в API Facebook на публикацию действия для URL объекта (запрос № 1), Facebook немедленно попытается очистить указанный вами объект URL (запрос № 2) и на основании того, что он может успешно обработать, возвращает ответ на исходный запрос. Если я выполняю запрос № 1 синхронно, это свяжет мой веб-процесс в Heroku, и мое приложение не сможет одновременно обработать запрос № 2. Другими словами, Facebook не может успешно получить доступ к URL-адресу объекта, который нужно очистить; вместо этого он возвращает некоторые значения по умолчанию, включая тип объекта "веб-сайт". Интересно, что это произошло даже тогда, когда я запустил несколько веб-процессов на Heroku. Приложение намеревалось использовать один и тот же веб-процесс для обработки обоих запросов.

Я решил проблему, обработав все запросы Facebook API в качестве фоновых заданий (используя delayed_job). На Heroku это требует запуска как минимум одного веб-процесса и одного рабочего процесса. Если вы можете сделать это, то выполнение запросов API в фоновом режиме является хорошей идеей, так как это не связывает ваш веб-сайт с пользователями, заставляя их ждать несколько секунд, прежде чем они смогут что-либо сделать.

Кстати, я рекомендую запустить два фоновых задания. Первый должен просто очистить URL объекта, отправив сообщение по адресу: https://graph.facebook.com/?id= {object_url} & scrape = true

Как только первое задание будет успешно выполнено, запустите другое фоновое задание, чтобы отправить действие на временную шкалу: https://graph.facebook.com/me/ {app_namespace}: {action_name}? Access_token={user_access_token}

БОЛЬШЕ ПОСЛЕДНЕГО ОБНОВЛЕНИЯ:

Согласно предложению в комментариях, использование Unicorn также поможет вам без необходимости в delayed_job. Смотрите больше здесь, если вы используете Heroku:
http://blog.railsonfire.com/2012/05/06/Unicorn-on-Heroku.html

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

На некоторых платформах хостинга и разработки, где вы одновременно создаете объект и публикуете его в Facebook, вы можете получить сообщение о том, что объект не существует. Это связано с состоянием гонки, которое существует в некоторых системах.

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

Исходя из этого, я думаю, что вам нужно добавить &scrape=true на начальный вызов, чтобы вызвать немедленную очистку, затем попробуйте создать действие через некоторое время. (Я полагаю, что полученное вами сообщение об ошибке, вероятно, связано с тем, что страница еще не была кэширована / очищена.)

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

По сути, вы должны

  1. Перепишите свои страницы, чтобы действовать так, как вы хотите
  2. Передайте соответствующие URL-адреса на страницу отладчика (чтобы убедиться, что они проверены, и чтобы обновить кэши), а затем
  3. Разрешить страницам обслуживаться "нормально", чтобы увидеть ваши изменения в действии.

Могут быть и другие способы принудительного истечения срока действия кэшей Facebook; см. эту страницу Stackru для некоторых возможных решений. Я еще не пробовал их, но они могут быть полезны.

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