Доброго дня читатель.
Топик посвящен тому как я писал обертку над всеми хорошо известным сайтом rutracker.org.
Я страсть как люблю изучать новые технологии, а дабы получше разобраться в каждой из них я стараюсь их применять на практике в своих мини проектах, которые делаю в свободное от работы время. Так как я последние 6 лет занимаюсь разработкой на платформе .Net, весь приведенный код будет, как не сложно догадаться на C#. Забегая вперед, я хочу сказать, какие технологии мне удалось затронуть, а это ASP.NET MVC, Windows Azure(WebSites, Cloud Services, Sql Database, Service Bus), WCF аутентификацию на основе сертификатов, наконец-то удалось вблизи пощупать Windsor IoC, но речь пойдет не о технологиях.
Зачастую проводя время в компании хороших друзей, часто можно услышать реплики типа: «А ты смотрел фильм yyy(3 икса писать не хочется)?», в такие моменты думаешь, что нужно его обязательно глянуть, а под рукой только планшет или телефон, а пока доберешься домой и вовсе забудешь про что речь шла. Покопавшись в настройках, опять же небезызвестной программы uTorrents, я обнаружил, что в ней возможность качать торренты из указанной папки. Тут-то я и смекнул, что вместе Dropbox’ом это может быть неплохим инструментом по скачиванию торрентов. Итак, я вооружился веб-дебаггером под именем Fiddler2. И посмотрел какие запросы шлет браузер к серверу rutracker’a. Как оказалось запросы совсем несложные и хорошо читаемые. Вот к примеру запрос на авторизацию:
Как видно он совсем не сложный, никакого HTTPS нету, пробуем написать простой прототип, который авторизуется на сайте:
и авторизоваться не получается, по той простой причине что стандартный класс WebClient не поддерживает хранение cookies. Ок, пришлось написать свой класс унаследованный от WebClient’a перегрузив всего 2 метода GetWebRequest и GetWebResponse(весь код и проект целиком можно найти в конце статьи, будет ссылка на svn гугла).
Пробую авторизоваться на сайте и на этот раз все получилось. Поигравшись с кодом немножко, и написав пару тестов, я понял, что это просто удача, потому что rutracker стал просить у меня ввод капчи, а это уже сложнее и понятно что авторизоваться не с первого раза может не получится. Отсюда и вырисовывается будущая архитектура проекта, нужно пытаться авторизоваться на сайте через какой-то период пока все не получится. Итак что нужно:
• Тонкий клиент, который будет отправлять запросы в очередь
• Сама очередь
• Сервер, который будет по таймеру забирать сообщения, пытаться авторизоваться на сайте и выкачать торрент, как только у него это получится.
На лицо типичная архитектура на базе сообщений. Клиент отправляет в очередь сообщение, сервер по таймеру проверяет эту очередь, пытается авторизоваться и скачать торрент, в случае неудачи, оставляет сообщение в очереди.
В качестве очереди выступает MS Service Bus в качестве клиента обычное ASP.Net приложение, в качестве сервиса MS Cloud Service. Клиент до безобразия прост и содержит следующие поля для ввода
• текстовое поле для ввода темы с торрентом,
• логин от rutracker’a
• пароль от от негоже,
• е-mail для отправки результатов обработки сообщения
• token для dropbox’a, который можно получить прямо на клиенте
• папку дропбокса, в которую будет скачан торрент
Что примечательно это отсутствие хранения состояния.
Как оказалось бы дело сделано, но пользоваться этим совершенно не возможно (вспомнил почему-то про книгу Психбольница в руках пациентов), я еще раз убедился, что программисты не умеют проектировать интерфейсы, не говоря уже о взаимодействии, мы слишком озабочены другими вещами: архитектурой, дизайном системы, выбором фреймворков и т.п… Пришлось переделывать если не все, то почти многое. Что бы не извращаться с интерфейсом сайта, было решено сделать прокси к rutracker’y, т.е. свой сайт, который выкачивает html с rutracker.org и отрисовывает его в отдельном тэге плюс добавляет кнопочку по скачиванию торрента прямо в дропбокс. Сразу же отпала необходимость в отдельном сервере и очередях, потому, что пользователь авторизуется вручную и ввести капчу не представляется проблемой.
В планах реализовать получение прямой ссылки на уже скачанные файлы, можно посмотреть что за зверь такой Windows Azure Storage и встроить поддержку не только rutracker’a но и других популярных торрент трекеров.
Готовый и рабочий проект находится на rutracker.azurewebsites.net, надеюсь публикуя эту ссылку мой триальный WindowsAzure аккаунт не скажет мне до свидания. Как и обещал ссылка на svn репозиторий
P.S. Если статья вызовет хоть какой-то интерес, обещаю рассказать про детали реализации с более подробными разъяснениями.
Автор: Disposer