Как исправить ошибку с нескачиванием страниц с сайта при помощи 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

введите сюда описание изображения

Видео ультракороткое поскольку ограничение на размер гифки, но оно все скачивает если ей дать время

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка