通过开放图形向Facebook提交对象不起作用,但是在Facebook的对象调试器中测试URL之后可以正常工作吗?

ben*_*ben 24 facebook meta-tags facebook-graph-api

我想允许我的网络应用程序的用户能够从一个页面(main_page)将多个对象发布到他们的时间轴.

我已经存储了用户的访问令牌.

我试图提交的页面上的标签,网址是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" />   
Run Code Online (Sandbox Code Playgroud)

Rails代码提交从main_page触发的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
Run Code Online (Sandbox Code Playgroud)

产量

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\"}}"
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是,在收到此错误后,如果我在对象调试器上测试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
Run Code Online (Sandbox Code Playgroud)

产量

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}"
Run Code Online (Sandbox Code Playgroud)

奇怪的是,类型是website,标题是页面的URL.我再次检查了HTML和Facebook调试器,并且类型和标题都是正确的.

gus*_*bit 26

我遇到了同样的问题.

我已经能够成功发布我定义的自定义对象类型的操作的唯一方法是首先使用Object Debugger手动测试对象URL ,然后通过我的应用程序在该对象上发布操作.

即使使用棉短绒API -其中Facebook建议在这里 -给我一个错误.

curl -X POST \
     -F "id=my_custom_object_url" \
     -F "scrape=true" \
     "https://graph.facebook.com"
Run Code Online (Sandbox Code Playgroud)

只有调试工具似乎实际上正确地刮擦了页面.

请注意,在使用预定义的对象类型(例如"website")时,我没有遇到此问题:

<meta property="og:type" content="website" />
Run Code Online (Sandbox Code Playgroud)

由于某种原因,此问题似乎只会影响自定义对象类型.

更新(解决方案):

我终于想通了.问题实际上是由于我的应用程序无法处理两个同时发生的HTTP请求.(仅供参考:我正在使用Heroku部署我的Rails应用程序.)当您向Facebook API发出请求以在对象URL上发布操作(请求#1)时,Facebook将立即尝试刮取您指定的对象URL(请求#2),并根据它能够成功获取的内容,它返回对原始请求的响应.如果我同步运行请求#1,那将占用我在Heroku上的Web进程,使我的应用程序无法同时处理请求#2.换句话说,Facebook无法成功访问它需要抓取的对象URL; 相反,它返回一些默认值,包括对象类型"网站".有趣的是,即使我在Heroku上启动了多个Web进程,也会发生这种情况.该应用程序旨在使用相同的Web进程来处理这两个请求.

我通过将所有Facebook API请求作为后台作业处理(使用delayed_job)来解决问题.在Heroku上,这需要启动至少一个Web进程和一个工作进程.如果你能做到这一点,那么在后台运行API请求无论如何都是一个好主意,因为它不会为用户占用你的网站,使他们等待几秒钟才能做任何事情.

顺便说一句,我建议运行两个后台作业.第一个应该简单地通过POST来刮取对象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


Igy*_*Igy 6

对象创建文档说,它应该在您第一次创建对象时抓取一个对象,但也要说

在您创建对象并同时发布到Facebook的某些托管和开发平台中,您可能会收到错误消息,指出该对象不存在.这是由于某些系统中存在竞争条件.

我们建议您(a)在发布操作之前验证对象是否已复制,或者(b)引入一个小延迟来解释复制滞后(例如,15-30秒).

基于此,我认为您需要添加&scrape=true到初始调用以强制立即刮,然后尝试稍后创建操作.(我相信您收到的错误消息可能是因为页面尚未缓存/抓取.)


Bob*_*ore 5

从我所看到的,Facebook调试器页面是最好的(并且,在大多数实际目的)强制Facebook的缓存给定页面的OpenGraph信息刷新.否则,您将花费一周时间等待他们已经删除的页面的缓存信息.

基本上,你应该

  1. 重写您的页面以按您的意愿行事
  2. 将相关URL传递给Debugger页面(以查看它们是否已验证,刷新缓存),然后
  3. 允许"正常"提供页面以查看您的更改.

可能有其他方法迫使Facebook缓存过期; 请参阅此Stackoverflow页面以获取一些可能的解决方案.我还没有尝试过,但它们可能会有所帮助.