«»» | |
$description Российская социальная платформа для прямых трансляций и видеохостинга. | |
$ URL-адрес vk.com | |
$тип live, vod | |
«»» | |
журнал импорта | |
импорт по | |
из hashlib импорта md5 | |
из urllib.parse import parse_qsl, без кавычек, urlparse | |
из streamlink. exceptions import NoStreamsError | |
из streamlink.plugin import Plugin, PluginError, pluginmatcher | |
из streamlink.plugin.api, проверка импорта | |
из streamlink.stream.dash импортировать DASHStream | |
из streamlink.stream.hls импортировать HLSStream | |
из streamlink.utils.url import update_qsd | |
журнал = logging.getLogger(__name__) | |
@pluginmatcher(перекомпилировать( | |
r»https?://(?:\w+\. )?vk\.com/videos?(?:\?z=video)?(?P | |
)) | |
@pluginmatcher(перекомпилировать( | |
r»https?://(\w+\.)?vk\.com/.+» | |
)) | |
класс ВК(Плагин): | |
API_URL = «https://vk.com/al_video.php» | |
HASH_COOKIE = «хэш529» | |
по определению _get_cookies(я): | |
определение on_response(res, **kwargs): | |
, если res. headers.get(«x-waf-redirect») == «1»: | |
, если не res.headers.get(«X-WAF-Backend-Status»): | |
log.debug(«Получение файла cookie WAF») | |
ключ = md5(cookie.encode(«utf-8»)).hexdigest() | |
res.headers[«Местоположение»] = update_qsd(res.headers[«Местоположение»], qsd={«ключ»: ключ}) | |
возврат рез | |
elif res.headers.get(«X-WAF-Backend-Status») == «challenge_success»: | |
self.session.http.cookies.update(res.cookies) | |
self. session.http.get(«https://vk.com/», hooks={«response»: on_response}) | |
по определению _has_video_id(я): | |
вернуть любое (self.matches[:-1]) | |
по определению follow_vk_redirect(self): | |
, если self._has_video_id(): | |
возврат | |
попытка: | |
parsed_url = urlparse(self.url) | |
true_path = next(unquote(v). split(«/»)[0] для k, v в parse_qsl(parsed_url.query), если k == «z» и len(v) > | |
self.url = f»{parsed_url.scheme}://{parsed_url.netloc}/{true_path}» | |
, если self._has_video_id(): | |
возврат | |
кроме StopIteration: | |
проход | |
попытка: | |
self.url = self.session.http.get(self.url, схема=validate.Schema( | |
validate.parse_html(), | |
validate. xml_xpath_string(«.//head/meta[@property=’og:url’][@content]/@content»), | |
ул | |
)) | |
кроме PluginError: | |
проход | |
, если self._has_video_id(): | |
возврат | |
поднять NoStreamsError(self.url) | |
по определению _get_streams(я): | |
self._get_cookies() | |
self. | |
video_id = self.match.group(«video_id») | |
если не video_id: | |
возврат | |
log.debug(f»ИД видео: {video_id}») | |
попытка: | |
данных = self.session.http.post( | |
self.API_URL, | |
params={«действие»: «показать»}, | |
data={«act»: «show», «al»: «1», «video»: video_id}, 9\s* |