Перехват базовых запросов с помощью Selenium Wire и Python

Редактор выделяет красным эту строку кода:
raise exception_class(message, screen, stacktrace)
 
Вот полная ошибка:
Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)]
Type "help", "copyright", "credits" or "license" for more information.
[анализируем requests_interception.py]
Введите ссылку на видео-файл из Облака:
Traceback (most recent call last):
Файл "C:\Users\Пк\Desktop\Перехват запросов с Selenium Wire и Python\requests_interception.py", строка 126, из <module> main()
Файл "C:\Users\Пк\Desktop\Перехват запросов с Selenium Wire и Python\requests_interception.py", строка 110, из <module> if link := get_link(url):
Файл "C:\Users\Пк\Desktop\Перехват запросов с Selenium Wire и Python\requests_interception.py", строка 44, из <module> driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
Файл "c:\python\lib\site-packages\seleniumwire\webdriver.py", строка 218, из __init__ super().__init__(*args, **kwargs)
Файл "c:\python\lib\site-packages\selenium\webdriver\chrome\webdriver.py", строка 70, из __init__ super(WebDriver, self).__init__(DesiredCapabilities.CHROME['browserName'], "goog",
Файл "c:\python\lib\site-packages\selenium\webdriver\chromium\webdriver.py", строка 93, из __init__ RemoteWebDriver.__init__(
Файл "c:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py", строка 268, из __init__ self.start_session(capabilities, browser_profile)
Файл "c:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py", строка 359, из start_session response = self.execute(Command.NEW_SESSION, parameters)
Файл "c:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py", строка 424, из execute self.error_handler.check_response(response)
Файл "c:\python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", строка 247, из check_response raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
Stacktrace:
Backtrace:
Ordinal0 [0x00CBA113+1548563]
Ordinal0 [0x00C3DDA1+1039777]
Ordinal0 [0x00BBE485+517253]
Ordinal0 [0x00B4C0F1+49393]
Ordinal0 [0x00B6B797+178071]
Ordinal0 [0x00B6B59D+177565]
Ordinal0 [0x00B695FB+169467]
Ordinal0 [0x00B5160A+71178]
Ordinal0 [0x00B52690+75408]
Ordinal0 [0x00B52629+75305]
Ordinal0 [0x00C571B7+1143223]
GetHandleVerifier [0x00D52B46+507814]
GetHandleVerifier [0x00D52864+507076]
GetHandleVerifier [0x00D59F47+537511]
GetHandleVerifier [0x00D53402+510050]
Ordinal0 [0x00C4F29C+1110684]
Ordinal0 [0x00C5938B+1151883]
Ordinal0 [0x00C594F3+1152243]
Ordinal0 [0x00C583F5+1147893]
BaseThreadInitThunk [0x776400F9+25]
RtlGetAppContainerNamedObjectPath [0x77D97BBE+286]
RtlGetAppContainerNamedObjectPath [0x77D97B8E+238]

Еще раз говорю, проверьте версию браузера и попробуйте заменить веб-драйвер.

Вот обработанная ваша ссылка. Как видите, все работает.

1677294421688.png
 
Редактор выделяет красным эту строку кода:
raise exception_class(message, screen, stacktrace)

Ну да. Вот погуглил немного. Эта ошибка: WebDriverException: Message: unknown error: cannot find Chrome binary означает, что ChromeDriver не смог найти двоичный файл Chrome в директории по умолчанию. Возможно, что у вас Google Chrome установлен куда-то в другое место. Вот страница на Stack Overflow: . Изучайте
 
Спасибо.
Всё супер.
Дело было в драйвере.
Я Вам отправлю на почту моё общение с ChatGPT
Там пытаемся созлать новый плейлист. Который будет работать на ПК.
 
Здравствуйте! У меня вот такой результат выполнения скрипта:

Введите ссылку на видео-файл из Облака:
Не могу получить ссылку на плейлист с разрешениями: None

Process finished with exit code 0
Подскажите пожалуйста, что может быть не так?
 
Здравствуйте! У меня вот такой результат выполнения скрипта:


Подскажите пожалуйста, что может быть не так?

Здравствуйте. Я только что попробовал работу скрипта. Все отработало хорошо. Но, на моей ссылке. То есть, я закинул видео в облако, поделился и взял ссылку.

screenshot1.png


А вот плейлист, который грузиться по этой ссылке:

screenshot2.png


По вашей же ссылке, когда ее открываешь в браузере получается вот такая вот картинка:

screenshot3.png


Соответственно, по вашей ссылке у меня такой же результат, как у вас:

screenshot4.png


Может быть дело в этом? ))
 
Traceback (most recent call last):
File "D:\PYCHARM\lop\A!!\requests_interception\requests_interception.py", line 26, in <module>
from seleniumwire import webdriver
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\webdriver.py", line 28, in <module>
from seleniumwire import backend, utils
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\backend.py", line 4, in <module>
from seleniumwire.server import MitmProxy
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\server.py", line 5, in <module>
from seleniumwire.handler import InterceptRequestHandler
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\handler.py", line 5, in <module>
from seleniumwire import har
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\har.py", line 11, in <module>
from seleniumwire.thirdparty.mitmproxy import connections
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\connections.py", line 10, in <module>
from seleniumwire.thirdparty.mitmproxy.net import tls, tcp
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\net\tls.py", line 15, in <module>
import seleniumwire.thirdparty.mitmproxy.options
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\options.py", line 5, in <module>
from seleniumwire.thirdparty.mitmproxy import optmanager
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\optmanager.py", line 9, in <module>
import blinker._saferef
ModuleNotFoundError: No module named 'blinker._saferef'
 
Traceback (most recent call last):
File "D:\PYCHARM\lop\A!!\requests_interception\requests_interception.py", line 26, in <module>
from seleniumwire import webdriver
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\webdriver.py", line 28, in <module>
from seleniumwire import backend, utils
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\backend.py", line 4, in <module>
from seleniumwire.server import MitmProxy
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\server.py", line 5, in <module>
from seleniumwire.handler import InterceptRequestHandler
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\handler.py", line 5, in <module>
from seleniumwire import har
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\har.py", line 11, in <module>
from seleniumwire.thirdparty.mitmproxy import connections
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\connections.py", line 10, in <module>
from seleniumwire.thirdparty.mitmproxy.net import tls, tcp
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\net\tls.py", line 15, in <module>
import seleniumwire.thirdparty.mitmproxy.options
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\options.py", line 5, in <module>
from seleniumwire.thirdparty.mitmproxy import optmanager
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\optmanager.py", line 9, in <module>
import blinker._saferef
ModuleNotFoundError: No module named 'blinker._saferef'
Данные ошибки появляются вследствие того, что поддержка некоторых библиотек прекращена или не устанавливается по умолчанию в python 3.12. Поэтому, чтобы исправить ошибку: "ModuleNotFoundError: No module named 'blinker._saferef'", нужно установить:

pip install blinker==1.7.0

Также, должны быть установлены библиотеки из файла: requirements.txt и браузер Google Chrome.
Код в статье написан с загрузкой хромдрайвера из скачанного вами файла. Однако, в данном случае код нужно слегка поправить:

Python:
import os
import time
from urllib.parse import urlparse, urljoin

from requests import get
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from seleniumwire import webdriver

options = Options()
options.add_argument("--headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")


def get_link(url: str) -> (str, bool):
    """
    Получение ссылки на плейлист со ссылками на плейлисты с различным разрешением.
    :param url: Ссылка на страницу с ресурсом (в данном случае видео).
    :return: Возвращаем найденную и отфильтрованную ссылку.
    """
    driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull))
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        'source': '''
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
      '''
    })
    driver.get(url)
    time.sleep(1)

    for req in driver.requests:
        if req.response:
            if "/0p/" in urlparse(req.url).path:
                return req.url
            continue
        return False


def get_playlist(pl_url: str) -> (str, bool):
    """
    Скачивание плейлиста со ссылками на плейлисты с разрешениями.
    :param pl_url: Ссылка на плейлист с разрешениями.
    :return: Текст плейлиста для обработки.
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/108.0.0.0 YaBrowser/23.1.2.987 Yowser/2.5 Safari/537.36',
        'Host': 'cloud.mail.ru'
    }
    try:
        res = get(url=pl_url, headers=headers, timeout=5)
        return res.text if res.status_code == 200 else False
    except Exception:
        return False


def get_resolution(text: str, url: str) -> (str, bool):
    """
    Парсинг содержимого плейлиста и получение ссылки на плейлист
    с самым большим разрешением.
    :param text: Текст плейлиста.
    :param url: Ссылка на плейлист со ссылками (исходная ссылка).
    :return: Ссылка на плейлист с самым большим разрешением.
    """
    res = num = 0
    link = ""
    for txt in text.splitlines():
        if txt.startswith("#EXT-X"):
            num = int(txt.strip().split("x")[-1])
            continue
        elif txt.startswith("/"):
            if num > res:
                res = num
                link = urljoin(url, txt.strip())
    return link if link else False


def main():
    """
    Запрос ссылки на ресурс. Запуск перехвата запросов.
    Получение текста плейлиста. Парсинг. Вывод в терминал ссылки
    на плейлист с самым высоким разрешением.
    """
    url = input("Введите ссылку на видео-файл из Облака: ")
    if link := get_link(url):
        print(f"Ссылка на плейлист с разрешениями получена: {link}")
        print(f"Получение плейлиста с разрешениями")
        if text := get_playlist(link):
            print(f"Плейлист с разрешениями получен. Обработка")
            if res_link := get_resolution(text, link):
                print(f"Ссылка на самое большое разрешение в плейлисте: {res_link}")
            else:
                print(f'Не удалось получить ссылку{res_link}')
        else:
            print(f'Не могу получить плейлист: {text}')
    else:
        print(f'Не могу получить ссылку на плейлист с разрешениями: {link}')


if __name__ == "__main__":
    main()
Код:

У меня появились также другие ошибки, связанные с библиотеками, но они были исправлены простой их установкой.

Таким образом, установите библиотеки из файла: requirements.txt, установите blinker, замените код из статьи кодом из ответа и установите Google Chrome. Должно заработать.

На всякий случай еще пара команд для установки библиотек, на отсутствие которых ругался интерпретатор у меня:

Bash:
pip install packaging
pip install setuptools

У меня все заработало.
 
Данные ошибки появляются вследствие того, что поддержка некоторых библиотек прекращена или не устанавливается по умолчанию в python 3.12. Поэтому, чтобы исправить ошибку: "ModuleNotFoundError: No module named 'blinker._saferef'", нужно установить:

pip install blinker==1.7.0

Также, должны быть установлены библиотеки из файла: requirements.txt и браузер Google Chrome.
Код в статье написан с загрузкой хромдрайвера из скачанного вами файла. Однако, в данном случае код нужно слегка поправить:

Python:
import os
import time
from urllib.parse import urlparse, urljoin

from requests import get
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from seleniumwire import webdriver

options = Options()
options.add_argument("--headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")


def get_link(url: str) -> (str, bool):
    """
    Получение ссылки на плейлист со ссылками на плейлисты с различным разрешением.
    :param url: Ссылка на страницу с ресурсом (в данном случае видео).
    :return: Возвращаем найденную и отфильтрованную ссылку.
    """
    driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull))
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        'source': '''
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
      '''
    })
    driver.get(url)
    time.sleep(1)

    for req in driver.requests:
        if req.response:
            if "/0p/" in urlparse(req.url).path:
                return req.url
            continue
        return False


def get_playlist(pl_url: str) -> (str, bool):
    """
    Скачивание плейлиста со ссылками на плейлисты с разрешениями.
    :param pl_url: Ссылка на плейлист с разрешениями.
    :return: Текст плейлиста для обработки.
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/108.0.0.0 YaBrowser/23.1.2.987 Yowser/2.5 Safari/537.36',
        'Host': 'cloud.mail.ru'
    }
    try:
        res = get(url=pl_url, headers=headers, timeout=5)
        return res.text if res.status_code == 200 else False
    except Exception:
        return False


def get_resolution(text: str, url: str) -> (str, bool):
    """
    Парсинг содержимого плейлиста и получение ссылки на плейлист
    с самым большим разрешением.
    :param text: Текст плейлиста.
    :param url: Ссылка на плейлист со ссылками (исходная ссылка).
    :return: Ссылка на плейлист с самым большим разрешением.
    """
    res = num = 0
    link = ""
    for txt in text.splitlines():
        if txt.startswith("#EXT-X"):
            num = int(txt.strip().split("x")[-1])
            continue
        elif txt.startswith("/"):
            if num > res:
                res = num
                link = urljoin(url, txt.strip())
    return link if link else False


def main():
    """
    Запрос ссылки на ресурс. Запуск перехвата запросов.
    Получение текста плейлиста. Парсинг. Вывод в терминал ссылки
    на плейлист с самым высоким разрешением.
    """
    url = input("Введите ссылку на видео-файл из Облака: ")
    if link := get_link(url):
        print(f"Ссылка на плейлист с разрешениями получена: {link}")
        print(f"Получение плейлиста с разрешениями")
        if text := get_playlist(link):
            print(f"Плейлист с разрешениями получен. Обработка")
            if res_link := get_resolution(text, link):
                print(f"Ссылка на самое большое разрешение в плейлисте: {res_link}")
            else:
                print(f'Не удалось получить ссылку{res_link}')
        else:
            print(f'Не могу получить плейлист: {text}')
    else:
        print(f'Не могу получить ссылку на плейлист с разрешениями: {link}')


if __name__ == "__main__":
    main()
Код:

У меня появились также другие ошибки, связанные с библиотеками, но они были исправлены простой их установкой.

Таким образом, установите библиотеки из файла: requirements.txt, установите blinker, замените код из статьи кодом из ответа и установите Google Chrome. Должно заработать.

На всякий случай еще пара команд для установки библиотек, на отсутствие которых ругался интерпретатор у меня:

Bash:
pip install packaging
pip install setuptools

У меня все заработало.
Traceback (most recent call last):
File "D:\PYCHARM\lop\A!!\requests_interception\sea.py", line 8, in <module>
from seleniumwire import webdriver
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\webdriver.py", line 28, in <module>
from seleniumwire import backend, utils
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\backend.py", line 4, in <module>
from seleniumwire.server import MitmProxy
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\server.py", line 7, in <module>
from seleniumwire.thirdparty.mitmproxy import addons
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\addons\__init__.py", line 1, in <module>
from seleniumwire.thirdparty.mitmproxy.addons import core
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\addons\core.py", line 5, in <module>
from seleniumwire.thirdparty.mitmproxy import command, ctx, exceptions, optmanager, platform
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\ctx.py", line 2, in <module>
import seleniumwire.thirdparty.mitmproxy.master
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\master.py", line 7, in <module>
from seleniumwire.thirdparty.mitmproxy import (
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\addonmanager.py", line 8, in <module>
from seleniumwire.thirdparty.mitmproxy import controller, eventsequence, exceptions
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\eventsequence.py", line 3, in <module>
from seleniumwire.thirdparty.mitmproxy import controller, http, tcp, websocket
File "D:\PYCHARM\lop\venv\Lib\site-packages\seleniumwire\thirdparty\mitmproxy\websocket.py", line 5, in <module>
from wsproto.frame_protocol import CloseReason, Opcode
File "D:\PYCHARM\lop\venv\Lib\site-packages\wsproto\__init__.py", line 9, in <module>
from .connection import Connection, ConnectionState, ConnectionType
File "D:\PYCHARM\lop\venv\Lib\site-packages\wsproto\connection.py", line 23, in <module>
from .utilities import LocalProtocolError
File "D:\PYCHARM\lop\venv\Lib\site-packages\wsproto\utilities.py", line 12, in <module>
from h11._headers import Headers as H11Headers
ImportError: cannot import name 'Headers' from 'h11._headers' (D:\PYCHARM\lop\venv\Lib\site-packages\h11\_headers.py)


я все установил
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!