У меня было 2 языка программирования, более 1000 строк функционального кода, охапка самописных библиотек, десяток скриптов и целое множество подключаемых модулей всех сортов и расцветок, пара виртуальных серверов, а также консоль, командная строка, текстовый редактор, платформа симуляции браузера и 2 дюжины скоростных VDS-прокси. Не то чтобы это был необходимый запас для создания ботов в социальной сети, но, когда начинаешь слышать звон выплат на кошельке, становится трудно остановиться. Единственное, что вызывало у меня опасение – реализация многопоточности. Нет ничего в мире более беспомощного, отвратительного и порочного, чем отладка багов конкурирующих потоков. Я знал, что рано или поздно вляпаюсь и в эту дрянь.
Несмотря на ожидания, реализовать долгожданную многопоточность оказалось, хоть и муторно, но не невозможно. Интернет был не особо щедр на предоставление нужной информации по грамотной реализации многопоточности в Python, поэтому пришлось потратить время на то, чтобы досконально отследить, какой поток чем занимается, и где между ними могут протекать и перемешиваться данные. Ведь с точки зрения ОД, все потоки должны были представлять полностью разных изолированных пользователей со своими наборами индивидуальных параметров (cookie, user agent, прокси), но с общей очередью забора свежих пользователей и единым списком отработанных Одноклассников.
Достигнутый результат даровал мне потенциал колоссальной мощности – теперь на своём компьютере с совсем невыдающимися характеристиками я легко мог запускать несколько десятков потоков. Максимальным числом работающих параллельно экземпляров было 70, в основном же их количество держалось в районе 30-50.
Проблема с участившимися удалениями групп была решена полной автоматизацией их создания и подготовки – скрипт сам создавал группу, выставлял нужные настройки, загружал аватарку, прописывал тексты с заданными параметрами рандомизации и размещал нужным образом ссылку. Когда группа удалялась, софт фиксировал это событие, останавливал потоки, создавал новую группу и перезапускался. Всё работало на автопилоте. Таким образом, группы из штучного товара ручной работы превратились в создаваемый на ходу расходный материал.
Программный комплекс рос не по дням, а по часам – из скромного скрипта инвайтер превратился в большой полнофункциональный многопоточный комбайн со сложной логикой. Объём кода перевалил за 1000 строк. Теперь это была уже не просто забавная игрушка, а полноценное орудие массового поражения. И с каждым днём оно становилось надёжнее – все нестандартные и неожиданные ситуации записывались и сохранялись, чтобы позже я мог добавить в код конкретные инструкции на случай их повторения.
В квартиру было проведено два дублирующих друг друга интернет-провайдера, через грязные маленькие серые провода которых десятки тысяч рублей ежедневно закачивались в мой компьютер.
Отключение электричества, к счастью, было событием редким, а с его кратковременными перебоями справлялся источник бесперебойного питания.
На случай падения софта или наступления каких-то критических и требующих моего немедленного внимания событий в скрипте было реализовано смс-информирование. Теперь, как только что-то шло не так, я тут же получал смс на специально выделенный для этого дела старый телефон, который всегда и везде был со мной.
Молчание этого телефона буквально являлось аналогом настоящего золота.
На заре своих интернет-заработков одним зимним вечером, уже при свете ночи после обычного рабочего дня в офисе я шёл домой мимо пустой автобусной остановки. Звук телефона оповестил о прибытии романтичного супружеского сообщения – списка продуктов для покупки в магазине по пути. Оценив пустоту своего бумажника, я ответил, что с удовлетворением просьбы придётся немного повременить.
Неприятная привычка сутулиться и смотреть во время ходьбы себе под ноги на этот раз приятно удивила – на тротуаре в снегу я разглядел фигуру Петра Первого на фоне 500-рублёвой купюры. Не растерявшись, я быстро сделал вид, что у меня на сапоге развязались шнурки, присел и забрал бесхозную бумажку. Подняв взгляд, я удивился ещё больше – на расстоянии метра от Петра Великого в снегу подмерзали его исторические коллеги, итоговой суммой на, ни много ни мало, 5000 рублей.
Собрав трясущейся от волнения рукой хрустящие бумажки, я оглянулся и как ни в чём ни бывало отправился к дому в обходном направлении. По пути зашёл в магазин и купил продукты по списку. Действия кассира развеяли сомнения в подлинности купюр.
Надо сказать, что это была самая крупная находка денежных средств в моей жизни. Радость от неё была намного большей по сравнению с предыдущей, когда мне посчастливилось найти вмерзшую в лёд лужи пятирублевую монету на школьном дворе своей небогатой юности.
А на следующий день мне позвонили со скрытого номера. Голос в трубке представился лейтенантом Федеральной службы безопасности и вежливо поинтересовался, не желаю ли я сегодня вечером после работы заглянуть к ним в гости на дружескую беседу. Я уже был готов услышать фразу «Мальчик, верни деньги», однако мои робкие попытки узнать тему грядущей встречи остались корректно неудовлетворенными – уж кто-кто, а они умеют это делать.
Будучи немного знакомым со спецификой работы людей в чёрном, остаток дня я невольно провел на иголках, теряясь в догадках. Даже если просто попросят вернуть им деньги, то сделать я это не смогу, так как часть из них уже потратил. А что отвечать, если вдруг они попросят рассказать про мою деятельность в интернете? А что, если деньги я вчера нашёл совсем не случайно?..
Однако истина оказалась более приземлённой – вечером выяснилось, что стоящие на страже государства товарищи просто собирали данные с основных ВУЗов города о выпускниках, закончивших обучение с красным дипломом. Их обзванивали и приглашали прийти на встречу, чтобы предложить работу в своей структуре, только и всего.
Послушав лекцию про прелести службы во благо безопасности родины, я вежливо ответил отказом. Безусловно, это приглашение мне очень льстило. Тем более, что красный диплом в университете мне так и не дали. Но всё равно с тех пор я неконтролируемо настораживаюсь, когда кто-то на протяжении беседы дважды задаёт один и тот же вопрос.
Несмотря на более-менее налаженный механизм борьбы с капчей, ежедневно уходящая в фонд поддержки ручного труда Индии сумма в $1000 волей-неволей побуждала искать другие способы решения этого вопроса.
Надежду подавали высоты, достигнутые в области OCR – алгоритмов оптического распознавания символов. Подобным решением для ВК-капчи я успел попользоваться в последние пару недель своей работы в этой социальной сети. Как вы помните, стоило оно немало ($300) и имело не прямо чтобы блестящую 50%-ную эффективность, но работало исправно и, кроме ресурсов процессора компьютера, больше ничего не просило. Однако общение с разработчиками этого модуля выявило отсутствие интереса у них создавать подобное решение для капчи из ОД (видимо, вследствие невысокой популярности Одноклассников).
Разработчики ZennoPoster (известного конструктора для автоматизации действий в интернете) в то время анонсировали свой новый инструмент автоматического распознавания капч – CapMonster. Проведенные мною тесты подтвердили честные предупреждения создателей о том, что на данном этапе развития программы стоит ожидать от неё верного разгадывания разве что самых простых капч, кривые символы из ОД к которым, конечно же, не относились.
Как-то на Хабре я прочел статью о серьёзных победах алгоритмов OCR над первыми версиями ReCaptcha – одним из самых лютых проявлений капч в интернете. Известия пришли с западных спам-фронтов, однако, как это часто бывает, без участия наших соотечественников тут не обошлось (чему, собственно, статья и была посвящена). Попытки связаться с упоминаемыми персонажами ни к чему не привели – мне ответили, что ничем помочь не могут. Даже несмотря на то, что я готов был предложить очень хорошее вознаграждение за решение больного вопроса тому, кто избавит меня от необходимости расходовать по $1000 на капчу каждый день. В месяц это экономило бы мне порядка $30 000, большей частью которых я был готов поделиться со светлыми OCR-умами.
Но, как говорится, что ни делается – всё к лучшему. В чём я вскоре смог убедиться, потому что до разработчиков ОД наконец-то стало доходить, что требовать от своих пользователей бесплатно работать индусом-разгадывателем капчи при каждом приглашении человека в группу – это далеко не образец лучших практик построения дружественных интерфейсов.
И в один (действительно прекрасный) день здравый смысл восторжествовал, и капча с приглашений была убрана. Однако сделано это было только в полной версии сайта, а я ведь тогда работал исключительно через мобильную. Здесь надо отметить, что полная и мобильная версии одной и той же социальной сети ОД – это, несмотря на внешнюю схожесть, два совершенно разных мира, два различных сайта. И, как это хорошо видно на примере с отменой капчи, в первую очередь цивилизация приходила именно в версию настольную.
Главной сложностью работы одновременно с обеими версиями ОД были динамические идентификаторы всего, что только можно: профилей, групп, записей и прочего – все они заново генерировались для каждой сессии и, соответственно, всегда были разными. Поначалу этот зоопарк порождал проблемы разве что в вопросе создания точного списка отработанных пользователей. Теперь было необходимо научиться отыскивать одни и те же объекты в двух разных мирах постоянно меняющихся указателей.
Желание насладиться свободой от капчи, дарованной настольной версией ОД, в итоге привело к обнаружению какого-то постоянного вспомогательного идентификатора, связанного с главной фотографией пользователя. Путем блуждания сложных перекрёстных запросов, я смог собирать пользователей, находящихся в онлайне с мобильных устройств из поиска мобильной версии, а приглашения им отправлять уже из версии полной, поставив тем самым жирную точку в конце наших отношений с Антигейтом и открыв новую главу в отношениях с интернет-провайдером.
Так как теперь часть работы софту приходилось проделывать, находясь в полной (вечно тормозящей) версии ОД, значительно, просто в разы, вырос объём трафика, и теперь слабым местом системы стала пропускная способность моего интернет-провайдера. Тут я впервые увидел причину реальной необходимости покупки самого дорогого тарифа – в те времена это была скорость в 40 Мбит/с за пару тысяч рублей в месяц. Совсем небольшая цена по сравнению с былыми тратами на капчу в Антигейте.
Иногда я пересматривал свой код перекрёстных запросов и сам уже не понимал, как он работает. Определённо, эта технически сложная победа была одной из выдающихся на фронте моей деятельности, достижение которой при использовании принципа «Сэкономил – значит заработал» позволило при прочих равных практически удвоить чистую прибыль.
В моменте обновления статистики партнёрской программы есть нечто одновременно как и приятное, так и тревожащее. Первое, разумеется, связано с ожидаемым увеличением суммы заработка в графе «Итого», второе – с боязнью увидеть на экране без изменений замершие цифры.
Второй вариант может быть результатом множества событий, имеющих вероятность произойти с любой стороны технологической цепочки движения трафика. Например, мог упасть сервер с моими сайтами, забаниться ссылки в ОД, умереть редиректы, прилечь лендинги партнёрки, могли случиться технические сложности у операторов сотовой связи, у контент-провайдеров или в самой ПП. Или же просто могло быть так, что со времени предыдущей проверки статистики при полностью исправной цепочке ни один из пользователей просто так и не отправил ни одного смс.
Заметив отсутствие жизни в статистике, конечно же начинаешь проверять весь техпроцесс по порядку, в глубине души надеясь, что это какой-то небольшой временный глюк не на твоей стороне, и что скоро он сам собой исправится.
Довольно часто так и происходило. Но не на сей раз.
Проверка техпроцесса не обнаружила признаков аварии – софт крутился, приглашения рассылались, серверы работали, сайты и ссылки исправно открывались. Всё выглядело находящимся в полном порядке, но статистика по-прежнему не хотела обновляться.
Через пару минут собственный прямой заход по партнёрской ссылке сдвинул-таки в честь меня число уникальных посетителей на единицу, ознаменовав тем самым столкновение с достойной имени Шрёдингера неопределённостью – всё вроде работает, но в то же время как бы и нет. От недоумения я полез проверять всё, что мог подсказать проверить здравый смысл, в том числе и HTML-код своих промежуточных сайтов.
За время работы с мобильной партнёрской программой я настолько часто видел свою партнёрскую ссылку, что, несмотря на короткую память, даже запомнил номер её параметра-идентификатора. По этому параметру ПП понимает, что пользователь пришёл именно от вас, а не от кого-то ещё, и что именно вам надо зачислить прибыль от их смс. И поэтому довольно быстро я заметил, что в коде моего сайта на моём сервере находится чужая ссылка той же самой ПП!
Огромных трудов стоило в тот момент признать самому себе факт наличия дыры в безопасности. Это примерно то же самое, как если бы вы зашли к себе на кухню и увидели наполовину надкусанный бутерброд, который вы приготовили пару минут назад. И вы отлично помните, что не кусали его. При этом в квартире вы живете один, на девятом этаже, и входная дверь точно заперта. А вы на кухне в силу какой-то странной традиции вы имеете привычку хранить свои деньги, документы, драгоценности и интимные фотографии.
Когда я начал понемногу приходить в себя, и градус здравомыслия поднялся чуть выше уровня передач про пришельцев на РенТВ, стала заметна ещё одна странность произошедшего – с точки зрения человека, обладающего умением незаметно поедать бутерброды на девятом этаже запертой квартиры, было как-то неразумно оставлять свою партнёрскую ссылку той же самой ПП в таком явном виде.
Тотчас же в аське я связался с администратором партнёрки, объяснил суть произошедшего и попросил принять меры по наказанию фокусника. Как и в любой адекватной среде конкуренции, в интернет-заработке угон трафика у коллег по цеху крайне не приветствуется, и со стороны ПП жестко наказывается отменой всех выплат и вечным баном. Администратор с пониманием подошёл к вопросу, сообщил, что да, действительно, у них в системе есть свежий аккаунт с таким идентификатором и пообещал оперативно во всём разобраться.
Чуть успокоившись, я поинтересовался, не оставлял ли владелец этого аккаунта свой номер ICQ, что, как правило, было обязательным для заполнения полем в форме регистрации в ПП. Спустя минуту номер был у меня. Конечно же, ничто не мешало человеку при регистрации указать любые пришедшие в голову цифры вместо настоящего номера аськи, так что убедиться в его актуальности можно было лишь одним способом.
Я забил номер в поиск аськи, и аккаунт на удивление нашёлся. Более того, он даже был в онлайне. Недолго думая, я написал ему:
– Привет. Я смотрю ты неплохо разбираешься в вопросах информационной безопасности, не так ли?
Ответ не заставил себя долго ждать, несколько меня удивив… Передо мной вежливо извинились за вторжение на сервер и сопутствующие неудобства. Дальше последовала переписка, из которой выяснилось, что интервентом моей цифровой территории явился… моряк дальнего плавания.
На несколько месяцев он уходил на корабле в дальнее плавание, оставаясь вдали от интернета и высоких технологий. А по возвращении, во время отпуска он развлекал своё любопытство самой разной деятельностью, в том числе связанной с информационной безопасностью в сети.
Путь к нашей встрече начался с того, что мой собеседник, любопытства ради зарегистрировавшись в партнёрке, заприметил в топе мой ник. В те времена имя моего присутствия в интернете было уникально и весьма опрометчиво совпадало с логином как в ПП, так ещё и на куче сайтов, где я имел неосторожность ввиду своей забывчивости и лени использовать одно и то же наименование учётной записи. Но это ещё полбеды… Как вы уже догадались, пароль на большинстве этих сайтов тоже был одинаков. В том числе и на хостинге.
Зная мой логин от сервера, пароль он подобрал простым перебором по SSH, так как в те времена настройки этого хостинга по умолчанию позволяли беспрепятственно перебирать пароли. По его словам, он особо не надеялся на какой-либо результат, действовал наудачу – запустил на ночь перебор паролей по словарю и уже на следующий день, к своему удивлению, получил совпадение. Это была на самом деле довольно простая комбинация из восьми символов. Легко запомнить, легко потерять.
Узнав пароль, он получил доступ к моему серверу. А также, благодаря информации на нём, к резервной почте, аккаунту ПП, ВК и даже ICQ. В последние два, говорит, не заходил, просто проверил пароль на валидность, хотя легко мог бы сильно усложнить мне жизнь просто потому, что мог. Но не стал.
Ещё, как выяснилось, он сливал себе трафик уже в течение десяти часов, периодически возвращая мою ссылку обратно на место, чтобы не вызывать подозрений резкой остановкой. Как раз накануне я заметил уменьшение количества посетителей, но ночью трафик закономерно падает, и изменения вполне укладывались в рамки правдоподобного колебания статистики. Так что удача в тот день была и на моей стороне, потому что я зашёл на сервер и обнаружил чужую ссылку именно тогда, когда она там была.
Так или иначе, у этого человека не было намерений воровать мои деньги, он делал всё это из любопытства, эксперимента ради. Сказал, что если бы я ничего так и не заметил, то рано или поздно сообщил бы мне о взломе сам. И я даже склонен ему верить.
Прошло около часа с момента начала нашего общения, мне написал админ ПП и сообщил, что они разобрались, нарушителя забанили и деньги с его аккаунта скоро перечислят мне. За непродолжительное время переменной эксплуатации моего трафика накапала пара тысяч рублей. Более чем доступная плата за столь наглядный урок по безопасности – подумал я и попросил админа оставить парню эту сумму и не блокировать аккаунт.
Поблагодарив своего собеседника за встречу, остаток дня я провел за сменой паролей от всех своих учётных записей в сети на сложные, многосимвольные и случайно сгенерированные.
К счастью или к сожалению, больше я с этим парнем не пересекался.
Как уже упоминалось, при всей популярности адалт-темы в ОД у неё был один весомый минус – женская часть аудитории оставалась незадействованной. У меня, конечно, были логичные мысли разделять пользователей по полу, и мужчин и женщин приглашать в разные группы с разной тематикой. Но я предпочитаю полностью концентрироваться на одном направлении.
Поэтому моя моногамная душа просила универсальную тему, в которой можно было бы, как минимум, заинтересовать преимущественно женщин и, хотя бы отчасти, мужчин. Либо же, в идеале, задействовать вообще всю находящуюся в ОД аудиторию целиком.
Несмотря на масштабность, решение этой задачи лежало на поверхности. Что любят практически все люди? Любого пола, возраста и уровня интеллекта. Про всех них можно с уверенностью сказать, что они любят получать подарки!
Поэтому я начал создавать группы с простым названием «Вам подарок!», украшая их аватарки празднично упакованной подарочной коробкой с красной лентой. Далее я постарался максимально упростить путь пользователя от получения приглашения до момента скачивания мидлета на телефон. Для этой цели в группе создавалась одна-единственная тема, где безо всяких текстовых описаний и объяснений находилась одна ссылка с привлекательным названием «Получить подарок!».
Оставалось выбрать, что именно надо было «дарить». Полистав предлагаемые партнёркой лендинги, я выбрал нейтральный сайт с кучей каких-то приколов на телефон, типа анекдотов и розыгрышей. Вполне сойдет за подарок, почему нет.
Я запустил инвайтинг… и тема просто взорвалась! Доход взлетел в облака, оставив адалт далеко позади. Число принимающих приглашение людей намного превысило те 10%, что были замерены во время работы с мобильными играми. Расчёт на подарочную тематику был неприлично прост и эффективен. Я свернул остальные группы и направил всю мощь софта в новое русло.
Однако мне этого было мало. Я хотел сделать всё ещё проще. И тогда в голову пришла идея выбросить из цепочки шагов этап посещения страницы со списком мидлетов. Вместо того, чтобы поражать человека обилием предлагаемых «подарков» и заставлять его выбирать, было решено сразу же отправлять его из группы на один конкретный мидлет, благо ПП технически позволяла это сделать.
Таким образом весь процесс максимально упрощался до схемы:
Приглашение в группу > Переход в неё > Клик по ссылке в теме
И всё – после этого «подарочный» мидлет уже загружался пользователю на телефон. Прямая, как рельсы Байкало-Амурской магистрали, схема даже не давала большинству приглашенных осознать, что они всего лишь получили простое приглашение в группу и перешли по внешней ссылке на сторонний ресурс – они думали, что сама социальная сеть раздаёт им подарки. Идеально.
Если запуск темы с подарками взорвал мою прибыль, то последующее упрощение схемы повлекло за собой эффект настоящей авиационной бомбы – заработок улетел в небеса! Если в сутки выходило меньше 30 000 рублей чистыми, то этот день я считал неудачным.
Первое место в топе стало родным домом. Лучший показатель составлял 70 000 рублей чистыми в сутки при расходах на капчу порядка $1000. Выплаты в партнёрской программе производились каждую неделю, поэтому в среднем за этот период успевало набраться от 200 до 300 тысяч рублей. Очередная психологически важная отметка в первый миллион была достигнута очень быстро.
По правде говоря, в самой ПП эта схема могла быть не совсем легальна. Так как формально перед загрузкой мидлета нужно ознакомить пользователя с условиями предоставления контента, которые обычно ютились в подвалах лендингов, а я лил трафик мимо них, сразу на мидлет. Но, судя по всему, когда ты делаешь для партнёрки оборот в 300 000 рублей в неделю, то на такие вещи могут смотреть сквозь пальцы.
Мне в аську несколько раз писал администратор ПП, сообщая, что поступила жалоба от одного из абонентов, которого я привёл. Текст жалоб прилагался, и чаще всего их было смешно читать: «Я сидела в Одноклассниках, мне что-то написали, после чего с моего баланса списались деньги!» – банальная компьютерная безграмотность и неумение толком объяснить ситуацию были явно не на стороне потерпевших. Я честно отвечал, что да, гоню трафик из ОД-группы (по правилам ПП это не запрещается), а что конкретно несёт данный недовольный пользователь понятия не имею. В ответ на это администратор, как правило, просто инициировал возврат средств абоненту и закрывал жалобу.
Честно говоря, я не совсем понимал, зачем админ мне это писал – возможно, он просто следовал регламенту или таким образом давал поблажку топовому партнёру. Я старался не углубляться в это, так как боялся потерять заработанные за часть недели деньги. При желании ПП ничего не стоило забанить или лишить меня выплат под любым предлогом. Так или иначе, сама ПП зарабатывала на проценте с оборота своих партнёров, так что в итоге они сами были заинтересованы в сотрудничестве. По крайней мере, до тех пор, пока жалобы на меня будут носить такой редкий, неадекватный и легко опровергаемый характер.