Skip to content

Instantly share code, notes, and snippets.

@hotsoft-desenv2
Last active February 21, 2025 22:14
Show Gist options
  • Save hotsoft-desenv2/d7e33eeea0cd34da5b4150e935caad1b to your computer and use it in GitHub Desktop.
Save hotsoft-desenv2/d7e33eeea0cd34da5b4150e935caad1b to your computer and use it in GitHub Desktop.
(async function() {
const baseUrl = "https://intranet.rgk4it.com/znuny/customer.pl";
const ticketsPerPage = 30; // 30 tickets por página
const totalTickets = 4413; // Total de tickets
const totalPages = Math.ceil(totalTickets / ticketsPerPage); // 148 páginas
let totalDownloaded = 0;
let totalRemaining = totalTickets;
// Função para carregar TicketIDs processados
function loadProcessedTickets() {
const processedTickets = localStorage.getItem('processedTickets');
return processedTickets ? JSON.parse(processedTickets) : [];
}
// Função para salvar TicketIDs processados
function saveProcessedTickets(processedTickets) {
localStorage.setItem('processedTickets', JSON.stringify(processedTickets));
}
// Função para carregar páginas processadas
function loadProcessedPages() {
const processedPages = localStorage.getItem('processedPages');
return processedPages ? JSON.parse(processedPages) : [];
}
// Função para salvar páginas processadas
function saveProcessedPages(processedPages) {
localStorage.setItem('processedPages', JSON.stringify(processedPages));
}
// Carregar TicketIDs e páginas já processados
const processedTickets = new Set(loadProcessedTickets());
const processedPages = new Set(loadProcessedPages());
// Adiciona um aviso visual para o usuário
const warningDiv = document.createElement('div');
warningDiv.textContent = "Não recarregue ou feche esta página. O script está em execução.";
warningDiv.style.position = 'fixed';
warningDiv.style.top = '0';
warningDiv.style.left = '0';
warningDiv.style.width = '100%';
warningDiv.style.padding = '10px';
warningDiv.style.backgroundColor = 'red';
warningDiv.style.color = 'white';
warningDiv.style.textAlign = 'center';
warningDiv.style.zIndex = '9999';
document.body.appendChild(warningDiv);
// Função para baixar o PDF sem abrir
async function downloadPDF(ticketNumber) {
if (processedTickets.has(ticketNumber)) {
console.log(`Ticket ${ticketNumber} já processado, pulando...`);
totalDownloaded++;
totalRemaining--;
console.log(`Progresso: ${totalDownloaded} baixados, ${totalRemaining} restantes.`);
return;
}
console.log(`Processando ticket: ${ticketNumber}`);
const ticketUrl = `${baseUrl}?Action=CustomerPortalTicketZoom;TicketNumber=${ticketNumber}`;
try {
const response = await fetch(ticketUrl);
const htmlText = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(htmlText, 'text/html');
const ticketIdInput = doc.querySelector('input[name="TicketID"]');
if (!ticketIdInput) {
console.warn(`TicketID não encontrado para ${ticketNumber}`);
return;
}
const ticketId = ticketIdInput.value;
console.log(`TicketID encontrado: ${ticketId}`);
const pdfUrl = `${baseUrl}?Action=CustomerTicketPrint;TicketID=${ticketId}`;
const pdfResponse = await fetch(pdfUrl, {
headers: {
'Accept': 'application/pdf' // Força o tipo como PDF puro
}
});
const blob = await pdfResponse.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${ticketNumber}.pdf`;
a.style.display = 'none'; // Evita interferência visual
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
console.log(`PDF baixado: ${ticketNumber}.pdf`);
totalDownloaded++;
totalRemaining--;
console.log(`Progresso: ${totalDownloaded} baixados, ${totalRemaining} restantes.`);
processedTickets.add(ticketNumber); // Adicionar TicketNumber aos processados
saveProcessedTickets([...processedTickets]); // Salvar processados
} catch (e) {
console.error(`Erro ao processar ${ticketNumber}: ${e.message}`);
}
}
// Função para processar todos os tickets de uma página simultaneamente
async function processPageTickets(ticketNumbers) {
const downloadPromises = ticketNumbers.map(ticketNumber => downloadPDF(ticketNumber));
await Promise.all(downloadPromises); // Executa todos os downloads em paralelo
}
// Função para processar todas as páginas via fetch
async function processAllPages() {
for (let page = 1; page <= totalPages; page++) {
if (processedPages.has(page)) {
console.log(`Página ${page} já processada, pulando...`);
continue;
}
const startHit = (page - 1) * ticketsPerPage + 1; // 1, 31, 61, ...
const pageUrl = `${baseUrl}?Action=CompanyTickets;SortBy=Age;OrderBy=Down;Filter=All;Subaction=CompanyTickets;CustomerIDs=hotsoft;StartWindow=0;StartHit=${startHit}`;
console.log(`Buscando página ${page} de ${totalPages}: ${pageUrl}`);
try {
const response = await fetch(pageUrl);
const htmlText = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(htmlText, 'text/html');
const ticketLinks = doc.querySelectorAll('td.TicketNumber a.MasterActionLink');
const ticketNumbers = Array.from(ticketLinks).map(link => link.textContent);
console.log(`Tickets na página ${page}: ${ticketNumbers.length}`);
if (ticketNumbers.length === 0) {
console.log(`Nenhum ticket encontrado na página ${page}, parando.`);
break;
}
// Processar todos os tickets da página simultaneamente
await processPageTickets(ticketNumbers);
processedPages.add(page); // Adicionar a página aos processados
saveProcessedPages([...processedPages]); // Salvar páginas processadas
console.log(`Página ${page} processada. Progresso geral: ${page}/${totalPages} páginas.`);
} catch (e) {
console.error(`Erro ao buscar página ${page}: ${e.message}`);
break;
}
}
console.log("Todas as páginas foram processadas!");
// Remover o aviso visual após a conclusão
warningDiv.remove();
}
// Iniciar
await processAllPages();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment