channel Screenshot Scanner Backend test form html success ✅ not full GAS code

// ========================================== // CHANNEL DEALS - TEST MODE BACKEND (v1.1 - Minimal Scanner & Sync) // ========================================== const SHEET_ID = '1NyiZ3NWoO3DJiwcnSfDGza9XiyfL02Hin9rLUDjNopw'; const GEMINI_API_KEY = "AIzaSyBbJ-Pv1df886JSvHA9zkJTe-G-iBHJGXw"; // Aapki API key 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(); // 1. AI OCR SCANNER if (action === "scanAsset") { return jsonResponse(processOCRWithGemini(formData.payload.base64Images, formData.payload.platform)); } // 2. SAVE YOUTUBE DATA if (action === "sellChannel") { const dbSheet = ss.getSheetByName("New Channels") || ss.insertSheet("New Channels"); dbSheet.appendRow([ timestamp, trimData(formData.sellerWhatsapp), trimData(formData.channelName), trimData(formData.channelLink), trimData(formData.subscribers), trimData(formData.views), trimData(formData.videoType), trimData(formData.monetized), trimData(formData.earning), trimData(formData.watchTime), trimData(formData.topGeo), trimData(formData.strikeInfo), trimData(formData.category), trimData(formData.partnerId), trimData(formData.images[0]), trimData(formData.images[1]), trimData(formData.images[2]), trimData(formData.expectedPrice), "Pending" ]); return jsonResponse({ status: "success", message: "YouTube Test Data Saved!" }); } // 3. SAVE INSTAGRAM DATA if (action === "sellInsta") { const dbSheet = ss.getSheetByName("Insta_Deals") || ss.insertSheet("Insta_Deals"); dbSheet.appendRow([ timestamp, trimData(formData.sellerWhatsapp), trimData(formData.instaUsername), trimData(formData.followers), trimData(formData.monthlyReach), trimData(formData.storyViews), trimData(formData.ogeStatus), trimData(formData.topGeo), trimData(formData.category), trimData(formData.partnerId), trimData(formData.profileLink), trimData(formData.images[0]), trimData(formData.images[1]), trimData(formData.images[2]), trimData(formData.expectedPrice), "Pending" ]); return jsonResponse({ status: "success", message: "Instagram Test Data Saved!" }); } // 4. SAVE FACEBOOK DATA if (action === "sellFacebook") { const dbSheet = ss.getSheetByName("FB_Deals") || ss.insertSheet("FB_Deals"); dbSheet.appendRow([ timestamp, trimData(formData.sellerWhatsapp), trimData(formData.pageName), trimData(formData.pageLink), trimData(formData.followers), trimData(formData.reach), trimData(formData.bmStatus), trimData(formData.pageQuality), trimData(formData.nameChange), trimData(formData.category), trimData(formData.monetization), trimData(formData.topGeo), trimData(formData.earning), trimData(formData.watchTime), trimData(formData.partnerId), trimData(formData.images[0]), trimData(formData.images[1]), trimData(formData.images[2]), trimData(formData.images[3]), trimData(formData.expectedPrice), "Pending" ]); return jsonResponse({ status: "success", message: "Facebook Test Data Saved!" }); } return jsonResponse({ status: "error", message: "Invalid action." }); } catch (error) { return jsonResponse({ status: "error", message: error.message }); } } // ============================================================ // 🌟 AI MULTI-IMAGE OCR SCANNER ENGINE (ANTI-LINK & MODEL FIXED) // ============================================================ function processOCRWithGemini(base64Images, platform) { try { let promptText = ""; if (platform === "yt") { promptText = "Analyze these YouTube Studio screenshots. Extract accurate stats. Guidelines: 1. 'channelName' 2. 'subscribers' 3. 'views' 4. 'videoType' (Infer Shorts/Long/Both) 5. 'monetized' (Return 'yes', 'no', or 'half') 6. 'earning' (Include $) 7. 'watchTime' 8. 'topGeo' 9. 'strikeInfo' (Return '1 Active Strike', '1 Warning', or 'No Strike'). Return ONLY a valid JSON object without markdown. Keys: channelName, subscribers, views, videoType, monetized, earning, watchTime, topGeo, strikeInfo."; } else if (platform === "ig") { promptText = "Analyze these Instagram Dashboard screenshots. Extract stats. Guidelines: 1. 'instaUsername' 2. 'followers' 3. 'monthlyReach' 4. 'storyViews' 5. 'ogeStatus' (Default 'Yes') 6. 'topGeo'. Return ONLY a valid JSON object without markdown. Keys: instaUsername, followers, monthlyReach, storyViews, ogeStatus, topGeo."; } else if (platform === "fb") { promptText = "Analyze these Facebook Page screenshots. Extract stats. Guidelines: 1. 'pageName' 2. 'followers' 3. 'reach' 4. 'bmStatus' (Return 'Linked' or 'Clean') 5. 'pageQuality' (Return 'Green', 'Yellow', or 'Red') 6. 'nameChange' (Return 'Yes' or 'No') 7. 'monetization' (Return 'Fully Monetized', 'Not Monetized', or 'LOC Strike') 8. 'topGeo' 9. 'earning' 10. 'watchTime'. Return ONLY a valid JSON object without markdown. Keys: pageName, followers, reach, bmStatus, pageQuality, nameChange, monetization, topGeo, earning, watchTime."; } let parts = [{ "text": promptText }]; for (let i = 0; i < base64Images.length; i++) { parts.push({ "inline_data": { "mime_type": "image/jpeg", "data": base64Images[i] } }); } var payload = { "contents": [{ "parts": parts }] }; var options = { "method": "post", "contentType": "application/json", "payload": JSON.stringify(payload), "muteHttpExceptions": true }; // 💡 ANTI-LINK CORRUPTION LOGIC var d1 = "https://generativelanguage"; var d2 = "googleapis"; var d3 = "com"; var path = "/v1beta/models/"; var baseUrl = d1 + "." + d2 + "." + d3 + path; // 🔥 LATEST 2026 API MODEL IDs (Based on your screenshot) var url1 = baseUrl + "gemini-3.5-flash-lite:generateContent?key=" + GEMINI_API_KEY; var url2 = baseUrl + "gemini-3.8-flash:generateContent?key=" + GEMINI_API_KEY; var response = UrlFetchApp.fetch(url1, options); var json = JSON.parse(response.getContentText()); // अगर 3.5 Flash-Lite बिजी या फेल होता है, तो 3.8 Flash (Fallback) को कॉल करें if (json.error) { response = UrlFetchApp.fetch(url2, options); json = JSON.parse(response.getContentText()); // अगर Fallback भी फेल हो जाए, तो असली एरर दिखाएं if (json.error) return { status: "error", message: json.error.message }; } var aiResponse = json.candidates[0].content.parts[0].text; aiResponse = aiResponse.replace(/```json/gi, '').replace(/```/g, '').trim(); return { status: "success", text: aiResponse }; } catch(err) { return { status: "error", message: "API Crash: " + err.toString() }; } } // ============================================================ // 🛠️ HELPER FUNCTIONS (CRITICAL FOR CORS & AVOIDING CRASHES) // ============================================================ function trimData(val) { return val ? val.toString().trim() : ""; } function jsonResponse(data) { return ContentService.createTextOutput(JSON.stringify(data)) .setMimeType(ContentService.MimeType.JSON); }