init: scripts diversos (crawlers, conversores, scrapers)

This commit is contained in:
2026-03-05 20:38:36 +00:00
commit 6ac6f4be2a
925 changed files with 850330 additions and 0 deletions

View File

@@ -0,0 +1,112 @@
/**
* geminiService.ts
*
* @author Descomplicar® Crescimento Digital
* @link https://descomplicar.pt
* @copyright 2025 Descomplicar®
*/
import { GoogleGenAI, Type } from "@google/genai";
import type { Email, ClassifiedCategory, CategorizedEmails } from "../types";
import { EmailCategory } from "../types";
const MOCKED_RESPONSE: ClassifiedCategory[] = [
{
category: EmailCategory.PROMOTIONS,
summary: "Ofertas especiais e descontos de várias lojas online.",
email_ids: [2, 5, 8, 11]
},
{
category: EmailCategory.NOTIFICATIONS,
summary: "Alertas de login, atualizações de projetos e menções em redes sociais.",
email_ids: [1, 4, 7, 10, 13]
},
{
category: EmailCategory.NEWSLETTERS,
summary: "Boletins informativos de tecnologia, design e notícias gerais.",
email_ids: [3, 6, 9, 12, 14]
}
];
const processApiResponse = (
response: ClassifiedCategory[],
allEmails: Email[]
): CategorizedEmails => {
const categorized: CategorizedEmails = {};
for (const item of response) {
const categoryKey = item.category;
if (categoryKey !== EmailCategory.IMPORTANT && categoryKey !== EmailCategory.UNKNOWN) {
const emailsInCategory = item.email_ids.map(id =>
allEmails.find(email => email.id === id)
).filter((email): email is Email => email !== undefined);
if(emailsInCategory.length > 0) {
if (!categorized[categoryKey]) {
categorized[categoryKey] = { summary: item.summary, emails: [] };
}
categorized[categoryKey].summary = item.summary;
categorized[categoryKey].emails.push(...emailsInCategory);
}
}
}
return categorized;
};
export const classifyEmails = async (emails: Email[], apiKey: string): Promise<CategorizedEmails> => {
if (!apiKey) {
console.warn("API_KEY for Gemini is not provided. Using mocked data.");
await new Promise(resolve => setTimeout(resolve, 2000));
return processApiResponse(MOCKED_RESPONSE, emails);
}
const ai = new GoogleGenAI({ apiKey });
const emailPromptData = emails.map(e => ({
id: e.id,
from: e.sender,
subject: e.subject,
snippet: e.snippet
}));
const prompt = `
Você é um especialista em organização de e-mails. Analise a seguinte lista de e-mails em formato JSON.
1. Categorize cada e-mail em uma das seguintes categorias base: ${Object.values(EmailCategory).join(', ')}.
2. Agrupe os e-mails por categoria. Para cada categoria, forneça um breve resumo em português do conteúdo e uma lista dos IDs dos e-mails correspondentes.
3. NÃO inclua a categoria 'IMPORTANTE' no resultado final.
Aqui está a lista de e-mails:
${JSON.stringify(emailPromptData, null, 2)}
`;
try {
const response = await ai.models.generateContent({
model: "gemini-2.5-flash",
contents: prompt,
config: {
responseMimeType: "application/json",
responseSchema: {
type: Type.ARRAY,
items: {
type: Type.OBJECT,
properties: {
category: { type: Type.STRING },
summary: { type: Type.STRING },
email_ids: { type: Type.ARRAY, items: { type: Type.INTEGER } }
}
}
}
}
});
const classifiedData = JSON.parse(response.text);
return processApiResponse(classifiedData, emails);
} catch (error) {
console.error("Error calling Gemini API:", error);
throw new Error("Failed to classify emails with Gemini API.");
}
};

View File

@@ -0,0 +1,34 @@
/**
* perfexCrmService.ts
*
* @author Descomplicar® Crescimento Digital
* @link https://descomplicar.pt
* @copyright 2025 Descomplicar®
*/
import type { CrmSettings } from '../types';
/**
* Simula a exclusão de tickets no Perfex CRM com base nos remetentes de e-mail.
*/
export const deleteTicketsFromSendersInPerfex = (
settings: CrmSettings,
senderEmails: string[]
): Promise<number> => {
console.log('Iniciando exclusão de tickets de spam/notificações no Perfex CRM...');
console.log('Remetentes alvo:', senderEmails);
return new Promise((resolve, reject) => {
setTimeout(() => {
if (!settings.url || !settings.token) {
return reject(new Error('Não foi possível excluir tickets: URL do CRM ou Token não configurado.'));
}
if (settings.token === 'fail') {
return reject(new Error('Falha ao excluir tickets no Perfex CRM.'));
}
const simulatedDeletedCount = Math.floor(Math.random() * senderEmails.length) + 1;
console.log(`Sucesso! ${simulatedDeletedCount} tickets foram "excluídos" do Perfex CRM.`);
resolve(simulatedDeletedCount);
}, 1500);
});
};