Список форумов * PWR FACTORY *  -  Полезные программы для CS 1.6  -  Скачивание всех HLTV-демок на игрока (assault-only)

Автор Сообщение
Lanm
Добавлено: Ср Сен 06, 2017 21:29
Оффлайн
* Админ Assault *
* Админ Assault *
Награды: 1
Coder (Количество: 1)
Информация
На форуме с: 19.07.2016 Возраст: 32 Сообщения: 1732
Скачивание всех HLTV-демок на игрока (assault-only)

Необходимо:

1. Cygwin или ОС с поддержкой POSIX
2. GNU Coreutils
3. wget

папка в которой будут хранится все демки
в этой папке список plist в формате "имя_папки_игрока_без_пробелов http://www.pwrfactory.ru/stats/as/player.php?id=242406" по одному игроку на строчку
код скрипта сохранить в файл, запускать из баша или ярлык сделать, тоже могу рассказать

Ссылка на код: https://pastebin.com/vaQ9xy2d (форум съел кусок кода, пихнул на другой сайт)
https://pastebin.com/hg78Xt5Q - вторая версия, теперь:
- не будет скачан мусор (index.html), если сессия началась после окончания всех демок
- можно передать число первых страниц архива, которое надо распарсить
- не будет скачана предыдущая демка, если число начала сессии и число демки совпадают

https://pastebin.com/eXTw2KfQ - третья версия:
- исправлен противный баг с сессиями, пересекающими полночь
- закомментировано переименование списка игроков

https://pastebin.com/fWU0U6D3 - чётвёртая версия:
- исправлена регрессия - не скачивалась последняя демка сессии

https://pastebin.com/We0EErmi - пятая версия
- к названию папки теперь приписывается полный ник игрока (кириллица что-то не катит пока)
- в начале скрипта есть регулярка для имени демки, туда можно пихнуть название карты вместо "pwr"

Можно адаптировать для других серверов проекта.

Код:
Код:
mapRegex=pwr
cd /cygdrive/f/Sync/QT_STEAM/qbans/
if [[ $1 != "" ]]; then pages=$1; else pages=20; fi
links=$({ for i in $(seq.exe 1 1 $pages); do wget  --retry-on-http-error=403 --retry-connrefused -O - 'http://pwrfactory.ru/hltv/index.php?server=assault&page='$i | grep -Po 'assault/pwr_asslt\-\d{10}\-[^\"]*'; sleep 0; done; } | sort | uniq );
switch=0
for pl in `cat plist`; do
   if (( ! $switch )); then
      name=$pl
      switch=1;
   else
      regex='.*id=([0-9]*)$'
      [[ $pl =~ $regex ]]
      num=${BASH_REMATCH[1]}
      page=`wget  --retry-on-http-error=403  -O - $pl 2>/dev/null`
      regex='<h1>Статистика игрока : ([^<]*)</h1>'
      [[ $page =~ $regex ]]
      actualName=${BASH_REMATCH[1]}
      dirName=$name-$num-${actualName//[^a-zA-Z_0-9]/_}
      mkdir $dirName
      cd $dirName
      echo $pl
      dates=$( wget  --retry-on-http-error=403  -O - $pl"&slimit=1000&ssort=sessionstart&sorder=desc&sstart=0" |
      grep -Po '<td>([0-9]{4})-([0-9]{2})-([0-9]{2}) @ ([0-9]{2}):([0-9]{2}) - ([0-9]{2}):([0-9]{2})</td>'|
      {
      while read RNG; do
         regex='<td>([0-9]{2})([0-9]{2})-([0-9]{2})-([0-9]{2}) @ ([0-9]{2}):([0-9]{2}) - ([0-9]{2}):([0-9]{2})</td>'
         if [[ "$RNG" =~ $regex ]]; then
            a=${BASH_REMATCH[2]}${BASH_REMATCH[3]}${BASH_REMATCH[4]}${BASH_REMATCH[5]}${BASH_REMATCH[6]}
            b=${BASH_REMATCH[2]}${BASH_REMATCH[3]}${BASH_REMATCH[4]}${BASH_REMATCH[7]}${BASH_REMATCH[8]}
            if (( $b < $a )); then
               bdate="${BASH_REMATCH[1]}${BASH_REMATCH[2]}-${BASH_REMATCH[3]}-${BASH_REMATCH[4]} ${BASH_REMATCH[7]}:${BASH_REMATCH[8]}"
               b=`date -d "$bdate + day" +%g%m%d%H%M`
            fi
            echo $a; echo $b
         fi
      done;
      } |
      sort; )
      echo $dates
      dateSwitch=0
      for dt in $dates; do
         if (( ! $dateSwitch )); then
            a=$dt
            dateSwitch=1
         else
            b=$dt
            echo $a $b
            pfound=false
            for lnk in $links; do
               regex='assault/pwr_asslt\-([0-9]{10})\-[^\"]*';
               if [[ $lnk =~ $regex ]]; then
                  if (( ${BASH_REMATCH[1]} <= $a )); then
                     pfound=true
                     prev=${BASH_REMATCH[0]};
                  elif (( ${BASH_REMATCH[1]} <b>= $b )); then
                     if [[ $pfound == true ]]; then
                        if [[ $prev =~ $mapRegex ]]; then
                           echo $prev
                           wget  --retry-on-http-error=403  -c --retry-connrefused 'http://pwrfactory.ru/hltv/'$prev;
                        fi
                     fi
                     break;
                  fi
               fi
            done
            dateSwitch=0
         fi
      done
      cd ..
      switch=0
   fi
done
# mv plist plist.done


P.S. Есть проблема с переводами строк в plist, они должны быть в формате Unix (LF), иначе будет ошибка вместо демок.
Вернуться к началу
Steam Profile
KABANOFF [PWR]
Добавлено: Ср Сен 06, 2017 22:12
Оффлайн
* Админ AIM + HS *
* Админ AIM + HS *
Награды: 4
PWR Boost Event (Количество: 1) Video Shot Event (Количество: 1) Акционер проекта (Количество: 1) Почётный ветеран (Количество: 1)
Информация
На форуме с: 27.02.2014 Возраст: 32 Сообщения: 2349 Откуда: Латвиджа
А можно теперь нам тупым бездарям объяснить что это и зачем?
Вернуться к началу
Steam Profile
Lanm
Добавлено: Чт Сен 07, 2017 9:29
Оффлайн
* Админ Assault *
* Админ Assault *
Награды: 1
Coder (Количество: 1)
Информация
На форуме с: 19.07.2016 Возраст: 32 Сообщения: 1732
Это программа для POSIX shell (sh, bash, zsh и т.д.), она нужна для автоматической выборки всех HLTV-демок из архива с использованием статистики игрока. Если кому-то интересно, и нет опыта использования Cygwin (нужен только для винды, в POSIX-системах можно прямо так запускать) - могу рассказать, как использовать.
Вернуться к началу
Steam Profile
bibika
Добавлено: Пт Сен 08, 2017 9:29
Оффлайн
* Главный главнюк *
* Главный главнюк *
Информация
На форуме с: 25.10.2009 Возраст: 37 Сообщения: 7834 Откуда: Питер
Заморочился ты не слабо Very Happy.

Распиши более подробно как это работают по коду примерно понятно, ну чтобы все поняли.

Цитата:
папка в которой будут хранится все демки
в этой папке список plist в формате "имя_папки_игрока_без_пробелов http://www.pwrfactory.ru/stats/as/player.php?id=242406" по одному игроку на строчку
код скрипта сохранить в файл, запускать из баша или ярлык сделать, тоже могу рассказать



Вернуться к началу
Steam Profile
Lanm
Добавлено: Пт Сен 08, 2017 11:26
Оффлайн
* Админ Assault *
* Админ Assault *
Награды: 1
Coder (Количество: 1)
Информация
На форуме с: 19.07.2016 Возраст: 32 Сообщения: 1732
Вот ты зря код вставил, в теге code неправильно экранируется текст (видимо, сначала исключаются все теги, и только потом работает экранирование code), там съеден кусочек в середине. Вставляю экранированный от HTML код - форум экранирует амперсанды, так что вставить код я не могу.

Работает это так:
Код:
cd /cygdrive/d/QT_STEAM/qbans/
links=$({ for i in $(seq.exe 1 1 20); do wget -O - 'http://pwrfactory.ru/hltv/index.php?server=assault&page='$i | grep -Po 'assault/pwr_asslt\-\d{10}\-[^\"]*'; sleep 1s; done; } | sort | uniq );

- переход в папку для скачивания
- скачивание всех страниц со списками демок с запасом (больше 17 не видел), сортировка (получается сортированый по времени список), исключение повторов (если я запросил 20 страницу, а страниц только 17, будет отдана первая)
Код:
switch=0
for pl in `cat plist`; do
    if (( ! $switch )); then
        mkdir $pl;
        cd $pl;
        switch=1;

- создание папки для игрока для каждой второй строки без пробелов, начиная с первой
Код:
    else
        echo $pl
        dates=$( wget -O - $pl"&slimit=1000&ssort=sessionstart&sorder=desc&sstart=0" |
        grep -Po '<td>([0-9]{4})-([0-9]{2})-([0-9]{2}) @ ([0-9]{2}):([0-9]{2}) - ([0-9]{2}):([0-9]{2})</td>'|
        {
        while read RNG; do
            regex='<td>([0-9]{2})([0-9]{2})-([0-9]{2})-([0-9]{2}) @ ([0-9]{2}):([0-9]{2}) - ([0-9]{2}):([0-9]{2})</td>'
            if [[ "$RNG" =~ $regex ]]; then
                a=${BASH_REMATCH[2]}${BASH_REMATCH[3]}${BASH_REMATCH[4]}${BASH_REMATCH[5]}${BASH_REMATCH[6]}
                b=${BASH_REMATCH[2]}${BASH_REMATCH[3]}${BASH_REMATCH[4]}${BASH_REMATCH[7]}${BASH_REMATCH[8]}
                echo $a; echo $b
            fi
        done;
        } |
        sort; )

- скачивание страницы статистики игрока с дописанными URL-параметрами, увеличивающими длину списка сессий до очень большого
- выуживание только того, что похоже на две даты
- составление одного числа и цифр даты из статистики (как в названии демки)
Код:
        echo $dates
        dateSwitch=0
        for dt in $dates; do
            if (( ! $dateSwitch )); then
                a=$dt
                dateSwitch=1
            else

- обработка дат (начала и концы сессий) из переменной в виде чисел попарно (можно входные данные на массивы из двух элементов разбить, но лень)
Код:
                b=$dt
                echo $a $b
                for lnk in $links; do
                    # echo $lnk
                    regex='assault/pwr_asslt\-([0-9]{10})\-[^\"]*';
                    if [[ $lnk =~ $regex ]]; then
                        if (( ${BASH_REMATCH[1]} <= $a )); then # оператор изменён с меньше на меньше или равно
                            prev=${BASH_REMATCH[0]};
                        elif (( ${BASH_REMATCH[1]} <b>= $b )); then # здесь съеден кусок кода из-за парсера
                            wget 'http://pwrfactory.ru/hltv/'$prev;
                            break;
                        fi
                    fi
                done
                dateSwitch=0

- проход по всем ссылкам на демки (можно двоичный поиск, но НЕ НУЖНО) с выуживанием числа из ссылки (относительной) на демку. Число обозначает время начала записи. Из-за того, что всё крутится на одном сервере, время совпадает точно.
- пока число из имени не больше числа начала сессии, запоминаем последнюю ссылку на демку (если начало следующей демки окажется внутри диапазона, эту демку надо будет скачать)
- пока число из имени меньше конца демки, скачиваем предыдущую демку и запоминаем эту (так проще написать, чтобы каждая пара обрабатывалась в каком-то из условий)
- когда число совпало или превысило число конца сессии, скачиваем последнюю и переходим к следующей сессии
Код:
mv plist plist.done

- переименование обработанного списка
    - добавлено спустя 9 минут:
Потратил полтора часа досуга. Вот ты говоришь "заморочился", а я однажды работал в фирме, в которой надо было перетаскивать мышкой картинки в сетку в ворде, делать подписи к ним и вставлять ссылки на все картинки, и однажды этих картинок было три тысячи.

"Да пошло оно всё" - подумал я и четверть от того времени, которое я потратил бы на это, я потратил на написание баш-скрипта, который:
- парсит имя файла, содержащего данные для подписи (пара чисел и коммент)
- вставляет подписи, имена файлов и якоря для ссылок (числа) в XML-файл, который является частью DOCX (и других форматов)
- вставляет между каждыми двумя именами файлов ручками скопированный текст, который отделяет строки и ячейки таблицы (там тоже машина состояний)
- вставляет список ссылок в другой файл
- запаковывает всё это вместе с файлами картинок в ZIP-архив (которым являются DOCX и т..д)

И оно РАБОТАЛО сразу же, как только я отловил очевидные баги. ГОТОВО. После этого я ту же работу делал в 10 раз быстрее, переименовывая файлики картинок кнопкой F2 и запуская скрипт.
Вернуться к началу
Steam Profile
Lanm
Добавлено: Пт Сен 08, 2017 12:46
Оффлайн
* Админ Assault *
* Админ Assault *
Награды: 1
Coder (Количество: 1)
Информация
На форуме с: 19.07.2016 Возраст: 32 Сообщения: 1732
Забавно было то, что разные доки отдавались двум сотрудницам, одна из которых говорила "сделай красиво - так, чтобы фотка заполняла ячейку", а другая говорила "сделай красиво - так, чтобы не было растянутых фоток", это я тоже автоматизировал.
Вернуться к началу
Steam Profile
o5
Добавлено: Пт Сен 08, 2017 15:34
Оффлайн
* Бан по ассисту *
* Бан по ассисту *
Награды: 2
Video Shot Event (Количество: 1) Почётный ветеран (Количество: 1)
Информация
На форуме с: 13.08.2011 Возраст: 37 Сообщения: 5796
Хорошая тема. Правда, у нас никто в жизни не качал все демки на человека. Но как заполнение раздела это замечательная тема.

Сыр и дырки в сыре: Больше сыра — больше дырок. Больше дырок — меньше сыра. Больше сыра = меньше сыра!
Вернуться к началу
Steam Profile
XBOCT
Добавлено: Вс Сен 10, 2017 22:54
Оффлайн
* Админ GunGame *
* Админ GunGame *
Награды: 3
Linux Helper (Количество: 1) PWR Boost Event (Количество: 1) Акционер проекта (Количество: 1)
Информация
На форуме с: 10.10.2015 Возраст: 37 Сообщения: 366 Откуда: Ессентуки
Ещё один Линуксоид всегда хорошо))))
Вернуться к началу
KABANOFF [PWR]
Добавлено: Пн Сен 11, 2017 0:46
Оффлайн
* Админ AIM + HS *
* Админ AIM + HS *
Награды: 4
PWR Boost Event (Количество: 1) Video Shot Event (Количество: 1) Акционер проекта (Количество: 1) Почётный ветеран (Количество: 1)
Информация
На форуме с: 27.02.2014 Возраст: 32 Сообщения: 2349 Откуда: Латвиджа
Ланм ты ведь не сам это придумал?
Вернуться к началу
Steam Profile
Lanm
Добавлено: Пн Сен 11, 2017 9:27
Оффлайн
* Админ Assault *
* Админ Assault *
Награды: 1
Coder (Количество: 1)
Информация
На форуме с: 19.07.2016 Возраст: 32 Сообщения: 1732
Пусть это будет загадкой для тебя.
Вернуться к началу
Steam Profile

Показать сообщения:  

   Страница 1 из 1

Перейти:  

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы