Натрапив на ще один чудовий сайт з книгами для читання в онлайні. Відштовхуючись від попередньої статті написав скрипт для завантаження книг з сайту у форматі FB2.

Цього разу функціонал сайту є більш складним, що додає азарту. Сайт використувує кастомні форми з csrf токенами для відображення сторінок з ajax запитів, зберігає і використовує інфо з кукіз і ще деякі цікавинки.

Отримати значення кукі легко з curl:

get_cookie()
{
    cat $1 |
    grep ".*$2" | cut -f7
}
curl -o "$PAGE_HTML" --silent --no-verbose --cookie-jar $COOKIES_FILE $URL
CSRF_COOKIE=$(get_cookie $COOKIES_FILE "_csrf")

У цьому скрипті я доробив додавання глав у FB2 файлі. Глави знаходяться на сторінці у select box. Використовуючи hxselect ми дістаємо всі значення, потім конвертуємо з <option> у <a>. Після цього використовуючи hxpipe ми отримаємо всі тексті які починаються з символу решітки (#)  і використовуючи awk ми фільтруємо їх.

І щоб отримати масив з текстом я використовую команду readarray.

get_chapters_names()
{
    cat $1 |
    hxnormalize -x -e -s | 
    hxselect -i select.js-chapter-change | 
    sed -e 's/<select[^>]*>//g' | 
    sed 's/<option/<a/g' | 
    sed 's/option>/a>/g' | 
    sed 's/value=/href=/g' | 
    tr -d '\n' | hxpipe | awk -F "-" '{print $2}' | grep "\S"
}
readarray -t CHAPTERS_NAMES < <(get_chapters_names $PAGE_HTML)

Помітив, що сервер блокує мій скрипт коли я роблю багато запитів за короткий проміжок часу. То ж довелося додати оновлення токену і затримку у 2хв між цими діями. В іншому випадку оновлювати токен не потрібно, якщо я роблю затримку між запитами у 2сек.

Ще одна цікава дія, яку довелося відтворити це отримати значення з json. Перепробував багато різних команд для bash, але всі вони працювали тільки з невеликими значеннями у json. Тому найпростіший спосіб роспарсити правильно json був у використанні PHP.

get_json_val()
{
    cat $1 | \
    php -r "echo json_decode(file_get_contents('php://stdin'))->$2 ?? '';"
}

Інши скрипти були трохи дороблені з минулої статті.

Початковий код: https://gist.github.com/onesixromcom/b20c6701d92bc1579ec94edf63d7bde5

Коментувати

Вміст цього поля є приватним і не буде доступний широкому загалу.
  • Не дозволено жодних HTML теґів.