Отправка объекта в 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 данной страницы обновляться. В противном случае вы потратите до недели на ожидание их кэшированной информации о страницах, которые они уже просмотрели.
По сути, вы должны
- Перепишите свои страницы, чтобы действовать так, как вы хотите
- Передайте соответствующие URL-адреса на страницу отладчика (чтобы убедиться, что они проверены, и чтобы обновить кэши), а затем
- Разрешить страницам обслуживаться "нормально", чтобы увидеть ваши изменения в действии.
Могут быть и другие способы принудительного истечения срока действия кэшей Facebook; см. эту страницу Stackru для некоторых возможных решений. Я еще не пробовал их, но они могут быть полезны.