Initialer Versionstand des eBay Trackers
This commit is contained in:
86
src/ebayService.js
Normal file
86
src/ebayService.js
Normal file
@@ -0,0 +1,86 @@
|
||||
import axios from 'axios';
|
||||
import { getEbayToken } from './ebayAuth.js';
|
||||
|
||||
// Hilfsfunktion: Aufteilen eines Arrays in kleinere Häppchen (Chunks)
|
||||
function chunkArray(array, chunkSize) {
|
||||
const chunks = [];
|
||||
for (let i = 0; i < array.length; i += chunkSize) {
|
||||
chunks.push(array.slice(i, i + chunkSize));
|
||||
}
|
||||
return chunks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Durchsucht eBay nach ALLEN Whitelist-Verkäufern in der Datenbank
|
||||
*/
|
||||
export async function searchEbayProducts(query, allowedSellers = [], negativeKeywords = []) {
|
||||
if (!allowedSellers || allowedSellers.length === 0) {
|
||||
console.log('⚠️ Keine Verkäufer in der Whitelist hinterlegt.');
|
||||
return [];
|
||||
}
|
||||
|
||||
try {
|
||||
const token = await getEbayToken();
|
||||
|
||||
// 1. Verkäufernamen bereinigen
|
||||
const validSellers = allowedSellers
|
||||
.map(s => String(s).trim())
|
||||
.filter(Boolean);
|
||||
|
||||
if (validSellers.length === 0) return [];
|
||||
|
||||
// 2. Verkäufer in 25er-Pakete aufteilen
|
||||
const sellerBatches = chunkArray(validSellers, 25);
|
||||
let allRawItems = [];
|
||||
|
||||
// 3. Jedes 25er-Paket nacheinander bei eBay abfragen
|
||||
for (const batch of sellerBatches) {
|
||||
const formattedSellers = batch.map(s => encodeURIComponent(s)).join('|');
|
||||
const sellerFilterString = `sellers:{${formattedSellers}}`;
|
||||
|
||||
const response = await axios.get('https://api.ebay.com/buy/browse/v1/item_summary/search', {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'X-EBAY-C-MARKETPLACE-ID': 'EBAY-DE'
|
||||
},
|
||||
params: {
|
||||
q: query,
|
||||
filter: sellerFilterString,
|
||||
limit: 50,
|
||||
sort: 'newlyListed'
|
||||
}
|
||||
});
|
||||
|
||||
const items = response.data.itemSummaries || [];
|
||||
allRawItems = allRawItems.concat(items);
|
||||
}
|
||||
|
||||
// 4. Duplikate über die itemId entfernen
|
||||
const uniqueItemsMap = new Map();
|
||||
for (const item of allRawItems) {
|
||||
uniqueItemsMap.set(item.itemId, item);
|
||||
}
|
||||
const uniqueItems = Array.from(uniqueItemsMap.values());
|
||||
|
||||
// 5. Negativ-Keywords lokal ausfiltern
|
||||
const filteredItems = uniqueItems.filter(item => {
|
||||
const titleLower = item.title.toLowerCase();
|
||||
return !negativeKeywords.some(kw => titleLower.includes(kw.toLowerCase().trim()));
|
||||
});
|
||||
|
||||
return filteredItems.map(item => ({
|
||||
itemId: item.itemId,
|
||||
title: item.title,
|
||||
price: item.price?.value,
|
||||
currency: item.price?.currency || 'EUR',
|
||||
sellerUsername: item.seller?.username || 'Unbekannt',
|
||||
itemUrl: item.itemWebUrl,
|
||||
imageUrl: item.image?.imageUrl || null
|
||||
}));
|
||||
|
||||
} catch (error) {
|
||||
const apiError = error.response?.data?.errors?.[0]?.message || error.message;
|
||||
console.error(`❌ Fehler bei der eBay-Suche für "${query}":`, apiError);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user