Real-Time Phishing & Scam Order Identifier

Real-Time Phishing & Scam Order Identifier

Analyze orders against customizable risk rules to flag suspicious activity.

Configure your orders and risk rules, then click "Analyze Orders" to see the fraud report.

Risk Factors:

    ${order.reasons.length > 0 ? order.reasons.map(r => `
  • ${r}
  • `).join('') : '
  • None Detected
  • '}
`; resultsContainer.appendChild(card); }); downloadPdfBtn.disabled = false; }; // --- CORE LOGIC --- const analyzeOrderRisk = (order, rules) => { let score = 0; let reasons = []; // Rule 1: High value order if (order.value >= rules.highValueThreshold) { score += 50; reasons.push(`High order value ($${order.value.toFixed(2)})`); } // Rule 2: Disposable email domain const emailDomain = order.email.split('@')[1]; if (emailDomain && rules.disposableDomains.includes(emailDomain.toLowerCase())) { score += 40; reasons.push(`Disposable email domain (${emailDomain})`); } // Rule 3: Risky address keywords const addressLower = order.address.toLowerCase(); if (rules.riskyAddressKeywords.some(keyword => addressLower.includes(keyword))) { score += 30; reasons.push('Address contains risky keywords (e.g., P.O. Box)'); } let riskLevel = 'Low'; if (score >= 70) riskLevel = 'High'; else if (score >= 30) riskLevel = 'Medium'; return { ...order, riskLevel, reasons }; }; // --- UI & EVENT HANDLERS --- const switchTab = (tabId) => { currentTab = tabId; Object.values(tabPanes).forEach(pane => pane.classList.add('hidden')); tabPanes[tabId].classList.remove('hidden'); Object.values(tabButtons).forEach(btn => btn.classList.replace('tab-active', 'tab-inactive')); tabButtons[tabId].classList.replace('tab-inactive', 'tab-active'); updateNavButtons(); }; const navigateTabs = (direction) => { const currentIndex = tabs.indexOf(currentTab); const newIndex = direction === 'next' ? currentIndex + 1 : currentIndex - 1; if (newIndex >= 0 && newIndex < tabs.length) switchTab(tabs[newIndex]); }; const updateNavButtons = () => { const currentIndex = tabs.indexOf(currentTab); prevBtn.disabled = currentIndex === 0; nextBtn.disabled = currentIndex === tabs.length - 1; prevBtn.classList.toggle('opacity-50', prevBtn.disabled); nextBtn.classList.toggle('opacity-50', nextBtn.disabled); }; const handleScanOrders = () => { scanOrdersBtnSpinner.classList.remove('hidden'); scanOrdersBtnText.textContent = 'Analyzing...'; scanOrdersBtn.disabled = true; setTimeout(() => { const rules = { highValueThreshold: parseFloat(document.getElementById('high-value-threshold').value) || 99999, disposableDomains: document.getElementById('disposable-domains').value.split('\n').map(d => d.trim().toLowerCase()).filter(Boolean), riskyAddressKeywords: document.getElementById('risky-address-keywords').value.split(',').map(k => k.trim().toLowerCase()).filter(Boolean) }; const analyzedOrders = orders.map(order => analyzeOrderRisk(order, rules)); renderScanResults(analyzedOrders); switchTab('dashboard'); scanOrdersBtnSpinner.classList.add('hidden'); scanOrdersBtnText.textContent = 'Analyze Orders'; scanOrdersBtn.disabled = false; }, 500); }; const handlePdfDownload = () => { const rules = { highValueThreshold: parseFloat(document.getElementById('high-value-threshold').value), disposableDomains: document.getElementById('disposable-domains').value.split('\n').map(d => d.trim().toLowerCase()), riskyAddressKeywords: document.getElementById('risky-address-keywords').value.split(',').map(k => k.trim().toLowerCase()) }; const analyzedOrders = orders.map(order => analyzeOrderRisk(order, rules)); if(analyzedOrders.length === 0) return; let pdfHtml = `

Order Fraud Analysis Report

${analyzedOrders.map(order => ` `).join('')}
Order ID Risk Level Details & Risk Factors
${order.orderId} ${order.riskLevel} Email: ${order.email}
Value: $${order.value.toFixed(2)}
Factors: ${order.reasons.length > 0 ? order.reasons.join(', ') : 'None'}
`; pdfRenderContainer.innerHTML = pdfHtml; html2canvas(pdfRenderContainer, { scale: 2 }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight); pdf.save('Fraud-Analysis-Report.pdf'); }); }; // --- EVENT LISTENERS --- window.switchTab = switchTab; window.navigateTabs = navigateTabs; scanOrdersBtn.addEventListener('click', handleScanOrders); downloadPdfBtn.addEventListener('click', handlePdfDownload); addOrderBtn.addEventListener('click', () => { const newOrder = { id: nextId++, orderId: `US-NEW-${nextId}`, email: 'new@example.com', address: '123 New Address', value: 0.00 }; orders.push(newOrder); renderConfigTable(); }); configTableBody.addEventListener('input', e => { if (e.target.classList.contains('config-input')) { const id = parseInt(e.target.closest('tr').dataset.id); const prop = e.target.dataset.prop; const order = orders.find(o => o.id === id); if (order) { const value = e.target.type === 'number' ? parseFloat(e.target.value) || 0 : e.target.value; order[prop] = value; } } }); configTableBody.addEventListener('click', e => { if (e.target.classList.contains('remove-row-btn')) { const idToRemove = parseInt(e.target.closest('tr').dataset.id); orders = orders.filter(o => o.id !== idToRemove); renderConfigTable(); } }); // --- INITIALIZATION --- renderConfigTable(); updateNavButtons(); switchTab('dashboard'); });
Scroll to Top