ViKing.ApplicationFramework

ViKing.ApplicationFramework

Наконец-то нашел время написать эту статью. Давно уже пользуюсь, пора бы и поделиться. Итак, речь пойдет о ViKing.ApplicationFramework

Основная цель этой библиотеки — сделать процесс написания всевозможных парсеров и накрутчиков максимально быстрым при минимальном объеме кода. Фреймворк сам генерирует интерфейс и занимается потоками, остается только написать код, обрабатывающий запросы. На практике для большинства задач достаточно создать проект и написать всего пару десятков строк кода.

Давайте рассмотрим процесс работы с фреймворком на примере создания парсера подписчиков публичных страниц вконтакте. Здесь я хочу в общих чертах показать, как выглядит процесс создания простого приложения, более подробное описание функционала библиотеки будет в следующем посте.

Сначала библиотеку нужно скачать и установить. Подробнее здесь.

Далее создаем новый проект:

new viking framework project

Проект состоит из основного файла с кодом Job.cs, папки lib с движком и фреймворком и нескольких стандартных файлов. На данном этапе при запуске мы получаем следующее окно: framework_vk_parser1

Содержимое файла Job.cs для нового проекта:

using ...

namespace Viking_Application1
{
    public class Job : JobBase
    {
        public override void DoWork()
        {

        }
    }
}

Давайте теперь напишем основную логику. Для начала нам понадобятся данные от пользователя: аккаунт вконтакте и номер сообщества. Для создания полей ввода нужно всего лишь задать статичное свойство. Значения свойств сами сохраняются в реестр и подгружаются при следующем запуске программы. Все делается автоматически

public static string Login { get; set; }
public static string Password { get; set; }
public static string Public { get; set; }

Парсинг будет состоять из 2 шагов: нужно один раз залогиниться, и затем в несколько потоков качать и разбирать страницы. Для однопоточной инициализации перегружаем функцию StartWork() и делаем запрос на логин с глобальными куками (они потом автоматически будут подставляться в каждый поток). Обратите внимание, что для выполнения запроса тут используется локальная функция, позже я расскажу, чем она отличается от функции из Viking.Engine.

public override void StartWork()
{
    Request(String.Format("https://login.vk.com/?act=login&role=al_frame&email={0}&pass={1}", Login, Password), FollowRedirects: true, cookies: GlobalCookies);
}

Теперь пишем код для парсинга в многопоточной функции DoWork(). Качаем список участников сообщества:

var content = Request(String.Format("http://vk.com/al_page.php?act=box&al=1&offset={0}&oid=-{1}&tab=members", offset, Public)).Content;

Вытаскиваем из него ссылки на аккаунты:

var akks = content.Matches(@"fans_fan_lnk"" href=""/([^""]+)").GetGroup(1).ToList();

Если найдено 0 акков – пора останавливать задание:

if (akks.Count == 0) StopJop("No more members");

И в конце записываем полученые аккаунты:

File.AppendAllLines("members.txt", akks);

Все, софт готов, можно пользоваться. Вот что получилось в результате: framework_vk_parser2

using ...;

namespace Viking_Application1
{
    public class Job : JobBase
    {
        public static string Login { get; set; }
        public static string Password { get; set; }
        public static string Public { get; set; }

        int page = 0;

        public override void StartWork()
        {
            Request(String.Format("https://login.vk.com/?act=login&role=al_frame&email={0}&pass={1}", Login, Password), FollowRedirects: true, cookies: GlobalCookies);
            File.Delete("members.txt");
        }

        public override void DoWork()
        {
            int offset = page++ * 60;
            var content = Request(String.Format("http://vk.com/al_page.php?act=box&al=1&offset={0}&oid=-{1}&tab=members", offset, Public)).Content;
            var akks = content.Matches(@"fans_fan_lnk"" href=""/([^""]+)").GetGroup(1).ToList();
            Log("Found {0} members", akks.Count);
            Stats["Members"] += akks.Count;
            if (akks.Count == 0) StopJop("No more members");
            File.AppendAllLines("members.txt", akks);
        }
    }
}

Я понимаю, что к концу прочтения поста могло возникнуть много вопросов. Этот пост в большей степени является рекламой фреймворка. В следующей статье я более подробно расскажу как все работает.

Исходник с комментариями можно скачать тут, сам фреймворк находится здесь.

upd: Обновил совместимость с .NET 4.0 и 4.5

Comments are closed.