| «»» | |
| $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* |

exceptions import NoStreamsError
)?vk\.com/videos?(?:\?z=video)?(?P
headers.get(«x-waf-redirect») == «1»:
session.http.get(«https://vk.com/», hooks={«response»: on_response})
split(«/»)[0] для k, v в parse_qsl(parsed_url.query), если k == «z» и len(v) >
xml_xpath_string(«.//head/meta[@property=’og:url’][@content]/@content»),