Как стать автором
Обновить

Rghost на прицеле

Wassup!
Не так давно 090h опубликовал статью под названием «Грабим награбленное», где рассказал интересную идею по поводу «прошаривания» файлообменников на предмет .txt файлов. Сегодня я бы хотел рассмотреть создания подобного «парсера-качателя» для rghost.ru на C#. Статья рассчитана на новичков, поэтому гуру вряд ли что-то для себя подчеркнут. Сам я являюсь тоже новичком, поэтому за говн быдло-код уж не серчайте на меня. Сразу скажу, в его статье тоже приводятся какие-то скрипты, но я их даже не смотрел, со своими работать как-то приятнее.

image

Итак, начнем. Создайте WindowsFormsApplication проект, раскидайте по форме все примерно вот так.

image

Так же на второй вкладке добавьте компонент webBrowser.
Подключаем к классу нужные библиотеки.

using System.Net; // Для работы с интернетом, скачать файлы/взять html
using System.IO;
using System.Text.RegularExpressions; // Регулярные выражения для парсинга


Идем дальше, теперь в классе Form1 объявим нужные нам переменные.

string HTML; // Возьмем HTML код страницы
string UTFhtml; // Преобразуем HTML в utf-8
Regex regex;  // Костыли для 
Regex regex2; // парсинга
string adress;  // Будем записывать ссылки на файлы
string fileURL;  // Если нашли .txt, то записываем адрес файла для скачивания
string catalog; // Каталог, куда будут сохраняться файлы
Uri url; // Очередной костыль-преобразователь для браузера
int min; // Номер файла (его id на rghost)
bool active; // Это потом поймете для чего
int provereno; // Считаем сколько файлов проверено
int naideno; // И сколько скачано


В textBox1 у нас будет записываться начальный id файла, он будет преобразовываться в min, в последующем он будет инкрементироваться.

Теперь создаем обработчик событий OnClick для кнопки:

try // Пробуем из textBox'а преобразовать в min(id файла на rghost)
   {
       min = Convert.ToInt32(textBox1.Text);
   }
 catch (Exception)
     {
          MessageBox.Show("Неверный формат мин. или макс. значения",
              "Ошибка",
               MessageBoxButtons.OK,
               MessageBoxIcon.Error);
            return;
     }
       change_url(); // Одна из важнейших функций, дальше, в статье будет ее описание


Теперь опишем метод change_url:

 private void change_url()
        {           
            
                adress = "http://rghost.ru/" + min; // Генерируем ссылку
                provereno++;
                label2.Text = "Ссылок проверено: " + Convert.ToString(provereno);
              url = new Uri(adress); // Делаем из нее URL
                label1.Text = "URL:" + adress;
                active = true; // Разрешаем браузеру начать работу
                webBrowser1.Url = url; // Ставим в браузер                                
            // а браузер начинает парсить              
        }


После вызова этой функции наш компонент webBrowser1 (находящийся на второй вкладке) получает ссылку на страницу и открывает ее. Теперь нам нужно сделать обработчик событий DocumentComplited для браузера. Т.е, когда страница загружена, вызывается этот обработчик.

if (active == false) return; // Проверяем, была ли вызвана функция change_url()
           adress = webBrowser1.Url.ToString(); // Записываем текущий адрес 
            var webClient = new System.Net.WebClient(); // Необходим для получения HTML кода.
            try // Пробуем получить HTML код страницы
            {
                HTML = webClient.DownloadString(adress);
            }
            catch (Exception) // Если вдруг 404 (файла нет)
            {
                min++;
                change_url(); // Генерируем ссылку опять
            }
            
            UTFhtml = ConvertToUtf8(HTML); // Конвертируем HTML в utf-8, код функции будет позже
 // Начинаем парсить. В этом я не очень силен, поэтому делал это поэтапно.
             regex2 = new Regex(@"(.txt — RGhost — файлообменник</title>)"); 
                // Проанализировав title, можно узнать какой файл мы имеем
            fileURL = Convert.ToString(regex2.Match(UTFhtml)); 
           // Если формат .txt
          if(fileURL == ".txt — RGhost — файлообменник</title>")
          {
            // То пытаемся найти ссылку на скачивание
            regex = new Regex(@"(.txt)");
            fileURL = Convert.ToString(regex.Match(UTFhtml));

                    regex = new Regex(@"(?<=<h1>)[\d\D]+(?=</h1>)");
                    fileURL = Convert.ToString(regex.Match(UTFhtml));
                    
                        // Фильтруем дальше
                        regex = new Regex(@"(?<=href)[\d\D]+(?=class)");
                        fileURL = Convert.ToString(regex.Match(fileURL));
                       
                            // Очередной фильтр
                            regex = new Regex(@"(?<="")[\d\D]+(?="")");
                            fileURL = Convert.ToString(regex.Match(fileURL));

                            naideno++;
                            label3.Text = "Файлов найдено: " + Convert.ToString(naideno);
                     // Получаем ссылку и скачиваем файл
                    download();  // Скачиваем, функция тоже будет описана позже
                    return;
         }
             min++;
             change_url(); // Скачали или нет - неважно, все равно генерируем новую ссылку.


Теперь собственно скачивание:

private void download()
        {            
            var webClient = new WebClient();
            System.IO.Directory.CreateDirectory(@"c:/PSWDfinder/");         // Создаем каталог
            catalog = @"c:/PSWDfinder/" + Convert.ToString(min) + ".txt"; // Каталог +id файла  + .txt

            try  // Пробуем его скачать,
            {
                webClient.DownloadFileAsync(new Uri(fileURL), catalog);
            }
            catch (Exception) // Если не скачался (например, файл удален)
            {
                min++;
                change_url(); // Генерируем опять ссылку
            }
            min++;
            change_url(); // Генерируем


Из неописанных функций у нас остался только конвертер в utf-8, я знаю что можно это делать как-то через Encoding, но что-то я не разобрался. Поэтому в этих ваших интернетах нашел готовую:

private string ConvertToUtf8(string source)
        {
            Encoding win1251 = Encoding.GetEncoding("windows-1251");
            Encoding utf8 = Encoding.GetEncoding("utf-8");

            byte[] win1251Bytes = utf8.GetBytes(source);
            byte[] utf8Bytes = Encoding.Convert(utf8, win1251, win1251Bytes);
            source = utf8.GetString(utf8Bytes);
            return source;
        }


Ну вот вроде бы и все.
Готовый проект можно скачать http://rghost.ru/39693631 (на rghost выложил специально, мне интересно, увидев эту статью, удалят ли они этот архив или нет, если что, перезалью)

Это был мой первый пост. В комментария можете ругать меня какой я быдло-кодер.

Удачи!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.