C# İle Özel Bir Fiyat Takip Ve Bildirim Botu Nasıl Yapılır?

C# İle Özel Bir Fiyat Takip Ve Bildirim Botu Nasıl Yapılır?
C# İle Özel Bir Fiyat Takip Ve Bildirim Botu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projemize başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarına göre aşağıdaki araçların kurulu olması gerekmektedir:

  • Visual Studio 2022 (veya üzeri) veya VS Code.
  • .NET 9 SDK: Modern asenkron özellikler ve performans iyileştirmeleri için gereklidir.
  • HtmlAgilityPack: Web sayfalarındaki HTML dokümanlarını kolayca ayrıştırmak için kullanılan endüstri standardı kütüphane.
  • MailKit: Bildirimleri e-posta yoluyla göndermek için kullanılan güvenilir bir kütüphane.

Projenizi oluşturmak için terminalinizi açın ve şu komutları sırasıyla çalıştırın:

dotnet new console -n FiyatTakipBotu
cd FiyatTakipBotu
dotnet add package HtmlAgilityPack
dotnet add package MailKit

Adım 1: Hedef Web Sitesinden Veri Çekme

Fiyat takip botunun ilk adımı, hedef ürünün bulunduğu sayfadaki HTML içeriğini çekmektir. Bu işlem için HttpClient sınıfını kullanacağız. Ancak, birçok web sitesi botları engellemek için "User-Agent" kontrolü yapar. Bu nedenle, isteğimizi bir tarayıcıdan geliyormuş gibi göstermeliyiz.

using System.Net.Http;

public async Task GetHtmlContent(string url)
{
    using var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
    return await httpClient.GetStringAsync(url);
}

Yukarıdaki kod, belirtilen URL'ye bir GET isteği gönderir ve sayfa içeriğini string olarak döndürür. User-Agent başlığını eklemek, çoğu basit güvenlik duvarını aşmanıza yardımcı olur.

Adım 2: Fiyat Bilgisini HTML İçerisinden Ayıklama

Sayfayı indirdikten sonra, fiyatın bulunduğu HTML etiketini bulmamız gerekir. HtmlAgilityPack kullanarak, XPath veya CSS seçicileri ile fiyatı çekebiliriz. Bu örnekte, ürün fiyatının içerisinde olduğunu varsayıyoruz.

using HtmlAgilityPack;

public decimal GetPrice(string html)
{
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var priceNode = doc.DocumentNode.SelectSingleNode("//span[@class='price']");
    string priceText = priceNode.InnerText.Trim().Replace("TL", "").Replace(".", "").Replace(",", ".");
    return decimal.Parse(priceText);
}

Burada, gelen metin içerisindeki para birimi sembollerini ve format karakterlerini temizleyerek decimal veri tipine dönüştürüyoruz. Bu dönüşüm, sayısal karşılaştırmalar yapabilmemiz için zorunludur.

Adım 3: Fiyat Takip Mantığı ve Karşılaştırma

Botumuzun en önemli parçası, mevcut fiyat ile hedef fiyatı karşılaştıran mantıktır. Bu mantığı bir döngü içerisinde veya zamanlanmış bir görev (Task Scheduler) olarak çalıştırabiliriz.

public void CheckPrice(decimal currentPrice, decimal targetPrice)
{
    if (currentPrice


Adım 4: Telegram Üzerinden Bildirim Gönderme

Fiyat hedefine ulaşıldığında kullanıcıyı bilgilendirmek için en pratik yöntem bir Telegram botu kullanmaktır. Telegram Bot API, HTTP istekleri ile kolayca yönetilebilir. Öncelikle BotFather üzerinden bir token almalı ve botunuzu bir kanala veya kendi sohbetinize eklemelisiniz.

C# tarafında HttpClient kullanarak bildirim gönderme işlemini şu şekilde gerçekleştirebiliriz:

public async Task SendTelegramNotification(string message, string botToken, string chatId)
{
    using (var client = new HttpClient())
    {
        string url = $"https://api.telegram.org/bot{botToken}/sendMessage?chat_id={chatId}&text={Uri.EscapeDataString(message)}";
        var response = await client.GetAsync(url);
        if (response.IsSuccessStatusCode)
        {
            Console.WriteLine("Bildirim başarıyla gönderildi.");
        }
    }
}

Adım 5: Hata Ayıklama ve Dayanıklılık (Resilience)

Web scraping işlemleri, hedef sitenin yapısının değişmesi veya ağ kesintileri nedeniyle sıkça hata verebilir. Botunuzun çökmemesi için try-catch blokları ve hata yönetimi stratejileri kullanmalısınız. Özellikle HtmlNode nesnesinin null dönme ihtimaline karşı kontroller eklemek kritik öneme sahiptir.

public decimal? GetPriceSafely(string html)
{
    try 
    {
        var doc = new HtmlDocument();
        doc.LoadHtml(html);
        var priceNode = doc.DocumentNode.SelectSingleNode("//span[@class='price']");
        
        if (priceNode == null) return null;

        string priceText = priceNode.InnerText.Trim().Replace("TL", "").Replace(".", "").Replace(",", ".");
        return decimal.Parse(priceText);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Hata oluştu: {ex.Message}");
        return null;
    }
}

Performans ve İleri İpuçları

  • User-Agent Kullanımı: Bazı siteler botları engellemek için tarayıcı bilgisi (User-Agent) kontrolü yapar. HttpClient isteğinize mutlaka bir User-Agent başlığı ekleyin.
  • Zamanlama: Botunuzu sürekli çalıştırmak yerine Task.Delay veya System.Timers.Timer kullanarak belirli aralıklarla (örneğin saatte bir) çalışacak şekilde yapılandırın.
  • Proxy Kullanımı: Çok sık istek atıyorsanız IP adresinizin engellenmemesi için proxy servislerini kullanmayı değerlendirin.

Aşağıdaki örnek, botun belirli bir süre uyumasını ve tekrar kontrol etmesini sağlayan basit bir döngü yapısını gösterir:

public async Task StartMonitoring(string url, decimal targetPrice)
{
    while (true)
    {
        var html = await DownloadHtml(url);
        var currentPrice = GetPriceSafely(html);

        if (currentPrice.HasValue && currentPrice                
Bu yazıya tepkinizi paylaşın:
Emre Çelik

Eğitici içerik tasarımı ve yapılandırılmış metin oluşturma konusunda deneyimliyim. Kullanıcıların doğrudan sonuca ulaşmasını sağlayan net ve yalın bir anlatım tarzım var.

Yorumlar (0)

Yorum Yaz