WBI signature

This commit is contained in:
grqx_wsl 2024-07-02 18:25:34 +12:00
parent a9ac7d7f99
commit d079c1a67f

View File

@ -1657,7 +1657,7 @@ def _real_extract(self, url):
return self.playlist_result(self._entries(category, subcategory, query), query, query) return self.playlist_result(self._entries(category, subcategory, query), query, query)
class BiliBiliSearchAllIE(SearchInfoExtractor): class BiliBiliSearchAllIE(SearchInfoExtractor, BilibiliBaseIE):
IE_DESC = 'Bilibili all search' IE_DESC = 'Bilibili all search'
_MAX_RESULTS = 100000 _MAX_RESULTS = 100000
_SEARCH_KEY = 'biliallsearch' _SEARCH_KEY = 'biliallsearch'
@ -1698,6 +1698,7 @@ class BiliBiliSearchAllIE(SearchInfoExtractor):
def _search_results(self, query): def _search_results(self, query):
headers = self.geo_verification_headers() headers = self.geo_verification_headers()
headers['Referer'] = 'https://www.bilibili.com/'
page_size = 50 page_size = 50
live_room_prefix = 'https://live.bilibili.com/' live_room_prefix = 'https://live.bilibili.com/'
bili_user_prefix = 'https://space.bilibili.com/' bili_user_prefix = 'https://space.bilibili.com/'
@ -1710,10 +1711,12 @@ def _search_results(self, query):
'dynamic_offset': (page_num - 1) * page_size, 'dynamic_offset': (page_num - 1) * page_size,
'platform': 'pc', 'platform': 'pc',
} }
api_url = r'https://api.bilibili.com/x/web-interface/search/all/v2' api_url = r'https://api.bilibili.com/x/web-interface/wbi/search/all/v2'
try: try:
search_all_result = self._download_json( search_all_result = self._download_json(
api_url, video_id=query, query=query_params, headers=headers) api_url, video_id=query, query=self._sign_wbi(query_params, query),
headers=headers,
)
except ExtractorError as e: except ExtractorError as e:
if isinstance(e.cause, HTTPError) and e.cause.status == 412: if isinstance(e.cause, HTTPError) and e.cause.status == 412:
raise ExtractorError('Request is blocked by server (-412).', expected=True) raise ExtractorError('Request is blocked by server (-412).', expected=True)
@ -2517,6 +2520,7 @@ def _real_extract(self, url):
live_room_prefix = 'https://live.bilibili.com/' live_room_prefix = 'https://live.bilibili.com/'
bili_user_prefix = 'https://space.bilibili.com/' bili_user_prefix = 'https://space.bilibili.com/'
headers = self.geo_verification_headers() headers = self.geo_verification_headers()
headers['Referer'] = url
entries = [] entries = []
params = parse_qs(url) params = parse_qs(url)
query = { query = {
@ -2565,8 +2569,8 @@ def _real_extract(self, url):
if search_type == 'all' and page_num == 1: if search_type == 'all' and page_num == 1:
try: try:
search_all_result = self._download_json( search_all_result = self._download_json(
r'https://api.bilibili.com/x/web-interface/search/all/v2', r'https://api.bilibili.com/x/web-interface/wbi/search/all/v2',
video_id=playlist_id, query=query, headers=headers) video_id=playlist_id, query=self._sign_wbi(query, playlist_id), headers=headers)
except ExtractorError as e: except ExtractorError as e:
if isinstance(e.cause, HTTPError) and e.cause.status == 412: if isinstance(e.cause, HTTPError) and e.cause.status == 412:
raise ExtractorError('Request is blocked by server (-412).', expected=True) raise ExtractorError('Request is blocked by server (-412).', expected=True)
@ -2591,13 +2595,15 @@ def _real_extract(self, url):
elif result_type == 'bili_user': elif result_type == 'bili_user':
entries.append(self.url_result(bili_user_prefix + str(result_data['mid']))) entries.append(self.url_result(bili_user_prefix + str(result_data['mid'])))
else: else:
query = {
'search_type': search_type_mapping[search_type],
**query, # search_type in type is overridden when specified in url params
}
try: try:
search_type_result = self._download_json( search_type_result = self._download_json(
r'https://api.bilibili.com/x/web-interface/search/type', r'https://api.bilibili.com/x/web-interface/wbi/search/type',
video_id=playlist_id, query={ video_id=playlist_id, query=self._sign_wbi(query, playlist_id), headers=headers,
'search_type': search_type_mapping[search_type], )
**query, # search_type in type is overridden when specified in url params
}, headers=headers)
except ExtractorError as e: except ExtractorError as e:
if isinstance(e.cause, HTTPError) and e.cause.status == 412: if isinstance(e.cause, HTTPError) and e.cause.status == 412:
raise ExtractorError('Request is blocked by server (-412).') raise ExtractorError('Request is blocked by server (-412).')