Натрапив на ще один чудовий сайт з книгами для читання в онлайні. Відштовхуючись від попередньої статті написав скрипт для завантаження книг з сайту у форматі 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
Коментувати