Продукты «Хакера»

  • Ежеквартальный «Хакер» #3

    Ежеквартальный «Хакер» #3

    Лучшие статьи квартала на бумаге

    2 000 ₽

    Заказать журнал
  • Годовая подписка на Xakep.ru

    Годовая подписка на Xakep.ru

    Полный доступ к статьям и архиву выпусков

    6 000 ₽ в год

    Подписаться
  • «Пентест WEB» для начинающих

    «Пентест WEB» для начинающих

    Совместный курс «Хакера» и лаборатории «Хаксет»

    7 000 ₽

    Купить курс
  • Спецвыпуск «Хакера» #4

    Спецвыпуск «Хакера» #4

    Лучшие статьи за 2021–2022 годы на бумаге

    2 000 ₽

    Заказать журнал

Судя по отзывам на статьи, посвященные кодингу, эта тема пользуется не очень большой популярностью среди читателей "Х". Возможно, потому что большинство жаждет легкой славы, возможно, сказывается недостаток базовых знаний, а может быть, хороших статей по этой теме не так уж много. Моя статья ни в коей мере не претендует на это гордое звание, так как то, о чем я пишу, сложно назвать кодингом. Это просто автоматизация выполнения часто встречающихся действий, и время создания программы лишь несколько превышает время необходимое на то, чтобы набрать ее исходный код. Несмотря на это, она может чему-то научить, или по крайней мере показать, что в этой самой автоматизации нет ничего запредельного. Итак, передо мной стояла задача скачать с сайта www.xakep.ru статьи, для того чтобы потом иметь возможность просматривать их в оффлайне. Дело затрудняется тем, что ссылок на большинство статей на сайте нет, а если и есть, то доступ к ним не так прост. Выручает то, что все статьи расположены по ссылкам вида
http://www.xakep.ru/post/XXXXX/default.asp?flash=1, где XXXXX - пятизначное число, указывающее на номер статьи. Используемый язык программирования - Perl. Платформа - Win. Скачать Perl для этой платформы можно по адресу:
http://www.activestate.com/activeperl. Неплохая документация доступна по адресу:
http://cgiworld.al.ru/library.htm.

Итак, вот текст программы:

#С подобной строки должна начинаться любая Перл - программа. Это путь к
интерпретатору.
#!/usr/bin/perl

#Подключаем библиотеку для работы с сокетами.
use IO:Socket;

#В options.ini хранится номер последней скачанной статьи.
#Эти три строки открывают текстовый файл, и считывают его в массив @lines1
open (TXTFILE, "options.ini");
@lines1 = <TXTFILE>;
close(TXTFILE);

#Переменной $last_checked_num присваиваем первую строку файла
$last_checked_num = lines1 [0];
#Инкрементируем эту переменную. (увеличиваем значение на 1)
$last_checked_num ++ ;

#Инициализируем переменные
$host = "www.xakep.ru";
$port = 80;

#Метка в Перл вводится именно так (label - имя метки. В данном случае label не является зарезервированной инструкцией языка, и используется как идентификатор.)
label: ;

#Конструируем путь к статье. (Точка предназначена для конкатенации [строкового сложения].)
$path_to_info = "http://www.xakep.ru/post/"&$last_checked_num&"/default.asp?flash=1";

#Пытаемся открыть сокет. Если не получится, то выполнится команда после or. В данном случае я останавливаю работу программы, с выдачей сообщения об ошибке.
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP") or die "Не могу подключиться к серверу.\n";

#Конструируем HTTP запрос:

$url = "GET " . $path_to_info;
$buffer = " HTTP/1.0\r\n";
$end = "\r\n\r\n";
$url = $url . $buffer . $end;

#Отправляем запрос.
print $socket "$url";

#Получаем ответ в массив @lines
@lines = <$socket>;
#Выводим сообщение об успехе.
print "Попытка удалась\n";

#Открываем html файл в режиме перезаписи. Его имя - номер статьи.
open (TXTFILE, "$last_checked_num.htm");

#Этот флаг используется для того, чтобы определить, следует ли записывать строку из массива @lines в файл. #Дело в том, что помимо необходимых нам HTML инструкций, в нем будет еще служебная информация (заголовок).
#В файл будет записано все, что идет после <html>

$flag=0;

#Для каждой строчки массива выполнять:
#Внутри тела инструкции foreach обращение к текущей строке происходит через переменную $line

foreach $line (@lines) 
{

#если флаг не 0, то продолжаем, если ноль, то переходим к инструкциям после else
if ($flag != 0)
{
#Если текущая строка не пустая, то записываем ее в файл
if ($line ne "\n") {print TXTFILE $line;}
}
#Иначе если встретили <html>, то устанавливаем флаг в 1.
else {if ($line =~ /<html>.*/){$flag=1;print TXTFILE "<html>";}}
};

#Закрываем файл
close TXTFILE;

#Записываем в options.ini номер статьи, которая была сохранена в файл.
@lines1[0] = $last_checked_num;
$filename = ">options.ini";
open (TXTFILE, $filename);
print TXTFILE @lines1;
close(TXTFILE);

#Переходим к следующей статье.
$last_checked_num ++ ;

#Круг замкнулся. 🙂
goto label;

Хочу обратить твое внимание на то, что в случае если соединение прервется в момент получения текста статьи, то в файле options.ini может быть установлено некорректное значение. Просто посмотри номер последней нормально
скачавшейся статьи и запиши его в options.ini . Удачного тебе программирования
:).

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии