// Função principal que extrai questões e processa
async function analyzeQuestions() {
try {
// Extrai questões da página UniCesumar
const questions = extractQuestions();
if ([Link] === 0) {
showStatus('❌ Nenhuma questão encontrada');
return;
}
showStatus(`🔍 Encontradas ${[Link]} questões. Processando...`);
// Processa cada questão
for (let i = 0; i < [Link]; i++) {
const question = questions[i];
showStatus(`🤖 Analisando questão ${i + 1}/${[Link]}...`);
const answer = await getAIAnswer(question);
if (answer) {
highlightCorrectAnswer(question, answer);
}
// Delay entre questões para não sobrecarregar a API
await new Promise(resolve => setTimeout(resolve, 1000));
}
showStatus('✅ Análise concluída!');
} catch (error) {
[Link]('Erro:', error);
showStatus('❌ Erro na análise: ' + [Link]);
}
}
// Extrai questões e alternativas da página
function extractQuestions() {
const questions = [];
// Seletores específicos para UniCesumar (mais genéricos)
const possibleQuestionSelectors = [
'.questao',
'.question',
'.pergunta',
'[class*="questao"]',
'[class*="question"]',
'div:has(input[type="radio"])',
'fieldset'
];
let questionElements = [];
// Tenta diferentes seletores
for (const selector of possibleQuestionSelectors) {
try {
questionElements = [Link](selector);
if ([Link] > 0) {
[Link](`Encontradas questões com seletor: ${selector}`);
break;
}
} catch (e) {
continue;
}
}
// Se não encontrou, procura por grupos de radio buttons
if ([Link] === 0) {
const radioGroups = {};
const radios = [Link]('input[type="radio"]');
[Link](radio => {
const name = [Link];
if (!radioGroups[name]) {
radioGroups[name] = [];
}
radioGroups[name].push(radio);
});
[Link](radioGroups).forEach((groupName, index) => {
const radios = radioGroups[groupName];
// Busca o texto da questão próximo aos radios
let questionText = '';
const firstRadio = radios[0];
let parent = [Link]('div, fieldset, section');
if (parent) {
// Procura por texto da questão
const textNodes = [Link]('p, div, span, h1, h2, h3, h4,
h5, h6');
for (const node of textNodes) {
if ([Link]().length > 20) {
questionText = [Link]();
break;
}
}
}
// Coleta alternativas
const alternatives = [];
[Link](radio => {
let altText = '';
const label = [Link](`label[for="${[Link]}"]`) ||
[Link]('label');
if (label) {
altText = [Link]();
} else if ([Link]) {
altText = [Link]?.trim() || '';
}
if (altText) {
[Link]({
element: radio,
text: altText,
value: [Link]
});
}
});
if (questionText && [Link] > 0) {
[Link]({
index: index,
text: questionText,
alternatives: alternatives,
element: parent
});
}
});
}
[Link](`Total de questões encontradas: ${[Link]}`);
return questions;
}
// Envia questão para a IA Perplexity (CORRIGIDO)
async function getAIAnswer(question) {
try {
// Busca a API key
const result = await [Link](['perplexityApiKey']);
const apiKey = [Link];
if (!apiKey) {
showStatus('❌ Configure a API Key da Perplexity primeiro');
return null;
}
// Formata a pergunta
const prompt = `Questão: ${[Link]}
Alternativas:
${[Link]((alt, i) =>
`${[Link](65 + i)}. ${[Link]}`
).join('\n')}
Responda apenas com a letra da alternativa correta (A, B, C, D ou E):`;
[Link]('Enviando prompt:', prompt);
// Chama a API da Perplexity (FORMATO CORRETO)
const response = await fetch('[Link] {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: [Link]({
model: 'llama-3.1-sonar-small-128k-online', // Modelo correto
messages: [
{
role: 'user',
content: prompt
}
],
max_tokens: 10,
temperature: 0.1
})
});
[Link]('Status da resposta:', [Link]);
if (![Link]) {
const errorText = await [Link]();
[Link]('Erro da API:', errorText);
throw new Error(`API Error: ${[Link]} - ${errorText}`);
}
const data = await [Link]();
[Link]('Resposta da API:', data);
const answer = [Link][0].[Link]().toUpperCase();
// Extrai apenas a letra (A, B, C, D, E)
const match = [Link](/[A-E]/);
const finalAnswer = match ? match : null;
[Link]('Resposta processada:', finalAnswer);
return finalAnswer;
} catch (error) {
[Link]('Erro na API:', error);
showStatus(`❌ Erro na API: ${[Link]}`);
return null;
}
}
// Destaca a resposta correta
function highlightCorrectAnswer(question, answerLetter) {
const answerIndex = [Link](0) - 65; // A=0, B=1, etc.
if (answerIndex >= 0 && answerIndex < [Link]) {
const correctAlternative = [Link][answerIndex];
// Adiciona destaque visual
[Link] = `
background: #4CAF50 !important;
transform: scale(1.05) !important;
box-shadow: 0 0 15px #4CAF50 !important;
border: 3px solid #2E7D32 !important;
border-radius: 8px !important;
`;
// Adiciona ícone de sugestão
const suggestion = [Link]('span');
[Link] = ' 🤖✨ SUGERIDO';
[Link] = `
color: #4CAF50 !important;
font-weight: bold !important;
font-size: 14px !important;
margin-left: 10px !important;
`;
const label = [Link]('label') ||
[Link](`label[for="$
{[Link]}"]`);
if (label && ) {
[Link] = 'ai-suggestion';
[Link](suggestion);
}
[Link](`Destacada alternativa ${answerLetter} para questão $
{[Link] + 1}`);
}
}
// Mostra status na página
function showStatus(message) {
let statusDiv = [Link]('ai-helper-status');
if (!statusDiv) {
statusDiv = [Link]('div');
[Link] = 'ai-helper-status';
[Link] = `
position: fixed !important;
top: 20px !important;
right: 20px !important;
background: #333 !important;
color: white !important;
padding: 15px 20px !important;
border-radius: 8px !important;
z-index: 999999 !important;
font-family: Arial, sans-serif !important;
font-size: 14px !important;
box-shadow: 0 4px 12px rgba(0,0,0,0.5) !important;
max-width: 300px !important;
word-wrap: break-word !important;
`;
[Link](statusDiv);
}
[Link] = message;
[Link]('Status:', message);
// Remove depois de 5 segundos se for mensagem de sucesso/erro
if ([Link]('✅') || [Link]('❌')) {
setTimeout(() => {
if ([Link]) {
[Link](statusDiv);
}
}, 5000);
}
}
// Escuta mensagens do popup
[Link](function(request, sender, sendResponse) {
if ([Link] === "analyzeQuestions") {
analyzeQuestions();
sendResponse({status: "Iniciando análise..."});
}
});
[Link]('UniCesumar AI Helper carregado!');