diff --git a/webscraper/api/EbayAPI.py b/webscraper/api/EbayAPI.py index 715913b..a7417bb 100644 --- a/webscraper/api/EbayAPI.py +++ b/webscraper/api/EbayAPI.py @@ -3,7 +3,7 @@ from dotenv import load_dotenv import os import logging -from webscraper.api.interface import EbayABC +from webscraper.api.interface import ScraperAPIInterface # Load environment variables and configure logging load_dotenv() @@ -23,7 +23,7 @@ def __init__(self, name, price, currency, url, date, user_id=None): self.date = date self.user_id = user_id -class EbayAPI(EbayABC): +class EbayAPI(ScraperAPIInterface): client_secret_key = os.getenv("clientsecret") client_id_key = os.getenv("clientid") get_user_key = HTTPBasicAuth(client_id_key, client_secret_key) @@ -86,10 +86,10 @@ def retrieve_access_token() -> str: raise @staticmethod - def retrieve_ebay_response(httprequest: str, query: str) -> dict: + def retrieve_ebay_response(httprequest: str, query: str, category_id: int = 0) -> dict: """Perform GET request to eBay API.""" auth = EbayAPI.retrieve_access_token() - logger.info(f"Making GET request to eBay API: {httprequest} with query: {query}") + logger.info(f"Making GET request to eBay API: {httprequest} with query: {query} and category_id: {category_id}") try: response = requests.get( httprequest, @@ -97,7 +97,10 @@ def retrieve_ebay_response(httprequest: str, query: str) -> dict: "Authorization": f"Bearer {auth}", "Content-Type": "application/json" }, - params={"q": query, "category_tree_id": 0} + params={ + "q": query, + "category_ids": category_id if category_id else None # send only if nonzero + } ) if response.status_code == 429: logger.warning("Rate limit exceeded.") @@ -107,4 +110,4 @@ def retrieve_ebay_response(httprequest: str, query: str) -> dict: return response.json() except requests.exceptions.RequestException as e: logger.exception("Error retrieving eBay response.") - raise Exception(f"Error retrieving eBay response: {str(e)}") from e \ No newline at end of file + raise Exception(f"Error retrieving eBay response: {str(e)}") from e diff --git a/webscraper/api/interface.py b/webscraper/api/interface.py index 72f0cf0..e52a7e0 100644 --- a/webscraper/api/interface.py +++ b/webscraper/api/interface.py @@ -3,7 +3,7 @@ from accounts.models import Product -class EbayABC(ABC): +class ScraperAPIInterface(ABC): @abstractmethod def get_scraped_data(self, paths: list[str]) -> Product: diff --git a/webscraper/api/routes.py b/webscraper/api/routes.py index e74a287..072a394 100644 --- a/webscraper/api/routes.py +++ b/webscraper/api/routes.py @@ -1,9 +1,38 @@ import sys import os sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) +import django +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cheaper.settings') +django.setup() from flask import Flask, jsonify, request from webscraper.src.Cheaper_Scraper import CheaperScraper +from flask import Blueprint, request, jsonify +from webscraper.api.EbayAPI import EbayAPI + +ebay_bp = Blueprint("ebay", __name__, url_prefix="/api/ebay") + +@ebay_bp.route("/category", methods=["GET"]) +def get_items_by_category(): + query = request.args.get("q") + category_id = request.args.get("category_id", default=0, type=int) + + if not query: + return jsonify({"error": "Missing required query parameter 'q'"}), 400 + + try: + results = EbayAPI.retrieve_ebay_response( + "https://api.sandbox.ebay.com/buy/browse/v1/item_summary/search", + query, + category_id + ) + return jsonify(results) + except Exception as e: + return jsonify({"error": str(e)}), 500 + +app = Flask(__name__) +app.register_blueprint(ebay_bp) + app = Flask(__name__) scraper = CheaperScraper(base_url="https://books.toscrape.com") diff --git a/webscraper/src/Cheaper_Scraper.py b/webscraper/src/Cheaper_Scraper.py index ce83e2f..eef7508 100644 --- a/webscraper/src/Cheaper_Scraper.py +++ b/webscraper/src/Cheaper_Scraper.py @@ -10,6 +10,12 @@ from webscraper.src.fetch_utils import cached_get from functools import lru_cache from webscraper.api.EbayAPI import EbayItem +import os +import django +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cheaper.settings') # adjust if needed +django.setup() +from accounts.models import Product + @@ -108,3 +114,6 @@ def scrape(self, paths: List[str]) -> Dict[str, List[str]]: def get_scraped_data(self, paths: List[str]) -> Dict[str, List[str]]: return self.scrape(paths) + def search_item(self, query: str) -> Product: + raise NotImplementedError("search_item not implemented yet") +