|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>FILESNITCH™ - The open web is a filing cabinet left unlocked</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<style> |
|
.file-icon { |
|
width: 48px; |
|
height: 48px; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
border-radius: 8px; |
|
} |
|
.pdf-icon { |
|
background-color: #FF5252; |
|
color: white; |
|
} |
|
.docx-icon { |
|
background-color: #4285F4; |
|
color: white; |
|
} |
|
.xls-icon { |
|
background-color: #0F9D58; |
|
color: white; |
|
} |
|
.csv-icon { |
|
background-color: #FF9800; |
|
color: white; |
|
} |
|
.pulse { |
|
animation: pulse 2s infinite; |
|
} |
|
@keyframes pulse { |
|
0% { |
|
opacity: 0.6; |
|
} |
|
50% { |
|
opacity: 1; |
|
} |
|
100% { |
|
opacity: 0.6; |
|
} |
|
} |
|
.loading-bar { |
|
width: 100%; |
|
height: 4px; |
|
background-color: #e5e7eb; |
|
overflow: hidden; |
|
} |
|
.loading-progress { |
|
height: 100%; |
|
width: 0%; |
|
background-color: #3b82f6; |
|
animation: loading 2s ease-in-out infinite; |
|
} |
|
@keyframes loading { |
|
0% { |
|
width: 0%; |
|
margin-left: 0; |
|
} |
|
50% { |
|
width: 100%; |
|
margin-left: 0; |
|
} |
|
100% { |
|
width: 0%; |
|
margin-left: 100%; |
|
} |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-100 min-h-screen"> |
|
<div class="bg-black text-white py-4 px-6 shadow-md"> |
|
<div class="container mx-auto flex justify-between items-center"> |
|
<div class="flex items-center space-x-2"> |
|
<i class="fas fa-file-alt text-red-500 text-2xl"></i> |
|
<h1 class="text-2xl font-bold">FILESNITCH™</h1> |
|
</div> |
|
<div class="hidden md:flex space-x-6"> |
|
<a href="#" class="hover:text-red-400 transition">How It Works</a> |
|
<a href="#" class="hover:text-red-400 transition">Pricing</a> |
|
<a href="#" class="hover:text-red-400 transition">Data Packs</a> |
|
<a href="#" class="hover:text-red-400 transition">Blog</a> |
|
</div> |
|
<button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-md font-medium transition"> |
|
Sign In |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="container mx-auto px-4 py-12"> |
|
<div class="max-w-4xl mx-auto text-center mb-12"> |
|
<h2 class="text-4xl font-bold mb-4">The open web is a filing cabinet left unlocked</h2> |
|
<p class="text-xl text-gray-600 mb-8">Feed in an IP, name, or domain — returns PDF, XLS, DOCX, and CSV files publicly indexed (and often forgotten).</p> |
|
|
|
<div class="relative max-w-2xl mx-auto"> |
|
<input type="text" id="searchQuery" placeholder="Search for domains, IPs, names, or keywords..." |
|
class="w-full px-6 py-4 rounded-full border-2 border-gray-300 focus:border-red-500 focus:outline-none shadow-lg"> |
|
<button id="searchButton" class="absolute right-2 top-2 bg-red-600 hover:bg-red-700 text-white px-6 py-2 rounded-full font-medium transition"> |
|
<i class="fas fa-search mr-2"></i> Search |
|
</button> |
|
</div> |
|
|
|
<div class="mt-4 flex flex-wrap justify-center gap-2"> |
|
<span class="text-sm text-gray-500">Try:</span> |
|
<button class="text-sm text-red-600 hover:text-red-800 hover:underline" onclick="setExample('site:gov contracts')">government contracts</button> |
|
<span class="text-sm text-gray-500">•</span> |
|
<button class="text-sm text-red-600 hover:text-red-800 hover:underline" onclick="setExample('filetype:pdf court filing')">court filings</button> |
|
<span class="text-sm text-gray-500">•</span> |
|
<button class="text-sm text-red-600 hover:text-red-800 hover:underline" onclick="setExample('filetype:xls financial data')">financial data</button> |
|
</div> |
|
</div> |
|
|
|
<div id="resultsContainer" class="hidden"> |
|
<div class="flex justify-between items-center mb-6"> |
|
<h3 class="text-2xl font-semibold">Search Results</h3> |
|
<div class="flex items-center space-x-4"> |
|
<div class="flex items-center"> |
|
<span class="mr-2 text-sm text-gray-600">Filter:</span> |
|
<select id="fileTypeFilter" class="border rounded px-3 py-1 text-sm"> |
|
<option value="all">All File Types</option> |
|
<option value="pdf">PDF</option> |
|
<option value="docx">DOCX</option> |
|
<option value="xls">XLS/XLSX</option> |
|
<option value="csv">CSV</option> |
|
</select> |
|
</div> |
|
<button id="buyPackButton" class="bg-green-600 hover:bg-green-700 text-white px-4 py-1 rounded-md text-sm font-medium hidden"> |
|
<i class="fas fa-shopping-cart mr-1"></i> Buy Data Pack |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div id="loadingIndicator" class="hidden"> |
|
<div class="loading-bar mb-4"> |
|
<div class="loading-progress"></div> |
|
</div> |
|
<p class="text-center text-gray-500">Searching the depths of the open web...</p> |
|
</div> |
|
|
|
<div id="resultsList" class="space-y-4"> |
|
|
|
</div> |
|
|
|
<div id="pagination" class="mt-8 flex justify-center space-x-2 hidden"> |
|
<button id="prevPage" class="px-4 py-2 border rounded-md hover:bg-gray-100 disabled:opacity-50"> |
|
<i class="fas fa-chevron-left mr-1"></i> Previous |
|
</button> |
|
<div id="pageNumbers" class="flex space-x-1"> |
|
|
|
</div> |
|
<button id="nextPage" class="px-4 py-2 border rounded-md hover:bg-gray-100 disabled:opacity-50"> |
|
Next <i class="fas fa-chevron-right ml-1"></i> |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div id="noResults" class="hidden text-center py-12"> |
|
<i class="fas fa-file-excel text-5xl text-gray-400 mb-4"></i> |
|
<h3 class="text-2xl font-semibold mb-2">No documents found</h3> |
|
<p class="text-gray-600 mb-6">Try refining your search with specific keywords or file types.</p> |
|
<button onclick="resetSearch()" class="bg-red-600 hover:bg-red-700 text-white px-6 py-2 rounded-md font-medium"> |
|
<i class="fas fa-redo mr-2"></i> New Search |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="bg-gray-900 text-white py-12"> |
|
<div class="container mx-auto px-4"> |
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-8"> |
|
<div> |
|
<h4 class="text-xl font-bold mb-4">Data Packs</h4> |
|
<ul class="space-y-2"> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Government Contracts</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Court Filings</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Small Town Corruption</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Corporate Leaks</a></li> |
|
</ul> |
|
</div> |
|
<div> |
|
<h4 class="text-xl font-bold mb-4">Resources</h4> |
|
<ul class="space-y-2"> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Search Tips</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">API Documentation</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Data Privacy</a></li> |
|
</ul> |
|
</div> |
|
<div> |
|
<h4 class="text-xl font-bold mb-4">Company</h4> |
|
<ul class="space-y-2"> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">About Us</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Careers</a></li> |
|
<li><a href="#" class="text-gray-400 hover:text-white transition">Contact</a></li> |
|
</ul> |
|
</div> |
|
<div> |
|
<h4 class="text-xl font-bold mb-4">Subscribe</h4> |
|
<p class="text-gray-400 mb-4">Get notified when we add new data packs.</p> |
|
<div class="flex"> |
|
<input type="email" placeholder="Your email" class="px-4 py-2 rounded-l-md text-gray-900 w-full"> |
|
<button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-r-md"> |
|
<i class="fas fa-paper-plane"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="border-t border-gray-800 mt-8 pt-8 text-center text-gray-500"> |
|
<p>© 2023 FILESNITCH™. All rights reserved. The information provided is from publicly available sources.</p> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
const API_KEY = 'AIzaSyDzq7qYyQjQ6mQ6v6q6q6q6q6q6q6q6q6q'; |
|
const SEARCH_ENGINE_ID = '012345678901234567890:abcdefghijk'; |
|
let currentPage = 1; |
|
let currentQuery = ''; |
|
let totalResults = 0; |
|
let resultsPerPage = 5; |
|
|
|
|
|
const searchQueryInput = document.getElementById('searchQuery'); |
|
const searchButton = document.getElementById('searchButton'); |
|
const resultsContainer = document.getElementById('resultsContainer'); |
|
const resultsList = document.getElementById('resultsList'); |
|
const loadingIndicator = document.getElementById('loadingIndicator'); |
|
const noResults = document.getElementById('noResults'); |
|
const pagination = document.getElementById('pagination'); |
|
const prevPageButton = document.getElementById('prevPage'); |
|
const nextPageButton = document.getElementById('nextPage'); |
|
const pageNumbersContainer = document.getElementById('pageNumbers'); |
|
const fileTypeFilter = document.getElementById('fileTypeFilter'); |
|
const buyPackButton = document.getElementById('buyPackButton'); |
|
|
|
|
|
searchButton.addEventListener('click', performSearch); |
|
searchQueryInput.addEventListener('keypress', function(e) { |
|
if (e.key === 'Enter') { |
|
performSearch(); |
|
} |
|
}); |
|
prevPageButton.addEventListener('click', goToPreviousPage); |
|
nextPageButton.addEventListener('click', goToNextPage); |
|
fileTypeFilter.addEventListener('change', filterResultsByFileType); |
|
|
|
|
|
function setExample(query) { |
|
searchQueryInput.value = query; |
|
searchQueryInput.focus(); |
|
} |
|
|
|
|
|
function resetSearch() { |
|
resultsContainer.classList.add('hidden'); |
|
noResults.classList.add('hidden'); |
|
searchQueryInput.value = ''; |
|
searchQueryInput.focus(); |
|
} |
|
|
|
|
|
function performSearch() { |
|
const query = searchQueryInput.value.trim(); |
|
if (!query) return; |
|
|
|
currentQuery = query; |
|
currentPage = 1; |
|
|
|
resultsContainer.classList.remove('hidden'); |
|
resultsList.innerHTML = ''; |
|
loadingIndicator.classList.remove('hidden'); |
|
noResults.classList.add('hidden'); |
|
pagination.classList.add('hidden'); |
|
|
|
searchDocuments(query, currentPage); |
|
} |
|
|
|
|
|
function searchDocuments(query, page) { |
|
const startIndex = (page - 1) * resultsPerPage + 1; |
|
const fileTypes = ['pdf', 'docx', 'xls', 'csv']; |
|
const fileTypeQueries = fileTypes.map(type => `filetype:${type}`).join(' OR '); |
|
|
|
const fullQuery = `${query} AND (${fileTypeQueries})`; |
|
|
|
fetch(`https://www.googleapis.com/customsearch/v1?key=${API_KEY}&cx=${SEARCH_ENGINE_ID}&q=${encodeURIComponent(fullQuery)}&start=${startIndex}&num=${resultsPerPage}`) |
|
.then(response => { |
|
if (!response.ok) { |
|
throw new Error('Network response was not ok'); |
|
} |
|
return response.json(); |
|
}) |
|
.then(data => { |
|
loadingIndicator.classList.add('hidden'); |
|
|
|
if (data.items && data.items.length > 0) { |
|
totalResults = Math.min(data.searchInformation.totalResults, 100); |
|
displayResults(data.items); |
|
updatePagination(); |
|
} else { |
|
showNoResults(); |
|
} |
|
}) |
|
.catch(error => { |
|
console.error('Error fetching search results:', error); |
|
loadingIndicator.classList.add('hidden'); |
|
showNoResults(); |
|
}); |
|
} |
|
|
|
|
|
function displayResults(items) { |
|
resultsList.innerHTML = ''; |
|
|
|
items.forEach(item => { |
|
const fileType = getFileType(item.link); |
|
const fileIcon = getFileIcon(fileType); |
|
const fileIconClass = getFileIconClass(fileType); |
|
|
|
const resultElement = document.createElement('div'); |
|
resultElement.className = 'bg-white p-6 rounded-lg shadow-md hover:shadow-lg transition'; |
|
resultElement.innerHTML = ` |
|
<div class="flex items-start space-x-4"> |
|
<div class="file-icon ${fileIconClass}"> |
|
<i class="${fileIcon} text-2xl"></i> |
|
</div> |
|
<div class="flex-1"> |
|
<h4 class="text-lg font-semibold mb-1"> |
|
<a href="${item.link}" target="_blank" class="text-blue-600 hover:underline">${item.title || 'Untitled Document'}</a> |
|
</h4> |
|
<p class="text-sm text-gray-600 mb-2">${item.snippet || 'No description available.'}</p> |
|
<div class="flex flex-wrap items-center text-xs text-gray-500 space-x-4"> |
|
<span class="flex items-center"> |
|
<i class="fas fa-link mr-1"></i> ${extractDomain(item.link)} |
|
</span> |
|
<span class="flex items-center"> |
|
<i class="fas fa-file-${fileType === 'csv' ? 'excel' : fileType} mr-1"></i> ${fileType.toUpperCase()} |
|
</span> |
|
<span class="flex items-center"> |
|
<i class="fas fa-download mr-1"></i> |
|
<a href="${item.link}" target="_blank" class="text-blue-500 hover:underline">Download</a> |
|
</span> |
|
</div> |
|
</div> |
|
<div class="flex flex-col items-center"> |
|
<span class="text-xs text-gray-500 mb-2">$0.99</span> |
|
<button class="bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded-md text-xs"> |
|
<i class="fas fa-unlock-alt mr-1"></i> Unlock |
|
</button> |
|
</div> |
|
</div> |
|
`; |
|
resultsList.appendChild(resultElement); |
|
}); |
|
|
|
|
|
if (totalResults > 5) { |
|
buyPackButton.classList.remove('hidden'); |
|
} else { |
|
buyPackButton.classList.add('hidden'); |
|
} |
|
} |
|
|
|
|
|
function filterResultsByFileType() { |
|
const selectedType = fileTypeFilter.value; |
|
if (selectedType === 'all') { |
|
|
|
document.querySelectorAll('#resultsList > div').forEach(el => { |
|
el.style.display = 'block'; |
|
}); |
|
} else { |
|
|
|
document.querySelectorAll('#resultsList > div').forEach(el => { |
|
const fileType = el.querySelector('i.fa-file-pdf, i.fa-file-word, i.fa-file-excel, i.fa-file-csv').classList.value.includes(selectedType); |
|
el.style.display = fileType ? 'block' : 'none'; |
|
}); |
|
} |
|
} |
|
|
|
|
|
function updatePagination() { |
|
pagination.classList.remove('hidden'); |
|
prevPageButton.disabled = currentPage === 1; |
|
|
|
const totalPages = Math.ceil(totalResults / resultsPerPage); |
|
nextPageButton.disabled = currentPage === totalPages; |
|
|
|
|
|
pageNumbersContainer.innerHTML = ''; |
|
const maxVisiblePages = 5; |
|
let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2)); |
|
let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1); |
|
|
|
if (endPage - startPage + 1 < maxVisiblePages) { |
|
startPage = Math.max(1, endPage - maxVisiblePages + 1); |
|
} |
|
|
|
if (startPage > 1) { |
|
const pageElement = document.createElement('button'); |
|
pageElement.className = 'px-4 py-2 border rounded-md hover:bg-gray-100'; |
|
pageElement.textContent = '1'; |
|
pageElement.addEventListener('click', () => goToPage(1)); |
|
pageNumbersContainer.appendChild(pageElement); |
|
|
|
if (startPage > 2) { |
|
const ellipsis = document.createElement('span'); |
|
ellipsis.className = 'px-2 py-2'; |
|
ellipsis.textContent = '...'; |
|
pageNumbersContainer.appendChild(ellipsis); |
|
} |
|
} |
|
|
|
for (let i = startPage; i <= endPage; i++) { |
|
const pageElement = document.createElement('button'); |
|
pageElement.className = i === currentPage |
|
? 'px-4 py-2 border rounded-md bg-red-600 text-white' |
|
: 'px-4 py-2 border rounded-md hover:bg-gray-100'; |
|
pageElement.textContent = i; |
|
pageElement.addEventListener('click', () => goToPage(i)); |
|
pageNumbersContainer.appendChild(pageElement); |
|
} |
|
|
|
if (endPage < totalPages) { |
|
if (endPage < totalPages - 1) { |
|
const ellipsis = document.createElement('span'); |
|
ellipsis.className = 'px-2 py-2'; |
|
ellipsis.textContent = '...'; |
|
pageNumbersContainer.appendChild(ellipsis); |
|
} |
|
|
|
const pageElement = document.createElement('button'); |
|
pageElement.className = 'px-4 py-2 border rounded-md hover:bg-gray-100'; |
|
pageElement.textContent = totalPages; |
|
pageElement.addEventListener('click', () => goToPage(totalPages)); |
|
pageNumbersContainer.appendChild(pageElement); |
|
} |
|
} |
|
|
|
|
|
function goToPage(page) { |
|
if (page === currentPage) return; |
|
|
|
currentPage = page; |
|
resultsList.innerHTML = ''; |
|
loadingIndicator.classList.remove('hidden'); |
|
window.scrollTo({ top: 0, behavior: 'smooth' }); |
|
|
|
searchDocuments(currentQuery, currentPage); |
|
} |
|
|
|
function goToPreviousPage() { |
|
if (currentPage > 1) { |
|
goToPage(currentPage - 1); |
|
} |
|
} |
|
|
|
function goToNextPage() { |
|
const totalPages = Math.ceil(totalResults / resultsPerPage); |
|
if (currentPage < totalPages) { |
|
goToPage(currentPage + 1); |
|
} |
|
} |
|
|
|
|
|
function showNoResults() { |
|
resultsContainer.classList.add('hidden'); |
|
noResults.classList.remove('hidden'); |
|
} |
|
|
|
|
|
function getFileType(url) { |
|
if (url.toLowerCase().endsWith('.pdf')) return 'pdf'; |
|
if (url.toLowerCase().endsWith('.docx')) return 'docx'; |
|
if (url.toLowerCase().endsWith('.xls') || url.toLowerCase().endsWith('.xlsx')) return 'xls'; |
|
if (url.toLowerCase().endsWith('.csv')) return 'csv'; |
|
return 'unknown'; |
|
} |
|
|
|
function getFileIcon(fileType) { |
|
switch(fileType) { |
|
case 'pdf': return 'fas fa-file-pdf'; |
|
case 'docx': return 'fas fa-file-word'; |
|
case 'xls': return 'fas fa-file-excel'; |
|
case 'csv': return 'fas fa-file-csv'; |
|
default: return 'fas fa-file'; |
|
} |
|
} |
|
|
|
function getFileIconClass(fileType) { |
|
switch(fileType) { |
|
case 'pdf': return 'pdf-icon'; |
|
case 'docx': return 'docx-icon'; |
|
case 'xls': return 'xls-icon'; |
|
case 'csv': return 'csv-icon'; |
|
default: return 'bg-gray-500'; |
|
} |
|
} |
|
|
|
function extractDomain(url) { |
|
try { |
|
const domain = new URL(url).hostname.replace('www.', ''); |
|
return domain.length > 30 ? domain.substring(0, 27) + '...' : domain; |
|
} catch { |
|
return url.length > 30 ? url.substring(0, 27) + '...' : url; |
|
} |
|
} |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=numbpilled/filesnitch-feed-it-ip-name-domain-return-pdf-xlds-csv-of-all-related-and-indexed-files" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |