@skvor1n

Как модифицировать GET запрос Selenium на Python?

Пишу скрипт с использованием Selenium, который переходит на определённый сайт и когда сайт посылает GET запрос с "get_check_records" в url скрипт должен модифицировать его, а именно выдавать заранее записанный в коде ответ, но я столкнулся с тем, что либо ловлю 404 или 501 ко всем запросам в браузере и без моего заранее сделанного в коде ответа соответственно, либо ответ вообще никак не модифицируется. Прямого ответа в гугле как провернуть подобные фокусы на python я не нашёл, обратился к ChatGPT, тот выдавал разные варианты: используя только selenium, использование библиотеки mitmproxy (он застрял на одной строчке кода), browsermobproxy (сделал всё по инструкции, скачал, указал основную папку, указал папку bin, но получил дохренилиард ошибок при его запуске и закрылся) и наконец библиотека mitm, какой вариант с ней он предлагал уже не найду, но и он был безуспешен.

Ниже его варианты, если это поможет

Первый вариант со встроенными функциями Selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Создаем опции для Firefox WebDriver
firefox_options = Options()

# Инициализируем WebDriver с опциями
driver = webdriver.Firefox(options=firefox_options)

# Перехватываем GET запросы через DevTools Protocol
def request_intercepted(request):
    if "get_check_records" in request.url:
        # Модифицируем ответ на запрос
        response = {
            "body": "Модифицированный ответ здесь".encode("utf-8"),
            "headers": request.headers,
            "responseCode": 200,
        }
        request.continue_(
            response=response
        )
    else:
        request.continue_()

driver.request_interceptor = request_intercepted

# Открываем целевой сайт
driver.get("https://google.com")

# Выполняем необходимые действия на сайте с помощью Selenium
# ...

# Закрываем браузер
driver.quit()


Второй вариант через mitmproxy

import threading
import time
from mitmproxy import proxy, options
from mitmproxy.tools.dump import DumpMaster
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class Addon:
    def __init__(self):
        self.response_text = "Модифицированный ответ здесь"

    def response(self, flow):
        if "get_check_records" in flow.request.url:
            flow.response = flow.request.make_response(200, self.response_text.encode())

    def load(self, entry):
        entry.add_response_hook(self.response)

def mitmproxy_thread():
    opts = options.Options()
    opts.add_option("ssl_insecure", bool, True, "Ignore SSL errors")
    config = proxy.ProxyConfig(opts) # Застрял тут, тут вылезала ошибка, он менял её то на config = proxy.config.ProxyConfig(opts) то обратно на config = proxy.ProxyConfig(opts), безуспешно

    addon = Addon()

    master = DumpMaster(config)
    master.addons.add(addon)

    try:
        master.run()
    except KeyboardInterrupt:
        master.shutdown()

def selenium_script():
    # Создаем опции для Firefox WebDriver
    firefox_options = webdriver.FirefoxOptions()


    # Инициализируем WebDriver с опциями
    driver = webdriver.Firefox(options=firefox_options)

    # Открываем целевой сайт
    driver.get("https://google.com")

    # Выполняем необходимые действия на сайте с помощью Selenium
    # ...

    # Закрываем браузер
    driver.quit()

if __name__ == "__main__":
    mitmproxy_thread = threading.Thread(target=mitmproxy_thread)
    mitmproxy_thread.start()

    # Даем немного времени для запуска mitmproxy
    time.sleep(2)

    # Запускаем Selenium скрипт
    selenium_script()

    # Завершаем работу mitmproxy после выполнения Selenium скрипта
    mitmproxy_thread.join()


Третий вариант с browsermobproxy
from browsermobproxy import Server
import time
import json

# Запуск сервера BrowserMob Proxy
server = Server(r'ПУТЬ_К_ПАПКЕ_С_BROWSERMOB_PROXY')
server.start()
proxy = server.create_proxy()

# Настройка Selenium с использованием прокси
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))

# Инициализация драйвера Chrome
driver = webdriver.Chrome(chrome_options=chrome_options)

# Настройка прокси для BrowserMob Proxy
proxy.new_har("modified_responses")

# Открытие страницы и выполнение действий
driver.get("https://google.com")
# Выполните дополнительные действия на странице

# Получение записанных данных
har = proxy.har
for entry in har['log']['entries']:
    request = entry['request']
    response = entry['response']
    url = request['url']
    if "get_check_records" in url:
        # Модифицируйте ответ по вашему усмотрению
        modified_response = "Ваш заранее записанный ответ"
        response['content']['text'] = modified_response

# Закрытие драйвера и сервера BrowserMob Proxy
driver.quit()
server.stop()
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
Я решаю аналогичные задачи с помощью selenium-wire:

Features
~~~~~~~~

* Pure Python, user-friendly API
* HTTP and HTTPS requests captured
* Intercept requests and responses
* Modify headers, parameters, body content on the fly
* Capture websocket messages
* HAR format supported
* Proxy server support
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы