提取文件直链 & HTTP head请求 使用小记

    科技2024-07-27  16

    前段时间,由于工作需要,一咬牙便充值了 XX网的会员,朋友得知后便一发不可自拔,不断发送链接让我帮忙下载,只好先将文件下载到本地,再发送过去,但一直这么搞着实麻烦,由于文件较大,下载和发送都需要时间,于是便寻思,能不能直接获取到文件的直链呢?如果可以的话,直接发送链接,让他自己去下载就好了!

    First

    鼠标右边复制链接

    得到的是一个如下格式的链接:

    https://www.xxxx.com/plus/download.php?open=2&id=1&uhash=a9a8c1cd9c908a44fd2f508e

    在我这里通过浏览器访问之后,直接就开始下载文件了,发送朋友试试

    果然没这么简单

    Second

    使用 Fiddler 抓包看看,先看一下响应体

    神马东西都没有,再看一下响应头

    原来经过了一次 302 重定向,而重定向的地址,嘿,这不就是我们一直寻找的文件直链嘛!

    复制一下发给朋友,果然成功下载!

    Third

    但是每次都要抓包来查看地址也太麻烦了吧,于是便使用 python 来简化一下!

    得益于 requests 库,很简单的几行代码就可以实现这个功能!

    原以为已经可以和朋友装x了,但是就这么简单的几行代码,却一直没有打印直接结果,直到最后给我来了一个请求超时错误

    于是便重新捋了一遍逻辑,

    1. 请求右键复制到的下载链接 2. 自动跳转到文件直链 3. 重新发起请求

    对额,这里会直接请求文件,但是这个文件足有 240MB,直接请求的话,大概率会请求超时了

    这就尴尬了,我只需要链接的响应头,并不想请求它的实际内容

    一番查阅资料,终于发现了 HTTP 的 HEAD 请求方式,完美契合我的需求,上一段官方说明:

    9.4 HEAD

    The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification.

    简单修改代码,完美解决问题

    res = requests.head(url, headers=headers) print(res.headers.get('location'))
    Processed: 0.015, SQL: 8