4

我创建了一个 Facebook 画布应用程序。这个画布应用程序本质上是一个图像库,用户可以通过单击“下一步”按钮来查看图像——非常简单。

当用户“查看”图像时,我正在使用 Graph API 发布到自定义对象。我这样做(PHP SDK):

$this->data['facebook']->api('/me/myapp:look_at', 'post', array(
        'picture' => current_url()
    ));

current_url() 是 Facebook 画布的当前 URL (https://apps.facebook.com/myapp/image/id)。此页面有一系列 og 元标记:

   <meta property="og:title" content="<?=$image->title?>" />
   <meta property="og:description" content="Pic of <?=$image->title?>" />
   <meta property="og:image" content="https://www.***.com/***/images/<?=$image->src?>" />
   <meta property="fb:app_id" content="<?=FB_APP_ID?>" />
   <meta property="og:url" content="<?=current_url();?>" />
   <meta property="og:type" content="myapp:picture" />

我已经读过,在将图像添加到库时,我需要让 Facebook 为 og:tags 抓取页面。我使用以下方法执行此操作:

file_get_contents('https://graph.facebook.com?id=https://apps.facebook.com/myapp/image/'.url_title($_POST['title']).'/'.$data['image_id'].'&scrape=true');

但是,我很确定这是行不通的,在应用程序中调用 mail() 后,访问该 URL 并等待什么都没有通过,这表明它没有被抓取。

运行第一个代码块(调用 Graph API myapp:look_at)时,我从 Facebook 收到以下异常:

Fatal error: Uncaught OAuthException: (#3502) Object at URL https://apps.facebook.com/myapp/image/img/id has og:type of 'website'. The property 'picture' requires an object of og:type 'myapp:picture'. thrown in /****/application/libraries/base_facebook.php on line 1106

如果我使用 Facebook 的调试器工具来抓取页面,我会得到所有信息。如果我然后重新访问进行 FB Graph API 调用的画布页面,那么一切都会顺利进行。我在其他 SO 帖子上读到这是一个常见问题,我需要在调用 Graph API 之前让 Facebook 抓取页面,这正是我在上面的第三个代码块(file_get_contents)中尝试做的事情没有运气。

我想我的问题是:我是否以正确的方式处理这件事?当以这种方式使用该过程时,我正在努力寻找有关该过程的任何明确文档。

如果我以正确的方式进行操作,为什么在调用 file_get_contents('https://app....) 时我的页面没有被抓取?

抱歉,帖子太长了,我试图给你完整的图片。

谢谢

4

2 回答 2

1

您无需手动抓取即可让对象注册。根据 Facebook 文档:

当您的应用程序尝试通过 Open Graph 上的操作在用户和对象之间建立连接时,Facebook 将抓取对象网页并读取元标记以将用户与对象关联。对象刮擦发生在以下情况:

  • 用户第一次对对象执行操作(例如:喜欢、收听、阅读或对对象的任何自定义操作)。详细
    了解如何发布操作。
  • 项目清单
  • 通过对象调试器检查对象 URL
  • 在第一次抓取后每 7 天通过 Linter API 对对象 URL 进行检查

如果发布代码被调用,连接的对象在第一次被引用时会被自动抓取。否则,正如您提到的那样,使用调试器将产生相同的效果。

编辑-> 但是,有一些不一致的地方(正如你提到的),开发人员注意到他们的“新鲜”对象没有被正确地抓取。Facebook 不是这个错误,希望能尽快解决。一种解决方法似乎是强制使用调试器对项目进行 linting。

https://developers.beta.facebook.com/bugs/141650809281976/?browse=search_4f488911648042f90826189

文档:https ://developers.facebook.com/docs/opengraph/objects/#connect

希望这有帮助,祝你好运

于 2012-04-10T12:18:44.033 回答
0

解决它。我需要对发布 Graph API 的代码进行用户代理检查,以防止在 FB 命中时发布该代码:

if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') === false)
于 2012-04-10T12:27:24.030 回答