mirror of
https://codeberg.org/Gary_vov/pixeldrain-bypass-downloader
synced 2025-12-19 10:23:31 +00:00
添加 worker.js
This commit is contained in:
152
worker.js
Normal file
152
worker.js
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
// User-Agent pool to mimic browser requests
|
||||||
|
const userAgents = [
|
||||||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||||||
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15',
|
||||||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0'
|
||||||
|
];
|
||||||
|
|
||||||
|
// IMPORTANT: Configure your proxy subdomains here.
|
||||||
|
// These should be other Cloudflare Workers running the proxy logic.
|
||||||
|
const subDomains = [
|
||||||
|
'https://pdb01.yourdomain.com', // Replace with your own proxy worker URL
|
||||||
|
'https://pdb02.yourdomain.com' // Replace with your own proxy worker URL
|
||||||
|
];
|
||||||
|
|
||||||
|
// --- Main Fetch Handler ---
|
||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
const url = new URL(request.url);
|
||||||
|
const path = url.pathname;
|
||||||
|
|
||||||
|
// Route requests
|
||||||
|
if (path.startsWith('/api/generate/')) {
|
||||||
|
// API: Generate download links
|
||||||
|
const fileId = path.replace('/api/generate/', '');
|
||||||
|
return handleGenerateAPI(fileId);
|
||||||
|
} else {
|
||||||
|
// Serve the basic HTML page for all other requests
|
||||||
|
return new Response(getHtml(), {
|
||||||
|
headers: { 'Content-Type': 'text/html; charset=utf-8' }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- API Logic ---
|
||||||
|
async function handleGenerateAPI(fileId) {
|
||||||
|
if (!fileId || !/^[a-zA-Z0-9]+$/.test(fileId)) {
|
||||||
|
return new Response(JSON.stringify({ success: false, error: 'Invalid Pixeldrain URL format.' }), {
|
||||||
|
headers: { 'Content-Type': 'application/json' }, status: 400
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const fileInfo = await getPixeldrainFileInfo(fileId);
|
||||||
|
if (!fileInfo.success) {
|
||||||
|
return new Response(JSON.stringify(fileInfo), {
|
||||||
|
headers: { 'Content-Type': 'application/json' }, status: 404
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate multiple proxied download links
|
||||||
|
const downloadUrls = subDomains.map(domain => `${domain}/download/${fileId}`); // Note: Assumes proxy workers handle the /download/ path
|
||||||
|
|
||||||
|
return new Response(JSON.stringify({
|
||||||
|
success: true,
|
||||||
|
fileName: fileInfo.fileName,
|
||||||
|
downloadUrls: downloadUrls
|
||||||
|
}), {
|
||||||
|
headers: { 'Content-Type': 'application/json' }
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return new Response(JSON.stringify({ success: false, error: 'Server error. Please try again later.' }), {
|
||||||
|
headers: { 'Content-Type': 'application/json' }, status: 500
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Helper Functions ---
|
||||||
|
async function getPixeldrainFileInfo(fileId) {
|
||||||
|
const randomUserAgent = userAgents[Math.floor(Math.random() * userAgents.length)];
|
||||||
|
const infoUrl = `https://pixeldrain.com/api/file/${fileId}/info`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(infoUrl, {
|
||||||
|
headers: { 'User-Agent': randomUserAgent, 'Accept': 'application/json' }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
return { success: false, error: 'Invalid URL or file not found/expired.' };
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
if (!data.success) {
|
||||||
|
return { success: false, error: data.message || 'Could not retrieve file info.' };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { success: true, fileName: data.name || `file_${fileId}` };
|
||||||
|
} catch (error) {
|
||||||
|
return { success: false, error: 'Failed to connect to Pixeldrain API.' };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Minimalist Frontend HTML ---
|
||||||
|
function getHtml() {
|
||||||
|
return `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Minimal Pixeldrain Bypass</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: sans-serif; max-width: 600px; margin: 40px auto; padding: 20px; background: #f4f4f4; }
|
||||||
|
.container { background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
|
||||||
|
input { width: 100%; padding: 10px; margin-bottom: 10px; box-sizing: border-box; }
|
||||||
|
button { width: 100%; padding: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
|
||||||
|
#result a { display: block; margin-top: 10px; padding: 10px; background: #28a745; color: white; text-align: center; text-decoration: none; border-radius: 4px; }
|
||||||
|
#result .error { color: #dc3545; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Pixeldrain Bypass Tool</h1>
|
||||||
|
<p>Paste a Pixeldrain URL to generate a direct download link.</p>
|
||||||
|
<input type="url" id="pixeldrainUrl" placeholder="e.g., https://pixeldrain.com/u/ABC123">
|
||||||
|
<button onclick="generateLink()">Generate Link</button>
|
||||||
|
<div id="result" style="margin-top: 20px;"></div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
async function generateLink() {
|
||||||
|
const resultDiv = document.getElementById('result');
|
||||||
|
const url = document.getElementById('pixeldrainUrl').value;
|
||||||
|
const fileId = url.match(/\\/u\\/([a-zA-Z0-9]+)/)?.[1];
|
||||||
|
|
||||||
|
resultDiv.innerHTML = 'Generating...';
|
||||||
|
|
||||||
|
if (!fileId) {
|
||||||
|
resultDiv.innerHTML = '<p class="error">Invalid URL format.</p>';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/generate/' + fileId);
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
// For simplicity, we just use the first generated URL
|
||||||
|
const downloadUrl = data.downloadUrls[0];
|
||||||
|
resultDiv.innerHTML = \`<a href="\${downloadUrl}" target="_blank">Download: \${data.fileName}</a>\`;
|
||||||
|
} else {
|
||||||
|
resultDiv.innerHTML = \`<p class="error">\${data.error}</p>\`;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
resultDiv.innerHTML = '<p class="error">Request failed. Check the console.</p>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user