Use Cases

Açık Artırma Sitesi İzleme için CAPTCHA Kullanımı

Açık artırma platformları, reCAPTCHA v2 ile listeleme verilerini ve arama işlevselliğini korur. CAPTCHA'lar en sık hızlı arama sorguları, ayrıntılı görünümlerin listelenmesi ve teklif geçmişi aramaları sırasında görünür. Açık artırma sitelerinde güvenilir izlemeyi nasıl sürdüreceğiniz aşağıda açıklanmıştır.

CAPTCHA'ların Açık Artırma Sitelerinde Tetiklendiği Yer

Eylem CAPTCHA türü Tetikleyici desen
Arama/browse listeleri reCAPTCHA v2 Hızlı sıralı aramalar
İlan ayrıntılarını görüntüle reCAPTCHA v2 Aynı IP'den yüksek ses seviyesi
Teklif geçmişini kontrol edin reCAPTCHA v2 Tekrarlanan ayrıntı sayfası yüklemeleri
Kategori tarama Cloudflare Turnstile Bot benzeri gezinme hızı
Fiyat uyarısı sayfaları reCAPTCHA v2 Sık yenilemeler

CAPTCHA Çözme ile Açık Artırma İzleme

import requests
import time
import re
from datetime import datetime

class AuctionMonitor:
    def __init__(self, api_key):
        self.api_key = api_key
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def search_listings(self, auction_url, query, category=None):
        """Search auction listings, solving CAPTCHAs when triggered."""
        params = {"q": query}
        if category:
            params["category"] = category

        response = self.session.get(
            f"{auction_url}/search", params=params
        )

        if self._has_captcha(response.text):
            site_key = self._extract_site_key(response.text)
            token = self._solve_recaptcha(site_key, f"{auction_url}/search")
            response = self.session.post(
                f"{auction_url}/search",
                data={**params, "g-recaptcha-response": token}
            )

        return self._parse_listings(response.text)

    def monitor_listing(self, auction_url, listing_id):
        """Get current bid and listing details."""
        url = f"{auction_url}/item/{listing_id}"
        response = self.session.get(url)

        if self._has_captcha(response.text):
            site_key = self._extract_site_key(response.text)
            token = self._solve_recaptcha(site_key, url)
            response = self.session.post(url, data={
                "g-recaptcha-response": token
            })

        return self._parse_listing_detail(response.text)

    def track_bids(self, auction_url, listing_ids, interval=60):
        """Track bid changes across multiple listings."""
        history = {lid: [] for lid in listing_ids}

        while True:
            for listing_id in listing_ids:
                try:
                    detail = self.monitor_listing(auction_url, listing_id)
                    previous = history[listing_id]

                    if previous and detail["current_bid"] != previous[-1]["current_bid"]:
                        print(f"Bid change on {listing_id}: "
                              f"${previous[-1]['current_bid']} → ${detail['current_bid']}")

                    history[listing_id].append(detail)
                except Exception as e:
                    print(f"Error checking {listing_id}: {e}")

            time.sleep(interval)

    def _has_captcha(self, html):
        return "g-recaptcha" in html or "recaptcha" in html.lower()

    def _extract_site_key(self, html):
        match = re.search(r'data-sitekey="([^"]+)"', html)
        if match:
            return match.group(1)
        match = re.search(r"sitekey['\"]?\s*[:=]\s*['\"]([^'\"]+)", html)
        if match:
            return match.group(1)
        raise ValueError("Could not find reCAPTCHA site key")

    def _solve_recaptcha(self, site_key, page_url):
        resp = requests.post("https://ocr.captchaai.com/in.php", data={
            "key": self.api_key,
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": page_url,
            "json": 1
        })
        task_id = resp.json()["request"]

        for _ in range(60):
            time.sleep(3)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id,
                "json": 1
            })
            data = result.json()
            if data["status"] == 1:
                return data["request"]

        raise TimeoutError("reCAPTCHA solve timed out")

    def _parse_listings(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")

        def text_or_none(node):
            return node.text.strip() if node and node.text else None

        def attr_or_none(node, attr):
            return node.get(attr) if node else None

        listings = []
        for item in soup.select(".listing-item, .auction-item"):
            listings.append({
                "title": text_or_none(item.select_one(".title")),
                "current_bid": text_or_none(item.select_one(".price, .bid")),
                "time_left": text_or_none(item.select_one(".time-left")),
                "url": attr_or_none(item.select_one("a"), "href")
            })
        return listings

    def _parse_listing_detail(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")

        def text_or_none(node):
            return node.text.strip() if node and node.text else None

        return {
            "title": text_or_none(soup.select_one("h1, .item-title")),
            "current_bid": text_or_none(soup.select_one(".current-bid, .price")),
            "bid_count": text_or_none(soup.select_one(".bid-count")),
            "time_left": text_or_none(soup.select_one(".time-remaining")),
            "checked_at": datetime.now().isoformat()
        }

# Usage
monitor = AuctionMonitor("YOUR_API_KEY")
listings = monitor.search_listings(
    "https://auctions.example.com",
    "vintage electronics",
    category="collectibles"
)

Fiyat Uyarı Sistemi (JavaScript)

class AuctionTracker {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.watchList = new Map();
  }

  addWatch(listingId, url, maxPrice) {
    this.watchList.set(listingId, { url, maxPrice, history: [] });
  }

  async checkAll() {
    const alerts = [];

    for (const [id, watch] of this.watchList) {
      try {
        const detail = await this.fetchListing(watch.url);
        watch.history.push(detail);

        const price = parseFloat(detail.currentBid.replace(/[^0-9.]/g, ''));
        if (price >= watch.maxPrice * 0.9) {
          alerts.push({
            listing: id,
            price,
            threshold: watch.maxPrice,
            message: `Price approaching limit: $${price} / $${watch.maxPrice}`
          });
        }
      } catch (error) {
        alerts.push({ listing: id, error: error.message });
      }
    }

    return alerts;
  }

  async fetchListing(url) {
    const response = await fetch(url);
    const html = await response.text();

    if (html.includes('g-recaptcha')) {
      return this.solveAndFetch(url, html);
    }

    return this.parseDetail(html);
  }

  async solveAndFetch(url, html) {
    const siteKeyMatch = html.match(/data-sitekey="([^"]+)"/);
    if (!siteKeyMatch) throw new Error('No reCAPTCHA site key found');

    const submitResp = await fetch('https://ocr.captchaai.com/in.php', {
      method: 'POST',
      body: new URLSearchParams({
        key: this.apiKey,
        method: 'userrecaptcha',
        googlekey: siteKeyMatch[1],
        pageurl: url,
        json: '1'
      })
    });

    const { request: taskId } = await submitResp.json();

    for (let i = 0; i < 60; i++) {
      await new Promise(r => setTimeout(r, 3000));
      const result = await fetch(
        `https://ocr.captchaai.com/res.php?key=${this.apiKey}&action=get&id=${taskId}&json=1`
      );
      const data = await result.json();
      if (data.status === 1) {
        // Resubmit with token
        const response = await fetch(url, {
          method: 'POST',
          body: new URLSearchParams({ 'g-recaptcha-response': data.request })
        });
        return this.parseDetail(await response.text());
      }
    }

    throw new Error('reCAPTCHA solve timed out');
  }

  parseDetail(html) {
    // Parse auction listing details from HTML
    return {
      currentBid: html.match(/current.?bid[^>]*>([^<]+)/i)?.[1]?.trim(),
      bidCount: html.match(/(\d+)\s*bids?/i)?.[1],
      timeLeft: html.match(/time.?(?:left|remaining)[^>]*>([^<]+)/i)?.[1]?.trim(),
      checkedAt: new Date().toISOString()
    };
  }
}

// Usage
const tracker = new AuctionTracker('YOUR_API_KEY');
tracker.addWatch('item-123', 'https://auctions.example.com/item/123', 500);
tracker.addWatch('item-456', 'https://auctions.example.com/item/456', 200);
const alerts = await tracker.checkAll();

İzleme Stratejisi

Frekansı kontrol edin Kullanım örneği Beklenen CAPTCHA oranı
Her 30 saniyede bir Son dakika teklifi Yüksek - proxy'leri kullanın
Her 5 dakikada bir Aktif açık artırma takibi Orta
Her 15 dakikada bir İzleme listesi izleme Düşük
Her saat Uzun vadeli fiyat araştırması Asgari

CAPTCHA Frekansını Azaltma

Teknik Etki
Oturum çerezlerini yeniden kullan Kimlik doğrulama durumunu korur
Konut vekillerini döndürün İstekleri IP'ler arasında dağıtır
İstek aralıklarını rastgele seç Periyodik algılama modellerini önler
Kimliği doğrulanmış hesapları kullanın CAPTCHA tetikleme eşiklerini düşürün

Sorun giderme

Sorun Sebep Düzeltme
Her istekte CAPTCHA Oturum kalıcılığı yok requests.Session()'yi yeniden kullanın
reCAPTCHA jetonu reddedildi Belirtecin süresi doldu (2 dakikalık kullanım ömrü) Göndermeden hemen önce çözün
Listeleme sayfasında 0 sonuç gösteriliyor CAPTCHA sessizce filtrelenmiş sonuçlar Gizli CAPTCHA öğelerini kontrol edin
Birçok CAPTCHA'dan sonra IP engellendi Oran sınırı aşıldı Proxy'leri döndürün, aralıkları artırın

SSS

Açık artırma listelerini ne kadar hızlı kontrol edebilirim?

CaptchaAI, reCAPTCHA v2'yi 10-30 saniyede çözer. Zamana duyarlı açık artırmalar için, gecikmeleri en aza indirmek için belirteçleri önceden çözün ve proxy'leri döndürün.

Açık artırma siteleri izlemeyi algılayacak mı?

Algılama, CAPTCHA çözümüne değil, istek modellerine bağlıdır. Gerçekçi aralıklar kullanın, kullanıcı aracılarını dönüşümlü kullanın ve trafiğin düşük olduğu, isteklerinizin öne çıktığı saatlerde kazımaktan kaçının.

Canlı müzayedeleri gerçek zamanlı olarak izleyebilir miyim?

Açık artırmanın son dakikalarında, CAPTCHA karşılaşmalarını en aza indirmek için önceden kimliği doğrulanmış oturumlarla tarayıcı otomasyonunu kullanın. CaptchaAI'nin hızı, hala görünen CAPTCHA'ları yönetir.

İlgili Makaleler

Sonraki Adımlar

Açık artırmaları güvenilir bir şekilde izleyin —CaptchaAI API anahtarınızı alınve reCAPTCHA v2 zorluklarını otomatik olarak çözün.

Bu makale için yorumlar devre dışı bırakılmıştır.

İlgili Yazılar

Tutorials CaptchaAI ile Rakip Analizi Kontrol Paneli Oluşturun
Captcha AI ile Rakip Analizi Kontrol Paneli Oluşturmak için doğrudan yeniden kullanılabilir örnekler ve net bir Captcha AI iş akışı içeren adım adım eğitim.

Captcha AI ile Rakip Analizi Kontrol Paneli Oluşturmak için doğrudan yeniden kullanılabilir örnekler ve net bi...

Apr 30, 2026
Use Cases CAPTCHA İşleme ile Havayolu Ücret Takibi
Gerçekçi senaryolar, iş akışı tavsiyeleri ve Captcha AI kullanılarak uygulanabilir adımlarla CAPTCHA İşleme ile Havayolu Ücret Takibi için pratik kılavuz.

Gerçekçi senaryolar, iş akışı tavsiyeleri ve Captcha AI kullanılarak uygulanabilir adımlarla CAPTCHA İşleme il...

Apr 19, 2026
Integrations CaptchaAI ile QA için tarayıcı profili izolasyonu
Staging QA testlerini temiz ve tekrarlanabilir tutmak için çerezleri, storage verilerini, test hesaplarını ve CAPTCHA yapılandırmalarını tarayıcı profiline göre...

Staging QA testlerini temiz ve tekrarlanabilir tutmak için çerezleri, storage verilerini, test hesaplarını ve...

Apr 29, 2026