27

Парсинг персональных ачивок

Долгое время был в read-only, но на днях увидел пост о борьбе с баянами "своими" постами, и как бы сказать вдохновился. Ладушки, поехали.

На Пикабу, на странице ленты наград есть проблема: нельзя просмотреть персональные ачивки. Есть только разделы "все", "индивидуальные" (которая по сути "все") и "сообщества". Мда, и сортировки нет, одна кнопка "загрузить еще" красуется. А мне было бы интересно почитать посты, за которые пользователей наградили персональными ачивками. Штош, если гора не идет к Магомеду, решаем проблему сами.

За язык программирования взял Javascript, т.к. долгое время работаю на нем и хотелось запускать скрипт сразу из браузера. Заодно почему бы и не найти все ачивки, а еще сгруппировать по пользователям (это не все ачивки :(, см. п. 4 в проблемах в конце поста). Посты писать не умею, поэтому сразу результат (код ниже).

Парсинг персональных ачивок Программирование, Награды Пикабу, Javascript, Длиннопост

На треугольники-стрелочки (которые слева) можно нажать, чтобы раскрыть список.

Парсинг персональных ачивок Программирование, Награды Пикабу, Javascript, Длиннопост

Отлично! Теперь можно скопировать ник пользователя, вставить в URL после "собачки" (https://pikabu.ru/@) и почитать посты.

Ну и сам скрипт с коментариями, если кто-то тоже хочет запустить у себя. Инструкция по запуску и проблемы ниже.

UPD. Не знал, что Пикабу не переваривает код. Ссылка на исходник https://pastebin.com/C7eZp3H7

Инструкция по запуску скрипта (только десктоп):

  1. Открываем любую страницу Пикабу в браузере, лишь бы домен был pikabu.ru, иначе возможна ошибка CORS.

  2. Нажимаем F12 (или Ctrl + Shift + i) (или тыкаем правой кнопкой мыши в любое место и выбираем пункт Inspect/Посмотреть код) (или через настройки браузера справа вверху в пункте Developer Tools/Инструменты разработчика). Открылись инструменты разработчика.

  3. Открываем вкладку Console/Консоль.

  4. Вставляем весь скрипт и нажимаем Enter.

  5. Ждем секунд 40 (зависит от интернет соединения, к серверу же обращаемся). Можно посмотреть ход выполнения скрипта во вкладке Network/Сеть. Там должны запросы к серверу отличающиеся только параметром page.

  6. Смотрим в консоль, и если ошибки нет, любуемся результатом.

Проблемы, с которыми столкнулся:

  1. Только методом тыка удалось составить необходимый header для AJAX запроса. И почему-то это 'X-Requested-With'. Странно, почему не 'Content-Type'?

  2. Кнопка "загрузить еще" грузит гребаный HTML код. Да, для браузера пользователя так быстрее, чем получать JSON и по нему рендерить HTML, но твою мать :(

  3. Я с этим не сталкивался, но если кто-то хочет запустить скрипт у себя, возможны синтаксические ошибки, т.к. использовал такие конструкции как spread, window.fetch и async/await. Эта проблема решается свежей версией браузера, в которой должны быть реализованы эти фичи.

  4. Почему-то на сервере всего 36 страниц наград. Т.е. это не все награды. Может и можно как-то загрузить все, но не нашел.

  5. Изначальная цель поиска персональных ачивок достигнута наполовину, потому что непонятно как понять, что ачивка персональная, а не выдана только одному пользователю. Поэтому просто взял весь список ачивок и отфильтровал по выданному кол-ву пользователей (чтобы был 1 пользователь-владелец), ну хоть как-то.

  6. Странно, в предпросмотре поста, слетели табы/пробелы кода.

Ну вот и все. Сам скрипт занял примерно 2 часа, зато теперь можно почитать специфичные посты (жаль только что не все (см. п. 4 в проблемах)).

P.S. скрипт мой значит тег "мое" :) Или нет, непонятно

P.P.S. чукча не писатель

Лига программистов

2K постов11.8K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества