Некоторые сайты защищаются от скачивания изображений, например с помощью cloudflare.
Если у вас есть список изображений в формате aria2c, то вы можете скачать их следующим способом:
1. Заходим на сайт донора (а лучше на страницу с изображением товара). чтобы прошли все проверки защиты от скачивания.
2. Нажимаем F12, откроется панель инструментов разработчика, переходим на вкладку Console (Консоль).
3. Вводим там следующий код и нажимаем Enter (выделить можно тройным кликом левой кнопки мыши):
let fetchMethodBlocked=false;function init(){const c=document.createElement("div");c.id="downloader-container";function forceRepaint(e){requestAnimationFrame(()=>requestAnimationFrame(()=>{e.offsetHeight;const o=e.style.opacity;e.style.opacity='0.99';setTimeout(()=>{e.style.opacity=o||'1';e.style.transform='translateZ(0)';setTimeout(()=>e.style.transform='',1)},1)}))}function applyStyles(){const s={'#downloader-container':{position:'fixed',top:'10px',left:'10px','z-index':'999999',background:'#ffffff',padding:'15px','border-radius':'10px',color:'#333333','font-family':'Arial, sans-serif','font-size':'14px','min-width':'280px','max-width':'320px','box-shadow':'0 0 30px rgba(0, 0, 0, .5)',border:'none',display:'block',margin:'0',width:'auto',height:'auto',overflow:'visible','box-sizing':'border-box','line-height':'normal','text-align':'left','white-space':'normal',opacity:'1',visibility:'visible',transform:'none',filter:'none'},h3:{margin:'0 0 10px 0',padding:'0',color:'#00bfff','font-size':'16px','font-weight':'bold','font-family':'Arial, sans-serif','line-height':'1.2','text-align':'left','text-decoration':'none','text-transform':'none','letter-spacing':'normal',background:'transparent',border:'none',display:'block',width:'auto',height:'auto'},label:{display:'block',margin:'0 0 3px 0',padding:'0','font-size':'12px',color:'#333333','font-weight':'normal','font-family':'Arial, sans-serif','text-shadow':'none','line-height':'1.2','text-align':'left',background:'transparent',border:'none',cursor:'default',width:'auto',height:'auto','text-decoration':'none','text-transform':'none','letter-spacing':'normal'},'input[type="number"]':{padding:'4px',margin:'0',border:'1px solid #ccc',background:'#ffffff',color:'#333333','border-radius':'4px','font-size':'12px','font-family':'Arial, sans-serif','font-weight':'normal','line-height':'normal','text-align':'left','vertical-align':'baseline','box-sizing':'border-box',outline:'none','box-shadow':'none','text-decoration':'none','text-transform':'none','letter-spacing':'normal',display:'inline-block',height:'auto','-webkit-appearance':'none','-moz-appearance':'textfield',appearance:'none',width:'120px'},select:{width:'120px',padding:'4px',margin:'0',border:'1px solid #ccc',background:'#ffffff',color:'#333333','border-radius':'4px','font-size':'12px','font-family':'Arial, sans-serif','font-weight':'normal','line-height':'normal','text-align':'left','vertical-align':'baseline','box-sizing':'border-box',outline:'none','box-shadow':'none','text-decoration':'none','text-transform':'none','letter-spacing':'normal',display:'inline-block',height:'auto','-webkit-appearance':'none','-moz-appearance':'none',appearance:'none'},option:{color:'#333333',background:'#ffffff',padding:'2px',margin:'0','font-size':'12px','font-family':'Arial, sans-serif'},div:{margin:'0 0 8px 0',padding:'0',border:'none',background:'transparent',color:'inherit','font-family':'inherit','font-size':'inherit','line-height':'normal','text-align':'left',display:'block',width:'auto',height:'auto','box-sizing':'border-box',overflow:'visible'},button:{width:'100%',padding:'12px',margin:'5px 0 0 0',background:'#00bfff',color:'#ffffff',border:'none','border-radius':'6px',cursor:'pointer','font-size':'14px','font-weight':'bold','font-family':'Arial, sans-serif','line-height':'normal','text-align':'center','vertical-align':'baseline','box-sizing':'border-box',outline:'none','box-shadow':'none','text-decoration':'none','text-transform':'none','letter-spacing':'normal',display:'block',height:'auto','-webkit-appearance':'none','-moz-appearance':'none',appearance:'none','white-space':'nowrap',overflow:'hidden','text-overflow':'ellipsis'},'input[type="file"]':{display:'none',visibility:'hidden',opacity:'0',position:'absolute',top:'-9999px',left:'-9999px',width:'0',height:'0'}};Object.entries(s).forEach(([sel,props])=>{const els=sel==='#downloader-container'?[c]:sel==='div'?Array.from(c.querySelectorAll('div')).filter(d=>d!==c):c.querySelectorAll(sel);els.forEach(el=>Object.entries(props).forEach(([prop,val])=>el.style.setProperty(prop,val,'important')))});const btn=c.querySelector('button');if(btn){btn.addEventListener('mouseenter',()=>btn.style.setProperty('background','#0099cc','important'));btn.addEventListener('mouseleave',()=>btn.style.setProperty('background','#00bfff','important'))}forceRepaint(c);const oh=c.style.height;c.style.height='auto';c.offsetHeight;c.style.height=oh}const settingsHtml=`<div><h3>⚙️ Настройки загрузки</h3><div><label for="batch-size">Размер пакета (1-5):</label><input type="number" id="batch-size" min="1" max="5" value="3"></div><div><label for="batch-delay">Задержка между пакетами (мс):</label><input type="number" id="batch-delay" min="0" max="10000" value="500" step="100"></div><div><label for="presets">Предустановки:</label><select id="presets"><option value="fast">Быстро (5, 300ms)</option><option value="normal" selected>Обычно (3, 500ms)</option><option value="slow">Медленно (2, 1000ms)</option><option value="careful">Осторожно (1, 2000ms)</option></select></div></div>`;c.innerHTML=settingsHtml;const a=document.createElement("input");a.type="file";a.accept=".txt";a.id="f123";const b=document.createElement("button");b.textContent="Выберите файл urls.txt";b.id="b123";b.onclick=()=>a.click();c.appendChild(b);c.appendChild(a);document.body.firstChild?document.body.insertBefore(c,document.body.firstChild):document.body.appendChild(c);setTimeout(applyStyles,10);document.getElementById("presets").addEventListener("change",function(){const presets={fast:{batch:5,delay:300},normal:{batch:3,delay:500},slow:{batch:2,delay:1000},careful:{batch:1,delay:2000}};const preset=presets[this.value];if(preset){document.getElementById("batch-size").value=preset.batch;document.getElementById("batch-delay").value=preset.delay;forceRepaint(c)}});a.addEventListener("change",load);setTimeout(()=>forceRepaint(c),50)}function load(d){const f=d.target.files[0];if(!f||!f.name.toLowerCase().endsWith(".txt")){console.error("Пожалуйста, выберите файл .txt");return}const r=new FileReader();r.onload=function(g){parse(g.target.result)};r.readAsText(f)}function parse(h){const lines=h.split("\n").map(l=>l.trim()).filter(l=>l&&!l.startsWith("#"));const dl=[];let url=null,out=null;const filenames=new Set();let index=0;for(let line of lines){if(line.startsWith("http")){if(url&&!out){const filename=fname(url);const uniqueFilename=filenames.has(filename)?`${filename}_${index++}_${Date.now()}`:filename;dl.push({url,filename:uniqueFilename});filenames.add(uniqueFilename)}url=line;out=null}else if(line.includes("out=")){out=line.split("out=")[1].trim();if(url){const uniqueFilename=filenames.has(out)?`${out}_${index++}_${Date.now()}`:out;dl.push({url,filename:uniqueFilename});filenames.add(uniqueFilename);url=null;out=null}}}if(url&&!out){const filename=fname(url);const uniqueFilename=filenames.has(filename)?`${filename}_${index++}_${Date.now()}`:filename;dl.push({url,filename:uniqueFilename});filenames.add(uniqueFilename)}console.log(`Найдено ${dl.length} изображений для загрузки:`);dl.forEach((item,idx)=>console.log(`${idx+1}. ${item.url} -> ${item.filename}`));down(dl)}function fname(url){return url.substring(url.lastIndexOf("/")+1)||`download_${Date.now()}`}async function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}async function fetchDownload(url,filename){const isSameDomain=url.includes(window.location.hostname);try{const response=await fetch(url,{method:"GET",mode:isSameDomain?"same-origin":"cors",headers:{"User-Agent":navigator.userAgent,"Accept":"image/*,*/*;q=0.8"},signal:AbortSignal.timeout(15000)});if(!response.ok)throw new Error(`HTTP ${response.status}`);const blob=await response.blob();if(blob.size===0)throw new Error("Empty file");const objectUrl=URL.createObjectURL(blob);const link=document.createElement("a");link.href=objectUrl;link.download=filename;link.style.display="none";document.body.appendChild(link);link.click();document.body.removeChild(link);URL.revokeObjectURL(objectUrl);console.log(`✓ ${filename} (${(blob.size/1024).toFixed(1)}KB)`);return true}catch(err){if(!fetchMethodBlocked&&(err.name==='TypeError'||err.message.includes('Failed to fetch'))){console.warn("❗ 'Fetch' method failed, likely due to the site's Content Security Policy (CSP). Switching to a fallback download method. This message will only appear once.");fetchMethodBlocked=true}console.warn(`✗ Fetch failed for ${filename}: ${err.message}`);return false}}async function directDownload(url,filename){try{new URL(url);const link=document.createElement("a");link.href=url;link.download=filename;link.style.display="none";link.target="";link.rel="";document.body.appendChild(link);const event=new MouseEvent('click',{view:window,bubbles:false,cancelable:true});link.dispatchEvent(event);document.body.removeChild(link);console.log(`✓ ${filename} (direct)`);return true}catch(err){console.warn(`✗ Direct download failed for ${filename}: ${err.message}`);return false}}async function downloadFile(url,filename){if(fetchMethodBlocked){return await directDownload(url,filename)}let success=await fetchDownload(url,filename);if(!success){success=await directDownload(url,filename)}return success}async function down(dl){console.log("Начинаем загрузку...");const button=document.getElementById("b123");const batchSize=parseInt(document.getElementById("batch-size").value)||3;const batchDelay=parseInt(document.getElementById("batch-delay").value)||500;const finalBatchSize=Math.max(1,Math.min(5,batchSize));const finalDelay=Math.max(0,Math.min(10000,batchDelay));button.textContent="Загружаем...";let successCount=0;let failedCount=0;const failedItems=[];console.log(`Настройки: пакеты по ${finalBatchSize} файлов, интервал ${finalDelay}ms`);console.log(`Обрабатываем ${dl.length} файлов...`);for(let i=0;i<dl.length;i+=finalBatchSize){const batch=dl.slice(i,i+finalBatchSize);console.log(`Пакет ${Math.floor(i/finalBatchSize)+1}/${Math.ceil(dl.length/finalBatchSize)}: загружаем ${batch.length} файлов`);const results=await Promise.all(batch.map(({url,filename})=>downloadFile(url,filename)));results.forEach((success,idx)=>{if(success)successCount++;else{failedCount++;failedItems.push(batch[idx])}});const progress=Math.min(i+finalBatchSize,dl.length);button.textContent=`Загружено ${successCount}/${dl.length}`;console.log(`Прогресс: ${progress}/${dl.length} (Успешно: ${successCount}, Ошибок: ${failedCount})`);if(i<dl.length-finalBatchSize&&finalDelay>0){await sleep(finalDelay)}}if(failedItems.length>0&&failedItems.length<=5){console.log(`Быстрый повтор для ${failedItems.length} неудачных файлов...`);button.textContent=`Повтор ${failedItems.length} файлов...`;await sleep(500);for(const{url,filename}of failedItems){const success=await downloadFile(url,filename);if(success){successCount++;failedCount--}await sleep(200)}}const finalFailed=dl.length-successCount;console.log(`🎉 Загрузка завершена! Успешно: ${successCount}/${dl.length}`);if(finalFailed>0){console.warn(`❌ Не загружено: ${finalFailed} файлов`);button.textContent=`✓ ${successCount}/${dl.length} загружено`;if(failedItems.length>5){console.log("💡 Слишком много ошибок. Попробуйте:");console.log("1. Перезапустить скрипт");console.log("2. Проверить, что вы на правильном домене");console.log("3. Убедиться, что URL-адреса корректны")}}else{button.textContent="✓ Все загружено!"}setTimeout(()=>{document.getElementById("downloader-container")?.remove()},3000)}console.log("Загрузчик изображений готов!");console.log("📋 ИНСТРУКЦИИ:");console.log("• Размер пакета - сколько файлов загружать одновременно (1-5)");console.log("• Задержка - пауза в миллисекундах между пакетами файлов");console.log("• При большом пакете и маленькой задержке браузер может отменять загрузки");console.log("• Баланс настроек зависит от сайта и скорости интернета");console.log("❗ ВАЖНО: оставайтесь на вкладке, пока не закончится загрузка, или периодически активируйте вкладку, иначе браузер может остановить загрузку изображений!");console.log("❗ ВАЖНО: проверьте количество загруженных изображений в папке загрузок!");init();
4. После выполнения кода появится кнопка "Выберите файл urls.txt" в левом верхнем углу страницы.
5. Нажимаем на кнопку и выбираем текстовый файл urls.txt с URL-адресами в формате aria2c. Пример содержимого файла:
#
https://img.reuter.de/products/bos/bos-h35363_0.jpg
out=15da0ae2daca986cae949bc61827ddd43cb31c60.jpg
https://img.reuter.de/products/bos/bos-h35360_0.jpg
out=aa4ab5eaa4a89a50b6504045454cf7dabdc0a83d.jpg
https://img.reuter.de/products/bos/bos-h75360_0.jpg
out=6add80faae3800acff70eb18bd34df1f6fa79e71.jpg
6. Браузер может спросить разрешение на скачивание множественных файлов, нажимаем Разрешить.
7. В консоли будет отображаться прогресс загрузки. Все изображения загрузятся в папку загрузок браузера с указанными именами файлов. В скрипте намеренно добавлена задержка при скачивании изображений, дабы не перегружать браузер/сервер и браузер не отменял часть загрузок.


ВАЖНО: обязательно проверьте количество скачанных картинок в папке загрузок. Если их меньше, попробуйте увеличить задержку и уменьшить количество картинок в пакете.
ВАЖНО: хотя бы раз в минуту необходимо активировать вкладку со скачиванием, а лучше просто оставить её активной, пока не завершится скачивание, иначе Chrome может замедлять или вовсе останавливать процесс скачивания.
Примечание: Скрипт автоматически парсит формат aria2c и использует указанные имена файлов из параметра out=.


