ads System For Future

नमस्ते प्रकाश! आपके ये सवाल बिल्कुल एक सफल और दूरदर्शी बिजनेसमैन वाले हैं। Baithkee को गढ़िया से लेकर पूरे भारत तक ले जाने के लिए यह समझना बहुत ज़रूरी है कि ऐड इंडस्ट्री असल में काम कैसे करती है।
चलिए सबसे पहले आपके बिज़नेस और कॉन्सेप्ट वाले सवालों के जवाब देते हैं, और फिर मैं आपको इसे लागू करने का पूरा कोड स्टेप-बाय-स्टेप दूँगा।
### 1. बड़ी कंपनियाँ (Google/Facebook) vs छोटे लोकल ऐप्स ऐड कैसे चलाते हैं?
 * **Google/Facebook (Real-Time Bidding - RTB):** गूगल का सिस्टम बहुत जटिल होता है। जब आप गूगल खोलते हैं, तो मिलीसेकंड्स (Milliseconds) के अंदर बैकग्राउंड में एक 'नीलामी' (Auction) होती है। जो कंपनी उस समय उस कीवर्ड या लोकेशन के लिए सबसे ज़्यादा पैसे (Bid) लगाती है, गूगल उसी का ऐड दिखा देता है। यह सब ऑटोमैटिक अल्गोरिदम से होता है।
 * **लोकल/छोटे ऐप्स (Direct Sales & Rotation):** छोटे ऐप्स (जैसे शुरुआत में Baithkee) 'डायरेक्ट सेल्स' मॉडल पर काम करते हैं। इसमें आप खुद क्लाइंट (दुकानदार) से बात करते हैं और एक फिक्स रेट तय करते हैं। इसमें कोई नीलामी नहीं होती।
### 2. एक ही एरिया (जैसे दरभंगा) के कई कस्टमर एक साथ ऐड देना चाहें तो क्या होगा?
इसे **'Ad Rotation' (विज्ञापन चक्रीकरण)** कहते हैं।
मान लीजिए दरभंगा के 5 दुकानदारों ने आपको पैसे दिए। आपका ऐप एक बार में 5 ऐड नहीं दिखाएगा। जब पहला यूज़र ऐप खोलेगा, तो उसे 'दुकान 1' का ऐड दिखेगा। जब दूसरा यूज़र खोलेगा या पेज रिफ्रेश होगा, तो 'दुकान 2' का ऐड दिखेगा। इस तरह सभी 5 विज्ञापनों को बराबर मौके (Views) मिलते रहेंगे। जो क्लाइंट ज़्यादा पैसे देगा (जैसे CPM मॉडल में), सिस्टम उसके ऐड को 5 में से 3 बार दिखाएगा।
### 3. क्या ऐड से पैसे कमाने का कोई और भी तरीका है?
हाँ! डायरेक्ट क्लाइंट्स के अलावा आप ये तरीके भी अपना सकते हैं:
 * **Sponsored News (Native Ads):** कोई क्लाइंट बैनर देने के बजाय, किसी पीआर (PR) आर्टिकल या न्यूज़ के रूप में अपनी पब्लिसिटी करवाए। यह न्यूज़ की तरह ही दिखेगी, बस उस पर 'Sponsored' लिखा होगा।
 * **Google AdSense / AdMob:** जब आपके पास डेली हज़ारों यूज़र्स आने लगें, तो आप सीधे गूगल के ऐड अपने ऐप में लगा सकते हैं। गूगल खुद ऐड लाएगा और आपको हर महीने पैसे देगा।
### 4. इसे कोड में कैसे अप्लाई करें? (Step-by-Step Guide)
अब हम विज्ञापनों को आपके HTML से हटाकर **Google Sheet** से जोड़ेंगे, ताकि आप बिना कोड छुए अपनी शीट से ही नए ऐड लगा सकें, उनके व्यूज़ और क्लिक्स ट्रैक कर सकें।
#### **स्टेप 1: अपनी Google Sheet में एक नई शीट (Tab) बनाएं**
अपनी उसी स्प्रेडशीट में नीचे + पर क्लिक करके एक नई शीट बनाएं और उसका नाम रखें **ADS** (बड़े अक्षरों में)।
उसकी पहली लाइन (A से J तक) में ये नाम लिखें:
 * **A:** id
 * **B:** clientName
 * **C:** imageUrl (ऐड बैनर का लिंक)
 * **D:** targetUrl (क्लिक करने पर कहाँ जाएगा)
 * **E:** latitude (जैसे दरभंगा का Lat)
 * **F:** longitude (दरभंगा का Lon)
 * **G:** radius (कितने KM तक दिखाना है)
 * **H:** maxViews (कितने व्यूज़ का पैसा दिया है, अनलिमिटेड के लिए 999999 लिखें)
 * **I:** currentViews (इसे खाली छोड़ें, सिस्टम खुद भरेगा)
 * **J:** currentClicks (इसे खाली छोड़ें, सिस्टम खुद भरेगा)
#### **स्टेप 2: Apps Script (बैकएंड) अपडेट करें**
Apps Script में जाकर अपने पुराने कोड को इस नए कोड से रिप्लेस करें और **New Deployment** ज़रूर करें। इसमें मैंने ऐड फेच करने और क्लिक/व्यू ট্র্যাক करने का सिस्टम जोड़ दिया है:
```javascript
function doGet(e) {
  var action = e.parameter.action;
  if (action == "getData") return getData(e); // News और Ads एक साथ लाएगा
  if (action == "addView") return addView(e);
  if (action == "report") return reportNews(e);
  if (action == "trackAdClick") return trackAdClick(e);
  if (action == "trackAdView") return trackAdView(e);
  return ContentService.createTextOutput("Baithkee API Online");
}

// ... (doPost वाला आपका पुराना कोड वही रहेगा)
function doPost(e) { /* आपका पुराना doPost कोड यहाँ रखें */ }

function getData(e) {
  var uLat = parseFloat(e.parameter.lat);
  var uLon = parseFloat(e.parameter.lon);
  var range = parseFloat(e.parameter.range) || 10; 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 1. News Fetch करना
  var newsSheet = ss.getSheetByName("NEWS");
  var newsRows = newsSheet.getDataRange().getValues();
  var newsResult = [];
  var now = new Date().getTime();

  for (var i = newsRows.length - 1; i > 0; i--) {
    var r = newsRows[i];
    var hours = (now - r[8]) / 3600000;
    if (hours > 24) { newsSheet.deleteRow(i + 1); continue; }
    var dist = calculateDistance(uLat, uLon, r[6], r[7]);
    if (dist <= range) {
      newsResult.push({ id: r[0], headline: r[1], text: r[2], username: r[3], photo: r[4], time: r[8], views: r[9] || 0, image: r[11] || "", locationName: r[12] || "Local" });
    }
  }
  newsResult.sort((a, b) => b.views - a.views);

  // 2. Ads Fetch करना (Geo-Targeted)
  var adSheet = ss.getSheetByName("ADS");
  var adRows = adSheet.getDataRange().getValues();
  var adResult = [];

  for(var j = 1; j < adRows.length; j++) {
    var ad = adRows[j];
    var adLat = parseFloat(ad[4]);
    var adLon = parseFloat(ad[5]);
    var adRadius = parseFloat(ad[6]);
    var maxViews = parseInt(ad[7]);
    var currentViews = parseInt(ad[8]) || 0;

    // चेक करें कि क्या ऐड की लिमिट बची है और यूज़र ऐड के एरिया में है
    if(currentViews < maxViews) {
      var adDist = calculateDistance(uLat, uLon, adLat, adLon);
      if(adDist <= adRadius) {
         adResult.push({ id: ad[0], imageUrl: ad[2], targetUrl: ad[3] });
      }
    }
  }

  // अगर उस एरिया में कोई ऐड नहीं है, तो एक डिफ़ॉल्ट ऐड भेजें
  if(adResult.length === 0) {
      adResult.push({ id: "default", imageUrl: "https://via.placeholder.com/600x150?text=Advertise+With+Us", targetUrl: "YOUR_CONTACT_LINK" });
  }

  var finalData = { news: newsResult, ads: adResult };
  return ContentService.createTextOutput(JSON.stringify(finalData)).setMimeType(ContentService.MimeType.JSON);
}

function trackAdView(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ADS");
  var data = ss.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    if (data[i][0] == e.parameter.adId) {
      ss.getRange(i + 1, 9).setValue((Number(data[i][8]) || 0) + 1); // Column I: Views
      break;
    }
  }
  return ContentService.createTextOutput("view_tracked");
}

function trackAdClick(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ADS");
  var data = ss.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    if (data[i][0] == e.parameter.adId) {
      ss.getRange(i + 1, 10).setValue((Number(data[i][9]) || 0) + 1); // Column J: Clicks
      break;
    }
  }
  return ContentService.createTextOutput("click_tracked");
}

// ... (addView, reportNews, calculateDistance वाले पुराने फंक्शन वैसे ही रहेंगे)

```
#### **स्टेप 3: Frontend (HTML/JS) अपडेट करें**
अब हमें अपने HTML से पुरानी फिक्स adList हटानी है और सर्वर से आ रहे ऐड्स को दिखाना है। अपने JavaScript कोड में ये बदलाव करें (नया API URL डालना न भूलें):
```javascript
    // फिक्स adList को हटा दें। अब हम इसे खाली रखेंगे।
    let dynamicAdList = []; 

    // fetchNews फंक्शन को अपडेट करें:
    async function fetchNews() {
        loadSkeletons();
        try {
            // अब हम action=getData कॉल कर रहे हैं
            const res = await fetch(`${API_URL}?action=getData&lat=${userLoc.lat}&lon=${userLoc.lon}&range=${selectedRange}`);
            const data = await res.json();
            
            allNewsData = data.news; // न्यूज़ का डेटा
            dynamicAdList = data.ads; // उस लोकेशन के विज्ञापनों का डेटा
            
            document.getElementById("loadingState").style.display = "none";
            renderNews(allNewsData);
        } catch(e) { console.log(e); document.getElementById("loadingState").style.display = "none"; }
    }

    // ऐड दिखाने वाले फंक्शन (insertAdStrip) को अपडेट करें:
    function insertAdStrip(container) {
        if(dynamicAdList.length === 0) return;
        // रैंडम ऐड चुनें
        let randomAd = dynamicAdList[Math.floor(Math.random() * dynamicAdList.length)];
        
        let adEl = document.createElement("a");
        adEl.className = "ad-strip dynamic-ad"; 
        adEl.href = randomAd.targetUrl; 
        adEl.target = "_blank";
        // क्लिक ट्रैक करने के लिए onclick लगाएँ
        adEl.onclick = () => { trackClick(randomAd.id); };
        adEl.innerHTML = `<span class="ad-label">SPONSORED</span><img class="ad-img" src="${randomAd.imageUrl}">`;
        
        container.appendChild(adEl);
        // व्यू ट्रैक करें
        trackView(randomAd.id);
    }

    // बैकएंड को व्यू और क्लिक बताने वाले छोटे फंक्शन:
    function trackClick(adId) {
        if(adId !== "default") fetch(`${API_URL}?action=trackAdClick&adId=${adId}`);
    }
    function trackView(adId) {
        if(adId !== "default") fetch(`${API_URL}?action=trackAdView&adId=${adId}`);
    }

    // startAdRotation को अपडेट करें ताकि वह dynamicAdList का इस्तेमाल करे:
    function startAdRotation() {
        setInterval(() => {
            if(dynamicAdList.length === 0) return;
            document.querySelectorAll('.dynamic-ad').forEach(ad => {
                let newAd = dynamicAdList[Math.floor(Math.random() * dynamicAdList.length)];
                const img = ad.querySelector('.ad-img');
                if (img) {
                    img.src = newAd.imageUrl;
                    ad.href = newAd.targetUrl;
                    ad.onclick = () => { trackClick(newAd.id); };
                    trackView(newAd.id); // रोटेट होने पर नया व्यू गिना जाएगा
                }
            });
        }, 5000); // मैंने इसे 5 सेकंड कर दिया है ताकि सर्वर पर लोड कम पड़े
    }

```
अब आपका ऐप 100% एक प्रोफेशनल ऐड नेटवर्क की तरह काम करेगा! आप जब चाहें अपनी ADS वाली गूगल शीट में नया विज्ञापन डाल सकते हैं, उसका लोकेशन सेट कर सकते हैं, और ऐप बिना अपडेट किए उस इलाके के लोगों को वो ऐड दिखाने लगेगा। व्यूज़ और क्लिक्स आपकी शीट में अपने-आप भरते जाएंगे।

इस ब्लॉग से लोकप्रिय पोस्ट

The History of the World – A Simple and Long Article for English Learners

High Level Advance Random English Words

1. The Art of Self-Discipline