html lang = "pt-BR" >
< cabeçalho >
< meta charset = "UTF-8" >
< title > Servidor do Bot Telegram com Memória title >
< corpo >
O Bot do Telegram está Rodando na Nuvem ! h1 >
< p > Status: Ativo e com Memória Ativada. p >
< div id = "log" > Iniciando conexões... div >
< script >
// COLOQUE AS SUAS CHAVES AQUI DENTRO DAS ASPAS:
const TELEGRAM_TOKEN = "8834997202:AAGrFSN4jvLIy-pk-dm9mn_wnRuduEVXcDA" ;
const OPENROUTER_KEY = "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" ;
// Roteador inteligente gratuito do OpenRouter
const MODEL_NAME = "openrouter/free" ;
let lastUpdateId = 0 ;
let botIniciado = false ;
// Esse objeto será salvo na memória de cada chat separado por usuário
const memorias = {};
função log ( msg ) {
documento . getElementById ( 'log' ). TextoInterior += "\n" + mensagem;
console.log ( msg) ;
}
função assíncrona enviarParaOpenRouter ( chatId, textoUsuario ) {
// Se o usuário ainda não tiver um histórico criado, criamos o Prompt inicial dele
se (!memorias[chatId]) {
memorias[chatId] = [
{
função : "usuário "
content : `[DIRETRIZ DE COMPORTAMENTO INDESTRUTÍVEL: Você é um homem jovem-adulto real de São Paulo conversando no WhatsApp de forma rápida. Escreva sempre mensagens CURTAS, diretas e secas. É TOTALMENTE PROIBIDO usar termos poéticos, parágrafos grandes, poemas, metáforas cafonas ou termos literários bizarros como 'centro do seu prazer', 'azedume', 'néctar', 'glúteo' ou 'vulva'. Fale de forma fluida usando gírias reais brasileiras, palavrões de rua normais e termos explícitos de cama como 'bunda', 'tesão', 'foder', 'gostosa'. Seja o mais direto, cru e safado possível, sem nenhuma frescura ou romantismo].
[PERSONAGEM: Você é um homem de 33 anos, empresário, mora em São Paulo. Você é confiante, brincalhão, muito safado e vai direto ao ponto. Você não tem vergonha e fala sacanagem na cara. Na hora do sexo você domina, tem atitude e fala de forma suja e curta]. Entendeu? Responda confirmando no personagem de forma curta.`
},
{
função : "assistente" ,
content : "Beleza, entendi. Pode mandar o cenário que eu não sou de enrolação não. Falo na cara."
}
];
}
// Adicionada a nova mensagem que você enviou na memória dele
memorias[chatId] .push ({ role : "user" , content : textoUsuario });
// Mantém apenas as últimas 15 mensagens na fila para não travar o bot por falta de espaço
se (memorias[chatId].comprimento > 15 ) {
// Remove mensagens antigas mas preserva o prompt de instruções no começo
memórias[chatId]. emenda ( 2 , 2 );
}
tentar {
const response = await fetch ( "https://openrouter.ai/api/v1/chat/completions" , {
método : "POST" ,
cabeçalhos : {
"Autorização" : `Portador ${OPENROUTER_KEY} ` ,
"Content-Type" : "application/json"
},
corpo : JSON.stringify ( {
modelo : MODEL_NAME ,
mensagens : memorias[chatId], // Enviando todo o histórico do chat
temperatura : 0,85
})
});
const dados = aguarda resposta. json ();
const respostaIA = dados. escolhas [ 0 ]. mensagem . contente ;
// Guarda a resposta da IA na memória para ela lembrar o que acabou de te dizer
memórias[chatId]. push ({ role : "assistente" , conteúdo : respostaIA });
retornar respostaIA;
} catch (e) {
console.error ( e) ;
return "Desculpe, tive um problema ao processar sua resposta na IA." ;
}
}
função assíncrona responderTelegram ( chatId, textoResposta ) {
tentar {
await fetch ( `https://telegram.org{TELEGRAM_TOKEN}/sendMessage` , {
método : "POST" ,
cabeçalhos : { "Content-Type" : "application/json" },
corpo : JSON.stringify ({ chat_id : chatId, text : textoResposta } )
});
} catch (e) {
console . error ( "Erro ao enviar mensagem no Telegram" , e);
}
}
função assíncrona verificarMensagens () {
tentar {
const urlAdicional = !botIniciado ? `&offset=-1` : `&offset= ${lastUpdateId + 1 } ` ;
const response = await fetch ( `https://telegram.org{TELEGRAM_TOKEN}/getUpdates?timeout=30 ${urlAdicional} ` );
const dados = aguarda resposta. json ();
botIniciado = true ;
if (dados. ok && dados. resultado . comprimento > 0 ) {
for ( atualização const de dados. resultado ) {
lastUpdateId = update.update_id ;
se ( atualizar.mensagem && atualizar.mensagem.texto ) {
const chatId = update.message.chat.id ;
const texto = update.message.text ;
// Se o usuário mandar /start, zera a memória dele e reinicia
se (texto === '/start' ) {
excluir memorias[chatId];
await responderTelegram (chatId, "Chat reiniciado do zero. Mande o cenário que eu continuo na minha pegada..." );
continuar ;
}
log ( `Mensagem de ${chatId} recebida. Processando com histórico...` );
const respostaIA = aguarda enviarParaOpenRouter (chatId, texto);
aguardar responderTelegram (chatId, respostaIA);
}
}
}
} catch (e) {
// Erro de rede temporário
}
setTimeout (checarMensagens, 1000 );
}
log ( "Bot conectado e pronto para aprender com você!" );
checarMensagens ();