Curl 用户代理影响Dropbox共享链接下载

Curl 用户代理影响Dropbox共享链接下载,curl,dropbox,user-agent,Curl,Dropbox,User Agent,我在下载共享链接时偶然发现了一个奇怪的Dropbox行为。考虑下面的卷曲命令: 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/yYOt5GIz

我在下载共享链接时偶然发现了一个奇怪的Dropbox行为。考虑下面的卷曲命令:

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
curl-H'用户代理:curl/7.51.0'-vhttps://www.dropbox.com/s/nbgs6wqmlqp78sg/demo-pic.jpg\?dl\=0
# ...
#找到
这将返回一个302重定向,其中包含指向实际图像文件的位置。但当我更改用户代理时,会得到不同的结果:

curl -H 'User-Agent: foobar' -v https://www.dropbox.com/s/nbgs6wqmlqp78sg/demo-pic.jpg\?dl\=0
# ...
# < HTTP/1.1 200 OK
# ...
curl-H'用户代理:foobar'-vhttps://www.dropbox.com/s/nbgs6wqmlqp78sg/demo-pic.jpg\?dl\=0
# ...
#
这将从dropbox返回一个HTML页面,其中包含所有登录内容、图片预览等

不幸的是,我还没有找到关于这个的任何文档,以及哪个用户代理将返回什么返回状态代码


我的意思是,我可以设置
用户代理:curl/7.51.0
并依赖于此,但是dropbox还需要多长时间才能改变这种行为?

dropbox可以通过这样的重定向为某些用户代理提供原始文件内容,例如,对于curl,用户不太可能需要预览页面的HTML。但这并没有文档记录或保证,所以我不建议依赖它

有一些记录在案的URL参数可用于管理共享链接的行为,但:


Dropbox可以通过如下重定向为某些用户代理提供原始文件内容,例如,对于curl,用户不太可能需要预览页面的HTML。但这并没有文档记录或保证,所以我不建议依赖它

有一些记录在案的URL参数可用于管理共享链接的行为,但:


我在尝试使用Java从Dropbox中提取文件时遇到了相同的问题。它对curl非常有效,但对Java失败(返回的是HTML页面)。将我的Java应用程序中的用户代理头设置为
curl/7.54.0
有效,但这似乎是一个可怕的黑客行为

格雷格的建议为我指出了解决方案:

要强制浏览器下载链接的内容而不是显示链接,可以在URL中使用dl=1作为查询参数。例如:


因此,我将URL中的
dl=0
替换为
dl=1
,一切都很好地工作——无需更改用户代理头。还有301和302重定向需要遵循,但这对于
java.net.HttpURLConnection
和大多数其他库来说都不是问题。

我在尝试使用java从Dropbox中提取文件时遇到了同样的问题。它对curl非常有效,但对Java失败(返回的是HTML页面)。将我的Java应用程序中的用户代理头设置为
curl/7.54.0
有效,但这似乎是一个可怕的黑客行为

格雷格的建议为我指出了解决方案:

要强制浏览器下载链接的内容而不是显示链接,可以在URL中使用dl=1作为查询参数。例如:

因此,我将URL中的
dl=0
替换为
dl=1
,一切都很好地工作——无需更改用户代理头。还有301和302重定向需要遵循,但这对于
java.net.HttpURLConnection
和大多数其他库来说都不是问题