Son Yazılanlar

Forum İstatistikleri
  • Toplam Yorumlar73
  • Toplam Konular44
  • Toplam Üyeler11
  • Son ÜyeBotDev


Yazar: admin
10-17-2026, 11:43 AM
Forum: Hazir Script & Kod Bankasi
- Yorum Yok

Optimizasyon: Fiyat Değişmediğinde JSON Logunu Şişirmeme (Delta Loglama Yöntemi)

Fiyat takip botları 7/24 çalışırken (örneğin 30 dakikada bir kontrol yaparken), fiyat haftalarca aynı kalabilir. Her kontrolde JSON dosyasına aynı fiyatı yazmak iki büyük soruna yol açar:

  1. Gereksiz Dosya Boyutu: 10 ürün için günde yüzlerce tekrarlanan satır oluşur ve JSON dosyası megabaytlarca şişer.
  2. Grafik ve Analiz Kirliliği: İleride fiyat grafiği çizdirmek istediğinizde aynı fiyatın binlerce kopyası grafiği anlamsız şekilde uzatır.

Bunun çözümü Delta Loglama (Sadece Değişimleri Kaydetme) mantığıdır: Bot yeni fiyatı aldığında dosyadaki en son kayıtlı fiyata bakar; fiyat kuruşu kuruşuna aynıysa dosyaya dokunmaz, yalnızca fiyat değişmişse (artmış veya azalmışsa) arşive yeni bir satır ekler.



1. Optimize Edilmiş `fiyatKaydet()` Fonksiyonu

Mevcut scriptinizdeki `fiyatKaydet` fonksiyonunu aşağıdaki mantıkla güncelleyin:

Kod:
/** * Yalnızca fiyat değiştiğinde JSON dosyasına log atan optimize fonksiyon */ function fiyatKaydet(urunAdi, guncelFiyat) {   let gecmisVeri = {};   // 1. Mevcut JSON dosyasını oku   if (fs.existsSync(LOG_DOSYASI)) {     try {       const hamIcerik = fs.readFileSync(LOG_DOSYASI, 'utf8');       gecmisVeri = hamIcerik ? JSON.parse(hamIcerik) : {};     } catch (e) {       gecmisVeri = {};     }   }   // 2. Bu ürünün geçmiş kayıt listesini al (yoksa boş dizi aç)   if (!gecmisVeri[urunAdi]) {     gecmisVeri[urunAdi] = [];   }   const urunKayitlari = gecmisVeri[urunAdi];   // 3. KONTROL: Ürünün son kayıtlı fiyatına bak   if (urunKayitlari.length > 0) {     const sonKayit = urunKayitlari[urunKayitlari.length - 1];         // Fiyat değişmemişse diske yazma işlemini pas geç     if (sonKayit.fiyat === guncelFiyat) {       console.log(`ℹ️ [Fiyat Sabit] ${urunAdi} hala ${guncelFiyat} TL (Log atlanıyor).`);       return false; // Değişim olmadığını bildirmek için false döner     }     // Fiyat değiştiyse konsola ne kadar değiştiğini yazdır     const fark = (guncelFiyat - sonKayit.fiyat).toFixed(2);     const durum = fark > 0 ? `+${fark} TL (Zam)` : `${fark} TL (İndirim)`;     console.log(`? [Fiyat Değişti] ${urunAdi}: ${sonKayit.fiyat} TL ➔ ${guncelFiyat} TL (${durum})`);   } else {     // Ürün dosyaya ilk defa ekleniyorsa     console.log(`? [İlk Kayıt] ${urunAdi} sisteme eklendi: ${guncelFiyat} TL`);   }   // 4. Yeni kaydı oluştur ve arşive ekle   const simdi = new Date();   const yeniKayit = {     tarih: simdi.toLocaleDateString('tr-TR'),     saat: simdi.toLocaleTimeString('tr-TR'),     fiyat: guncelFiyat   };   urunKayitlari.push(yeniKayit);   // 5. Dosyaya yaz   fs.writeFileSync(LOG_DOSYASI, JSON.stringify(gecmisVeri, null, 2), 'utf8');   return true; // Değişim olduğunu bildirmek için true döner }



2. Elde Ettiğimiz Avantajlar
  • %95 Disk Tasarrufu: Fiyatı 1 ay boyunca değişmeyen bir ürün için 1440 satır yerine sadece 1 satır veri saklarsınız.
  • SSD/Disk Ömrü: Her 30 dakikada bir diske sürekli I/O (yazma) işlemi yapılmaz, sadece piyasa oynadığında diske yazılır.
  • Net Fiyat Eğrisi: Grafiğe veya Excel'e aktardığınızda her satır gerçek bir piyasa hareketini (zam veya indirim anını) temsil eder.

Alıntı:İpucu: Bu fonksiyondan dönen `true` veya `false` değerini kullanarak; sadece fiyat gerçekten değiştiğinde Telegram'a "X ürününün fiyatı güncellendi!" şeklinde bilgilendirme mesajı da attırabilirsiniz.

Bu konuyu yazdır


Yazar: admin
10-17-2026, 11:39 AM
Forum: Fiyat ve Stok Takip Botlari
- Yorum Yok

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:

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!

Bu konuyu yazdır


Yazar: admin
10-17-2026, 11:37 AM
Forum: Fiyat ve Stok Takip Botlari
- Yorum Yok

Hazır Kod: Çoklu Ürün Fiyat Takip Botu (10+ Farklı Ürünü Sırayla Gezen Dizi Mimarisi)

Önceki rehberimizde tek bir ürün linkini kontrol eden yapıyı kurmuştuk. Ancak gerçek hayatta takip etmek istediğimiz birden fazla ürün (ekran kartı, monitör, kahve makinesi, telefon vb.) olur.

Her ürün için ayrı bir script çalıştırmak RAM'i tüketir. Doğru mühendislik yaklaşımı: Tüm ürünleri ve hedef fiyatlarını bir dizi (Array) içinde tanımlamak, tek bir tarayıcı açıp ürünleri sırayla gezmek ve işlem bitince tarayıcıyı kapatmaktır.

Bu rehberde siteler tarafından engellenmemek (IP ban yememek) için aralara rastgele gecikmeler koyan çoklu takip mimarisini paylaşıyorum.



1. Çalışan Tam Kod (coklu_fiyat_takip.js)

Klasörünüzde coklu_fiyat_takip.js dosyası oluşturup aşağıdaki kodları yapıştırın:

Kod:
const puppeteer = require('puppeteer'); const axios = require('axios'); // --- TELEGRAM AYARLARI --- const TELEGRAM_BOT_TOKEN = 'BURAYA_BOT_TOKEN'; const TELEGRAM_CHAT_ID = 'BURAYA_CHAT_ID'; // Kaç dakikada bir tüm liste baştan kontrol edilsin? const KONTROL_PERIYODU_DAKIKA = 45; // --- TAKİP EDİLECEK ÜRÜNLER LİSTESİ --- // Her ürünün adını, linkini, hedef fiyatını ve sitenin fiyat etiketini (selector) buraya ekleyin 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'   },   {     isim: 'Philips Airfryer XXL',     url: 'https://www.ornek-site.com/philips-airfryer-xxl-p-55443',     hedefFiyat: 5200,     selector: '.price, .product-price-current'   },   {     isim: 'Sony WH-1000XM5 Kulaklık',     url: 'https://www.ornek-site.com/sony-wh1000xm5-p-99881',     hedefFiyat: 11500,     selector: '.price'   } ]; // İnsansı rastgele bekleme fonksiyonu (ms) 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',       disable_web_page_preview: false     });   } 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); } /** * Tüm ürünleri tek bir tarayıcı oturumunda sırayla gezen ana döngü */ async function tumListeyiKontrolEt() {   console.log(`\n==================================================`);   console.log(`[${new Date().toLocaleTimeString('tr-TR')}] Toplam ${URUNLER.length} ürün taranıyor...`);   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');     // Resimleri ve gereksiz medya isteklerini engelleyerek hızı 4 katına çıkarın     await page.setRequestInterception(true);     page.on('request', (req) => {       if (['image', 'font', 'media'].includes(req.resourceType())) {         req.abort();       } else {         req.continue();       }     });     // Ürünleri sırayla gez     for (let i = 0; i < URUNLER.length; i++) {       const urun = URUNLER[i];       console.log(`\n[${i + 1}/${URUNLER.length}] İnceleniyor: ${urun.isim}`);       try {         await page.goto(urun.url, { waitUntil: 'domcontentloaded', timeout: 35000 });         // Sayfadaki fiyat bilgisini oku         const cekilenFiyatMetni = await page.evaluate((secici) => {           const eleman = document.querySelector(secici);           return eleman ? eleman.innerText.trim() : null;         }, urun.selector);         if (!cekilenFiyatMetni) {           console.log(`⚠️ Fiyat etiketi bulunamadı! Sayfa yapısı değişmiş veya bot engeli olabilir.`);           continue;         }         const guncelFiyat = fiyatiSayiyaCevir(cekilenFiyatMetni);         console.log(`Güncel: ${guncelFiyat} TL | Hedef: ${urun.hedefFiyat} TL`);         // Hedef fiyat kontrolü         if (guncelFiyat && guncelFiyat <= urun.hedefFiyat) {           console.log(`? İNDİRİM YAKALANDI! Telegram'a gönderiliyor...`);                     const alarm = ` ? <b>İNDİRİM YAKALANDI!</b> ? ━━━━━━━━━━━━━━━━━━━━ ? <b>Ürün:</b> ${urun.isim} ? <b>Hedef Fiyat:</b> ${urun.hedefFiyat} TL ? <b>GÜNCEL FİYAT:</b> <b>${guncelFiyat} TL</b> ⏰ <b>Saat:</b> ${new Date().toLocaleTimeString('tr-TR')} ━━━━━━━━━━━━━━━━━━━━ ? <a href="${urun.url}">Hemen Ürüne Git</a>           `;           await telegramBildir(alarm);         } else {           console.log(`Fiyat henüz istenen seviyede değil.`);         }       } catch (urunHatasi) {         console.error(`"${urun.isim}" kontrol edilirken hata:`, urunHatasi.message);       }       // Sitenin bot olduğumuzu anlamaması için iki ürün arasında 3-6 saniye rastgele bekle       const beklemeSuresi = Math.floor(Math.random() * 3000) + 3000;       await bekle(beklemeSuresi);     }   } catch (genelHata) {     console.error('Genel tarama hatası:', genelHata.message);   } finally {     if (browser) {       await browser.close();       console.log(`\nTarama tamamlandı, tarayıcı kapatıldı. Bir sonraki kontrol ${KONTROL_PERIYODU_DAKIKA} dakika sonra.`);     }   } } // İlk çalıştırma tumListeyiKontrolEt(); // Belirlenen periyotta sürekli çalış setInterval(tumListeyiKontrolEt, KONTROL_PERIYODU_DAKIKA * 60 * 1000);



2. Neden Bu Yapıyı Kullanmalıyız?
  • Tek Tarayıcı Örneği (Zero Leak): 10 ürün için 10 ayrı tarayıcı açılmaz. Tek bir Chromium sayfası kullanılır ve liste bitince süreç tamamen kapatılarak RAM belleğe geri verilir.
  • İnsansı Gecikme (Random Delay): Döngü içinde her ürün arasında rastgele 3 ile 6 saniye beklenir (bekle(beklemeSuresi)). Bu sayede pazar yeri siteleri ardı ardına makine gibi istek aldıklarını fark edip IP adresinizi bloklamaz.
  • Kolayca Genişletilebilir: İleride 50 ürün eklemek isterseniz sadece URUNLER dizisine yeni bir süslü parantez `{ ... }` bloğu eklemeniz yeterlidir.

Kendi listenizdeki ürünleri denerken takıldığınız bir selector veya site olursa linki paylaşın, seçici kodunu birlikte çıkaralım!

Bu konuyu yazdır


Yazar: admin
10-17-2026, 11:35 AM
Forum: Fiyat ve Stok Takip Botlari
- Yorum Yok

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!

Bu konuyu yazdır


Yazar: admin
10-17-2026, 11:32 AM
Forum: Telegram & Discord Bildirim Botlari
- Yorum Yok

Hazır Script: Node.js ile 3 Dakikada Cep Telefonunuza Telegram Bildirim Botu Kurun (Tek Tıkla Çalışır)

Otomasyon projelerinde (fiyat takibi, bilet yakalama, sunucu kontrolü veya dosya indirme) en büyük ihtiyaç, işlem bittiğinde veya kritik bir olay yaşandığında anında haberdar olmaktır. Bilgisayar başında saatlerce ekran beklemek yerine, sistemin doğrudan cep telefonunuza Telegram üzerinden bildirim göndermesi en pratik çözümdür.

Bu rehberde sıfırdan Telegram botu açıp, sadece 15 satırlık hafif bir Node.js koduyla telefonunuza nasıl anlık alarm/bildirim göndereceğinizi adım adım paylaşıyorum.



Adım 1: 1 Dakikada Telegram Botu ve Chat ID Alma

  1. Telegram arama kutusuna @BotFather yazın ve resmi onaylı bota girin.
  2. /newbot komutunu gönderin.
  3. Botunuz için bir isim (Örn: Benim Alarm Botum) ve ardından sonu "bot" ile biten bir kullanıcı adı (Örn: otomasyon_alarm_bot) belirleyin.
  4. BotFather size HTTP API Token verecektir. Bu token anahtarınızı bir yere not edin (Örn: 712345678:AAH...).
  5. Arama kutusuna az önce açtığınız botun adını yazın ve bota girip /start butonuna basın (Mesaj atabilmesi için bu şarttır).
  6. Kendi kullanıcı ID numaranızı öğrenmek için Telegram'da @userinfobot hesabını aratıp /start deyin; size Id numaranızı (Örn: 123456789) verecektir.



Adım 2: Gerekli Tek Kütüphaneyi Kurun

Bilgisayarınızda veya sunucunuzda boş bir klasör açın, terminali (CMD) açıp şu hafif kütüphaneyi yükleyin:

Kod:
npm install axios



Adım 3: Çalışan Hazır Kod (telegram_alarm.js)

Klasörünüzde telegram_alarm.js adında bir dosya oluşturun ve aşağıdaki kodları yapıştırın. BOT_TOKEN ve CHAT_ID alanlarına 1. Adımda aldığınız bilgileri yazın:

Kod:
const axios = require('axios'); // 1. Adımda aldığınız bilgileri buraya girin const BOT_TOKEN = 'BURAYA_BOT_TOKEN_GELECEK'; const CHAT_ID = 'BURAYA_CHAT_ID_GELECEK'; /** * Telegram'a formatlı mesaj gönderen pratik fonksiyon * @param {string} mesaj - Gönderilecek metin (HTML etiketleri destekler) */ async function bildirimGonder(mesaj) {   const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`;   try {     const response = await axios.post(url, {       chat_id: CHAT_ID,       text: mesaj,       parse_mode: 'HTML' // Kalın, italik ve link desteği için     });     if (response.data.ok) {       console.log('Bildirim telefona başarıyla iletildi!');     }   } catch (error) {     console.error('Telegram hatası:', error.response ? error.response.data.description : error.message);   } } // TEST KULLANIMI: const testMesaji = ` ? <b>Otomasyon Alarmı!</b> ━━━━━━━━━━━━━━━━━━ ? <b>Ürün:</b> Takip Edilen Ekran Kartı ? <b>Fiyat:</b> 14.500 TL (Hedef Fiyatın Altına Düştü!) ⏱ <b>Zaman:</b> ${new Date().toLocaleTimeString('tr-TR')} ? <a href="https://example.com">Ürüne Gitmek İçin Tıklayın</a> `; bildirimGonder(testMesaji);



Adım 4: Tek Tıkla Çalıştırma (Masaüstü Kısayolu)

Her seferinde terminal açmakla uğraşmak istemiyorsanız, aynı klasörün içine calistir.bat adında bir metin dosyası açıp içine şu tek satırı yazın:

Kod:
node telegram_alarm.js pause

Artık bu .bat dosyasına çift tıkladığınız an arka planda komut çalışır ve saniyesinde telefonunuza bildirim sesiyle birlikte mesajınız düşer.

Alıntı:Nerede Kullanabilirsiniz?
Bu fonksiyonu yazdığınız herhangi bir scraping (fiyat/stok) botunun içine, Puppeteer senaryolarının sonuna veya sunucunuzdaki yedekleme scriptlerinin bitişine ekleyerek tüm süreçleri cebinizden anlık izleyebilirsiniz.

Takıldığınız veya Telegram API'sinden hata aldığınız bir adım olursa chat ID veya token bilgilerinizi gizleyerek bu başlık altından sorabilirsiniz!

Bu konuyu yazdır