mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2026-08-21 19:46:17 +03:00
[ie/tiktok] Fix extractor (#17452)
Closes #17403, Closes #17437 Authored by: bashonly
This commit is contained in:
@@ -3960,6 +3960,19 @@ class InfoExtractor:
|
|||||||
headers['Ytdl-request-proxy'] = geo_verification_proxy
|
headers['Ytdl-request-proxy'] = geo_verification_proxy
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _generate_blockbuster_headers(*, min_headers=2, max_headers=8):
|
||||||
|
"""Randomize our HTTP header fingerprint in an attempt to bust HTTP Error 403 blockage"""
|
||||||
|
|
||||||
|
def random_letters(minimum, maximum):
|
||||||
|
# Omit vowels so we don't generate valid header names like 'authorization', etc
|
||||||
|
return ''.join(random.choices('bcdfghjklmnpqrstvwxz', k=random.randint(minimum, maximum)))
|
||||||
|
|
||||||
|
return {
|
||||||
|
random_letters(8, 24): random_letters(16, 32)
|
||||||
|
for _ in range(random.randint(min_headers, max_headers))
|
||||||
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _generic_id(url):
|
def _generic_id(url):
|
||||||
return urllib.parse.unquote(os.path.splitext(url.rstrip('/').split('/')[-1])[0])
|
return urllib.parse.unquote(os.path.splitext(url.rstrip('/').split('/')[-1])[0])
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import functools
|
import functools
|
||||||
import json
|
import json
|
||||||
import random
|
|
||||||
import re
|
import re
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
@@ -364,19 +363,6 @@ class DailymotionIE(DailymotionBaseInfoExtractor):
|
|||||||
continue
|
continue
|
||||||
yield update_url(player_url, query=query_string)
|
yield update_url(player_url, query=query_string)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _generate_blockbuster_headers():
|
|
||||||
"""Randomize our HTTP header fingerprint to bust the HTTP Error 403 block"""
|
|
||||||
|
|
||||||
def random_letters(minimum, maximum):
|
|
||||||
# Omit vowels so we don't generate valid header names like 'authorization', etc
|
|
||||||
return ''.join(random.choices('bcdfghjklmnpqrstvwxz', k=random.randint(minimum, maximum)))
|
|
||||||
|
|
||||||
return {
|
|
||||||
random_letters(8, 24): random_letters(16, 32)
|
|
||||||
for _ in range(random.randint(2, 8))
|
|
||||||
}
|
|
||||||
|
|
||||||
def _extract_dailymotion_m3u8_formats_and_subtitles(self, media_url, video_id, live=False):
|
def _extract_dailymotion_m3u8_formats_and_subtitles(self, media_url, video_id, live=False):
|
||||||
"""See https://github.com/yt-dlp/yt-dlp/issues/15526"""
|
"""See https://github.com/yt-dlp/yt-dlp/issues/15526"""
|
||||||
|
|
||||||
|
|||||||
@@ -274,9 +274,10 @@ class TikTokBaseIE(InfoExtractor):
|
|||||||
|
|
||||||
def _extract_web_data_and_status(self, url, video_id, fatal=True):
|
def _extract_web_data_and_status(self, url, video_id, fatal=True):
|
||||||
video_data, status = {}, -1
|
video_data, status = {}, -1
|
||||||
|
headers = self._generate_blockbuster_headers()
|
||||||
|
|
||||||
def get_webpage(note='Downloading webpage'):
|
def get_webpage(note='Downloading webpage'):
|
||||||
res = self._download_webpage_handle(url, video_id, note, fatal=fatal, impersonate=True)
|
res = self._download_webpage_handle(url, video_id, note, fatal=fatal, headers=headers)
|
||||||
if res is False:
|
if res is False:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -1155,7 +1156,7 @@ class TikTokUserIE(TikTokBaseIE):
|
|||||||
webpage = self._download_webpage(
|
webpage = self._download_webpage(
|
||||||
self._UPLOADER_URL_FORMAT % user_name, user_name,
|
self._UPLOADER_URL_FORMAT % user_name, user_name,
|
||||||
'Downloading user webpage', 'Unable to download user webpage',
|
'Downloading user webpage', 'Unable to download user webpage',
|
||||||
fatal=False, impersonate=True) or ''
|
fatal=False, headers=self._generate_blockbuster_headers()) or ''
|
||||||
detail = traverse_obj(
|
detail = traverse_obj(
|
||||||
self._get_universal_data(webpage, user_name), ('webapp.user-detail', {dict})) or {}
|
self._get_universal_data(webpage, user_name), ('webapp.user-detail', {dict})) or {}
|
||||||
video_count = traverse_obj(detail, ('userInfo', ('stats', 'statsV2'), 'videoCount', {int}, any))
|
video_count = traverse_obj(detail, ('userInfo', ('stats', 'statsV2'), 'videoCount', {int}, any))
|
||||||
@@ -1613,7 +1614,8 @@ class TikTokLiveIE(TikTokBaseIE):
|
|||||||
uploader, room_id = self._match_valid_url(url).group('uploader', 'id')
|
uploader, room_id = self._match_valid_url(url).group('uploader', 'id')
|
||||||
if not room_id:
|
if not room_id:
|
||||||
webpage = self._download_webpage(
|
webpage = self._download_webpage(
|
||||||
format_field(uploader, None, self._UPLOADER_URL_FORMAT), uploader, impersonate=True)
|
format_field(uploader, None, self._UPLOADER_URL_FORMAT), uploader,
|
||||||
|
headers=self._generate_blockbuster_headers())
|
||||||
room_id = traverse_obj(
|
room_id = traverse_obj(
|
||||||
self._get_universal_data(webpage, uploader),
|
self._get_universal_data(webpage, uploader),
|
||||||
('webapp.user-detail', 'userInfo', 'user', 'roomId', {str}))
|
('webapp.user-detail', 'userInfo', 'user', 'roomId', {str}))
|
||||||
|
|||||||
Reference in New Issue
Block a user