← 返回部落格

如何從任何網站下載 iframe 嵌入的影片

iframe 嵌入會因跨域限制而導致大多數下載器失效。以下是識別底層影片並將其下載為 MP4 的方法。

教學網站、線上課程平台、企業培訓入口網站或部落格文章嵌入了一部影片。你想要離線查看它。你安裝了下載擴充程式,但什麼都沒發生。下載按鈕沒有出現。右鍵點擊被禁用。DevTools 中的 Network 標籤顯示向你從未聽過的域名發出的混亂請求。

問題幾乎總是相同的:影片位於來自不同來源的 <iframe> 內。瀏覽器安全規則防止擴充程式和 JavaScript 進入跨域 iframe 來檢查或與其內容互動。本指南解釋了為什麼 iframe 嵌入不同,如何識別底層影片,以及從中下載的三種可靠方法。

iframe 嵌入實際上是什麼

<iframe> 是一個視窗中的視窗:一個 HTML 元素,在父頁面內加載完全獨立的網頁。父頁面可以指定 iframe 的 URL(src 屬性),但如果 iframe 從不同域名加載,則無法讀取或修改 iframe 的內容。

Vimeo 在教學部落格上的嵌入在 HTML 中通常看起來像這樣:

<iframe
  src="https://player.vimeo.com/video/123456789?h=abc123def"
  width="640"
  height="360"
  allow="autoplay; fullscreen"
  allowfullscreen>
</iframe>

部落格頁面位於 tutorialsite.com/article-about-x。iframe 加載 player.vimeo.com/video/123456789。從瀏覽器的角度來看,這是兩個完全獨立的文檔——它們碰巧在屏幕上一起渲染,但受同源策略隔離。

大多數流行的影片嵌入都以這種方式工作:

  • Vimeo: player.vimeo.com/video/{id}
  • YouTube: youtube.com/embed/{id}(僅出於背景資訊——Chrome 網上應用店政策意味著我們不支援 YouTube 下載)
  • Wistia: fast.wistia.com/embed/iframe/{id}
  • Loom: loom.com/embed/{id}
  • Bunny Stream: iframe.mediadelivery.net/embed/{lib}/{id}
  • Cloudflare Stream: iframe.videodelivery.net/{uid}
  • JW Player: cdn.jwplayer.com/players/{id}
  • Brightcove: players.brightcove.net/{account}/{player}_{video}/index.html

為什麼同源策略是問題

在分頁上「活躍」的瀏覽器擴充程式只能看到該分頁主文檔的事件和 DOM。跨域 iframe 是其自己的文檔,具有自己的來源。擴充程式無法:

  • 檢查 iframe 內的 <video> 元素
  • 監聽源自 iframe 的網路請求(沒有 <all_urls> 權限,大多數擴充程式都不要求)
  • 讀取 iframe 的 URL 參數或身份驗證狀態

結果:當你直接訪問 Vimeo 時完美運作的擴充程式在嵌入到部落格上的相同 Vimeo 影片上失效檢測。

方法 1:在新分頁中開啟 iframe(最簡單)

最可靠的單一技巧:

  1. 在嵌入的影片上按右鍵 → Inspect(Chrome DevTools 在正確的元素處打開)
  2. 在 DOM 面板中,向上查找樹以找到 <iframe> 元素
  3. 記下 src 屬性——這是 iframe URL
  4. 在新分頁中打開該 URL

現在 iframe 在其自己的分頁中是頂層文檔。跨域限制消失,因為擴充程式現在直接在嵌入的來源上活躍。

在新分頁中:

  1. 等待播放器加載並開始播放影片
  2. 點擊擴充程式圖標
  3. 選擇品質,點擊下載

這是我們最經常推薦的工作流程,因為它對每個 iframe 嵌入的影片都有效,不需要擴充程式權限升級。

Video Downloader One-for-All 通過這個工作流程無縫處理 iframe 嵌入。該擴充程式還在檢測到當前頁面上的 iframe 時標記,並提供單鍵「在新分頁中開啟嵌入」操作,所以你不必挖掘 DevTools。

方法 2:以程式方式查找 iframe URL

如果一個頁面有多個嵌入影片,並且你想編寫發現腳本:

// 在頁面的 DevTools 控制台中運行
document.querySelectorAll('iframe').forEach((f, i) => {
  console.log(`${i}: ${f.src}`);
});

這列出了頁面上的每個 iframe 及其源 URL。按你識別的嵌入提供者過濾:

document.querySelectorAll('iframe').forEach(f => {
  if (f.src.includes('vimeo') || f.src.includes('wistia') || f.src.includes('jwplayer')) {
    console.log(f.src);
  }
});

在新分頁中打開每個 URL 並如方法 1 所述下載。

方法 3:在父頁面 URL 上使用 yt-dlp

yt-dlp 有一個提取器列表,包括大多數流行的 iframe 嵌入提供者。傳遞父頁面 URL,yt-dlp 掃描它尋找 iframe 嵌入,解析底層影片並下載:

yt-dlp "https://tutorialsite.com/article-about-x"

如果父頁面有多個影片,yt-dlp 提示你選擇一個或下載全部(取決於版本和標誌)。要下載全部:

yt-dlp --no-playlist --yes-playlist "https://tutorialsite.com/page-with-multiple-videos"

當 yt-dlp 無法識別嵌入提供者時,它會回退到其通用提取器,掃描頁面 HTML 和 JavaScript 中的 .m3u8.mpd.mp4 URL。命中率不同——對大多數嵌入有效,對某些自訂或混淆的嵌入失效。

為什麼嵌入有時顯示「你的地區不可用」

某些 iframe 嵌入設置域限制:嵌入只能在特定父域上播放。當你直接在新分頁中打開嵌入的 iframe URL 時,嵌入會將新分頁的來源(即嵌入提供者的域本身)視為父級。

對於大多數嵌入提供者(Vimeo、JW Player、Brightcove),這很好——直接打開嵌入 URL 有效,因為當沒有父級時域限制被移除。

對於一些更嚴格的設置,嵌入可能拒絕播放。在這些情況下:

  • 嵌入強制執行原始域作為安全措施
  • 繞過此限制通常違反嵌入建立者的意圖
  • 我們不提供解決方案

如果嵌入在父級背景中播放但直接打開時沒有,你已達到此限制。方法 3(在父 URL 上使用 yt-dlp)有時有效,因為 yt-dlp 在伺服器端解析嵌入中繼資料,有時可以提取繞過 iframe 的 CDN URL。

自訂影片播放器 iframe(無識別提供者)

某些網站構建自己的影片播放器並通過 iframe 從自己的域嵌入(例如,cdn.example.com/player/{id})。這些不符合任何提取器的已知模式,所以 yt-dlp 的特定提取器沒有幫助。

路徑:

  1. 在新分頁中打開 iframe URL(方法 1)
  2. 打開 DevTools → Network 標籤
  3. 播放影片,尋找 .m3u8.mpd.mp4 請求
  4. 瀏覽器擴充程式應自動檢測它們;如果沒有,複製 URL 並使用 FFmpeg

對於混淆清單 URL 的網站(不常見但存在——特別是在付費課程平台上),你可能必須閱讀 iframe 的 JavaScript 來找到它構建 URL 的位置。這很罕見;大多數 iframe 影片播放器使用標準 HLS 或 DASH URL。

常見問題

為什麼我的下載器在具有嵌入影片的頁面上不顯示按鈕?

因為影片在跨域 iframe 中,擴充程式無法存取。在新分頁中打開 iframe URL(右鍵 → Inspect → 找到 iframe src)。

擴充程式可以僅要求讀取所有 iframe 的權限嗎?

它們可以要求 <all_urls> 主機權限,這將允許它們向每個 iframe 注入內容腳本,無論來源如何。我們有意不這樣做是因為:

  1. 這是隱私紅旗——許多使用者(正確地)拒絕安裝具有該權限的擴充程式
  2. Chrome 網上應用店標記廣泛權限擴充程式進行額外審核
  3. 「在新分頁中打開」工作流程大致同樣快速並避免權限提示

擴充程式改為要求 activeTab(使用者點擊時僅限當前分頁)並在存在 iframe 時提供 iframe 檢測流程。

為什麼右鍵 → 另存影片在某些嵌入上有效,但在其他嵌入上無效?

當嵌入通過 <video src="..."> 屬性提供單個漸進式 MP4 文件(不是 blob URL,不是 MSE 供應)時,瀏覽器的原生背景功能表可以保存它。這日益罕見;大多數現代嵌入使用 HLS 或 DASH,產生 blob URL——參閱如何在 Chrome 中下載 Blob 影片了解為什麼 blob URL 無法以此方式保存。

如果 iframe 在登錄牆後的頁面上呢?

相同的技術有效——你的瀏覽器工作階段是父分頁的工作階段,但當你在新分頁中打開 iframe URL 時,新分頁會繼承嵌入提供者域名的相同工作階段。只要嵌入提供者將你視為已驗證(例如,你有權存取的付費 Vimeo Showcase),下載就有效。

嵌套 iframe 是一個問題嗎?

偶爾——網站嵌入了一個本身包含 iframe 的 iframe。反覆重複「右鍵 → Inspect → 找到 iframe src」過程,直到達到實際包含影片元素的最底層 iframe。方法 3(yt-dlp)在許多情況下會自動處理嵌套 iframe。

我可以在頁面上以程式方式偵測 iframe 嵌入的影片嗎?

可以——方法 2 中的 JavaScript 片段列出了所有 iframe。按已知影片提供者域名過濾。擴充程式在背景中自動執行此操作,並在偵測到包含影片的 iframe 時顯示通知。

比較

情況最佳方法
教學部落格上的單個影片在新分頁中打開 iframe URL → 擴充程式
具有多個嵌入影片的頁面在父頁面 URL 上使用 yt-dlp
自訂(非標準)嵌入DevTools Network + 擴充程式或 FFmpeg
域限制嵌入yt-dlp 有時;否則使用原始網站

要點

iframe 嵌入破壞大多數下載器不是出於惡意,而是因為同源策略對瀏覽器安全至關重要。解決方案是在 iframe 的自己分頁中打開 iframe URL,其中跨域限制不再適用。

安裝 Video Downloader One-for-All——它偵測 iframe 並提供單鍵「在新分頁中打開」操作,使工作流程保持無縫。對於 Vimeo 具體來說(最常見的 iframe 嵌入源),參閱如何下載 Vimeo 影片。對於當嵌入使用 blob URL 時,參閱如何在 Chrome 中下載 Blob 影片