ytdlp.online

Lahat ng solusyon

Sa pahinang ito

Rumble 403 sa yt-dlp: fallback gamit ang datos ng player

Petsa ng paglalathala

I-download ang plugin na pang-ayos rumble_player.py

Kung lumalabas ang Unable to download JSON metadata: HTTP Error 403: Forbidden kapag nagda-download ka ng Rumble video gamit ang yt-dlp, maaari mong i-load ang compatibility plugin sa artikulong ito. Kapag nagbalik ng 403 ang JSON API na embedJS/u3 ng Rumble, awtomatikong kukunin ng plugin ang opisyal na embed player page (/embed/) ng parehong video. Babasahin nito ang datos ng media na nasa pahina at itutuloy ang download.

Kung ayaw mong mag-configure ng plugin sa iyong computer o manu-manong mag-convert ng mga link, gamitin ang aming Rumble video downloader, na may kasama nang solusyong ito.

Alamin muna kung saang hakbang lumalabas ang 403

Maaaring lumabas ang 403 sa tatlong magkakaibang yugto ng pag-download mula sa Rumble. Para mismo sa ikalawang kaso ang plugin na ito:

Mensahe ng error Saan nahaharang ang request Ano ang gagawin
Unable to download webpage: HTTP Error 403 Nahaharang ang HTML ng pahina kung saan pinapanood ang video; tingnan ang issue #15089 Kunin ang /embed/ address gamit ang opisyal na oEmbed API at gamitin ang --impersonate firefox
Unable to download JSON metadata: HTTP Error 403 Nahaharang ang metadata API na embedJS/u3; tingnan ang issue #17496 Gamitin ang plugin sa artikulong ito para awtomatikong bumasa ng datos mula sa pahinang /embed/
Nakalista na ang mga format, pero may 403 kapag dina-download ang mga segment o MP4 Tinatanggihan ng CDN ang request para sa media stream Suriin ang proxy at mga request header, o pumili ng ibang quality format

Mga hakbang para ayusin ang problema

1. I-save ang file ng plugin

Gawin ang sumusunod na mga folder sa iyong working directory, at i-save ang kumpletong code ng plugin bilang rumble_player.py. Hindi kailangang baguhin ang source code ng yt-dlp:

plugins/
└── rumble/
    └── yt_dlp_plugins/
        └── extractor/
            └── rumble_player.py

2. Kunin ang opisyal na /embed/ address ng video

Magkaiba ang ID sa URL ng Rumble watch page, gaya ng v6xxxx, at ang ID ng embed player, gaya ng vb0ofn. Hindi puwedeng basta buuin nang manu-mano ang address gamit ang parehong ID. Kung karaniwang watch-page link lang ang hawak mo, tawagan ang opisyal at pampublikong oEmbed API ng Rumble para makuha ang tamang /embed/ address:

curl -fsSG --data-urlencode "url=https://rumble.com/your-video.html" "https://rumble.com/api/Media/oembed.json"

Sa html field ng ibinalik na JSON, hanapin ang <iframe src="https://rumble.com/embed/xxxx/..." at kunin ang bahaging https://rumble.com/embed/xxxx/.

Kung 403 ang ibinalik ng oEmbed, i-install ang curl_cffi at subukan ulit gamit ang Firefox fingerprint. Palitan ang halimbawang URL sa ibaba ng buong URL ng page ng 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"

Kung hindi pa rin gumana, gamitin ang online downloader para awtomatikong i-convert ang link.

3. Ilista ang mga format at tingnan kung gumagana ang fallback

Patakbuhin ang command sa directory na naglalaman ng folder na plugins. Palitan ang halimbawa ng /embed/ address ng video na gusto mong kunin:

yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v -F "https://rumble.com/embed/vb0ofn/"

Kapag may [RumbleEmbed+PlayerFallback] sa log, naka-load na ang plugin:

  • Kung nagbalik ng 403 ang JSON API, susunod na makikita ang Downloading player webpage. Ipinapakita nito na nagsimula na ang fallback. Kailangang lumabas pagkatapos nito ang listahan ng mga format para makumpirmang matagumpay ang pag-parse ng datos.
  • Kung nagbalik naman ng 200 ang JSON API sa kasalukuyan mong koneksyon, gagamitin ang orihinal na proseso nang walang karagdagang request sa player page.

4. I-download ang video at suriin ang decoding

Pumili ng format ID mula sa listahang ibinalik ng -F, gaya ng mp4-360p, at simulan ang download:

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/"

Ito ang terminal log mula sa test kung saan gumana ang fallback:

[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

Para suriin kung buo at walang sira ang na-download na MP4 container at mga audio at video stream, gamitin ang ffprobe at ffmpeg:

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 -

Bakit nakapagpapatuloy ang player page kapag may JSON 403?

1. Paggamit muli sa datos na kasama sa opisyal na pahina

Karaniwang direktang humihingi ng JSON metadata ang RumbleEmbedIE mula sa https://rumble.com/embedJS/u3/?request=video&ver=2&v=.... Kapag partikular na hinarang ng Cloudflare o ng mga panuntunan sa seguridad ng site ang API na ito at nagbalik ng HTTP 403, hihinto ang extraction.

Pero ang mga script sa opisyal na embed page na https://rumble.com/embed/<video_id>/ ay mayroon nang video configuration object na kapareho ang istruktura. Kasama rito ang ua field na may mga stream address para sa iba't ibang kalidad, pati ang pamagat, haba ng video, at iba pang field. Kapag kinuha ang object na ito at ibinalik mula sa _download_json, makapagpapatuloy ang susunod na code ng yt-dlp para sa pag-parse ng mga format nang walang kailangang baguhin.

2. Pag-alis ng field na hindi valid sa JSON (loaded: h())

Hindi ganap na valid JSON ang data object na nasa pahina. May tawag ito sa isang runtime function sa dulo, ang loaded: h(), gaya nito:

u.f["vb0ofn"] = {"ua": {"mp4": {"360": {"url": "https://..."}}}, "title": "...", loaded: h()};

Kung direktang ipapasa ito sa JSON parser, magdudulot ng syntax error ang h(). Kaya ginagamit ng plugin ang transform_source sa _search_json upang alisin gamit ang regular expression ang dulong , loaded: xxx() lamang bago mag-parse. Sa text na nasa memory ginagawa ang lahat ng ito; walang JavaScript ng pahina na pinapatakbo:

  • Eksaktong pagtutugma: ang kinukuha lang ay ang object na ang key ay eksaktong katumbas ng kasalukuyang video_id (\b[\w$]+\.f\[\s*["']{video_id}["']\s*\]\s*=). Tinitiyak din na dictionary ang resulta at may hindi bakanteng media field na ua.
  • Limitadong pagbabago sa proseso: gumagana lang ang fallback kapag nakahuli ang _download_json ng HTTPError na may status na 403. Para sa 401, 404, 429, 500, o kapag walang valid na object sa pahina, muling ibinabato ang orihinal na exception nang walang pagbabago.
  • Paggamit sa aming serbisyo: bukod sa pag-load ng plugin, awtomatikong tinatawag ng aming online service ang oEmbed API para gawing /embed/ address ang karaniwang watch-page URL. Kapag walang ibinigay na --impersonate, ginagamit nito bilang default ang browser fingerprint na firefox-135.

Kumpletong code ng plugin

I-save ang sumusunod na code bilang plugins/rumble/yt_dlp_plugins/extractor/rumble_player.py. Nasubukan na ito sa Python 3.12+ at 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
Mga Tool ng yt-dlp
Tingnan ang lahat ng yt-dlp tool
Tulong at Dokumentasyon ng yt-dlp