我正在开发一个应用程序(Rails 3.2,Mongoid),它可以从用户那里获取所有(我的意思是“很多”)照片。首先,我们获取相册(<userid>/albums
),然后,为每张相册,我们拍摄其中的照片(<albumid>/photos
),然后拍摄用户照片(<userid>/photos
)。然后我们对每张照片进行一些操作,并将它们保存到数据库中。
目前,作为安全网,每张'孤儿'照片,我都会检查照片是否已经存在,以避免重复。当前检查是在带有exists
查询的数据库上完成的。但是,会产生大量的数据库查询,这是不可接受的。我尝试在服务器端进行操作,使用数组来跟踪照片,但速度较慢(如果我的内存正确,我使用了Array#select
。)
所以,有两个问题:1 /这个'安全网'是否有用,或者我可以理所当然地认为孤儿照片不能重复?我想是的,但我认为检查是有原因的。 2 /如果我必须检查以确保数据库中没有重复项,我该怎么做才能提高效率?
修改
好看,真的可以重复,所以问题1 /已经解决了。现在大约2:如果它属于一个专辑,是否可以从检索到的照片字段中“猜测”,即使没有像album_id
这样的字段?如“如果照片不是来自user
而user
被标记为” - &gt;孤儿?
谢谢你的时间!
答案 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个参数:
fbid
set
type
听起来很荒谬(而且非常荒谬:),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
确保在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,那么我想您必须知道每张照片的原始来源。