rotating vpn #157

This commit is contained in:
Bo Peng
2025-05-31 17:28:32 -05:00
parent 8103fa4ab2
commit 66228b3952
4 changed files with 41 additions and 10 deletions

View File

@@ -140,7 +140,7 @@ class Config(Generic[TAIConfig, TItemConfig, TMarketplaceConfig]):
)
marketplace_class = supported_marketplaces[market_type]
self.marketplace[marketplace_name] = marketplace_class.get_config(
name=marketplace_name, **marketplace_config
name=marketplace_name, monitor_config=self.monitor, **marketplace_config
)
lan = self.marketplace[marketplace_name].language
if lan is None:

View File

@@ -275,8 +275,8 @@ class FacebookMarketplace(Marketplace):
def login(self: "FacebookMarketplace") -> None:
assert self.browser is not None
context = self.browser.new_context()
self.page = context.new_page()
self.page = self.create_page(swap_proxy=True)
# Navigate to the URL, no timeout
self.goto_url(self.initial_url)

View File

@@ -7,7 +7,15 @@ from typing import Any, Callable, Generator, Generic, List, Type, TypeVar
from playwright.sync_api import Browser, ElementHandle, Locator, Page # type: ignore
from .listing import Listing
from .utils import BaseConfig, Currency, KeyboardMonitor, Translator, convert_to_seconds, hilight
from .utils import (
BaseConfig,
Currency,
KeyboardMonitor,
MonitorConfig,
Translator,
convert_to_seconds,
hilight,
)
class MarketPlace(Enum):
@@ -343,6 +351,7 @@ class MarketplaceConfig(MarketItemCommonConfig):
# name of market, right now facebook is the only supported one
market_type: str | None = MarketPlace.FACEBOOK.value
language: str | None = None
monitor_config: MonitorConfig | None = None
def handle_market_type(self: "MarketplaceConfig") -> None:
if self.market_type is None:
@@ -470,6 +479,32 @@ class Marketplace(Generic[TMarketplaceConfig, TItemConfig]):
self.browser = None
self.page = None
def create_page(self: "Marketplace", swap_proxy: bool = False) -> Page:
assert self.browser is not None
# if there is an existing page, asked to swap_proxy, and there is an proxy_server
# setting with multiple proxies
if (
self.page
and swap_proxy
and self.config.monitor_config is not None
and isinstance(self.config.monitor_config.proxy_server, list)
and len(self.config.monitor_config.proxy_server) > 1
):
self.page.close()
self.page = None
if self.page is None:
context = self.browser.new_context(
proxy=(
None
if self.config.monitor_config is None
else self.config.monitor_config.get_proxy_options()
)
)
self.page = context.new_page()
return self.page
def goto_url(self: "Marketplace", url: str, attempt: int = 0) -> None:
try:
assert self.page is not None

View File

@@ -394,9 +394,7 @@ class MarketplaceMonitor:
# Open a new browser page.
self.load_config_file()
assert self.config is not None
self.browser = self.playwright.chromium.launch(
headless=self.headless, proxy=self.config.monitor.get_proxy_options()
)
self.browser = self.playwright.chromium.launch(headless=self.headless)
#
assert self.browser is not None
while True:
@@ -552,9 +550,7 @@ class MarketplaceMonitor:
self.logger.info(
f"""{hilight("[Search]", "info")} Starting a browser because the item was not checked before."""
)
self.browser = self.playwright.chromium.launch(
headless=self.headless, proxy=self.config.monitor.get_proxy_options()
)
self.browser = self.playwright.chromium.launch(headless=self.headless)
marketplace.set_browser(self.browser)
# ignore enabled