Автор |
Сообщение |
Lanm |
Добавлено: Ср Сен 06, 2017 21:29
|
|
|
* Админ Assault *
Информация
На форуме с: 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), иначе будет ошибка вместо демок. |
|
|
Вернуться к началу
|
|
KABANOFF [PWR] |
Добавлено: Ср Сен 06, 2017 22:12
|
|
|
* Админ AIM + HS *
Информация
На форуме с: 27.02.2014
Возраст: 32
Сообщения: 2349
Откуда: Латвиджа
|
А можно теперь нам тупым бездарям объяснить что это и зачем? |
|
|
Вернуться к началу
|
|
Lanm |
Добавлено: Чт Сен 07, 2017 9:29
|
|
|
* Админ Assault *
Информация
На форуме с: 19.07.2016
Возраст: 32
Сообщения: 1732
|
Это программа для POSIX shell (sh, bash, zsh и т.д.), она нужна для автоматической выборки всех HLTV-демок из архива с использованием статистики игрока. Если кому-то интересно, и нет опыта использования Cygwin (нужен только для винды, в POSIX-системах можно прямо так запускать) - могу рассказать, как использовать. |
|
|
Вернуться к началу
|
|
bibika |
Добавлено: Пт Сен 08, 2017 9:29
|
|
|
* Главный главнюк *
Информация
На форуме с: 25.10.2009
Возраст: 37
Сообщения: 7834
Откуда: Питер
|
Заморочился ты не слабо .
Распиши более подробно как это работают по коду примерно понятно, ну чтобы все поняли.
Цитата: папка в которой будут хранится все демки
в этой папке список plist в формате "имя_папки_игрока_без_пробелов http://www.pwrfactory.ru/stats/as/player.php?id=242406" по одному игроку на строчку
код скрипта сохранить в файл, запускать из баша или ярлык сделать, тоже могу рассказать |
|
|
Вернуться к началу
|
|
Lanm |
Добавлено: Пт Сен 08, 2017 11:26
|
|
|
* Админ Assault *
Информация
На форуме с: 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
- проход по всем ссылкам на демки (можно двоичный поиск, но НЕ НУЖНО) с выуживанием числа из ссылки (относительной) на демку. Число обозначает время начала записи. Из-за того, что всё крутится на одном сервере, время совпадает точно.
- пока число из имени не больше числа начала сессии, запоминаем последнюю ссылку на демку (если начало следующей демки окажется внутри диапазона, эту демку надо будет скачать)
- пока число из имени меньше конца демки, скачиваем предыдущую демку и запоминаем эту (так проще написать, чтобы каждая пара обрабатывалась в каком-то из условий)
- когда число совпало или превысило число конца сессии, скачиваем последнюю и переходим к следующей сессии
- переименование обработанного списка- добавлено спустя 9 минут: Потратил полтора часа досуга. Вот ты говоришь "заморочился", а я однажды работал в фирме, в которой надо было перетаскивать мышкой картинки в сетку в ворде, делать подписи к ним и вставлять ссылки на все картинки, и однажды этих картинок было три тысячи.
"Да пошло оно всё" - подумал я и четверть от того времени, которое я потратил бы на это, я потратил на написание баш-скрипта, который:
- парсит имя файла, содержащего данные для подписи (пара чисел и коммент)
- вставляет подписи, имена файлов и якоря для ссылок (числа) в XML-файл, который является частью DOCX (и других форматов)
- вставляет между каждыми двумя именами файлов ручками скопированный текст, который отделяет строки и ячейки таблицы (там тоже машина состояний)
- вставляет список ссылок в другой файл
- запаковывает всё это вместе с файлами картинок в ZIP-архив (которым являются DOCX и т..д)
И оно РАБОТАЛО сразу же, как только я отловил очевидные баги. ГОТОВО. После этого я ту же работу делал в 10 раз быстрее, переименовывая файлики картинок кнопкой F2 и запуская скрипт. |
|
|
Вернуться к началу
|
|
Lanm |
Добавлено: Пт Сен 08, 2017 12:46
|
|
|
* Админ Assault *
Информация
На форуме с: 19.07.2016
Возраст: 32
Сообщения: 1732
|
Забавно было то, что разные доки отдавались двум сотрудницам, одна из которых говорила "сделай красиво - так, чтобы фотка заполняла ячейку", а другая говорила "сделай красиво - так, чтобы не было растянутых фоток", это я тоже автоматизировал. |
|
|
Вернуться к началу
|
|
o5 |
Добавлено: Пт Сен 08, 2017 15:34
|
|
|
* Бан по ассисту *
Информация
На форуме с: 13.08.2011
Возраст: 37
Сообщения: 5796
|
Хорошая тема. Правда, у нас никто в жизни не качал все демки на человека. Но как заполнение раздела это замечательная тема. |
Сыр и дырки в сыре: Больше сыра — больше дырок. Больше дырок — меньше сыра. Больше сыра = меньше сыра! |
|
Вернуться к началу
|
|
XBOCT |
Добавлено: Вс Сен 10, 2017 22:54
|
|
|
* Админ GunGame *
Информация
На форуме с: 10.10.2015
Возраст: 37
Сообщения: 366
Откуда: Ессентуки
|
Ещё один Линуксоид всегда хорошо)))) |
|
|
Вернуться к началу
|
|
KABANOFF [PWR] |
Добавлено: Пн Сен 11, 2017 0:46
|
|
|
* Админ AIM + HS *
Информация
На форуме с: 27.02.2014
Возраст: 32
Сообщения: 2349
Откуда: Латвиджа
|
Ланм ты ведь не сам это придумал? |
|
|
Вернуться к началу
|
|
Lanm |
Добавлено: Пн Сен 11, 2017 9:27
|
|
|
* Админ Assault *
Информация
На форуме с: 19.07.2016
Возраст: 32
Сообщения: 1732
|
Пусть это будет загадкой для тебя. |
|
|
Вернуться к началу
|
|
|