10-17-2026, 11:39 AM
Hazır Kod: Fiyat Takip Botuna JSON Veri Loglama (Fiyat Geçmişi & Grafik Altyapısı Ekleme)
Fiyat takip botlarında sadece anlık bildirim almak bir süre sonra yetersiz kalır. Ürünün son 1 haftada veya 1 ayda gördüğü en dip fiyatı, hangi günlerde indirime girdiğini ve satıcının bindirim yapıp yapmadığını analiz etmek için fiyat geçmişini yerel bir dosyada kayıt altında tutmak gerekir.
Node.js'in yerleşik fs (File System) modülü sayesinde harici hiçbir veritabanı (MySQL/MongoDB vb.) kurmaya gerek kalmadan, her taramada fiyatları urun_gecmisi.json dosyasına tarih ve saat damgasıyla otomatik işleyebiliriz.
1. JSON Dosyasının Yapısı Nasıl Görünecek?
Bot çalıştıkça aynı dizinde otomatik olarak şu formatta temiz bir arşiv oluşacaktır:
2. JSON Loglama Entegre Edilmiş Tam Kod (fiyat_takip_loglu.js)
Klasörünüzdeki koda sadece fs modülü ve fiyatKaydet() fonksiyonu eklenmiştir:
3. Bu Log Verisiyle İleride Neler Yapılabilir?
JSON dosyasına eklemek istediğiniz farklı alanlar (satıcı adı, stok var/yok durumu vb.) varsa sorularınızı bu başlık altından paylaşabilirsiniz!
Fiyat takip botlarında sadece anlık bildirim almak bir süre sonra yetersiz kalır. Ürünün son 1 haftada veya 1 ayda gördüğü en dip fiyatı, hangi günlerde indirime girdiğini ve satıcının bindirim yapıp yapmadığını analiz etmek için fiyat geçmişini yerel bir dosyada kayıt altında tutmak gerekir.
Node.js'in yerleşik fs (File System) modülü sayesinde harici hiçbir veritabanı (MySQL/MongoDB vb.) kurmaya gerek kalmadan, her taramada fiyatları urun_gecmisi.json dosyasına tarih ve saat damgasıyla otomatik işleyebiliriz.
1. JSON Dosyasının Yapısı Nasıl Görünecek?
Bot çalıştıkça aynı dizinde otomatik olarak şu formatta temiz bir arşiv oluşacaktır:
Kod:
{
"ASUS RTX 4070 Ti Ekran Kartı": [
{
"tarih": "17.10.2026",
"saat": "14:30:15",
"fiyat": 34500
},
{
"tarih": "17.10.2026",
"saat": "15:15:20",
"fiyat": 31999
}
]
}2. JSON Loglama Entegre Edilmiş Tam Kod (fiyat_takip_loglu.js)
Klasörünüzdeki koda sadece fs modülü ve fiyatKaydet() fonksiyonu eklenmiştir:
Kod:
const puppeteer = require('puppeteer');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
// --- AYARLAR ---
const TELEGRAM_BOT_TOKEN = 'BURAYA_BOT_TOKEN';
const TELEGRAM_CHAT_ID = 'BURAYA_CHAT_ID';
const KONTROL_PERIYODU_DAKIKA = 45;
const LOG_DOSYASI = path.join(__dirname, 'urun_gecmisi.json');
const URUNLER = [
{
isim: 'ASUS RTX 4070 Ti Ekran Kartı',
url: 'https://www.ornek-site.com/asus-rtx-4070-ti-p-12345',
hedefFiyat: 32000,
selector: '.product-price, [data-test-id="price-current-price"]'
},
{
isim: 'Samsung 27" 2K 165Hz Monitör',
url: 'https://www.ornek-site.com/samsung-27-monitor-p-67890',
hedefFiyat: 8500,
selector: '.product-price, .current-price-box'
}
];
const bekle = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function telegramBildir(mesaj) {
const url = `https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage`;
try {
await axios.post(url, {
chat_id: TELEGRAM_CHAT_ID,
text: mesaj,
parse_mode: 'HTML'
});
} catch (err) {
console.error('Telegram hata:', err.message);
}
}
function fiyatiSayiyaCevir(fiyatMetni) {
if (!fiyatMetni) return null;
const temiz = fiyatMetni
.replace(/[^\d,\.]/g, '')
.replace(/\./g, '')
.replace(',', '.');
return parseFloat(temiz);
}
/**
* Fiyatı urun_gecmisi.json dosyasına tarih ve saatle ekleyen fonksiyon
*/
function fiyatKaydet(urunAdi, guncelFiyat) {
let gecmisVeri = {};
// Dosya zaten varsa mevcut veriyi oku
if (fs.existsSync(LOG_DOSYASI)) {
try {
const hamIcerik = fs.readFileSync(LOG_DOSYASI, 'utf8');
gecmisVeri = hamIcerik ? JSON.parse(hamIcerik) : {};
} catch (e) {
gecmisVeri = {};
}
}
// Bu ürün için daha önce dizi açılmadıysa oluştur
if (!gecmisVeri[urunAdi]) {
gecmisVeri[urunAdi] = [];
}
const simdi = new Date();
const yeniKayit = {
tarih: simdi.toLocaleDateString('tr-TR'),
saat: simdi.toLocaleTimeString('tr-TR'),
fiyat: guncelFiyat
};
// Yeni fiyat kaydını ürünün geçmişine ekle
gecmisVeri[urunAdi].push(yeniKayit);
// Dosyaya düzenli ve okunaklı (2 boşluk girintili) yaz
fs.writeFileSync(LOG_DOSYASI, JSON.stringify(gecmisVeri, null, 2), 'utf8');
console.log(`? [JSON Log] ${urunAdi} için ${guncelFiyat} TL kaydedildi.`);
}
/**
* Ana Kontrol Döngüsü
*/
async function tumListeyiKontrolEt() {
console.log(`\n==================================================`);
console.log(`[${new Date().toLocaleTimeString('tr-TR')}] Fiyat kontrolü ve loglama başlatıldı...`);
console.log(`==================================================`);
let browser = null;
try {
browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
});
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36');
await page.setRequestInterception(true);
page.on('request', (req) => {
if (['image', 'font', 'media'].includes(req.resourceType())) {
req.abort();
} else {
req.continue();
}
});
for (let i = 0; i < URUNLER.length; i++) {
const urun = URUNLER[i];
console.log(`\n[${i + 1}/${URUNLER.length}] Kontrol: ${urun.isim}`);
try {
await page.goto(urun.url, { waitUntil: 'domcontentloaded', timeout: 35000 });
const fiyatMetni = await page.evaluate((secici) => {
const eleman = document.querySelector(secici);
return eleman ? eleman.innerText.trim() : null;
}, urun.selector);
if (!fiyatMetni) {
console.log(`⚠️ Fiyat etiketi bulunamadı!`);
continue;
}
const guncelFiyat = fiyatiSayiyaCevir(fiyatMetni);
console.log(`Fiyat: ${guncelFiyat} TL | Hedef: ${urun.hedefFiyat} TL`);
// 1. JSON DOSYASINA LOGLA
if (guncelFiyat) {
fiyatKaydet(urun.isim, guncelFiyat);
}
// 2. İNDİRİM VARSA TELEGRAM BİLDİRİMİ AT
if (guncelFiyat && guncelFiyat <= urun.hedefFiyat) {
const alarm = `
? <b>İNDİRİM ALARMI!</b> ?
━━━━━━━━━━━━━━━━━━━━
? <b>Ürün:</b> ${urun.isim}
? <b>Hedef:</b> ${urun.hedefFiyat} TL
? <b>FİYAT:</b> <b>${guncelFiyat} TL</b>
⏰ <b>Tarih/Saat:</b> ${new Date().toLocaleString('tr-TR')}
━━━━━━━━━━━━━━━━━━━━
? <a href="${urun.url}">Ürünü Aç</a>
`;
await telegramBildir(alarm);
}
} catch (err) {
console.error(`"${urun.isim}" hata:`, err.message);
}
await bekle(Math.floor(Math.random() * 3000) + 3000);
}
} catch (genelHata) {
console.error('Genel hata:', genelHata.message);
} finally {
if (browser) {
await browser.close();
console.log(`\nTarama tamamlandı. Sonraki kontrol ${KONTROL_PERIYODU_DAKIKA} dakika sonra.`);
}
}
}
tumListeyiKontrolEt();
setInterval(tumListeyiKontrolEt, KONTROL_PERIYODU_DAKIKA * 60 * 1000);3. Bu Log Verisiyle İleride Neler Yapılabilir?
- Fiyat Değişmediyse Log Boyutunu Koruma: İsterseniz son kaydedilen fiyat ile anlık fiyat aynıysa dosyaya tekrar yazmayıp sadece fiyat değiştiğinde satır ekletebilirsiniz.
- HTML / Chart.js ile Grafik Çizdirme: Bu JSON dosyasını okuyup tarayıcıda ürünün fiyat grafiğini çizdiren tek sayfalık mini bir HTML/JS arayüzü kurulabilir.
- Excel Çıktısı (CSV Export): Tek fonksiyonla bu JSON dosyasını Excel'in anlayacağı `.csv` formatına dönüştürüp haftalık rapor alabilirsiniz.
JSON dosyasına eklemek istediğiniz farklı alanlar (satıcı adı, stok var/yok durumu vb.) varsa sorularınızı bu başlık altından paylaşabilirsiniz!

