add abstraction ob platform and article + vinted

"

Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
This commit is contained in:
Omar Sánchez Pizarro
2025-10-10 14:58:27 +02:00
parent b5178f415b
commit 4111f57564
16 changed files with 1890 additions and 102 deletions

View File

@@ -1,13 +1,9 @@
import time
import requests
import logging
from datalayer.wallapop_article import WallapopArticle
import traceback
from platforms.platform_factory import PlatformFactory
REQUEST_SLEEP_TIME = 30
REQUEST_RETRY_TIME = 5
ERROR_SLEEP_TIME = 60
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
class Worker:
def __init__(self, item_to_monitor, general_args, queue_manager):
@@ -15,64 +11,25 @@ class Worker:
self._item_monitoring = item_to_monitor
self._general_args = general_args
self._queue_manager = queue_manager
# Initialize the platform based on item_to_monitor configuration
platform_name = self._item_monitoring.get_platform()
try:
self._platform = PlatformFactory.create_platform(platform_name, item_to_monitor)
self.logger.info(f"Initialized platform: {platform_name}")
except ValueError as e:
self.logger.error(f"Failed to initialize platform: {e}")
raise
# Initialize the queue with existing articles
self._queue_manager.add_to_notified_articles(self._request_articles())
def _create_url(self):
url = (
f"http://api.wallapop.com/api/v3/search"
f"?source=search_box"
f"&keywords={self._item_monitoring._search_query}"
f"&order_by=newest"
f"&language=es_ES"
)
# Only include latitude and longitude if both are not 0
if self._item_monitoring._latitude != 0 and self._item_monitoring._longitude != 0:
url += (
f"&latitude={self._item_monitoring._latitude}"
f"&longitude={self._item_monitoring._longitude}"
)
if self._item_monitoring._min_price != 0:
url += f"&min_sale_price={self._item_monitoring._min_price}"
if self._item_monitoring._max_price != 0:
url += f"&max_sale_price={self._item_monitoring._max_price}"
if self._item_monitoring._max_distance != 0:
url += f"&distance_in_km={self._item_monitoring._max_distance}"
if self._item_monitoring.get_condition() != "all":
url += f"&condition={self._item_monitoring.get_condition()}" # new, as_good_as_new, good, fair, has_given_it_all
return url
def _request_articles(self):
url = self._create_url()
while True:
try:
headers = {
'X-DeviceOS': '0',
'User-Agent': USER_AGENT
}
response = requests.get(url, headers=headers)
response.raise_for_status()
break
except requests.exceptions.RequestException as err:
self.logger.error(f"Request Exception: {err}")
time.sleep(REQUEST_RETRY_TIME)
json_response = response.json()
json_items = json_response['data']['section']['payload']['items']
articles = self._parse_json_response(json_items)
return articles
def _parse_json_response(self, json_response):
articles = []
for json_article in json_response:
articles.append(WallapopArticle.load_from_json(json_article))
return articles
"""
Request articles from the configured platform
Platform-specific logic is delegated to the platform implementation
"""
return self._platform.fetch_articles()
def _has_words(self, text, word_list):
return any(word in text for word in word_list)
@@ -136,7 +93,8 @@ class Worker:
def run(self):
while True:
try:
self.logger.info(f"Wallapop monitor worker started - {self._item_monitoring.get_name()}")
platform_name = self._platform.get_platform_name()
self.logger.info(f"{platform_name.capitalize()} monitor worker started - {self._item_monitoring.get_name()}")
self.work()
except Exception as e:
self.logger.error(f"{''.join(traceback.format_exception(None, e, e.__traceback__))}")