我创建了一个Facebook Canvas应用程序。这个画布应用程序本质上是一个图像库,用户可以通过单击“下一步”按钮来查看图像 - 非常简单。
当用户“查看”图片时,我使用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标签:
<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:标签的页面。我使用以下方法执行此操作:
file_get_contents('https://graph.facebook.com?id=https://apps.facebook.com/myapp/image/'.url_title($_POST['title']).'/'.$data['image_id'].'&scrape=true');
但是,我非常肯定这不起作用,在app中发出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帖子上看到这是一个常见问题,我需要让Facebook在调用Graph API之前抓取页面,这正是我在上面第三段代码中尝试做的事情(file_get_contents)没有运气。
我想我的问题是:我是否以正确的方式解决这个问题?当以这种方式使用时,我很难找到有关该过程的任何明确文档。
如果我以正确的方式解决这个问题,为什么在调用file_get_contents('https:// app ....)时我的页面没有被删除?
很抱歉这篇长篇文章,我试图全面了解你的情况。
由于
答案 0 :(得分:1)
您不需要进行手动刮擦即可使对象注册。 根据Facebook文档:
当您的应用尝试在用户和用户之间建立连接时 对象通过Open Graph上的动作,Facebook将刮掉对象 网页并读取元标记以将用户与对象相关联。 对象刮擦发生在:
- 用户第一次对对象执行操作(例如:喜欢,监听,读取或对象上的任何自定义操作)。了解更多
关于如何发布行动。- 列表项
- 通过对象调试器
设置对象URL- 第一次刮刮后每7天通过Linter API输入对象URL
如果调用发布代码,则首次引用连接对象时将自动删除该对象。 否则,使用调试器,正如您所提到的那样,将产生相同的效果。
编辑 - &GT;但是,有一些不一致(如你所提到的)和开发人员注意到他们的“新鲜”对象没有被正确刮擦。 Facebook不是这个错误,希望很快能解决它。解决方法似乎是使用调试器强制linting项目。
https://developers.beta.facebook.com/bugs/141650809281976/?browse=search_4f488911648042f90826189
文档:https://developers.facebook.com/docs/opengraph/objects/#connect
希望这有帮助:)祝你好运
答案 1 :(得分:0)
修正了它。我需要对发布Graph API的代码进行用户代理检查,以防止在FB命中时发布:
if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') === false)