Rehber & Hazır Kod: Puppeteer ile Fiyat Takip Botu Yapımı
#1

Rehber & Hazır Kod: Puppeteer ile Fiyat Takip Botu Yapımı (Fiyat Düşünce Telegram'a Alarm Gönderen Senaryo)

Bir önceki konumuzda cep telefonumuza tek tıkla Telegram bildirimi atan hafif modülü kurmuştuk. Şimdi bu altyapıyı gerçek bir senaryoya bağlıyoruz: Hedef bir e-ticaret sayfasındaki ürünün fiyatını belirli aralıklarla kontrol eden ve fiyat belirlediğimiz eşiğin altına indiğinde anında cep telefonumuza bildirim fırlatan bir fiyat takip botu.

Bu senaryoda bot; sayfayı açacak, fiyat etiketini okuyacak, metindeki gereksiz simgeleri temizleyip sayıya çevirecek ve fiyat düştüyse linkiyle birlikte Telegram'a mesaj atacaktır.



1. Gerekli Kütüphaneler

Boş bir klasör oluşturup terminal (CMD) üzerinden şu iki paketi kurun:

Kod:
npm install puppeteer axios



2. Hazır ve Çalışan Tam Kod (fiyat_takip.js)

Klasörünüzde fiyat_takip.js dosyası oluşturun ve aşağıdaki kodları yapıştırın. BOT_TOKEN ve CHAT_ID alanlarına kendi bilgilerinizi girin:

Kod:
const puppeteer = require('puppeteer'); const axios = require('axios'); // --- AYARLAR --- const TELEGRAM_BOT_TOKEN = 'BURAYA_BOT_TOKEN'; const TELEGRAM_CHAT_ID = 'BURAYA_CHAT_ID'; // Takip edilecek ürün bilgileri const URUN_URL = 'https://www.hepsiburada.com/ornek-urun-linki-p-HBV00000XXXXX'; const HEDEF_FIYAT = 15000; // Bu fiyatın altına düşerse bildirim gelir (TL) const KONTROL_PERIYODU_DAKIKA = 30; // Kaç dakikada bir kontrol edilsin? /** * Telegram'a HTML formatlı mesaj gönderir */ 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',       disable_web_page_preview: false     });     console.log(' Telegram bildirimi gönderildi!');   } catch (err) {     console.error('Telegram gönderim hatası:', err.message);   } } /** * Sayfadaki fiyat metnini (örn: "14.499,90 TL") saf sayıya (14499.90) dönüştürür */ function fiyatiSayiyaCevir(fiyatMetni) {   if (!fiyatMetni) return null;   // Boşlukları, TL simgesini ve noktaları temizle, virgülü noktaya çevir   const temiz = fiyatMetni     .replace(/[^\d,\.]/g, '')     .replace(/\./g, '')     .replace(',', '.');   return parseFloat(temiz); } /** * Puppeteer ile sayfayı ziyaret edip güncel fiyatı çeken ana fonksiyon */ async function fiyatiKontrolEt() {   console.log(`[${new Date().toLocaleTimeString('tr-TR')}] Fiyat kontrol ediliyor...`);     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();     // Gerçekçi masaüstü User-Agent tanımlayarak bot tespitini azaltın     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');     // Hız kazanmak ve RAM tüketmemek için gereksiz resim ve fontları engelleyin     await page.setRequestInterception(true);     page.on('request', (req) => {       if (['image', 'font', 'media'].includes(req.resourceType())) {         req.abort();       } else {         req.continue();       }     });     await page.goto(URUN_URL, { waitUntil: 'domcontentloaded', timeout: 35000 });     // Sayfadaki fiyat ve ürün başlığı seçicileri (Selector)     // NOT: İncele (Inspect) diyerek hedef sitenin etiket sınıfını buraya yazın     const veri = await page.evaluate(() => {       const baslik = document.querySelector('h1')?.innerText?.trim() || 'Ürün Başlığı Bulunamadı';             // Çoğu e-ticaret sitesinde fiyat içeren yaygın selector kalıpları       const fiyatElemani = document.querySelector('[data-test-id="price-current-price"]') ||                           document.querySelector('.price') ||                           document.querySelector('.product-price');                                 const fiyatHam = fiyatElemani ? fiyatElemani.innerText.trim() : null;       return { baslik, fiyatHam };     });     if (!veri.fiyatHam) {       console.log(' Fiyat etiketi sayfada bulunamadı! Selector değişmiş olabilir.');       return;     }     const guncelFiyat = fiyatiSayiyaCevir(veri.fiyatHam);     console.log(`Ürün: ${veri.baslik}`);     console.log(`Güncel Fiyat: ${guncelFiyat} TL | Hedef: ${HEDEF_FIYAT} TL`);     // FİYAT DÜŞTÜ MÜ KONTROLÜ     if (guncelFiyat && guncelFiyat <= HEDEF_FIYAT) {       const alarmMesaji = ` ? <b>İNDİRİM ALARMI! FİYAT DÜŞTÜ</b> ? ━━━━━━━━━━━━━━━━━━━━ ? <b>Ürün:</b> ${veri.baslik} ? <b>Eski / Hedef Fiyat:</b> ${HEDEF_FIYAT} TL ? <b>GÜNCEL FİYAT:</b> <b>${guncelFiyat} TL</b> ⏰ <b>Zaman:</b> ${new Date().toLocaleTimeString('tr-TR')} ━━━━━━━━━━━━━━━━━━━━ ? <a href="${URUN_URL}">Ürüne Gitmek İçin Hemen Tıklayın</a>       `;       await telegramBildir(alarmMesaji);     } else {       console.log(' Fiyat henüz hedef seviyeye düşmedi.');     }   } catch (hata) {     console.error('Bot çalışma hatası:', hata.message);   } finally {     if (browser) {       await browser.close();     }   } } // Botu hemen bir kez çalıştır fiyatiKontrolEt(); // Belirlenen dakika aralığıyla döngüye sok setInterval(fiyatiKontrolEt, KONTROL_PERIYODU_DAKIKA * 60 * 1000);



3. Hedef Sitenin Fiyat Selector'ı Nasıl Bulunur?

Her sitenin fiyat alanı farklıdır. Kendi takip etmek istediğiniz sitede doğru yeri yakalamak için:
  1. Ürün sayfasına gidin, fiyatın üzerine Sağ Tık > İncele (Inspect) deyin.
  2. Açılan kod penceresinde fiyatı barındıran etiketin class veya id değerine bakın (Örn: class="price-value").
  3. Koddaki document.querySelector('.price') alanına o sınıfı yazmanız yeterlidir.



4. Arka Planda 7/24 Kesintisiz Çalıştırma (PM2 Taktigi)

Terminali kapattığınızda botun durmasını istemiyorsanız, küresel olarak PM2 sürec yöneticisini kurup botu arka plana atabilirsiniz:

Kod:
npm install -g pm2 pm2 start fiyat_takip.js --name "fiyat-botu"

Artık bilgisayarınız veya sunucunuz açık olduğu sürece terminal penceresi kapalı olsa bile bot sessizce 30 dakikada bir kontrolü yapar, fiyat düştüğü anda telefonunuzu çaldırır.

Alıntı:Geliştirme Önerisi: Birden fazla ürünü takip etmek isterseniz kodun başındaki URUN_URL alanını bir dizi (array) haline getirip sırayla tüm linkleri döngüyle gezdirebilirsiniz.

Takip etmek istediğiniz sitede fiyatı yakalayamadığınız veya selector seçemediğiniz durumlar olursa sayfa linkini bu başlık altından paylaşın, birlikte bakalım!
Bul
Cevapla


Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi