我在下载共享链接时偶然发现了一个奇怪的Dropbox行为。请考虑以下curl命令:
curl -H 'User-Agent: curl/7.51.0' -v https://www.dropbox.com/s/nbgs6wqmlqp78sg/demo-pic.jpg\?dl\=0
# ...
# < HTTP/1.1 302 Found
# ....
# < Location: https://dl.dropboxusercontent.com/content_link/yYOt5GIzU8aFEuRve5tI6THhrxlQ8Hq5PCgXmSe6YHM81iKP2SFKlaJCCCSpE9hS/file
这将返回302重定向,其中包含实际图像文件的位置。但是当我更改用户代理时,我得到了不同的结果:
curl -H 'User-Agent: foobar' -v https://www.dropbox.com/s/nbgs6wqmlqp78sg/demo-pic.jpg\?dl\=0
# ...
# < HTTP/1.1 200 OK
# ...
这将从dropbox返回一个HTML页面,其中包含所有登录内容,图片预览等。
不幸的是,我没有找到任何关于此的文档,以及User-Agent将返回什么返回状态代码。
我的意思是,我可以设置User-Agent: curl/7.51.0
并依赖于此,但Dropbox还需要多长时间来改变这种行为?
答案 0 :(得分:0)
Dropbox可以通过像这样的重定向为某些用户代理提供原始文件内容,例如,用于curl,用户不太可能想要预览页面的HTML。这没有记录或保证,所以我不建议依赖它。
您可以使用一些记录的URL参数来管理共享链接的行为:
答案 1 :(得分:0)
我尝试使用Java从Dropbox提取文件时遇到了同样的问题。它可以很好地用于curl,但不能用于Java(而是返回HTML页面)。将我的Java应用程序中的User-Agent标头设置为curl/7.54.0
是可行的,但这似乎是一个糟糕的黑客。
格雷格(Greg)的link中的answer向我指出了解决方案:
要强制浏览器下载链接的内容而不是显示它,您可以在URL中使用dl = 1作为查询参数。例如:
因此,我将URL中的dl=0
替换为dl=1
,并且一切运行正常-无需更改User-Agent标头。仍然需要遵循301和302重定向,但这对于java.net.HttpURLConnection
和大多数其他库来说不是问题。