![]() #прогерское #фанфикс #снэпшот
Есть у меня одна негативная (или позитивная, тут уж как посмотреть) черта: я могу зацепиться за какую-то совершенно постороннюю проблему и начать её решать. Как вы помните, именно так появился на свет Fanfics Extender :) На этот раз мой взгляд зацепился вот за этот комментарий: Можно ли каким-нибудь способом целиком качнуть диалог в каком-нибудь человеческом формате (да хоть бы и в CSV)? Длинную переписку листать невозможно, даже если попытаться целиком загрузить. Как вы знаете, в блогах существуют посты с огромным количеством комментариев. Если нажать княпку "Показать все" (комментарии), сервер долго думает, и выдаёт пустую страницу. Единственный способ увидеть все комментарии — долго и нудно нажимать княпку "Показать ещё 20 комментариев". Для треда техподдержки (8577 комментариев) пришлось бы нажать 428 раз. И это если ваш браузер продерётся через уйму скриптов, метрики и прочей обработки нового контента. После 150-ой загрузки пачки комментариев мой ноут с Core i7 2.2GHz/16GB разгонял вентиляторы так, будто решил взлететь, а время загрузки/обработки каждой новой пачки стала занимать 10-15 секунд. Конечно же, я не кликал "Показать ещё 20 комментариев" вручную. Я написал скриптик, который заставлял браузер проделывать это за меня. Если кому интересно: PHP + Mink + chrome-mink-driver. Стало ясно, что нужно искать другой путь. Прости, javascript, но тут ты всё портишь. 1. Скачиваем изначальную страничку, на которой 20 комментариев и кнопочка "Показать ещё 20". 2. Чистим её от рекламных блоков, посторонних скриптов и стилей, и разбиваем на две части, «верх» и «низ». Между этими частями мы и будем вставлять загружаемые блоки с комментариями. 3. Начинаем загружать комментарии по 20 штук и сохранять в отдельные файлики. К сожалению, мы не можем загружать их, например, по 100 штук за раз. Родное API фанфикса (которое и обрабатывает нажатие кнопки "Показать ещё 20") отдаёт максимум 20 штук. Причём, чтобы загрузить следующую пачку — нужно знать ответ от предыдущего запроса. 3.1. Чертыхаемся, добавляем задержку между запросами, одной секунды должно быть достаточно :) 4. После загрузки всех блоков комментариев — склеиваем их в обратном порядке, вставляем между «верхом» и «низом». Вуаля. Наш снэпшот готов. Проходимся по нему «ластиком»: убираем онлайн-статусы; исправляем ссылки в текстах, чтобы они не вели на прокси фанфикса (она будет отфутболивать). Теперь самое главное: убрать из полученной страницы загрузку скриптов фанфикса, оставив только стили. Полученная страничка очень шустро открывается в браузере, ничего не тормозит и не лагает. Опционально убираем аватарки, чтобы не грузить сервер фанфикса кучей запросов на картинки (при первом открытии страницы). Держи, pskovoroda: архив HTML-странички без аватарок (≈8.6МБ, сжата до ≈1.1МБ). Теперь можно расслабиться и выпить кофе, попутно давя мысли о создании телеграм-бота, который бы создавал такие архивы по запросу. 22 апреля 2018
9 |
![]() |
|
Лайк за наркоманскую выходку.
1 |
![]() |
|
Хехе, телеграм-бот в свете последних событий звучит особо мимими
1 |
![]() |
|
архивы по запросу До недавнего времени для страницу жалоб и предложений можно было сохранить archive.is, но теперь это не помогает; поэтому подобная функция вполне может дополнить архивирование Экстендера. Оставляю запрос на архивирование шельфа. |
![]() |
|
rational_sith, 35834 комментариев? о_О Challenge accepted! :)
1 |
![]() |
|
rational_sith, 1791 запрос, 1791 секунда + время на склейку + пост-обработка.
|
![]() |
|
rational_sith
Done in 2050.44 seconds Архив HTML-странички без аватарок (≈29.8МБ, ужато до ≈2.8МБ). Загружается в браузере секунд 10 (на моём ноуте).1 |
![]() |
|
Styx, так а мне-то с этим что делать?
К тому же я об ЛС говорил... ;) |
![]() |
|
pskovoroda, лол, а я подумал, что об этом диалоге, ну т.е. о саппорт-треде :)
Вот так внезапно я получил звание «Решатель несуществующих проблем» :) 2 |
![]() |
|
pskovoroda, кстати, экспорт диалогов — тоже хорошая фича, записал в блокнотик для экстендера :)
1 |
![]() |
|
Styx, ЛС неуправляем. Я болтлив как сорока.
|
![]() |
|
pskovoroda, у меня нет настолько больших тредов в диалогах, поэтому могу только гадать. Как именно он неуправляем?
|
![]() |
|
ReFeRy, ну, 35к+ комментариев должно быть напряжно для сервера. Вот если вынести рендеринг комментариев на клиент — может и получиться, но для этого потребуется очень сильно переписать код.
А нельзя добавить в API загрузки следующей пачки комментариев какой-нибудь параметр типа load_count, с максимальным значением в 100, например? Это снизит кол-во запросов от моего этого скриптика архивации в 5 раз :) |
![]() |
|
Styx, сначала не может загрузиться, потом не может скроллить. Вообще всё умирает на компе с 48Г мозгов.
|
![]() |
|
pskovoroda, ага, ясненько. Challenge accepted! :)
|
![]() |
|
7 |
![]() |
Ластро
|
ReFeRy, шельф можно считать стрес тестом. Если он взлетит, то что угодно взлетит...
2 |
![]() |
|
![]() |
|
Адский Бетономешатель, там ещё и кнопок "Ответить" и "Изменить" нет вроде.
1 |
![]() |
|
Styx
Да, кажется. |
![]() |
|
Адский Бетономешатель
Даты проставит js скрипт, когда загрузится вся страница. Управляющих элементов там нет, ими пришлось пожертвовать. |
![]() |
|
ReFeRy, ещё можно пожертвовать onmouseover/onmouseout на никах (всплывающая плашка с инфой о юзере).
|
![]() |
|
Styx
Так пожертвовано. |
![]() |
|
ReFeRy, ой, точно. Тогда ещё можно убрать у span датой класс "uptodate" после первого прохода скрипта, обновляющего (устанавливающего) время. А то он потом каждую секунду по всем 8к сообщениям проходится. Ну или убирать у всех, кроме сделанных в текущем часу (или «сегодня»).
|
![]() |
|
Styx
Я об этом, конечно, подумал, но поленился корежить js. |
![]() |
|
ReFeRy, это, кстати, и для обычной версии подойдёт ;)
|