Ruby on rails Facebook照片:孤儿照片和相册中的照片

Ruby on rails Facebook照片:孤儿照片和相册中的照片,ruby-on-rails,facebook,facebook-graph-api,mongodb,Ruby On Rails,Facebook,Facebook Graph Api,Mongodb,我正在开发一个应用程序Rails 3.2,Mongoid,它可以从一个用户那里拍摄很多照片。首先,我们获取相册/相册,然后,对于每个相册,我们在其中拍摄照片/照片,然后是用户照片/照片。然后我们对每张照片进行一些操作,并将它们保存到数据库中 现在,作为一个安全网,对于每一张“孤儿”照片,我会检查照片是否已经存在,以避免重复。使用exists查询对数据库执行当前检查。但是,is会进行大量的数据库查询,这是不可接受的。我尝试在服务器端使用数组来跟踪照片,但如果我的内存正确,我使用Arrayselec

我正在开发一个应用程序Rails 3.2,Mongoid,它可以从一个用户那里拍摄很多照片。首先,我们获取相册/相册,然后,对于每个相册,我们在其中拍摄照片/照片,然后是用户照片/照片。然后我们对每张照片进行一些操作,并将它们保存到数据库中

现在,作为一个安全网,对于每一张“孤儿”照片,我会检查照片是否已经存在,以避免重复。使用exists查询对数据库执行当前检查。但是,is会进行大量的数据库查询,这是不可接受的。我尝试在服务器端使用数组来跟踪照片,但如果我的内存正确,我使用Arrayselect的速度要慢得多

所以,有两个问题:1/这个“安全网”有用吗,还是我可以想当然地认为孤儿照片不能复制?我想是的,但我认为检查是有原因的。 2/如果我必须进行检查以确保数据库中没有重复项,我应该如何进行检查以提高效率

编辑

好的,看起来确实可能有重复的,所以问题1/被解决了。现在大约2:即使没有像album_id这样的字段,也可以从检索到的照片字段猜测它是否属于相册吗?如果照片不是来自用户,并且用户被标记在->孤立


谢谢你抽出时间

不确定您的问题中有多少部分涉及到相同图像的检测。如果这确实是您要解决的问题的一部分,那么一种sorta的暴力方法可能是:

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.  
根据您的数据集,这可能是不太难实现+不太密集的处理器+的良好组合,将始终返回准确的结果

还有许多其他更优雅的方法。这里可以看到一些讨论: 在这里:


如果您讨论的问题更多的是如何确定给定图像的原始路径或文件位置,那么我认为您必须在导入每个照片时知道其来源。

好的-我们会把手弄脏一点,然后尝试查找孤儿照片的相册

免责声明,这些方法可能会受到Facebook的更改,这些更改可能不会公布。 我们将利用在Graph API中毫无意义的URI结构。Facebook可能会更改这些URI,但保持API不变,因此不需要提醒开发者任何更改

如果对/me/PHOTO_ID进行graph 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内图像的永久链接。如果你导航到那个URL,你会得到一些东西。经典的无灯箱式照片视图

让我们更仔细地看一下link参数,这次是一个真实的例子-

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

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

fbid 设置 类型 尽管听起来很荒谬,而且非常荒谬:,fbid参数实际上是photo_id。set参数的格式是a.{NUM}.{NUM}.{NUM}。a之后的第一批数字。是那张照片的相册id

现在您已经看到了该方法,可以看出它随时都可能发生更改。Facebook一直在推送用户界面的更新,而不必发布一个90天的突破性更改..耶..耶..耶..耶..耶。。。这只是他们在站点内部导航时使用的URL。所以,当心

是的,您可以:-

从文件中:

对于id为XXXXXX的给定照片:

select owner,album_object_id from photo where object_id=XXXXXX
如果你没有得到任何东西,那就意味着你查询了一张照片,这张照片不在你的数据库中

访问令牌到达查询其他人的照片

您需要用户照片权限才能访问用户照片,或者需要朋友照片权限才能访问其中一张用户朋友照片

否则,您应该在相册\u对象\u id中具有该照片的相册id

在测试查询时,确保在Graph API资源管理器中单击“获取访问令牌”按钮并检查“用户照片”权限

附言

我在各种照片上对此进行了测试,以确保所有测试结果均为阳性:-

指向Graph API explorer中的测试的链接:

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

别忘了用照片id更改XXXXXXXX。这一事实可能会在任何一天消失,这是一个阻碍,否则这绝对是一个有趣的方式。自从我使用他们的系统以来,他们一直没有改变。。。但是是的。。。在生产代码中不建议这样做。我不认为他们会改变它,至少在没有警告的情况下-毕竟,很多链接都会被破坏-但是,是的,对于生产来说并不真正安全。如果数据集不是很大,如果我们真的有图像数据和文件大小,这可能是有用的。Facebook API返回一个
关于照片的字段很少,但没有文件大小。我们不会在服务器上下载真实的图片,因为我们有到itOh的链接。你怎么。。。对每张照片执行一些操作,并将其保存到数据库中。没有可用的图像数据?我想我误解了你最初的问题。我的错误。我的意思是对我们检索到的数据进行操作:重命名属性以适合我们的模型,从评论/喜欢/等中推断各种统计数据。这就是我的意思:-