Подтвердить что ты не робот

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

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

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

Теги на странице, которую я пытаюсь отправить, 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-адреса, вызванного с главной страницы:

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, и то же самое происходит.

UPDATE:

В соответствии с ответом Igy я попытался разделить процесс очистки объекта с процессом создания действия. Итак, перед тем, как действие было отправлено для совершенно нового объекта, я запустил update для объекта с 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, и тип и название в них верны.

4b9b3361

Ответ 1

Я столкнулся с той же проблемой.

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

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

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

Только инструмент отладчика, похоже, действительно очищает страницу.

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

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

По какой-то причине эта проблема только влияет на пользовательские типы объектов.

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

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

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

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

Как только первое задание успешно завершено, запустите другое фоновое задание, чтобы выполнить POST действие на временной шкале: 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

Ответ 2

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

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

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

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

Ответ 3

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

В принципе, вы должны

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

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