视频资源路径探测过程记录

谁想工作
·
(修改过)
·
IPFS
一次好奇 + 技术动手实践,从免费试听课的视频链接开始,到自动探测整个视频资源目录,最终成功提取和批量下载目标视频文件。

🧩 起因与问题背景

在一次浏览某 iOS 相关的**付费课程网站**时,我注意到该平台提供了第一讲的免费视频试听。

在播放页面中,通过浏览器的右键菜单或开发者工具复制视频地址,发现其链接是如下格式的直链:

https://网站域名/video/ios/视频名称.mp4

该链接可**直接访问、播放或下载**,并不需要登录验证、token 授权或 Referer 限制。由此引发了我的兴趣:

是否该课程的其他视频也采用了类似的方式上传在同一目录中?

于是我尝试访问目录地址:

https://网站域名/video/ios

希望获取目录列表,但服务器返回了 403 Forbidden 错误。这说明该网站的服务器(nginx)**禁止列出目录内容**,只能通过明确的文件名来访问资源。

此外,该网站的主页是基于 WordPress 搭建的,我进一步尝试从多个角度探索资源路径:

  • 查看 HTML 页面源码和 JavaScript 动态加载逻辑

  • 分析浏览器 Network 抓包信息

  • 请求 WordPress 的 REST API 接口(如 /wp-json/wp/v2/posts)

  • 查看 /feed/ RSS、/sitemap.xml 等公开内容索引

最终确认该路径下的 .mp4 文件并未被直接引用在任何文章或可索引页面中。

与此同时,从实际抓到的几个 .mp4 链接来看,它们采用了明显的**编号命名**(如 1.mp4, 8.mp4, 12.mp4 等),推测资源目录采用了**数字序列的文件名方式存储视频**。

因此,为了获取该目录下全部可用的视频资源,我决定使用编程方式进行**暴力探测与文件名枚举扫描**。


🕵️♂️ 探测过程和遇到的障碍

❌ 目录访问受限

访问:

https://网站域名/video/ios/

返回:

403 Forbidden(禁止访问目录)

说明服务器关闭了目录索引(Index Listing)。


❌ 页面中无视频引用

尝试的途径包括:

  • /feed/(RSS) → 没有 .mp4 链接

  • /wp-json/wp/v2/posts(REST API) → 没有引用该视频目录

  • 页面 HTML 和 JS 源码 → 没有硬编码 .mp4 路径

  • sitemap.xml → 无资源目录信息


✅ 技术决策:暴力文件名探测

从现有的已知地址 8.mp4 推测,该目录下的视频采用**编号命名(如 1.mp4 ~ N.mp4)**。

因此,我使用 Python 编写脚本,暴力探测 1.mp4 ~ N.mp4 是否存在,自动过滤 404,记录有效资源,并最终下载。


🔧 Python 脚本:探测 + 下载

import requests
import time
import os

# 设置目标前缀
base_url = "https://网站域名/video/ios/"
headers = {"User-Agent": "Mozilla/5.0"}

# 设置起始和结束编号(
start_id = 1
end_id = 50  

# 是否保存结果
save_file = "found_videos.txt"
found = []

print(f"🚀 开始扫描 {base_url} 下的视频资源...\n")

for i in range(start_id, end_id + 1):
    filename = f"{i}.mp4"
    url = f"{base_url}{filename}"

    try:
        r = requests.head(url, headers=headers, timeout=1)  # 超时1秒
        if r.status_code == 200:
            print(f"✅ 找到视频: {url}")
            found.append(url)
        elif r.status_code == 403:
            print(f"🚫 被禁止访问: {url}")
        elif r.status_code != 404:
            print(f"⚠️ 状态 {r.status_code}: {url}")
    except Exception as e:
        print(f"❌ 请求出错: {url} — {e}")

    if i % 10 == 0:
        print(f"已扫描到第 {i} 个视频...")

    time.sleep(0.2)  # 延迟放在循环最后

# 写入结果文件
if found:
    with open(save_file, "w") as f:
        f.writelines(link + "\n" for link in found)
    print(f"\n📄 所有存在的视频已保存至:{save_file}")

    # 新增:下载视频
    download_dir = "downloaded_videos"
    os.makedirs(download_dir, exist_ok=True)
    print(f"\n⬇️ 开始下载视频到 {download_dir} 文件夹...")

    for url in found:
        filename = url.split("/")[-1]
        local_path = os.path.join(download_dir, filename)
        try:
            with requests.get(url, headers=headers, stream=True, timeout=10) as r:
                r.raise_for_status()
                with open(local_path, "wb") as f:
                    for chunk in r.iter_content(chunk_size=8192):
                        if chunk:
                            f.write(chunk)
            print(f"✅ 下载完成: {filename}")
        except Exception as e:
            print(f"❌ 下载失败: {filename} — {e}")

    print("🎉 所有可用视频下载完成!")
else:
    print("\n❗ 未发现任何可访问的视频。")

print("✅ 扫描结束。")

CC BY-NC-ND 4.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!