-
-
Save cronfy/00e23e126d4fbf3fab37392e414f0e4c to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
# Скрипт по загрузке публичных файлов с Облака mail.ru. Поддерживается докачка. | |
# v1.0.5 от 2022-05-30 | |
# | |
# ЕСЛИ СКРИПТ НЕ РАБОТАЕТ | |
# | |
# 1. Убедитесь, что файл доступен публично. Возможна загрузка только публичных файлов. | |
# 2. Mail.ru время от времени меняет внутрянку, не очень сильно, но требуется адаптация скрипта. | |
# Если скрипт не работает, просьба сделать работающий форк и скинуть ссылку в комментарии. | |
# Спасибо. | |
# | |
# КАК ПОЛЬЗОВАТЬСЯ | |
# | |
# 1. Скачать скрипт. | |
# 2. Сделать его исполняемым: | |
# chmod +x dl-cloud-mail-ru.sh | |
# 3. Получить ссылку на файл для скачивания (см. чуть ниже, как это сделать). | |
# 3. Скачать файл из облака: | |
# ./dl-cloud-mail-ru.sh ссылка_на_файл локальный_путь | |
# Например (пример рабочий, файл существует, можно потестировать скрипт): | |
# ./dl-cloud-mail-ru.sh https://cloud.mail.ru/public/Y5C8/KRwhz4JHW/linux-5.12.7.tar.xz linux-kernel.tar.xz | |
# | |
# КАК ПОЛУЧИТЬ ССЫЛКУ НА СКАЧИВАНИЕ ФАЙЛА В ПАПКЕ | |
# | |
# Если у вас есть ссылка на папку, и нужно скачать файл оттуда: | |
# | |
# 1. Два раза кликнуть на файл в папке. Появится всплывающее окно с кнопкой "Скачать". | |
# 2. В это время в адресной строке браузера будет отображаться ссылка на файл. Это и есть ссылка для скрипта. | |
# ENGLISH | |
# | |
# IMPORTANT: mail.ru sometimes changes internals, not too much, but script must be changed. | |
# | |
# If this script does not work: | |
# - see forks, may be there is a fix already, | |
# - if not, please post patch in comments or create a working fork of this gist. | |
# Thank you! | |
# ИСТОРИЯ И БЛАГОДАРНОСТИ | |
# | |
# 2022-05-30 отражены изменения со стороны mail.ru, спасибо https://gist.github.com/grumbik | |
# 2021-05-27 дополнена документация | |
# 2021-05-26 изменения со стороны mail.ru, плюс теперь определяем url к файлу проще без обращения к api, | |
# спасибо kerastinell https://gist.github.com/kerastinell | |
# 2018-06-18 mail.ru изменил формат страницы | |
# 2017-09-22 исходная идея: https://novall.net/itnews/bash-skript-dlya-skachivaniya-fajlov-s-mail-ru-cherez-konsol-linux.html | |
URL="$1" | |
DST_FILE="$2" | |
[ -z "$DST_FILE" ] && { | |
echo "Syntax: `basename $0` <url> <dst_file>" >&2 | |
echo "Example: `basename $0` https://cloud.mail.ru/public/BeAr/3s8QfYgLj /path/to/my/file.rar" >&2 | |
echo "Test: `basename $0` https://cloud.mail.ru/public/Y5C8/KRwhz4JHW/linux-5.12.7.tar.xz linux-5.12.7.tar.xz" >&2 | |
exit 1 | |
} | |
function getPageInformation() { | |
local pageUrl="$1" | |
wget --quiet -O - "$pageUrl" > page.html | |
wget --quiet -O - "$pageUrl" | sed -n "/window.cloudSettings/,/};<\/script>/p" | |
} | |
function ensureFileExists() { | |
local pageInformation="$1" | |
echo "$pageInformation" | grep -q '"not_exists"' && { | |
echo "Error: file does not exist" >&2 | |
exit 1 | |
} | |
} | |
function extractDownloadUrl() { | |
local pageUrl="$1" pageInformation="$2" storageUrl filePath | |
storageUrl=$(echo "$pageInformation" | sed -r 's|</?script[^>]*>|\n|g' | sed -n 's|.*\(window.cloudSettings=.*}\)|\1|p' | sed -n 's/.*\(weblink_get[^}]*}\).*/\1/p' | sed -n 's|.*\(https://[^"]*\)".*|\1|p') | |
filePath=$(echo "$pageUrl" | awk -F '/public/' '{print $2}') | |
[ -z "$storageUrl" ] || [ -z "$filePath" ] && { | |
echo "Error: failed to extract storage's url or file path" >&2 | |
exit 1 | |
} | |
echo "$storageUrl/$filePath" | |
} | |
pageInformation=$(getPageInformation "$URL") | |
ensureFileExists "$pageInformation" | |
downloadUrl=$(extractDownloadUrl "$URL" "$pageInformation") | |
wget --continue --no-check-certificate --referer="$URL" "$downloadUrl" -O "$DST_FILE" |
Now it doesn't work.
Example file: https://cloud.mail.ru/public/A9cF/bVSWJCJgt/imagesThumbnails/trainThumbnails.tar
Run: $ ./downloader.sh https://cloud.mail.ru/public/A9cF/bVSWJCJgt/imagesThumbnails/trainThumbnails.tar trainThumbnails.tar
Output:
--2019-02-23 02:23:31-- https://cloclo4.cldmail.ru/2yaEyUBxrvyHQUvxr9m7/G%0Ahttps://cloclo4.cldmail.ru/2yaEyUBxrvyHQUvxr9m7/G/A9cF/bVSWJCJgt/imagesThumbnails/trainThumbnails.tar?key=d0793366a34822a5a925d401574b2646809ffb0a
Resolving cloclo4.cldmail.ru (cloclo4.cldmail.ru)... 217.69.142.204
Connecting to cloclo4.cldmail.ru (cloclo4.cldmail.ru)|217.69.142.204|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2019-02-23 02:23:31 ERROR 404: Not Found.
Anybody can help with this error?
user@user-MacBook-Pro ~ % ./dl-cloud-mail-ru.sh https://cloud.mail.ru/public/A9cF/bVSWJCJgt/imagesThumbnails/trainThumbnails.tar test.tar
--2020-08-05 16:25:10-- ftp://%22weblink_get%22/[%7B%22count%22:1,%22url%22:%22https://cloclo21.cloud.mail.ru/public/2vQm7rqQsvZfagvKfDwH/G%22%7D]%0A%22weblink_get%22:[%7B%22count%22:1,%22url%22:%22https://cloclo21.cloud.mail.ru/public/2vQm7rqQsvZfagvKfDwH/G%22%7D]/A9cF/bVSWJCJgt/imagesThumbnails/trainThumbnails.tar?key=
=> ‘.listing’
Resolving "weblink_get" ("weblink_get")... failed: nodename nor servname provided, or not known.
wget: unable to resolve host address ‘"weblink_get"’
ERROR 404: Not Found
Error 404 Not found (T_T)
В настоящий момент скрипт не работает, т. к. mail.ru опять поменяли внутрянку. Если вы пофиксили или нашли работающую версию, просьба скинуть в комментарии ссылку на форк/скрипт. Спасибо!
@cronfy, @roman-4erkasov, теперь всё снова работает: https://gist.github.com/kerastinell/badbd1da6a76a6c77a15661bf0f1e288
Я ещё малость поковырялся и выяснил, что стягивать файл можно без лишнего запроса к API. В html-странице уже содержится очень подробный JSON со всеми настройками (поиск по файлу: window.cloudSettings
), там есть и детальная информация о файле, и адрес сервера для скачивания. В течение дня доделаю, если меня никто не опередит :)
@kerastinell супер! Будем ждать итоговый вариант! 👍
@cronfy готово, и ещё я добавил проверку на существование файла: https://gist.github.com/kerastinell/badbd1da6a76a6c77a15661bf0f1e288
@kerastinell спасибо! Обновил скрипт.
@grumbik спасибо! Внёс обновление.
В инструкции не правильно указано. По крайней мере для моей системы.
Вместо:
./dl-cloud-mail-ru.sh https://cloud.mail.ru/public/Y5C8/KRwhz4JHW/linux-5.12.7.tar.xz linux-kernel.tar.xz
- надо написать:
./dl-cloud-mail-ru.sh https://cloud.mail.ru/public/Y5C8/KRwhz4JHW linux-kernel.tar.xz
Иначе, будет выдавать ошибку:
Error: failed to extract storage's url or file path
http://: Invalid host name.
Тестировал на Debian 10.
@nailarch спасибо за информацию, но у меня не воспроизвелось. По ссылке из инструкции - скачивается нормально, по вашей ссылке - ОШИБКА 404: Not Found.
Hmm, what might the issue on bash or zsh if I am getting this?
bash-3.2$ ./dl.sh https://cloud.mail.ru/public/tHA5/HDetxxxxxM id.dmg sed: illegal option -- r usage: sed script [-Ealn] [-i extension] [file ...] sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...] Error: failed to extract storage's url or file path http://: Invalid host name.
Link altered cause of sensitive info!
@piratx you might be using macOS with sed
version that does not support -r
flag. Try to replace sed -r
to sed -E
in the script.
@cronfy Олег, подскажите, пожалуйста, а есть возможность как-то из скрипта использовать далее полученные ссылки для скачивания файла, указав полученный url в браузере (ну т.е. по факту получить прямую ссылку)? Скрипт же по итогу получает прямую ссылку, даже выводит ее, однако при обращении к ней через браузер выдается 403... Но как же он тогда качает файл?
Спасибо!
@Immick Для скачивания файла используется wget (последняя строка скрипта). Если посмотреть на его аргументы, можно увидеть, что помимо ссылки в параметрах также указывается referer. Полагаю, именно это и важно для скачивания файла.
- чтобы скачать файл по public ссылке типа
https://cloud.mail.ru/public/FGlZ/hYpBtNcGx
- с сохранением оригинального имени файла
test.mp4
- вместо флага
-O
можно использовать--content-disposition
:
wget --continue --no-check-certificate --referer="$URL" "$downloadUrl" --content-disposition
есть возможность вообще просто проверить, это ссылка на файл или на директорию (без скачивания)?