Facebook照片:孤儿照片&专辑中的照片

时间:2012-04-15 18:19:44

标签: ruby-on-rails facebook facebook-graph-api mongodb

我正在开发一个应用程序(Rails 3.2,Mongoid),它可以从用户那里获取所有(我的意思是“很多”)照片。首先,我们获取相册(<userid>/albums),然后,为每张相册,我们拍摄其中的照片(<albumid>/photos),然后拍摄用户照片(<userid>/photos)。然后我们对每张照片进行一些操作,并将它们保存到数据库中。

目前,作为安全网,每张'孤儿'照片,我都会检查照片是否已经存在,以避免重复。当前检查是在带有exists查询的数据库上完成的。但是,会产生大量的数据库查询,这是不可接受的。我尝试在服务器端进行操作,使用数组来跟踪照片,但速度较慢(如果我的内存正确,我使用了Array#select。)

所以,有两个问题:1 /这个'安全网'是否有用,或者我可以理所当然地认为孤儿照片不能重复?我想是的,但我认为检查是有原因的。 2 /如果我必须检查以确保数据库中没有重复项,我该怎么做才能提高效率?

修改

好看,真的可以重复,所以问题1 /已经解决了。现在大约2:如果它属于一个专辑,是否可以从检索到的照片字段中“猜测”,即使没有像album_id这样的字段?如“如果照片不是来自useruser被标记为” - &gt;孤儿?

谢谢你的时间!

3 个答案:

答案 0 :(得分:1)

好的 - 我们会弄得有点脏,并试图找到一张孤儿照片的相册。

  

免责声明,这些方法可能会被Facebook更改,但可能不会公布    I.E. - 我们将利用在Graph API中没有任何意义的URI结构。 Facebook可能会更改这些URI,但保持API不变,因此不需要提醒开发人员任何更改。

如果您对/me/PHOTO_ID进行图表API调用,您将收到与此类似的回复:

{
  "id": "101...", 
  "from": {
    "name": "Lix", 
    "id": "101..."
  }, 
  "name": "Carrot cake chocolate cake.", 
  "picture": "https://fbcdn-photos...jpg", 
  ...
  "link": "https://www.facebook.com/photo.php?fbid=101...&set=a.105...&type=1", 
  ...
}

所以我已经删除了这个回复,以便我们可以专门讨论link属性。正如您所看到的,它不是一个与API有关的链接,它是Facebook中图像的一种 perma-link 。如果您导航到该网址,您将获得like this。经典(无灯箱风格)照片视图。

让我们稍微看一下link参数,这次是一个真实的例子 -

https://www.facebook.com/photo.php?fbid=376995716728&set=a.376995711728.190761.20531316728&type=3

我们可以看到它有3个参数:

  1. fbid
  2. set
  3. type
  4. 听起来很荒谬(而且非常荒谬:),fbid参数实际上是photo_id。 set参数的格式为a.{NUM}.{NUM}.{NUM}a.之后的第一批数字是该照片的album_id。

    现在您已经看到了该方法,您可以随时告诉它很容易发生变化。 Facebook一直推动他们的用户界面更新,而不必通过90天的更改发布它...... yadda..yadda..yadda ...它只是用于网站内部导航的URL。所以,要小心......

答案 1 :(得分:1)

是的,你可以: - )

来自文档:Photo FQL table

对于ID为XXXXXX的给定照片:

select owner,album_object_id from photo where object_id=XXXXXX

如果你没有得到任何东西,那就意味着你查询了一张超出你的

的照片

access token到达(查询其他人的照片)。

您需要user_photos权限才能访问用户照片,或friends_photos访问其中一位用户朋友照片。

否则,您应该在album_object_id

中拥有该照片的相册ID

确保在Graph API资源管理器中点击获取访问令牌按钮,并在测试查询时检查user_photos权限。

P.S。

我已经在各种照片上对此进行了测试,以确保所有测试都回来positive : - )

在Graph API资源管理器中链接到测试:

https://developers.facebook.com/tools/explorer/?method=GET&path=fql%3Fq%3Dselect%20owner%2Calbum_object_id%20from%20photo%20where%20object_id%3DXXXXXXXX 

(别忘了用照片ID更改XXXXXXXX)

答案 2 :(得分:0)

不确定问题的一部分涉及检测相同的图像。如果这确实是你要解决的问题的一部分,那么一种蛮力方法可能是:

Examine image dimensions and filesize.  If no other image has these same properties(height, width, filesize), then the image cannot be a duplicate.  

If two images may be duplicates, perform pixel-by-pixel digital subtraction.  If result is zero, then images are duplicates.  

根据您的数据集,这可能是“不太难实现”+“处理器不太密集”+“将始终返回准确结果”的良好组合

还存在许多其他更优雅的方法。这里可以看到一些讨论:
Image comparison - fast algorithm
在这里:
Detecting image equality at different resolutions

如果您正在讨论的问题更多的问题是“我如何确定给定图像的原始PATH或FILE_LOCATION,那么我想您必须知道每张照片的原始来源。