better handling for private accounts

Authored by: bashonly
pull/14032/head
bashonly 2 days ago
parent 06d30212f5
commit a0682af89c
No known key found for this signature in database
GPG Key ID: 783F096F253D15B0

@ -1021,42 +1021,52 @@ class TikTokUserIE(TikTokBaseIE):
cursor = old_cursor - 7 * 86_400_000 cursor = old_cursor - 7 * 86_400_000
# In case 'hasMorePrevious' is wrong, break if we have gone back before TikTok existed # In case 'hasMorePrevious' is wrong, break if we have gone back before TikTok existed
if cursor < 1472706000000 or not traverse_obj(response, 'hasMorePrevious'): if cursor < 1472706000000 or not traverse_obj(response, 'hasMorePrevious'):
break return
# User directly passed sec_uid via prefix URL, bypassing our private account detection
if not user_name and not seen_ids:
self.raise_login_required(
'This user\'s account is likely private. Log into an account that has access')
def _get_sec_uid(self, user_url, user_name, msg): def _extract_sec_uid_from_embed(self, user_name):
webpage = self._download_webpage( webpage = self._download_webpage(
user_url, user_name, fatal=False, headers={'User-Agent': 'Mozilla/5.0'}, f'https://www.tiktok.com/embed/@{user_name}', user_name,
note=f'Downloading {msg} webpage', errnote=f'Unable to download {msg} webpage') or '' 'Downloading user embed page', errnote=False, fatal=False)
return (traverse_obj(self._get_universal_data(webpage, user_name), if not webpage:
('webapp.user-detail', 'userInfo', 'user', 'secUid', {str})) self.report_warning('This user\'s account is either private or has embedding disabled')
or traverse_obj(self._get_sigi_state(webpage, user_name), return None
('LiveRoom', 'liveRoomUserInfo', 'user', 'secUid', {str}),
('UserModule', 'users', ..., 'secUid', {str}, any))) data = traverse_obj(self._search_json(
r'<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>',
webpage, 'data', user_name, default={}),
('source', 'data', f'/embed/@{user_name}', {dict}))
for aweme_id in traverse_obj(data, ('videoList', ..., 'id', {str})):
webpage_url = self._create_url(user_name, aweme_id)
video_data, _ = self._extract_web_data_and_status(webpage_url, aweme_id, fatal=False)
sec_uid = self._parse_aweme_video_web(
video_data, webpage_url, aweme_id, extract_flat=True).get('channel_id')
if sec_uid:
return sec_uid
return None
def _real_extract(self, url): def _real_extract(self, url):
user_name, sec_uid = self._match_id(url), None user_name, sec_uid = self._match_id(url), None
if mobj := re.fullmatch(r'MS4wLjABAAAA[\w-]{64}', user_name): if mobj := re.fullmatch(r'MS4wLjABAAAA[\w-]{64}', user_name):
user_name, sec_uid = None, mobj.group(0) user_name, sec_uid = None, mobj.group(0)
else: else:
sec_uid = (self._get_sec_uid(self._UPLOADER_URL_FORMAT % user_name, user_name, 'user')
or self._get_sec_uid(self._UPLOADER_URL_FORMAT % f'{user_name}/live', user_name, 'live'))
if not sec_uid:
webpage = self._download_webpage( webpage = self._download_webpage(
f'https://www.tiktok.com/embed/@{user_name}', user_name, self._UPLOADER_URL_FORMAT % user_name, user_name,
note='Downloading user embed page', fatal=False) or '' 'Downloading user webpage', 'Unable to download user webpage',
data = traverse_obj(self._search_json( fatal=False, headers={'User-Agent': 'Mozilla/5.0'}) or ''
r'<script[^>]+\bid=[\'"]__FRONTITY_CONNECT_STATE__[\'"][^>]*>', detail = traverse_obj(
webpage, 'data', user_name, default={}), self._get_universal_data(webpage, user_name), ('webapp.user-detail', {dict})) or {}
('source', 'data', f'/embed/@{user_name}', {dict})) if detail.get('statusCode') == 10222:
self.raise_login_required(
for aweme_id in traverse_obj(data, ('videoList', ..., 'id', {str})): 'This user\'s account is private. Log into an account that has access')
webpage_url = self._create_url(user_name, aweme_id) sec_uid = traverse_obj(detail, (
video_data, _ = self._extract_web_data_and_status(webpage_url, aweme_id, fatal=False) 'userInfo', 'user', 'secUid', {str})) or self._extract_sec_uid_from_embed(user_name)
sec_uid = self._parse_aweme_video_web(
video_data, webpage_url, aweme_id, extract_flat=True).get('channel_id')
if sec_uid:
break
if not sec_uid: if not sec_uid:
raise ExtractorError( raise ExtractorError(

Loading…
Cancel
Save