Как скачать МНОГО файлов с Google Drive через wget
При скачивании большого количества файлов обычным способом гугл блокирует примерно через 50 файлов, даже если скачивать по одному файлу в 10 секунд (начинает отдавать 403 - "вы робот").
Чтобы "обмануть" его, нужно подсунуть свои куки из браузера для wget'а. Полагаю, что лимит в 50 файлов - это только для анонимусов, а для авторизованных пользователей он больше.
Итак, допустим, у нас есть набор ссылок:
- https://drive.google.com/open?id=1eoWI7aANlCcZaA4CBIkoCL2T9QdMYGRw
- https://drive.google.com/open?id=18UAqItpNmBQ1JqSSCC3TS7j6DVzSJ-mm
- https://drive.google.com/open?id=12K_Y-I9Z9pEsFyDrgJfG-H0zgDEmI-1W
- ...
И надо сказать, что далее предполагается, что все это - картинки jpeg, и скрипты рассчитаны именно на это.
Скрипты
Сначала создаём папку, в которую мы будем скачивать файлы, и кладем в неё скрипты:
dl.sh
#!/usr/bin/env bash
tr "=" " " | while read link id ; do
# trim
id="`echo "$id" | sed 's/^\s*// ; s/\s*$//'`"
[ -z "$id" ] && {
echo " !! Empty line: $link $id"
continue
}
echo "$id" | grep "[^a-zA-Z0-9_-]" && {
echo " !! Wrong id: $id"
continue
}
file="$id.jpg"
echo $id
[ -f $file ] && {
echo " Already exists"
continue
}
echo "Downloading"
wget --load-cookies cookies.txt --no-check-certificate "https://docs.google.com/uc?export=download&id=$id" -O $id.jpg || {
echo "ERROR"
echo "Waiting for 10 minutes"
date
sleep 600
}
echo "ok"
sleep 10
done
multiple-to-single.sh
#!/usr/bin/env bash
# переводит строку с несколькими ссылками, разделенными точкой с запятой, вида:
# https://.../1.jpg ; https://.../2.jpg ; https://.../3.jpg
# в отдельные строки:
# https://.../1.jpg
# https://.../2.jpg
# https://.../3.jpg
# пустые строки и лишние пробелы отбрасываются
tr ";" "\n" | while read link ; do
# sed is for trim
echo "$link" | sed 's/^\s*// ; s/\s*$//'
done | grep -v "^$"
check.sh
#!/usr/bin/env bash
find ./ -size 0
for i in *.jpg ; do
file "$i"
done | grep -v 'JPEG image'
Файлы со ссылками
Теперь готовим файл со списком ссылок.
- Либо каждая ссылка идет на одной строке.
- Либо в одной строке несколько ссылок, разделенных запятыми:
https://drive.google.com/open?id=1eoWI7aANlCcZaA4CBIkoCL2T9QdMYGRw ; https://drive.google.com/open?id=18UAqItpNmBQ1JqSSCC3TS7j6DVzSJ-mm ;
https://drive.google.com/open?id=12K_Y-I9Z9pEsFyDrgJfG-H0zgDEmI-1W
Размещаем этот файл рядом с dl.sh
.
cookie
Нужно подготовить файл cookies.txt для wget, чтобы гугл не считал его анонимусом.
- Устанавливаем в chrome расширение cookies.txt
- Заходим на любую из ссылок, которую мы хотим скачать.
- С помощью расширения копируем все куки и сохраняем их в файл
cookies.txt
рядом со скриптомdl.sh
.
Запуск
Для скачивания нужно запустить (допустим, ссылки у нас лежат в links.txt
):
cat links.txt | ./multiple-to-single.sh | ./dl.sh
Запускаем в tmux, ждем пока все скачается.
Проверка и докачка
При скачивании некоторых ссылок может произойти ошибка и файл скачается не тот или битый.
После того как все файлы скачаются, запускаем проверку:
./check.sh
Если он что-то выведет, то это файлы, которые скачались криво. Их нужно удалить и повторно запустить скачивание.
Когда скачивание про все файлы будет говорить "Already exists", а проверка не выдает ничего, значит - готово.