Войти

Показать полную графическую версию : [решено] Скачать изображения из галереи


GreatAndPowerful
27-08-2013, 17:37
Здравствуйте!
Помогите написать скрипт - мне нужно скачать больше тысячи изображений с галереи derpiboo.ru, выбрав определенного автора. Вручную на это уйдет много времени и я задумался об автоматизации. Ничего, кроме cmd не знаю. Буду благодарен за готовый скрипт или хотя бы подсказки, с чего начать.

Anonymоus
27-08-2013, 20:32
GreatAndPowerful, я намеренно не стал делать многопоточную версию. При указанных вами объемах это излишне нагрузит сервер дерпибуры. Имейте совесть, парни держат его на добровольные пожертвования.
@Echo Off
:: Inquisitor, 2013
:: Ad majorem Applejack gloriam
SetLocal EnableDelayedExpansion

:: Настройки
Set API_Key=
Set Query=artist:aeronjvl,scenery,rainbow dash
Set Timeout=10
Set MaxImages=500
Set ImagesDir=images

rem Подготавливаемся к работе
For /F "tokens=2 delims=[]" %%A In ('Ver') Do (For /F "tokens=2,3 delims=. " %%B In ("%%A") Do (Set Ver=%%B.%%C))
Set UA=Mozilla/5.0 (Windows NT %Ver%; wget 1.11) DerpibooruGrabber/1.0
If Not Exist "%ImagesDir%" MD "%ImagesDir%"
If Exist "%Temp%\derpibooru.json" Del "%Temp%\derpibooru.json"
Set Query=%Query: =+%
rem Делаем запрос к поиску
wget "http://derpiboo.ru/search.json?nocomments=1&nofav=1&q=%Query%&perpage=%MaxImages%&key=%API_Key%" -U "
%" -q -nc -O "%Temp%\derpibooru.json" 1>nul 2>nul||(Echo ERROR: Check your connection&Exit /B 1)
For /F "tokens=2 delims=:," %%A In ('grep -Eo ".id_number.:[0-9]*," "%Temp%\derpibooru.json"') Do (
Call :GetImage %%A
ping -n %Timeout% 127.0.0.1>nul
)
Echo All done
Pause&Exit

:GetImage
rem Запрашиваем данные о изображении через JSON API
Set file_name=&Set file_ext=&Set image=
For /F "delims=" %%A In ('wget "http://derpiboo.ru/%~1.json?nocomments=1&nofav=1" -U "
%" -q -O- 2^>^&1') Do (
rem Разбираем полученный JSON
For %%B In (%%A) Do (
For /F "tokens=1,* delims=:" %%C In ("%%B") Do (
For %%E In (file_name image) Do (
If "%%~C"=="%%E" Set %%E=%%~D
)
)
)
)
rem Обрабатываем результат
If Not Defined image Echo ERROR: Couldnt retrieve image info #%~1&Exit /B 1
For /F "delims=" %%A In ("!image!") Do (Set file_ext=%%~xA)
rem Получаем изображение
If Not Exist "%ImagesDir%\!file_name!!file_ext!" wget "!image!" -U "
%" -q -nc -O "%ImagesDir%\!file_name!!file_ext!" 1>nul 2>nul&&(Echo #%~1 retrieved)||(Echo ERROR: Couldnt retrieve image #%~1&Exit /B 1)
Exit /B 0

Для работы скрипта нужны wget (http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe) и grep (http://downloads.sourceforge.net/gnuwin32/grep-2.5.4-setup.exe) (хотел обойтись без последнего, но зачастую вес ответа достигает полумегабайта, и разбирать это таким же образом, как делается с картинкой, не представляется возможным). Обратите внимание на настройки:
API_Key - ключ для API, его можно посмотреть на странице своего аккаунта. Без него качать будет, но будет применяться фильтрация по умолчанию (т.е. отсекая NSFW)
Query - то же самое, что вы собираетесь писать в поиск. Тэги разделяются запятой, пробела перед и после неё быть не должно.
Timeout - настоятельно рекомендую не менять это. Не создавайте излишнюю нагрузку на сервер. Это интервал между запросами изображений.
MaxImages - количество изображений, скачиваемых за раз. Хоть несколько тысяч, выставьте столько, сколько планируете качать.
ImagesDir - куда сохранять.

GreatAndPowerful
27-08-2013, 20:48
Спасибо, все работает! А можно все таки многопоточную версию? Медленно качает :(
И не поясните, как оно работает? Мне почти все непонятно. А если я изменить скрипт захочу?

Anonymоus
27-08-2013, 21:20
А можно все таки многопоточную версию? »
Нет, нельзя. Причины я вам выше описал.
И не поясните, как оно работает? Мне почти все непонятно. »
Может быть, уточните, что конкретно нуждается в разъяснении?
Общая логика скрипта такова: стартуем, создаём папку для картинок, удаляем результат поиска (если остался от предыдущего раза), с помощью ключа делаем запрос к API дерпибуры, разбираем полученный результат (JSON) с помощью грепа, выделяем ID изображений. Далее вызываем функцию, которая с помощью запроса к API получает сведения о файле - прямую ссылку и реальное имя, далее с помощью wget файл скачивается - и так, пока не будут обработаны все файлы из поисковых результатов.

UPD: Добавил новый вариант скрипта, который не нуждается в указании максимального количества результатов, а забирает постранично всё что есть.

@Echo Off
:: Inquisitor, 2013
:: Ad majorem Applejack gloriam
SetLocal EnableDelayedExpansion

:: Настройки
Set API_Key=
Set Query=artist:aeronjvl,scenery,rainbow dash
Set Timeout=10
Set ImagesDir=images

rem Подготавливаемся к работе
For /F "tokens=2 delims=[]" %%A In ('Ver') Do (For /F "tokens=2,3 delims=. " %%B In ("%%A") Do (Set Ver=%%B.%%C))
Set UA=Mozilla/5.0 (Windows NT %Ver%; wget 1.11) DerpibooruGrabber/1.0
If Not Exist "%ImagesDir%" MD "%ImagesDir%"
If Exist "%Temp%\derpibooru.json" Del "%Temp%\derpibooru.json"
Set Query=%Query: =+%
Set Page=1&Set Downloaded=0
:Search
rem Делаем запрос к поиску
Set Images=0
wget "http://derpiboo.ru/search.json?nocomments=1&nofav=1&q=%Query%&perpage=50&key=%API_Key%&page=!Page!" -U "
%" -q -nc -O "%Temp%\derpibooru.json" 1>nul 2>nul
For /F "tokens=2 delims=:," %%A In ('grep -Eo ".id_number.:[0-9]*," "%Temp%\derpibooru.json"') Do (
Call :GetImage %%A
Set /A Images+=1
ping -n %Timeout% 127.0.0.1>nul
)
If Not "!Images!"=="0" (
Set /A Page+=1
ping -n 10 127.0.0.1>nul
Del "%Temp%\derpibooru.json"
GoTo :Search
)
Echo All done
Pause&Exit

:GetImage
rem Запрашиваем данные о изображении через JSON API
Set file_name=&Set file_ext=&Set image=
For /F "delims=" %%A In ('wget "http://derpiboo.ru/%~1.json?nocomments=1&nofav=1" -U "
%" -q -O- 2^>^&1') Do (
rem Разбираем полученный JSON
For %%B In (%%A) Do (
For /F "tokens=1,* delims=:" %%C In ("%%B") Do (
For %%E In (file_name image) Do (
If "%%~C"=="%%E" Set %%E=%%~D
)
)
)
)
rem Обрабатываем результат
If Not Defined image Echo ERROR: Couldnt retrieve image info #%~1&Exit /B 1
For /F "delims=" %%A In ("!image!") Do (Set file_ext=%%~xA)
rem Получаем изображение
Set /A Downloaded+=1
If Not Exist "%ImagesDir%\!file_name!!file_ext!" wget "!image!" -U "
%" -q -nc -O "%ImagesDir%\!file_name!!file_ext!" 1>nul 2>nul&&(Echo !Downloaded! #%~1 retrieved)||(Echo ERROR: Couldnt retrieve image #%~1&Exit /B 1)
Exit /B 0

Extazik
22-09-2015, 17:00
Данный скрипт более не работает? Ведь уже столько времени прошло :) Помогите пожалуйста написать новый.

Iska
22-09-2015, 17:10
Extazik, стучите ему в личку, он с августа не появлялся.

Extazik
22-09-2015, 17:30
Iska, окей )


А все же, как правильно запускаются такие скрипты? Может я как то не так это делаю.

Iska
22-09-2015, 18:50
Так же, как и любые другие пакетные файлы.




© OSzone.net 2001-2012