"); // Blog code right column mein save hoga (Insta ke liye 'S') sheet.getRange(row, blogCodeCol).setValue(aiDescription); let postUrl = ""; const postTitle = `🔥 Buy ${rowData[5]} | ID: ${rowData[4]}`; if (sheetName === "New Channels") postUrl = publishToBlogger(postTitle, aiDescription, rowData[12], rowData); else if (sheetName === "Insta_Deals") postUrl = publishInstaToBlogger(postTitle, aiDescription, rowData[10], rowData); else if (sheetName === "FB_Deals") postUrl = publishFBToBlogger(postTitle, aiDescription, rowData[13], rowData); if (postUrl) { // ✅ Ab 100% guarantee hai ki Link sahi jagah jayega (Insta ke liye 'P') sheet.getRange(row, blogLinkCol).setValue(postUrl); sheet.getRange(row, promptCol).clearContent(); sheet.getRange(row, blogCodeCol).clearContent(); } } catch (error) { // Error bhi usi blogLinkCol mein aayega sheet.getRange(row, blogLinkCol).setValue("Error: " + error.message); } } } } // Partner Trigger if (sheetName === "Partners_DB" && col === 10) { if (value && value.toString().trim().toLowerCase() === "settled") { const walletRange = sheet.getRange(row, 8), paidRange = sheet.getRange(row, 9); const curWallet = parseFloat(walletRange.getValue()) || 0, curPaid = parseFloat(paidRange.getValue()) || 0; if (curWallet > 0) { paidRange.setValue(curPaid + curWallet); walletRange.setValue(0); } } } if (sheetName === "Leads_DB" && (col === 7 || col === 8)) { const statusValue = sheet.getRange(row, 7).getValue().toString().trim().toLowerCase(); const commission = parseFloat(sheet.getRange(row, 8).getValue()) || 0; if (statusValue === "done" && commission > 0) { const pId = sheet.getRange(row, 2).getValue().toString().trim(); if (pId) { const pSheet = e.source.getSheetByName("Partners_DB"); const pData = pSheet.getDataRange().getValues(); for (let i = 1; i < pData.length; i++) { if (pData[i][1].toString().trim() === pId) { pSheet.getRange(i + 1, 7).setValue((parseInt(pData[i][6]) || 0) + 1); pSheet.getRange(i + 1, 8).setValue((parseFloat(pData[i][7]) || 0) + commission); pSheet.getRange(i + 1, 10).setValue("Pending"); sheet.getRange(row, 7).setValue("Done ✅"); break; } } } } } } // ========================================== // 4. FULLY-AUTO SEO MACHINE // ========================================== // ========================================== // 4. FULLY-AUTO SEO MACHINE (SMART SEO SUMMARY FIX) // ========================================== function runAutoSEOManager() { const ss = SpreadsheetApp.openById(SHEET_ID); let seoSheet = ss.getSheetByName("SEO_Keywords_DB"); if (!seoSheet) return; const data = seoSheet.getDataRange().getValues(); for (let i = 1; i < data.length; i++) { let keyword = data[i][0] ? data[i][0].toString().trim() : ""; let status = data[i][1] ? data[i][1].toString().trim().toUpperCase() : ""; if (status === "PENDING" && keyword !== "") { try { // NAYA COMMAND: AI ab sabse pehle 140 character ka description likhega const prompt = `Write a highly engaging, SEO-optimized article about "${keyword}". Language: Mix of English and simple Hindi (Hinglish/Roman Hindi) so Indian audience can easily read. Format: Use proper HTML tags like
, ,
,
- ,
- .
CRITICAL SEO RULE: The very first element of the article MUST be a
tag containing a powerful 140-character SEO Meta Description summarizing the topic. Make it bold using tag. Important: At the very end of the article, add a compelling Call-to-Action (CTA) inside an attractive HTML box with background color #162438, text color white, and border-left 4px solid #f39c12. The CTA should say: "🔥 Kya aap bhi ek Safe, Monetized YouTube Channel kharidna ya apna channel bechna chahte hain? Hamari PT Seva Deals agency aapse sirf 1 WhatsApp message door hai! Aaj hi sampark karein: +91 7987744656." Output rule: Return ONLY the clean HTML code for the article body. No markdown backticks, no or tags.`; const rawText = callGroq(prompt); const cleanHtml = rawText.replace(/```html/g, "").replace(/```/g, "").trim(); // API ke liye bhi description bhejenge (Agar Google future me apna bug theek kar de) const plainText = cleanHtml.replace(/<[^>]+>/g, '').replace(/ /g, ' ').trim(); const searchDesc = plainText.length > 145 ? plainText.substring(0, 145) + "..." : plainText; publishSEOArticleToBlogger(keyword, cleanHtml, searchDesc); seoSheet.getRange(i + 1, 2).setValue("DONE ✅"); break; } catch (error) { seoSheet.getRange(i + 1, 3).setValue("Error: " + error.message); break; } } } } // ========================================== // API HELPER FUNCTIONS // ========================================== function callGroq(promptText) { const url = "https://api.groq.com/openai/v1/chat/completions"; const payload = { "model": "llama-3.3-70b-versatile", "messages": [{ "role": "user", "content": promptText }], "temperature": 0.7 }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + GROQ_API_KEY }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.choices && json.choices.length > 0) return json.choices[0].message.content; else throw new Error("Groq API Error"); } // ========================================== // 5. PREMIUM APP-STYLE BLOGGER FUNCTION (YT - 100% ORIGINAL TEMPLATE) // ========================================== function publishToBlogger(title, aiContent, label, rowData) { const channelId = rowData[4] || "N/A"; const subs = rowData[6] || "0"; const views = rowData[7] || "0"; let rawMon = (rowData[8] || "No").toString().trim().toLowerCase(); let monStatus = "Not Monetised"; if (rawMon === "yes") monStatus = "Full Monetised"; else if (rawMon === "half") monStatus = "Half Monetised"; else if (rawMon !== "no" && rawMon !== "") monStatus = rowData[8]; const earnings = rowData[9] || "$0"; const strikes = rowData[11] || "None"; const videoType = rowData[13] || "Mixed"; const img1 = rowData[14] || ""; const img2 = rowData[15] || ""; const img3 = rowData[16] || ""; const ytLink = rowData[17] || "#"; const finalHtml = `
${title} `; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const labelsArray = label ? [label.toString().trim(), "Channel Deals", "Premium"] : ["Channel Deals", "Premium"]; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": labelsArray }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error(json.error ? json.error.message : "Blogger error"); } // 🟢 NEW: PUBLISHER (INSTAGRAM) - INDEPENDENT CODE function publishInstaToBlogger(title, aiContent, label, rowData) { // Extracting Exact Columns for Insta_Deals (Updated for New Sheet Structure) const accId = rowData[4] || "N/A"; const username = rowData[5] || "N/A"; const followers = rowData[6] || "0"; const reach = rowData[7] || "0"; const storyViews = rowData[8] || "0"; const oge = rowData[9] || "No"; const category = rowData[10] || "Mixed"; // 👇 FIXED INDICES: Shifted back by 3 due to deleted columns const img1 = rowData[11] || ""; // L Column const img2 = rowData[12] || ""; // M Column const img3 = rowData[13] || ""; // N Column const igLink = rowData[14] || "#"; // O Column const finalHtml = `Earning ChannelID: ${channelId}${subs} Subs & ${monStatus} YouTube Channel For Sale!
Buy this active, earning channel (${videoType} Videos) securely.
${img1 ? `` : ''} ${img2 ? `
` : ''} ${img3 ? `
` : ''}
Channel Analytics${subs}
Subscribers
${views}
Lifetime Views
${videoType}
Video Type
${monStatus}
Status
Restrictions: ${strikes}Monetize Status: ${monStatus}Lifetime Earnings: ${earnings}Channel Info
${aiContent}
100% सुरक्षित डील
चैनल आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।
${title} `; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": ["Instagram Deals", "Premium"] }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error("Blogger Error"); } // 🟢 NEW: PUBLISHER (FACEBOOK) - INDEPENDENT & SAFE CODE function publishFBToBlogger(title, aiContent, label, rowData) { const pgId = rowData[4] || "N/A"; const pageName = rowData[5] || "N/A"; const followers = rowData[6] || "0"; const reach = rowData[7] || "0"; let monStatus = rowData[8] || "No"; const bm = rowData[9] || "No"; const qual = rowData[10] || "Mixed"; // ✅ Ab Column L (11) sirf Earning hai, Name Change hamesha ke liye hat gaya const rawEarning = (rowData[11] || "").toString().trim(); // Column L const rawWT = (rowData[12] || "").toString().trim(); // Column M const category = rowData[13] || "Mixed"; // Column N const img1 = rowData[14] || ""; const img2 = rowData[15] || ""; const img3 = rowData[16] || ""; const img4 = rowData[17] || ""; const fbLink = rowData[18] || "#"; // Custom Logic for Monetization / Earning / WT let extraStatTitle = "Earning / WT"; let extraStatValue = "N/A"; if (rawEarning !== "") { extraStatTitle = "Lifetime Earnings"; extraStatValue = rawEarning; } else if (rawWT !== "") { extraStatTitle = "Watch Time (60D)"; extraStatValue = rawWT; } const finalHtml = `Instagram AccountID: ${accId}${followers} Followers & ${category} Instagram Account For Sale!
Buy this highly active Instagram account securely with Escrow.
${img1 ? `` : ''} ${img2 ? `
` : ''} ${img3 ? `
` : ''}
Account Analytics${followers}
Followers
${reach}
Monthly Reach
${storyViews}
Story Views
${oge}
OGE Status
Account Niche: ${category}Original Email (OGE): ${oge}Profile Link: Provided on RequestAccount Info
${aiContent}
100% सुरक्षित डील
अकाउंट आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।
${title} `; const labelsArray = label ? ["Facebook Deals", "Premium", label.toString().trim()] : ["Facebook Deals", "Premium"]; const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": labelsArray }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error(json.error ? json.error.message : "Blogger Error"); } function publishSEOArticleToBlogger(title, htmlContent) { const url = "https://www.googleapis.com/blogger/v3/blogs/" + BLOG_ID + "/posts/"; const finalHtml = `Facebook PageID: ${pgId}${followers} Followers & ${qual} Quality Facebook Page For Sale!
Buy this highly active Facebook Page securely with Escrow.
${img1 ? `` : ''} ${img2 ? `
` : ''} ${img3 ? `
` : ''} ${img4 ? `
` : ''}
Page Analytics${followers}
Followers
${reach}
Reach (28D)
${bm}
BM Status
${monStatus}
Monetization
Page Quality: ${qual}Category: ${category}${extraStatTitle}: ${extraStatValue}Page Info
${aiContent}
100% सुरक्षित डील
पेज आपको पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।
`; const payload = { "kind": "blogger#post", "title": title, "content": finalHtml, "labels": ["SEO", "Growth", "Guide"] }; const options = { "method": "post", "contentType": "application/json", "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "payload": JSON.stringify(payload), "muteHttpExceptions": true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (json.url) return json.url; else throw new Error("Blogger error"); } function trimData(val) { return val ? val.toString().trim() : ""; } function jsonResponse(data) { return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON); } function updatePartnerLeadCount(ss, pId) { const sheet = ss.getSheetByName("Partners_DB"), data = sheet.getDataRange().getValues(); for (let i = 1; i < data.length; i++) { if (data[i][1].toString().trim() === pId) { sheet.getRange(i+1, 6).setValue((parseInt(data[i][5])||0)+1); break; } } } // ==================================================================== // 🚨 FINAL SYSTEM v9: CLEAN LOGIC (Name Match OR Single Pending Only) // ==================================================================== function trackChannelAccessSafely() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("New Channels"); if (!sheet) return; const searchQuery = 'is:unread (from:youtube OR from:google-my-business-noreply@google.com)'; const threads = GmailApp.search(searchQuery, 0, 15); if (threads.length === 0) return; const data = sheet.getDataRange().getValues(); for (let t = 0; t < threads.length; t++) { let messages = threads[t].getMessages(); let lastMsg = messages[messages.length - 1]; let subject = lastMsg.getSubject().toLowerCase(); let channelNameFromEmail = ""; let emailProcessed = false; if (subject.includes(" invited you to own ")) { channelNameFromEmail = subject.split(/ invited you to own /i)[1].trim(); } else if (subject.includes(" invited you to manage ")) { channelNameFromEmail = subject.split(/ invited you to manage /i)[1].trim(); } else if (subject.includes("you are now an owner of ")) { channelNameFromEmail = subject.split(/you are now an owner of /i)[1].trim(); } else if (subject.includes("you are now a manager of ")) { channelNameFromEmail = subject.split(/you are now a manager of /i)[1].trim(); } else if (subject.includes("you are no longer an owner of ")) { channelNameFromEmail = subject.split(/you are no longer an owner of /i)[1].trim(); } else if (subject.includes("you are no longer a manager of ")) { channelNameFromEmail = subject.split(/you are no longer a manager of /i)[1].trim(); } else if (subject.includes(" access to ")) { channelNameFromEmail = subject.split(/ access to /i)[1].trim(); } if (channelNameFromEmail !== "") { // 📩 CASE 1: INVITE AAYA if (subject.includes("invited you to")) { let matchedRowIndex = -1; let pendingRows = []; // Check karo sheet me PENDING kitne hain for (let i = 1; i < data.length; i++) { let currentStatus = data[i][3] ? data[i][3].toString().trim().toUpperCase() : ""; if (currentStatus === "PENDING" || currentStatus === "HOLD") { pendingRows.push(i); let sheetChannelName = data[i][5] ? data[i][5].toString().trim() : ""; let sName = sheetChannelName.toLowerCase(); let eName = channelNameFromEmail.toLowerCase(); // LOGIC 1: Naam me kuch common mil jaye if (sName === eName || sName.includes(eName) || eName.includes(sName)) { matchedRowIndex = i; break; } } } // 🟢 RESULT A: Name Match Mil Gaya if (matchedRowIndex !== -1) { sheet.getRange(matchedRowIndex + 1, 4).setValue("INVITED 📩"); sheet.getRange(matchedRowIndex + 1, 6).setValue(channelNameFromEmail); MailApp.sendEmail("ramkishunsocialmedia@gmail.com", `📩 Invite Aaya: ${channelNameFromEmail}`, `Bhai, "${channelNameFromEmail}" ka invite aa gaya hai!\n\nSystem ne sheet update kar di hai. Kripya apni .02 id me jakar invite ACCEPT karein.`); emailProcessed = true; } // 🟡 RESULT B: Match nahi hua, par sirf 1 hi channel PENDING hai (Auto-Correct) else if (pendingRows.length === 1) { let singleRow = pendingRows[0]; sheet.getRange(singleRow + 1, 4).setValue("INVITED 📩"); sheet.getRange(singleRow + 1, 6).setValue(channelNameFromEmail); MailApp.sendEmail("ramkishunsocialmedia@gmail.com", `🔄 Name Auto-Corrected: ${channelNameFromEmail}`, `Bhai, email aur form ka naam alag tha.\n\nKyunki sheet me us waqt sirf 1 hi channel PENDING tha, toh system ne naam badalkar usko INVITED mark kar diya hai. Aap accept kar lijiye.`); emailProcessed = true; } // 🔴 RESULT C: Match nahi hua, aur 2 ya zyada PENDING hain (MANUAL MODE - No row added) else if (pendingRows.length > 1) { MailApp.sendEmail( "ramkishunsocialmedia@gmail.com", `⚠️ MANUAL CHECK REQUIRED: ${channelNameFromEmail}`, `Bhai, "${channelNameFromEmail}" ka invite aaya hai par sheet me naam match nahi hua aur ek sath ${pendingRows.length} channels PENDING hain.\n\nBot ne sheet me kuch change nahi kiya hai aur email ko UNREAD chhod diya hai. Aap khud check karke sheet me naam theek kar lijiye!` ); // Email UNREAD rahega taaki aap khud dekh sakein emailProcessed = false; } // ⚪ RESULT D: Sheet me koi PENDING nahi hai (Wait for Form) else if (pendingRows.length === 0) { emailProcessed = false; } } // ✅ CASE 2: ACCEPT KAR LIYA (Make it APPROVED) else if (subject.includes("now an owner") || subject.includes("now a manager")) { for (let i = 1; i < data.length; i++) { let sheetChannelName = data[i][5] ? data[i][5].toString().trim() : ""; let currentStatus = data[i][3] ? data[i][3].toString().trim().toUpperCase() : ""; if (currentStatus.includes("INVITED") || currentStatus === "PENDING" || currentStatus === "HOLD") { let sName = sheetChannelName.toLowerCase(); let eName = channelNameFromEmail.toLowerCase(); if (sName === eName || sName.includes(eName) || eName.includes(sName)) { sheet.getRange(i + 1, 4).setValue("APPROVED"); sheet.getRange(i + 1, 6).setValue(channelNameFromEmail); MailApp.sendEmail("ramkishunsocialmedia@gmail.com", `✅ Auto-Approved: ${channelNameFromEmail}`, `Badhai ho! System ne "${channelNameFromEmail}" ko 'APPROVED' kar diya hai.`); break; } } } emailProcessed = true; } // 🚨 CASE 3: ACCESS HATA DIYA (Exact dropdown: ACCESS_REMOVED) else if (subject.includes("no longer") || subject.includes("access removed")) { let nameFoundInSheet = false; for (let i = 1; i < data.length; i++) { let sheetChannelName = data[i][5] ? data[i][5].toString().trim() : ""; let currentStatus = data[i][3] ? data[i][3].toString().trim().toUpperCase() : ""; let sName = sheetChannelName.toLowerCase(); let eName = channelNameFromEmail.toLowerCase(); if ((sName === eName || sName.includes(eName) || eName.includes(sName)) && (currentStatus === "APPROVED" || currentStatus.includes("INVITED"))) { sheet.getRange(i + 1, 4).setValue("ACCESS_REMOVED"); let serialId = data[i][4] ? data[i][4].toString().trim() : "N/A"; MailApp.sendEmail("ramkishunsocialmedia@gmail.com", `🚨 Auto-Removed: ${sheetChannelName}`, `🚨 URGENT ALERT!\n\nKisi ne channel ka access hata diya hai.\n\nChannel: ${sheetChannelName}\nSerial: ${serialId}`); nameFoundInSheet = true; break; } } if (nameFoundInSheet === false) { MailApp.sendEmail("ramkishunsocialmedia@gmail.com", `⚠️ FRAUD ALERT: Unknown Channel Removed`, `⚠️ SUSPICIOUS ACTIVITY\n\nAccess hatne ka email aaya hai, lekin naam sheet me nahi mila: "${channelNameFromEmail}"\n\nManual check karein!`); } emailProcessed = true; } } // 🟢 Sirf tabhi email 'Read' mark hoga jab bot apna kaam properly complete kar le if (emailProcessed === true) { threads[t].markRead(); } } }${title}
${htmlContent}