当我从Facebook请求照片时,有些网址是这样的:
https://{hidden_for_privacy}79141548_n.jpg
其他人是这样的:
https://{hidden_for_privacy}23364315_n.jpg?oh=c566c56ca9fd7eb1ed5d8bfca4255e84&oe=544AF123&__gda__=1414682395_6d2cb778f5b2c857d1be1c781e81cdfa
第二个有一些额外的GET参数(哦,oe和__gda_ _(空格是为了防止加粗)。
当存在这些参数时,几天后图像将无效,因为这些值会有所不同(您可以通过执行新的API调用来检查此图片)。
这些参数意味着什么以及它们如何与最大时间范围相关联?
谢谢!
答案 0 :(得分:10)
我知道一些历史和目的。
最初facebook图片网址看起来像这样
https://开头{*剪断*} /XXXXXXXXXXX_b.jpg
但是有超过图像大小的可用,因此人们可以访问缩略图,只需用_n
替换后缀_b即可
(所以现在是https:// {* snipped *} /XXXXXXXXXXX_n.jpg)
访问更大版本的图像(如果可用)。
一段时间后,facebook会实现中央图像系统,可根据要求动态裁剪和调整图像大小
Facebook此时提供的网址可能如下所示:
HTTPS:// {*剪断*} .fbcdn.net / hprofile-XXX1 / V / t1.0-1 / p32x32 / 12345678_123412341234123_4123412341234123412_n.jpg
当人们看到他们的好奇心出现时。
让我们尝试从网址中删除一些参数
HTTPS:// {*剪断*} .fbcdn.net / hprofile-XXX1 / V / 12345678_123412341234123_4123412341234123412_n.jpg
他们得到的是他们可能从Facebook服务器获得的最大和最完整的图像版本。
这种方法工作了很长时间 当人们在他们的电子邮件中看到图像(主要是个人资料图片)时,他们可以获得完整版本的图像,甚至无需登录Facebook 它到处工作包括私人资料图片。
Facebook的快速解决方案和最便宜的解决方案是使用一些签名算法签署请求路径 我猜他们使用HMAC作为核心算法,从各种来源(包括请求路径)派生HMAC输入 这将确保唯一可以生成有效URL的一方是拥有HMAC密钥的一方。 (大概只是脸书)
现在旧问题已修复,你不能再使用它了,但有一个以上的问题可以通过添加MAC来解决。
访问图像无效 让我们说人们曾经发布他们的照片(现在其他人可以同时拥有有效的请求路径和来自Facebook的签名签名),之后他们会改变主意并将照片设为私有。
但是,具有有效网址和签名的人仍然可以从Facebook服务器获取图像 用超低价资源解决这个问题,认为他们已经实施了HMAC计算 (并且当你删除它时,Facebook实际上并没有从你的系统中删除你的图像这一事实。) 他们决定将从时间戳得出的价值混合到HMAC的输入中 (有关类似用法,请参阅RFC-6238)
因此,必须定期从Facebook进行签名刷新才能访问照片 这解决了后一个问题,非常便宜的额外资源。
在这里,你拥有它 Facebook的参数背后的一些历史和理由。
我确信没有关于时间范围的官方文件,但是自己认为现在你知道你想要的时间框架的价值是固定的和可预测的,你应该不难做一些实验。
答案 1 :(得分:1)
我认为它们是facebook图像会话密钥,它们是由facebook在每张图片上显示的。所以fb服务器认为Facebook本身允许并知道图像请求。
对不起我的英语不好以及我的浅薄评论,但我认为这个问题的解决方案可能是在旧图像会话到期时获取新图像会话的URL。或者我不知道你的整个系统,但也许你可以直接连接到facebook的assign-keys-for-images机制并获得所有新链接。
如果我对这些参数是对的'工作机制的目的,我认为没有第二个解决方案。 抱歉我的英语不好了。
答案 2 :(得分:0)
我找到答案(最后)。关键是照片不公开。如果您通过API请求私人照片,他们会添加一个查询字符串,以便在一段时间后该网址无效。因此,照片仍然有点私密"。该功能是可以理解的,除了将图像下载到其他地方之外,没有其他解决方法。