// ==========================================
// CHANNEL DEALS - GAS MASTER SCRIPT (PREMIUM AUTO-BLOG v12.0 FINAL)
// ==========================================
const SHEET_ID = '1zLtoIoTeWDYUY8RXSCESpPuSYf6jNkpGw_HRAKOMzJo';
const ADMIN_WHATSAPP = "917987744656";
// 🔴 API KEYS 🔴
const GROQ_API_KEY = "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";
const BLOG_ID = "8618582521881069823";
// ==========================================
// 1. DATA DIKHANE KE LIYE (GET REQUEST)
// ==========================================
function doGet(e) {
try {
const ss = SpreadsheetApp.openById(SHEET_ID);
const action = (e.parameter && e.parameter.action) ? e.parameter.action : "getChannels";
if (action === "getPartnerStats") {
const partnerId = e.parameter.partnerId;
const partnerSheet = ss.getSheetByName("Partners_DB");
const pData = partnerSheet.getDataRange().getValues();
for (let i = 1; i < pData.length; i++) {
if (pData[i][1].toString().trim() === partnerId) {
return jsonResponse({
name: pData[i][2], totalLeads: pData[i][5],
successDeals: pData[i][6], wallet: pData[i][7], paymentStatus: pData[i][9]
});
}
}
return jsonResponse({ error: "Partner ID not found" });
}
const sheet = ss.getSheetByName("New Channels");
const data = sheet.getDataRange().getValues();
let jsonData = [];
for (let i = 1; i < data.length; i++) {
let row = data[i];
let status = row[3] ? row[3].toString().trim().toUpperCase() : "";
if (status === "APPROVED" || status === "SOLD OUT") {
jsonData.push({
adminWhatsapp: ADMIN_WHATSAPP, topGeo: row[2] || "",
status: status === "SOLD OUT" ? "Sold Out" : "Approved",
channelId: row[4] || "", channelName: row[5] || "",
subscribers: row[6] || "", views: row[7] || "",
monetized: row[8] ? row[8].toString().trim().toLowerCase() : "no",
lifetimeEarning: row[9] || "", watchTime: row[10] || "",
strikeInfo: row[11] || "", category: row[12] || "",
videoType: row[13] || "", detailLink: row[18] || "#"
});
}
}
return jsonResponse(jsonData);
} catch (error) {
return jsonResponse({ "error": error.message });
}
}
// ==========================================
// 2. DATA SAVE KARNE KE LIYE (POST REQUEST)
// ==========================================
function doPost(e) {
try {
const ss = SpreadsheetApp.openById(SHEET_ID);
let formData = JSON.parse(e.postData.contents || "{}");
const action = formData.action;
const timestamp = new Date();
if (action === "sellChannel") {
const dbSheet = ss.getSheetByName("New Channels");
const lastRow = dbSheet.getLastRow();
const newRow = lastRow + 1;
const channelId = "CD" + (1000 + newRow);
const promptFormula = '="इस यूट्यूब चैनल की सिर्फ 3-4 लाइन की एक दमदार और आकर्षक AI Description लिखो। यह चैनल सेल के लिए है। सिर्फ फायदे बताओ ताकि कस्टमर तुरंत खरीद ले। चैनल का नाम: " & F' + newRow + ' & ", सब्सक्राइबर्स: " & G' + newRow + ' & ", कमाई: " & J' + newRow + ' & "। कोई HTML मत देना, सिर्फ सीधा टेक्स्ट लिखना।"';
const msgFormula = '="🔔 YouTube Channel for Sale ! 🔔" & CHAR(10) & "-----" & CHAR(10) & "👉 Channel ID: " & E' + newRow + ' & CHAR(10) & "👉 Current Status: AVAILABLE🟢" & CHAR(10) & "👉 Total Subscribers: " & G' + newRow + ' & CHAR(10) & "👉 Life Time Views: " & H' + newRow + ' & CHAR(10) & "👉 Monetize Status: " & I' + newRow + ' & CHAR(10) & "👉 Video type: " & N' + newRow + ' & CHAR(10) & "👉 Restrictions/Strikes: " & L' + newRow + ' & CHAR(10) & "👉 Lifetime Earnings: " & J' + newRow + ' & CHAR(10) & "👉 View More (Dashboard SS etc.): " & IF(S' + newRow + '="", "Link Processing...", S' + newRow + ') & CHAR(10) & CHAR(10) & "📌 Interested?, To buy this channel, Send us a message on What\'s App or Arratai: 7987744656 with Screenshot or Channel ID Number: " & E' + newRow;
dbSheet.appendRow([
timestamp, trimData(formData.sellerWhatsapp), trimData(formData.topGeo), "Pending",
channelId, trimData(formData.channelName), trimData(formData.subscribers),
trimData(formData.views), trimData(formData.monetized || "no"),
trimData(formData.earning || "0"), trimData(formData.watchTime || "0"),
trimData(formData.strikeInfo || "No Strike"), trimData(formData.category),
trimData(formData.videoType || ""), trimData(formData.dashboardImageUrl),
trimData(formData.analyticsImageUrl), trimData(formData.monetizeImageUrl),
trimData(formData.channelLink), "", trimData(formData.partnerId || ""),
promptFormula, "", msgFormula
]);
return jsonResponse({ status: "success", message: "Channel listed!" });
}
if (action === "registerPartner") {
const waNum = trimData(formData.whatsapp).replace(/\D/g, '');
const partnerId = "pts-" + waNum.slice(-5);
ss.getSheetByName("Partners_DB").appendRow([timestamp, partnerId, trimData(formData.name), waNum, trimData(formData.upi), 0, 0, 0, 0, "Active"]);
return jsonResponse({ status: "success", partnerId: partnerId });
}
if (action === "submitLead") {
const pId = trimData(formData.partnerId);
ss.getSheetByName("Leads_DB").appendRow([timestamp, pId, trimData(formData.leadType), trimData(formData.customerWhatsapp), trimData(formData.requirement), trimData(formData.budget), "Pending", ""]);
updatePartnerLeadCount(ss, pId);
return jsonResponse({ status: "success" });
}
return jsonResponse({ status: "error", message: "Invalid action." });
} catch (error) {
return jsonResponse({ status: "error", message: error.message });
}
}
// ==========================================
// 3. MAGIC AUTOMATION (ON EDIT TRIGGER) - 🌟 GROQ + BLOGGER PREMIUM DESIGN
// ==========================================
function createAutoBlog(e) {
if (!e || !e.range) return;
const sheet = e.range.getSheet();
const sheetName = sheet.getName();
const row = e.range.getRow();
const col = e.range.getColumn();
const value = e.value;
if (row < 2) return;
if (sheetName === "New Channels" && col === 4) {
if (value && value.toString().trim().toUpperCase() === "APPROVED") {
const blogLinkCheck = sheet.getRange(row, 19).getValue();
if (!blogLinkCheck) {
const rowData = sheet.getRange(row, 1, 1, 25).getValues()[0];
const geminiPrompt = rowData[20];
const channelId = rowData[4];
const channelName = rowData[5];
const category = rowData[12];
try {
// AI से Description लिखवाया और लाइन ब्रेक
फिक्स किया
const rawText = callGroq(geminiPrompt);
const aiDescription = rawText.replace(/```html/g, "").replace(/```/g, "").trim().replace(/\n/g, "
");
sheet.getRange(row, 22).setValue(aiDescription);
const postTitle = `🔥 YouTube Channel For Sale | ${channelName} | ID: ${channelId}`;
const postUrl = publishToBlogger(postTitle, aiDescription, category, rowData);
if (postUrl) {
sheet.getRange(row, 19).setValue(postUrl); // Column S में लिंक सेव होगी
sheet.getRange(row, 21).clearContent(); // Column U का फॉर्मूला तुरंत डिलीट करेगा
sheet.getRange(row, 22).clearContent(); // Column V का AI टेक्स्ट तुरंत डिलीट करेगा
}
} catch (error) {
sheet.getRange(row, 19).setValue("Error: " + error.message);
}
}
}
}
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;
}
}
}
}
}
}
// ==========================================
// 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: " + response.getContentText());
}
}
// 🌟 PREMIUM APP-STYLE BLOGGER FUNCTION (EXACT 100% ORIGINAL DESIGN) 🌟
function publishToBlogger(title, aiContent, label, rowData) {
const channelId = rowData[4] || "N/A";
const subs = rowData[6] || "0";
const views = rowData[7] || "0";
// 🚀 स्मार्ट Monetization कन्वर्टर (बस यही अपडेट किया है) 🚀
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 = `
Buy Monetized YouTube Channel - ${subs} Subs (${channelId}) | Channel Deals
ID: ${channelId}
${subs} Subs & ${monStatus} YouTube Channel For Sale!
Buy this active, earning channel (${videoType} Videos) securely with 100% Escrow Protection.
${img1 ? `
` : ''}
${img2 ? `
` : ''}
${img3 ? `
` : ''}
Channel Analytics
पैसे कमाने वाला चैनल (Channel Info)
${aiContent}
100% सुरक्षित डील
हम (CHANNEL DEALS) आपको विश्वास दिलाते हैं कि हमारी डील 100% सुरक्षित होती है। चैनल आपको 8-दिन की Escrow पॉलिसी के तहत पूरी सेफ्टी के साथ ट्रांसफर किया जाएगा।
`;
// 3. Blogger API Call
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 ? json.error.message : "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; }
}
}