Эта статья входит в цикл статей о том как легко научиться писать свои регеры, парсеры, спамеры, накрутчики опросов и прочий софт, автоматизирующий действия в сети. Вобщем-то в этом нет ничего сложного. Писать будем на C#. Нам понадобятся Visual Studio, Firefox, Firebug, Fiddler и ViKing.Engine, который можно скачать тут Следующая статья: думаю на ачате эта будет последней. возможно и эту тоже снесут. Предыдущая статья: на блоге, потому что не тянет на статью ачата. Предыдущая статья на ачате: mail регер rambler.ru. На этот раз мы будем учиться на примере более серьезной программы, которую, например, можно продать и на полученные деньги пойти купить себе сникерс . Это будет усовершенствованный регер почты rambler.ru, быстрый, многопоточный, с поддержкой антигейта и всех видов проксей. Программа эта более длинная чем предыдущие, поэтому я не буду объяснять как работает весь исходник, а расскажу только про важные части. Остальное в основном связано с работой интерфейса и можно понять просто глядя на код. Прокси При работе с прокси-серверами нужно привыкнуть к тому, что при запросах может возникать куча ошибок. Например, многие прокси, когда у них запрашиваешь сайт, скажем www.ya.ru, выдают вместо него какую-то левую страницу типа «добро пожаловать на наш офигенный прокси». Естественно программа ничего не поймет в этом ответе. При этом зачастую на следующий запрос прокси отвечает нормально. Также часто бывает что прокси поддерживает GET-запросы, но не поддерживает POST. Самая частая ситуация, это когда прокси просто забивает на то, что его попросили скачать какую-то страницу, и программа просто зря ждет надеясь получить ответ. Кстати, для настройки, сколько времени ждать ответа от сервера используйте параметр VkRequest.Timeout. Начнем с того, что напишем свой класс прокси, чтобы можно было учитывать количество ошибок в процессе работы программы и эффективно отсеивать нерабочие сервера. Code: class MyProxy : Proxy { public const int StartErrors = 3; public const int MaxErrors = 5; public int ErrorsCount { get; set; } // эти 2 конструктора просто повторяют конструкторы родительского класса public MyProxy(string addressAndPort, ProxyTypes type) : base(addressAndPort, type) { ErrorsCount = StartErrors; } public MyProxy(string address, int port, ProxyTypes type, string login = null, string password = null) : base(address, port, type, login, password) { ErrorsCount = StartErrors; } } Этот класс наследуется от класса Proxy, поэтому умеет все то же самое, что и основной класс + еще пару мелочей. У него появился параметр ErrorsCount, с помощью которого мы будем отслеживать, сколько ошибок подряд произошло при использовании данного прокси. Если их произошло больше 5 подряд прокси можно выкинуть. При этом если через прокси удалось успешно зарегистрировать аккаунт, будем скидывать счетчик на 0 – может быть получится еще один зарегистрировать. Чтобы отфильтровать совсем нерабочие прокси сразу, будем изначально устанавливать счетчик ошибок на 3. То есть, если мы взяли новый прокси, и он выдает 2 ошибки подряд, то выкинем его. Еще одна немаловажная деталь о прокси-серверах: они как правило очень медленные. Поэтому нужно позаботиться о том, чтобы через них проходило как можно меньше трафика. Если можно сделать какой-то запрос мимо прокси-сервера, нужно так и делать. Помните мы в первой версии регера вытаскивали uniq_id из страницы регистрации? При этом нашли мы его в 3-х местах, и одно из этих мест – это куки rrc, которое выдает нам страница регистрации. А помните в прошлом уроке я рассказывал про метод HEAD? Так вот, мы можем не качать всю форму регистрации, а только попросить ее заголовки: Code: CookieCollection cook = new CookieCollection(); // более подробно о том, как использоать куки я объясню в следующем уроке VkRequest.Request("http://id.rambler.ru/script/newuser.cgi", cookies: cook, method: "HEAD"); string id = cook["rrc"]; Таким образом мы сэкономим довольно много прокси-трафика. Страница регистрации весит 30кб, в сжатом виде (движок делает это автоматически) 9кб, одни заголовки – <1кб. Получается экономия почти в 10 раз. Дальше у нас идет скачивание капчи. Для большинства серверов (почти для всех) неважно качаете вы капчу через прокси или со своего компа. При этом скачать ее без прокси гораздо быстрее и сильно понижает вероятность ошибок, связанных с прокси (он должен успешно выполнить 2 запроса подряд вместо 3-х). Так что при скачивании капчи прокси использовать ненужно. Благодаря этим оптимизациям, для прокси вместо 3-х запросов на 15кб данных (9кб форма регистрации, 5кб капча, 1кб POST) получается всего 2 запроса по 1кб каждый (даже меньше). К тому же мы в 2 раза уменьшили общий трафик, убрав лишние 8кб для формы регистрации. Следует помнить, что скорость работы софта обычно напрямую зависит от того, сколько запросов он успевает послать по интернет каналу. Уменьшая количество необходимого трафика, вы тем самым увеличиваете скорость работы софта. Дальше у нас идет POST запрос на регистрацию. Поскольку определенный процент проксей не поддерживает POST запросы, желательно пытаться преобразовать их в GET с параметрами: Code: VkRequest.Request("http://id.rambler.ru/script/newuser.cgi", post); VkRequest.Request("http://id.rambler.ru/script/newuser.cgi?" + post); Вы наверное часто видели в адресной строке браузера, что после адреса стоит знак «?» и после него идут параметры, такие же как и в POST запросах. Некоторые сервера не различают параметры переданные этими двумя способами (например vkontakte.ru), поэтому следует попробовать преобразовать POST запрос в GET и посмотреть, будет ли так работать. Если получится, то мы сможем более эффективно использовать прокси серверы. Оказывается, что для rambler.ru GET вместо POST не подходит, поэтому оставим эту строку как есть. Antigate Теперь о том, как пользоваться антигейтом. Все очень просто, устанавливаете переменную в VkRequest.AntigateKey ваш ключ антикапчи, и разгадываете капчу от так: Code: string captchaAnswer = VkRequest.PostCaptcha(captchaImage); Эта функция подождет пока антигейт разгадает капчу и вернет результат разгадывания. Почти так же как и CaptchaWindow. Комментарии по исходнику Теперь как в прошлом уроке выделяем процедуру регистрации в отдельную функцию: Code: private void Register() { MyProxy p = null; try { // выбираем случайный прокси lock (proxies) if (proxies.Count == 0) { manager.StopJob("Готово!"); return; } else p = proxies[r.Next(proxies.Count)]; // генерируем случайные мыло и пароль string email = Path.GetRandomFileName().Replace(".", ""); string pass = Path.GetRandomFileName().Replace(".", ""); // получаем уникальный id регистрации CookieCollection cook = new CookieCollection(); VkRequest.Request("http://id.rambler.ru/script/newuser.cgi", proxy: p, cookies: cook, method: "HEAD"); string id = cook["rrc"]; if (id == null) throw new Exception("Неверная страница регистрации"); // скачиваем и разгадыаем капчу Image captchaImage = VkRequest.Request("http://id.rambler.ru/captcha/" + id + ".jpg").GetImage(); string captchaAnswer = VkRequest.PostCaptcha(captchaImage); // регистрируемся в почте string post = string.Format( "uniq_id={0}&user.login={1}&user.captcha={3}&user.password1={2}&user.password2={2}&skin=id&back=&back_immediate=&action=register&user.fname=firstname&user.lname=lastname&user.gender=1&user.bday=1&user.bmonth=1&user.byear=1950&user.domain=rambler.ru&x.emailfree=mail1245%40rambler.ru&user.question=own.question&user.own_question=question&user.answer=answer&user.email2=", id, email, pass, captchaAnswer); var result = VkRequest.Request("http://id.rambler.ru/script/newuser.cgi", post, proxy: p); // обработка возможных ошибок регистрации } catch (Exception e) { // опять обработка ошибок } } и создаем для нее JobManager: Code: manager = new JobManager(Register); manager.PreferredThreadCount = (int)threads.Value; manager.Start(); Остальная часть работы программы связана в основном с интерфейсом, и ее удобнее изучить просто глядя в исходник. Обращу лишь внимание на несколько неочевидных моментов: Если вы хотите взаимодействовать с интерфейсом из рабочего потока (функции Register()), то вам придется использовать метод BeginInvoke, который поставит вашу функцию в очередь на выполнение для потока интерфейса (только он может изменить что-то в окне): Code: private void log(string s) { BeginInvoke(new Action(() => { logBox.AppendText(s + "\r\n"); })); } Здесь использоано lambda-выражение () => { ... }, если хотите узнать о них подробнее, читайте гугл. У вас наверное бывало так, что при возникновении ошибки программа выдала сообщение о ней и сразу закрылась, хотя ошибка была незначительная? Чтобы иметь возможность продолжить работу, можно просто добавить в конструктор формы следующюю строку Code: Application.ThreadException += (obj, e) => ExceptionDialog.Show(e.Exception); В программе, которую я написал зарегистрированные аккаунты сразу же записываются в файл. Чтобы не обращаться к файлу слишком часто, реализован следующий механизм: - все зарегистрированные акки заносятся в список akksToWrite - таймер каждую секунду проверяет, есть ли что-то в списке, и если есть дописывает акки в файл и чистит список Таким образом получается, что все акки сохраняются и нет большой нагрузки на жесткий диск Количество потоков можно менять прямо в процессе работы. На сегодня все. Дальше изучайте исходник программы: http://kairos-blog.ru/?p=250 . Если что-то непонятно, задавайте вопросы.
Спасибо за статью, почитал =) Повторюсь, интересны сорсы самой либы(потому как не документированы классы) ну и реализация https
В связи с недавними изменениями контакта мне видимо придется писать софт под https, поэтому думаю скоро. Чем опасно?
2 CodeSender ну тыже юзаешь VS без сорцов. и .net тоже без уже в скомпиленном виде юзаешь. откуда ты знаешь что в получаемых файла нет скрытых данных о твоем компе типа мак адреса сетевухи. Но при этом тыже не просишь у MS чтобы открыли исходники т.к. ты хочешь их проверить)
Господи, да класс для работы по HTTP(S) на C# с проксями(HTTPS,socks4,socks5), SSL,gzip/deflate,chunked пишется ну максимум за недельку(это если уж совсем лениво делать), а так по хорошему дня 4 с нуля. Все что необходимо это RFC,MSDN ну и google, причем чем меньше гугла и тупакопированиякода тем выше понимая того что ты делаешь. 2 ТС давая что то интересное а то статьи аля "как я круто пишу регеры с помощью своей либы которую вы можете использовать вместе с моим классом для работы с антигейт который шлет мой soft_id и я получаю 10 центов от вас" уже не канают, увы.
Сколько раз уже писал. Если ТЫ давно программируешь, и ТЫ можешь написать такую программу за пару часов, то да, ТЕБЕ такие статьи будут совершенно неинтересны. Эта обучалка предназначена для тех, кто совсем недавно научился программировать, и не может написать такое сам за пару часов. P.S. За какую сумму согласишься написать мне такой класс с удобной архитектурой? Я бы лучше заказал чем самому писать.
Опасно менять GET на HEAD, POST на GET и капчу без прокси качать. Потом выходят такие автореггеры в паблик и все удивляются, почему аккаунты живут 3 дня. Но зато скорость высокая. Я не говорю конкретно про этот пример, но негативные последствия у таких методов ускорения могут быть и неплохо было бы указывать это в статьях. И про то, что не всегда замена методов работает, тоже не помешает написать. Чужие библиотеки используют в основном новички и много денег на антигейте с этого не получишь. Да и вообще, на процентах антигейта много не заработаешь. Раньше около 1 килобакса в месяц было на топ1, не думаю, что сейчас намного больше. По сравнению с доходом от продаж софта это копейки.
Запрос HEAD обрабатывается на уровне web-сервера (apache), крайне сомнительно что кто-то там скрипты свои разместит. По поводу GET и POST - если удается одно заменить на другое, значит 99% авторы скриптов используют переменную $_REQUEST. Да и вообще, если они сделали поддержку GET, значит предполагалось что они сами тоже будут этим пользоваться. С капчей примерно та же ситуация. В итоге конечно да, теоретически можно такими способами задетектить спам, но на практике всегда пользуются совсем другими методами, например кол-во действий в секунду.
Не понял насчет уровня веб-сервера. Есть $_SERVER['REQUEST_METHOD'] GET-запросы сохраняются в логах сервера, можно спарсить и забанить весь авторег сразу и со стопроцентой уверенностью, что это не человек. Конечно, на сайтах с многомилионной аудиторией этого не заметят. Но в соц.сетях численностью до нескольких миллионов человек админы быстро реагируют на появление 50-100к авторега в день.
Kairos а с чего ты взял, что админы палят в ручную все можно автоматизировать и палить тебя по запросам в режиме реального времени, а парсер access логов на том же perl минутное дело. Так что Kairos, больше ресурсы за тобой просто наблюдают хехе