tg
// ==========================================
// 1. GROQ API CREDENTIALS & SETTINGS
// ==========================================
const GROQ_API_KEY = "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";
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");
}
// ==========================================
// 2. AI CONTENT GENERATOR (With Strict HTML Rules)
// ==========================================
function generateAutoContent() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
// --- 🏏 Cricket Content Generation ---
var cricketSheet = sheet.getSheetByName("Cricket_Posts");
var cricketPrompt = "Write a highly engaging Telegram post (in a mix of Hindi and English) about the latest trending cricket news or match updates. Use appropriate emojis. STRICT RULE: Use ONLY HTML tags for bold text and for italic. DO NOT use markdown like ** or *. Do not add any intro/outro text, just give the direct message ready to post.";
try {
var rawCricketText = callGroq(cricketPrompt);
var cleanCricketText = rawCricketText.replace(/```html/g, "").replace(/```/g, "").trim();
cricketSheet.appendRow([new Date(), cleanCricketText, "Pending"]);
} catch (error) {
Logger.log("Cricket AI Error: " + error.message);
}
// --- 🩺 NEET Content Generation ---
var neetSheet = sheet.getSheetByName("NEET_Posts");
var neetPrompt = "Write one high-yield study fact and one challenging MCQ for NEET 2027 preparation (Subject: Biology, Physics, or Chemistry). Keep an encouraging tone for future doctors in a Hindi-English mix. Use emojis. STRICT RULE: Use ONLY HTML tags for bold text. DO NOT use markdown like **. Provide the correct answer and a 1-line explanation at the end. Do not add any intro/outro text, just the direct message.";
try {
var rawNeetText = callGroq(neetPrompt);
var cleanNeetText = rawNeetText.replace(/```html/g, "").replace(/```/g, "").trim();
neetSheet.appendRow([new Date(), cleanNeetText, "Pending"]);
} catch (error) {
Logger.log("NEET AI Error: " + error.message);
}
}
// ==========================================
// 3. TELEGRAM AUTO-POSTER LOGIC
// ==========================================
function autoPostToTelegram() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var configSheet = sheet.getSheetByName("Config");
// Bug Fix: .toString().trim() add kiya gaya hai taaki extra space ya number format ka issue na aaye
var botToken = configSheet.getRange("B1").getValue().toString().trim();
var cricketChatId = configSheet.getRange("B2").getValue().toString().trim();
var neetChatId = configSheet.getRange("B3").getValue().toString().trim();
function processSheet(sheetName, chatId) {
var dataSheet = sheet.getSheetByName(sheetName);
if (!dataSheet) return;
var lastRow = dataSheet.getLastRow();
if (lastRow < 2) return;
var data = dataSheet.getRange(2, 1, lastRow - 1, 3).getValues();
var lock = LockService.getScriptLock();
if (!lock.tryLock(10000)) return;
try {
for (var i = 0; i < data.length; i++) {
var message = data[i][1];
var status = data[i][2];
if (message !== "" && (status === "" || status === "Pending")) {
var result = sendMessage(botToken, chatId, message);
if(result === "Success") {
dataSheet.getRange(i + 2, 3).setValue("Sent");
} else {
// Ab sheet me exact error likha aayega (e.g., Failed: Bad Request: chat not found)
dataSheet.getRange(i + 2, 3).setValue("Failed: " + result);
}
break;
}
}
} finally {
lock.releaseLock();
}
}
processSheet("Cricket_Posts", cricketChatId);
processSheet("NEET_Posts", neetChatId);
}
// ==========================================
// 4. TELEGRAM API CALL (Fully Fixed for HTML & JSON)
// ==========================================
function sendMessage(botToken, chatId, text) {
var url = "https://api.telegram.org/bot" + botToken + "/sendMessage";
var payload = {
"chat_id": chatId,
"text": text,
"parse_mode": "HTML"
};
// Bug Fix: contentType aur JSON.stringify add kiya gaya hai
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
try {
var response = UrlFetchApp.fetch(url, options);
var jsonResponse = JSON.parse(response.getContentText());
// Agar success ho gaya
if(jsonResponse.ok) {
return "Success";
} else {
// Agar fail hua to Telegram ka exact error reason return karega
return jsonResponse.description;
}
} catch(e) {
return e.message;
}
}
// ==========================================
// ⭐ 5. MASTER CONTROLLER (Isi ko Trigger karna hai)
// ==========================================
function runMasterAutoPilot() {
generateAutoContent();
SpreadsheetApp.flush();
Utilities.sleep(3000);
autoPostToTelegram();
}
// ==========================================
// 6. WEBHOOK HANDLER (User Interaction & Buttons)
// ==========================================
function doPost(e) {
if (!e || !e.postData) {
return ContentService.createTextOutput("OK");
}
var data = JSON.parse(e.postData.contents);
if (data.callback_query) {
var callbackQueryId = data.callback_query.id;
var chatId = data.callback_query.message.chat.id;
var buttonData = data.callback_query.data;
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var botToken = sheet.getSheetByName("Config").getRange("B1").getValue().toString().trim();
var url = "https://api.telegram.org/bot" + botToken + "/answerCallbackQuery";
var payload = {
"callback_query_id": callbackQueryId,
"text": "Response Recorded: " + buttonData,
"show_alert": false
};
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
UrlFetchApp.fetch(url, options);
}
return ContentService.createTextOutput("OK");
}