0

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

现在,作为安全网,对于每张“孤儿”照片,我会检查该照片是否已经存在,以避免重复。当前检查是通过exists查询在数据库上完成的。但是,它会进行大量的数据库查询,这是不可接受的。我尝试在服务器端进行,使用数组来跟踪照片,但速度较慢(Array#select如果我的记忆正确,我会使用)。

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

编辑

好的,看起来确实可以重复,所以问题 1/ 已解决。现在大约 2:是否可以从检索到的照片字段中“猜测”它是否属于相册,即使没有类似的字段album_id?如“如果照片不是来自user并且user被标记”-> orphan ?

谢谢你的时间!

4

3 回答 3

1

是的你可以 :-)

来自文档:照片 FQL 表

对于 ID 为 XXXXXX 的给定照片:

select owner,album_object_id from photo where object_id=XXXXXX

如果你没有得到任何东西,那意味着你查询了一张不在你的照片中的照片

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

您需要user_photos访问用户照片或friends_photos访问用户朋友照片之一的权限。

否则,您应该拥有该照片的相册 IDalbum_object_id

确保在 Graph API Explorer 中单击Get Access Token按钮并user_photos在测试查询时检查权限。

附言

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

在 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)

于 2012-04-16T19:24:45.677 回答
1

好的 - 我们会弄脏手并尝试找到孤儿照片的相册。

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

如果您对 进行图形 API 调用/me/PHOTO_ID,您将收到类似于以下内容的响应:

{
  "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 个参数:

  1. fbid
  2. set
  3. type

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

现在您看到了该方法,您可以看出它随时容易更改。Facebook 一直在向他们的 UI 推送更新,而无需通过 90 天的重大更改来发布它..yadda..yadda..yadda...它只是他们用于网站内部导航的 URL。所以,小心...

于 2012-04-15T19:23:34.323 回答
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.  

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

存在许多其他更优雅的方法。一些讨论可以在这里看到:
图像比较 - 快速算法
和这里:
在不同分辨率下检测图像相等性

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

于 2012-04-15T19:09:21.110 回答