Baiki ralat Rumble 403 dalam yt-dlp dengan data pemain
Tarikh penerbitan
Muat turun pemalam pembaikan rumble_player.py
Jika yt-dlp memaparkan Unable to download JSON metadata: HTTP Error 403: Forbidden semasa memuat turun video Rumble, muatkan pemalam keserasian dalam artikel ini. Apabila API JSON embedJS/u3 Rumble mengembalikan 403, pemalam akan mendapatkan halaman pemain terbenam rasmi (/embed/) untuk video yang sama, mengekstrak data media sebarisnya dan meneruskan muat turun.
Jika anda mahu mengelakkan persediaan pemalam setempat atau penukaran pautan secara manual, gunakan pemuat turun video Rumble kami yang sudah menyertakan pembaikan ini.
Kenal pasti peringkat yang mengembalikan 403
Ralat 403 boleh berlaku pada tiga peringkat berbeza semasa memuat turun video Rumble. Pemalam ini khusus untuk keadaan kedua:
| Ralat atau gejala | Lokasi sekatan | Tindakan |
|---|---|---|
Unable to download webpage: HTTP Error 403 |
HTML halaman tontonan disekat, seperti dalam isu #15089 | Dapatkan alamat /embed/ melalui API oEmbed rasmi dan gunakan --impersonate firefox |
Unable to download JSON metadata: HTTP Error 403 |
API metadata embedJS/u3 disekat, seperti dalam isu #17496 |
Gunakan pemalam ini untuk beralih secara automatik kepada data sebaris halaman /embed/ |
| Senarai format dipaparkan, tetapi muat turun segmen atau MP4 mengembalikan 403 | CDN menolak permintaan aliran media | Semak proksi dan pengepala permintaan, atau pilih format dengan kualiti lain |
Langkah pembaikan pantas
1. Simpan fail pemalam
Cipta struktur folder berikut dalam direktori kerja dan simpan kod pemalam lengkap di hujung artikel sebagai rumble_player.py. Anda tidak perlu mengubah kod sumber yt-dlp:
plugins/
└── rumble/
└── yt_dlp_plugins/
└── extractor/
└── rumble_player.py
2. Dapatkan alamat /embed/ rasmi video
ID dalam URL halaman tontonan Rumble, seperti v6xxxx, berbeza daripada ID pemain terbenam, seperti vb0ofn. Oleh itu, alamat terbenam tidak boleh dibina dengan menyalin ID halaman tontonan. Jika anda hanya mempunyai pautan tontonan biasa, gunakan API oEmbed awam Rumble untuk mendapatkan alamat /embed/ sebenar:
curl -fsSG --data-urlencode "url=https://rumble.com/your-video.html" "https://rumble.com/api/Media/oembed.json"
Cari <iframe src="https://rumble.com/embed/xxxx/..." dalam medan html respons JSON dan ambil alamat https://rumble.com/embed/xxxx/.
Jika oEmbed mengembalikan 403, pasang curl_cffi dan cuba lagi menggunakan cap jari Firefox. Gantikan URL contoh di bawah dengan URL penuh halaman video.
python -m pip install curl_cffi
python -c "import sys; from curl_cffi import requests; r = requests.get('https://rumble.com/api/Media/oembed.json', params=dict(url=sys.argv[1]), impersonate='firefox', timeout=15); r.raise_for_status(); print(r.text)" "https://rumble.com/your-video.html"
Jika masih gagal, gunakan pemuat turun dalam talian untuk menukar pautan secara automatik.
3. Senaraikan format dan semak laluan sandaran
Jalankan arahan berikut dari direktori yang mengandungi folder plugins. Gantikan URL contoh dengan alamat /embed/ video sasaran:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v -F "https://rumble.com/embed/vb0ofn/"
Label [RumbleEmbed+PlayerFallback] dalam log mengesahkan bahawa pemalam telah dimuatkan:
- Jika API JSON mengembalikan 403, log
Downloading player webpageakan menyusul. Ini menunjukkan bahawa laluan sandaran digunakan; senarai format yang terhasil mengesahkan data berjaya dihuraikan. - Jika API JSON mengembalikan 200 pada sambungan anda, proses pengekstrakan asal diteruskan tanpa permintaan tambahan ke halaman pemain.
4. Muat turun video dan semak penyahkodan
Pilih ID format daripada output -F, contohnya mp4-360p, kemudian jalankan muat turun:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v --no-playlist -f mp4-360p -o "rumble-test.%(ext)s" "https://rumble.com/embed/vb0ofn/"
Output terminal ujian kami menunjukkan laluan sandaran digunakan dan muat turun selesai:
[RumbleEmbed+PlayerFallback] vb0ofn: Downloading JSON metadata
[RumbleEmbed+PlayerFallback] vb0ofn: Downloading player webpage
[info] vb0ofn: Downloading 1 format(s): mp4-360p
[download] 100% of 7.85MiB in 00:01:20 at 99.48KiB/s
Gunakan ffprobe dan ffmpeg untuk memeriksa bekas MP4 serta memastikan aliran video dan audio boleh dinyahkod tanpa ralat:
ffprobe -v error -show_entries stream=codec_name,codec_type,width,height:format=duration,size -of json "rumble-test.mp4"
ffmpeg -nostdin -v error -xerror -i "rumble-test.mp4" -map 0:v:0 -map "0:a:0?" -f null -
Cara halaman pemain menyediakan laluan sandaran bagi JSON 403
1. Guna semula data sebaris daripada laman yang sama
Secara lalai, RumbleEmbedIE meminta metadata JSON daripada https://rumble.com/embedJS/u3/?request=video&ver=2&v=.... Pengekstrakan terhenti apabila Cloudflare atau penapisan permintaan laman menyekat API itu dan mengembalikan HTTP 403.
Halaman terbenam rasmi di https://rumble.com/embed/<video_id>/ turut menyertakan objek konfigurasi video dalam skripnya. Strukturnya sama, termasuk medan ua yang mengandungi alamat aliran bagi setiap kualiti, tajuk dan tempoh video. Dengan mengembalikan objek ini daripada _download_json, penghuraian format yt-dlp boleh diteruskan tanpa perubahan pada kod sedia ada.
2. Buang medan yang bukan JSON sah (loaded: h())
Objek sebaris itu bukan literal JSON yang sah sepenuhnya. Di hujungnya terdapat panggilan fungsi masa jalan loaded: h(), seperti berikut:
u.f["vb0ofn"] = {"ua": {"mp4": {"360": {"url": "https://..."}}}, "title": "...", loaded: h()};
Penghurai JSON akan menolak h() sebagai ralat sintaks. Oleh itu, pemalam menggunakan cangkuk transform_source dalam _search_json untuk membuang hanya bahagian akhir , loaded: xxx() dengan ungkapan nalar sebelum penghuraian. Semua pemprosesan dilakukan pada teks dalam memori, tanpa menjalankan JavaScript halaman:
- Padankan video sasaran: ekstrak hanya objek yang kuncinya sama dengan
video_idsemasa (\b[\w$]+\.f\[\s*["']{video_id}["']\s*\]\s*=), kemudian pastikan hasilnya ialah kamus dengan medan mediauayang tidak kosong. - Hadkan penggunaan laluan sandaran: aktifkannya hanya apabila
_download_jsonmenangkapHTTPErrorberstatus403. Ralat seperti 401, 404, 429 dan 500, atau halaman tanpa objek yang sah, mengekalkan pengecualian asal. - Sokongan dalam perkhidmatan dalam talian: selain memuatkan pemalam, perkhidmatan kami menggunakan API oEmbed untuk menukar URL halaman tontonan kepada alamat
/embed/. Jika--impersonatetidak ditentukan, cap jari pelayarfirefox-135digunakan secara lalai.
Kod pemalam lengkap
Simpan kod berikut sebagai plugins/rumble/yt_dlp_plugins/extractor/rumble_player.py. Kod ini telah disahkan dengan Python 3.12+ dan yt-dlp 2026.10.10+.
"""Reuse official player media data when Rumble's JSON endpoint is blocked."""
import re
from yt_dlp.extractor.rumble import RumbleEmbedIE as BaseRumbleEmbedIE
from yt_dlp.networking.exceptions import HTTPError
from yt_dlp.utils import ExtractorError
class RumbleEmbedIE(BaseRumbleEmbedIE, plugin_name='PlayerFallback'):
def _real_extract(self, url):
self._player_url = url
return super()._real_extract(url)
def _download_json(self, url_or_request, video_id, *args, **kwargs):
try:
return super()._download_json(url_or_request, video_id, *args, **kwargs)
except ExtractorError as error:
if not isinstance(error.cause, HTTPError) or error.cause.status != 403:
raise
webpage = self._download_webpage(self._player_url, video_id, note='Downloading player webpage')
# Parse this video's object and strip the runtime call without executing page scripts.
data = self._search_json(
rf'''\b[\w$]+\.f\[\s*["']{re.escape(video_id)}["']\s*\]\s*=\s*''',
webpage, 'player data', video_id,
fatal=False,
transform_source=lambda source: re.sub(r',\s*loaded\s*:\s*[\w$]+\(\s*\)\s*(?=})', '', source))
if not isinstance(data, dict) or not data.get('ua'):
raise error
return data