Как исправить ошибку с нескачиванием страниц с сайта при помощи bash
Хочу скачать книгу с помощью скрипта, но скрипт неправильно работает, он должен скачивать все страницы с сайта, но в итоге он скачивает самую первую обложку и выводит информацию о странице, также должны быть другие страницы, но они не скачиваются.
Код:
#!/bin/bash
token="<eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMDUyOTEyLCJncm91cF9pZCI6MjE4LCJib29rX2lkIjo5NTE3MTMsImJvb2tfYWNjZXNzIjoxLCJ1c2VyX2VtYWlsIjoiZGFuc21pcjc0N2VAZ21haWwuY29tIiwidXNlcl90eXBlIjo4LCJleHAiOjE3MDI1ODU1MjgsImlhdCI6MTcwMjU2Mzg5OH0.CsU54Qvq3b03vYY92h2qXNP2GeLAiDYyx2bditM9WWqjfto-JvdGUD5iqG7nz4H-ONrJ78UYDXOiREUhyUYOIw>"
echo "Извлекается информация о книге..."
curl 'https://reader.new.book.ru/api/reader/book' \
-H 'authority: reader.new.book.ru' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6,zh-TW;q=0.5,zh;q=0.4,ko;q=0.3,tt;q=0.2' \
-H 'authorization: Bearer '$token \
-H 'cookie: _ym_uid=1673594313647687580; _ym_d=1673594313; _ym_isad=1' \
-H 'referer: https://reader.new.book.ru/?t='$token'&v=0' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
--compressed --output description.json 1> /dev/null
author=$(cat description.json | jq -r '.message .data .author')
name=$(cat description.json | jq -r '.message .data .name')
pages=$(cat description.json | jq '.message .data .pages')
echo "Скачивается книга \""$author" - "$name"\" ("$pages" страниц)"
for i in {1..$(expr $pages + 0)}; do
curl 'https://reader.new.book.ru/api/books/page_view/'$i'/'$token \
-H 'authority: reader.new.book.ru' \
-H 'accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8' \
-H 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6,zh-TW;q=0.5,zh;q=0.4,ko;q=0.3,tt;q=0.2' \
-H 'cookie: _ym_uid=1673594313647687580; _ym_d=1673594313; _ym_isad=1' \
-H 'referer: https://reader.new.book.ru/?t='$token'&v=0' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: image' \
-H 'sec-fetch-mode: no-cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
--compressed -v --output `printf %04d $i`."png" 1> /dev/null
done
bookname=$author' - '$name'.pdf'
echo "Конвертируется книга в файл \"".$bookname"\""
convert *.png $bookname
Ответы (1 шт):
он скачивает самую первую обложку
Если он скачивает только первую страницу, то возможно проблема в цикле.
Давайте проверим.
Уберем все лишнее, оставим только параметр, цикл с условием и хоть какую-либо индикацию, чтобы видеть, что цикл работает:
#!/bin/bash
# для примера я просто инициализировал переменную числом ибо токен битый
pages=10
for i in {1..$(expr $pages + 0)}; do
# для индикации просто вывожу строку со значением счетчика
echo "line #"$i
done
и вижу я в результате примерно следующее

выводится строка line #{1..10}, а это значит, что переменная $i, являющаяся результатам выражения равна {1..10}, что, наверное, не является тем, что Вы ожидали.
И как мне кажется, в данном случае как ни в каком другом случае подойдет следующий цикл
#!/bin/bash
pages=10
for (( i=1; i<=pages; i++))
do
echo "line #"$i
done
определение цикла состоит из трех выражений
инициализация
с какого значения начинается отчет в цикле
i=1
начинаем отсчет с единицыусловие
выражение, соблюдая которое, мы можем продолжать цикл
i<=pages
счетчик цикла будет увеличиваться до тех пока он будет меньше либо равен количеству страниц в книгешаг
с каким шагом будет изменяться счетчик цикла
i++
данное выражение эквивалентно выжажениюi=i+1, т.е. увеличению на единицу
Соответственно, необходимо заменить выражение цикла в скрипте
#!/bin/bash
token="eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMDUyOTEyLCJncm91cF9pZCI6MjE4LCJib29rX2lkIjo5NTE3MTMsImJvb2tfYWNjZXNzIjoxLCJ1c2VyX2VtYWlsIjoiZGFuc21pcjc0N2VAZ21haWwuY29tIiwidXNlcl90eXBlIjo4LCJleHAiOjE3MDI1ODU1MjgsImlhdCI6MTcwMjU2Mzg5OH0.CsU54Qvq3b03vYY92h2qXNP2GeLAiDYyx2bditM9WWqjfto-JvdGUD5iqG7nz4H-ONrJ78UYDXOiREUhyUYOIw"
echo "Извлекается информация о книге..."
curl 'https://reader.new.book.ru/api/reader/book' \
-H 'authority: reader.new.book.ru' \
-H 'accept: application/json, text/plain, */*' \
-H 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6,zh-TW;q=0.5,zh;q=0.4,ko;q=0.3,tt;q=0.2' \
-H 'authorization: Bearer '$token \
-H 'cookie: _ym_uid=1673594313647687580; _ym_d=1673594313; _ym_isad=1' \
-H 'referer: https://reader.new.book.ru/?t='$token'&v=0' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
--compressed --output description.json 1> /dev/null
author=$(cat description.json | jq -r '.message .data .author')
name=$(cat description.json | jq -r '.message .data .name')
pages=$(cat description.json | jq '.message .data .pages')
echo "Скачивается книга \""$author" - "$name"\" ("$pages" страниц)"
for (( i=1; i<=pages; i++))
do
curl 'https://reader.new.book.ru/api/books/page_view/'$i'/'$token \
-H 'authority: reader.new.book.ru' \
-H 'accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8' \
-H 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6,zh-TW;q=0.5,zh;q=0.4,ko;q=0.3,tt;q=0.2' \
-H 'cookie: _ym_uid=1673594313647687580; _ym_d=1673594313; _ym_isad=1' \
-H 'referer: https://reader.new.book.ru/?t='$token'&v=0' \
-H 'sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: image' \
-H 'sec-fetch-mode: no-cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
--compressed -v --output `printf %04d $i`."png" 1> /dev/null
done
bookname=$author' - '$name'.pdf'
echo "Конвертируется книга в файл \"".$bookname"\""
convert *.png $bookname
Видео ультракороткое поскольку ограничение на размер гифки, но оно все скачивает если ей дать время



