Посмотреть вложение 68544
Вступление
С nextplus/textplus (это приложения клоны) я познакомился еще году этак 2013-2014, когда мы массово регали на него аккаунты вайбера. Думаю, о nextplus (далее НП) многие слышали и использовали, как источник бесплатных номеров для регистраций. Но в этой статье я опишу способ монетизации не связанный с приемом смс.
Для тех, кто не знаком с данным приложением, то поясню, что в НП можно получить бесплатно американский номер и, опять же бесплатно, слать смс на другие американские телефонные номера.
Эту возможность я и использовал для монетизации - рассылка смс. Работал с этим сервисом в общем чуть более года (май 2019 - июнь 2020), а фактически несколько месяцев. НП закручивал гайки, я, не находя решения в лоб, бросал это дело и возвращался, когда появлялось время. Иногда приходилось покопаться, чтобы придумать способ обхода тех или иных ограничений. Когда я только начал работать с НП, там еще не было каптч и фильтров на ссылки. Единственная каптча на реге была только для вида, ее решение для работы на запросах не требовалось.
В этой статье я хотел бы рассказать о том, как с помощью Zennoposter, практически без знаний языков программирования, можно решать задачи по автоматизации на примере работы с НП. Основная информация из статьи не утратила актуальность и на данный момент,
но есть нюансы.
Инструменты
Работу с любым приложением я начинаю с ручного теста. Смотрю возможности, ищу касания с аудиторией, пытаюсь достигнуть каких либо лимитов, получить бан. Раньше работал с nox'ом, теперь перешел на эмулятор memu. Но также нужно иметь и реальное устройство для тестов, их у меня тоже несколько. Для НП сейчас хватит memu с андроидом 7.1. На 2019й год приложение работало и на андроиде 5.1.
Fiddler. Мой любимый софт для мониторинга трафика, особенно мне он нравится за возможность писать свои скрипты для обработки запросов.
В эмуляторе обязательно xposed с модулями Inspeckage, TrustMeAlready, changer(com.bigsing.changer).
Приложения для тестов я беру либо со сторонних источников, либо с плеймаркета с другого эмулятора. Потому что стараюсь проводить тесты на максимально чистом эмуле, без входов в акк гугла и т.д.
И, конечно, для автоматизации я использую ZennoPoster.
О настройке софта я подробнее рассказываю в видео.
Регистрация аккаунтов
За время работы с НП я зарегистрировал более 400к аккаунтов и получил около 200к номеров.
Регистрация состояла из нескольких запросов:
- Регистрация данных аккаунта
- Получение токена по логину и паролю
- Получение токена авторизации для работы
- Получение данных об аккаунте. Этот запрос не связан непосредственно с авторизацией, но данные из него, такие как JID и PersonaId в дальнейшем пригодятся.
Посмотреть вложение 68546
Регистрация данных аккаунта выглядела так:
Посмотреть вложение 68547
Не было каких-либо секретных токенов, каптчи и т.д. Как можно догадаться из названия udid и deviceUDID - это рандомный android id, platformOSVersion - версия андроид, model - модель телефона. Для массовой регистрации аккаунтов достаточно было генерировать эти параметры, а также логин и пароль.
Сейчас же регистрация выглядит следующим образом:
Посмотреть вложение 68554
Были добавлены два заголовка.
x-gsn-token - это токен полученный после прохождения каптчи, так называемой, safetynet recaptcha. Ее я обнаружил, когда писал статью. К сожалению, беглый поиск автоматизации ее решения не дал результатов.
!!! Без решения этой каптчи нет возможности для полной автоматизации регистрации в данный момент
x-reg-token - шифрование данного токена можно увидеть в панели inspeckage (данный момент я показываю в видео), во вкладке hash:
Алгоритм шифрования sha-512. Сделав несколько регистраций, узнаю, что меняется. Таким образом скелет выглядит так:
Еще для работы понадобятся такие данные как, модель, андроид ид, версия ос, версия приложения и т.д. Все это генерируется, либо берется из таблицы (файлы с данными в прикрепленных файлах):
Посмотреть вложение 68555
Теперь можно приступать к запросам. Так выглядит первый запрос в projectmaker:
Посмотреть вложение 68556
В случае успешной регистрации получим ответ с
кодом 201. Далее нужно получить токен, который будет использоваться в заголовке во всех запросах к апи НП:
Посмотреть вложение 68557
Посмотреть вложение 68558
Посмотреть вложение 68559
Срок жизни токена небольшой, поэтому в дальнейшем при работе с аккаунтом я его обновлял с помощью запроса номер 3.
Таким образом не составляло проблемы массово регистрировать аккаунты. Но спустя время начали банить прокси, на любое действие связанное с регистрацией либо авторизацией я получал
ошибку 401. Решалось использованием большего количества проксей.
А после начали банить (
ошибка 403) и сами аккаунты, но я стал их просто больше регистрировать.
Получение номера
Как я уже писал, монетизировал НП путем смс рассылки. Для этого следующим шагом после регистрации, мне нужно было получить номер. Вот здесь я столкнулся с первой проблемой. Казалось бы запросы на получение номера выглядят очень просто:
- Получить список префиксов телефонных номеров с их id.
Посмотреть вложение 68560
Парсим id, добавляем в таблицу колонки localeid и available, удаляем из таблицы строки со значением false, так как это означает, что доступных номеров для этого кода нет:
Посмотреть вложение 68561
2. Когда я плотно работал с НП, каптчи на получении номера не было, теперь же она есть, и запрос выглядит так:
Посмотреть вложение 68564Посмотреть вложение 68569
DeviceUdid - это все тот же android id. localeId мы получили в предыдущем запросе и взяли случайный.
RecaptchaCode - токен решенной каптчи. Получить данный токен не составляет проблем, так как здесь обычная recaptcha v2. Все что нужно для решения, это воспользоваться стандартным кубиком recaptcha v2:
PushToken - это токен гугла, отвечающий за пуш уведомления. Вначале я пробовал генерировать случайный, но на стороне сервера есть проверка. Использовать один и тот же тоже не вариант, так как если в многопотоке (я запускал в 100-400 потоков) одновременно шли обращения за номером, то почти все потоки получали ошибку.
Пришлось разбираться, как он генерируется.
Посмотреть вложение 68565
Для генерации токенов понадобятся данные авторизации в заголовке
Autorization, а также дополнительные данные в теле запроса:
X-appid - рандомный id.
device,
info - зависимые от данных авторизации параметры.
Остальные параметры неизменяемые.
Чтобы получить недостающие параметры, нужно сделать запрос:
Посмотреть вложение 68566
Так просто не получится его повторить, так как здесь используется Protobuffers. Поэтому я воспользовался сторонним скриптом
checkin.py в связке с Zennoposter. В папке с шаблоном будут полученные данные. Там их достаточно, чтобы потоки не пересекались.
Также в приложенных файлах есть дополнительный шаблон, который используется в основном шаблоне как “проект в проекте”, для получения токена. Для его работы понадобится
python 2.7, а также модули protobuf и requests.
Посмотреть вложение 68567
Разгадав каптчу, и получив токен, можно взять номер.
Рассылка
Получив номер, приступаем к рассылке. При первом подходе, я не смог определить как отправляются смс в НП. Fiddler мне ничего не показывал, каким-то образом сообщения шли мимо него. Я попробовал Charles и в одном из тестов я заметил подключение к
websocket. Больше мне не удалось повторить данный тест, подключение шло всегда напрямую и ни фидлер, ни чарлес его не видели. Поэтому пришлось пустить весь траффик через проксифаер, и вот оно подключение к вебсокету:
Посмотреть вложение 68570
Столкнулся я с websocket впервые. Нашел либу websocket-sharp, но в связи с особенностями протокола “из коробки” она не начала работать.
Посмотреть вложение 68571
Почитав документацию по данному
субпротоколу, я предположил, что все отличие в дополнительных заголовках и форматах сообщений.
Sec-WebSocket-Key (его значение - рандомный uuid),
Sec-WebSocket-Protocol и
Sec-WebSocket-Version.
Пришлось править и компилировать либу под себя. В связи с тем, что visual studio я до этого в глаза не видел, на то, чтобы добавить эти заголовки и удачно собрать библиотеку, у меня ушли сутки. Файл dll присутствует в папке с шаблоном.
При подключении к websocket, для работы нужна авторизация:
Посмотреть вложение 68572
Здесь в base64 закодировано часть jid (это внутренний id аккаунта) и токен авторизации, полученный при регистрации в таком формате:
\0 - это терминальный нуль, он же null
После успешной авторизации, можно отправлять смс:
Посмотреть вложение 68573
message id - случайное 32-х символьное значение
to - номер_получателя@sms.nextplus.com
thread - смотрим значение в inspeckage. Это строка формата
[номер_получателя][JID] закодированная в md5
body - текст сообщения.
В шаблоне у меня отправка построена так:
я записываю в список строки с сообщениями, а после подключаюсь к вебсокету и отправляю их:
var rand0 = Macros.TextProcessing.RandomText(6, "dc", ""); // случайные значения, которые понадобятся в работе
var rand1 = Macros.TextProcessing.RandomText(6, "dc", "");
var rand2 = Macros.TextProcessing.RandomText(6, "dc", "");
var msg = "";
var inboxmsg = "";
var proxy = project.Variables["proxy"].Value; //прокси формата http://ip:port, соксы не поддерживаются
using (var ws = new WebSocket("wss://35.201.97.43/")) // подключение к вебсокету
{
ws.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
ws.SetProxy (proxy,"","");
ws.OnMessage += (sender, e) => {
inboxmsg = e.Data;
};
ws.Connect();
System.Threading.Thread.Sleep(2000);
ws.Send("<open to='app.nextplus.me' version='1.0' xmlns='urn:ietf:params:xml:ns:xmpp-framing'/>"); // стандартные сообщения при подключении
System.Threading.Thread.Sleep(2000);
ws.Send(@"<auth xmlns=""urn:ietf:params:xml:ns:xmpp-sasl"" mechanism=""PLAIN"">" + project.Variables["authbase64"].Value + "</auth>"); //авторизация
System.Threading.Thread.Sleep(3000);
var goodauth = System.Text.RegularExpressions.Regex.Match(inboxmsg, "success").Value; // проверка успешного подключения
if (goodauth == "") {
project.Variables["badwebsocketauth"].Value = "bad";
project.Variables["websomsgerror"].Value = inboxmsg;
goto end;
}
ws.Send("<open to='app.nextplus.me' version='1.0' xmlns='urn:ietf:params:xml:ns:xmpp-framing'/>");
System.Threading.Thread.Sleep(1500);
ws.Send(@"<iq xmlns=""jabber:client"" id=""" + rand0 + @""" type=""set""><bind xmlns=""urn:ietf:params:xml:ns:xmpp-bind""><resource>" + project.Variables["device_id"].Value + "</resource></bind></iq>"); // переменная device_id - это тот же android id
System.Threading.Thread.Sleep(1500);
ws.Send(@"<iq id=""" + rand1 + @""" type=""set""><enable xmlns=""urn:xmpp:carbons:2""/></iq>");
System.Threading.Thread.Sleep(1500);
ws.Send(@"<iq xmlns=""jabber:client"" id=""" + rand2 + @""" type=""set""><session xmlns=""urn:ietf:params:xml:ns:xmpp-session""/></iq>");
System.Threading.Thread.Sleep(1500);
ws.Send(@"<iq id=""" + rand1 + @""" type=""set""><enable xmlns=""urn:xmpp:carbons:2""/></iq>");
System.Threading.Thread.Sleep(1500);
while (project.Lists["msgs"].Count != 0) //сообщения берутся из списка msgs и отправляются по очереди
{
msg = project.Lists["msgs"][0].Trim();
ws.Send(msg);
System.Threading.Thread.Sleep(700);
project.Lists["msgs"].RemoveAt(0);
}
System.Threading.Thread.Sleep(5000);
end:
ws.Close();
}
Посмотреть вложение 68574
Опытным путем было выяснено, что существует лимит на 10 диалогов, каждые 6 часов.
Базы рассылки
Я пробовал покупать, парсить, но в итоге наилучший результат давал метод генерации номеров.
Здесь на карте я искал большие города с густонаселенными районами. Брал коды этих районов, к примеру,
917 . Далее парсил по операторам коды со значением Wireless. Генерировал номера и рассылал по ним. На удивление, получалось лучше, чем с покупных, либо спаршеных баз.
Текст рассылки
Я пробовал свипы, гемблинг, товарку и т.д. Но как и ожидалось, что лучше всего заходил дейтинг. Использовался самый простой текст, наподобие “Привет, давай знакомиться”, либо “У вас 5 новых сообщений от Имя. Читать ссылка”. Я не раз уже убеждался на практике, что под микс траффик сообщение должно быть как можно короче.
Ничто не вечно
Раньше каждый раз, когда проект готов к полноценному запуску и масштабированию, я сталкиваюсь с дилеммой. Работать тихо и незаметно, но (возможно) долго, либо максимально быстро получить профит. В последнее время я все чаще выбираю второй вариант. Но тогда в случае с НП я остановился на чем-то среднем. И спустя месяц разработчики убрали возможность отправлять какие-либо активные ссылки. Еще пару дней я слал с доменами .рф, но и этот способ прикрыли. Проходят неактивные ссылки, что-то вроде этого:
http:/fb․me∕messages∕t∕@%79%61%2e%72%75 , но даже отправляя их отдельным сообщением, траффик упал в десятки раз. Пришлось отложить этот проект.
Вернулся я к НП спустя месяц. И нашел крайне простой способ отправки, который проморгал в самом начале. В 2019 году в приложении была функция “Пригласи друга”. Можно было приглашать друзей путем отправки смс непосредственно из НП. Никаких вебсокетов, обычный пост запрос, ссылки проходят. Месяца через полтора разработчики просто вырезали эту функцию. И опять проект перешел в категорию “будет время, посмотрю”.
Время появилось через пару месяцев. К сожалению, я так и не нашел способа отправлять активные ссылки в смс. Но заметил, что сообщения между пользователями НП проходят через свой обработчик и ссылки работают.
Посмотреть вложение 68575
Т.е. можно попробовать разослать сообщения внутри самого мессенджера. Но как спарсить базу пользователей? Из поиска можно найти только по полному логину, id здесь - это md5 хэш.
Как я и писал, за время работы мне удалось получить около 200к номеров. Так как я все данные храню в бд, я сделал выборку, получил все эти номера, убрал последние 4 цифры и почистил от дублей. Так как при получения номера я всегда использовал рандомный localeId и при таком большом количестве данных, можно предположить, что я получил практически все диапазоны, из которых НП выдает номера для своего сервиса.
Вышло 12к+ диапазонов.
В приложении при вводе номера получателя НП проверяет наличие пользователя с таким номером в своем сервисе:
Посмотреть вложение 68576
И, если номер в данный момент привязан к аккаунту, то будет такой ответ, из которого можно получить все данные о пользователе. Если аккаунт не активен в течение недели-двух, то сервис забирает номер. При бане аккаунта также. Сгенерировав все возможные номера и проверив их таким образом, я
получил 2кк+ пользователей. Именно активных пользователей. Также плюсом к внутренней рассылки - это то, что не нужно получать номера.
Дважды в месяц я перечекивал эти 2кк+ номеров, получая примерно 400-500к новых пользователей, так как номера. Рассылка по ним приносила
$1.5-3к в месяц. Но в мае этого года ввели фильтр на ссылки и для сообщений внутри НП. Еще была попытка рассылок картинками, но желаемого результата я не получил.
Статистика
Лил я на ЛП и монету:
Посмотреть вложение 68577
очень большое полотно получается, поэтому обрезал
Посмотреть вложение 68578
Посмотреть вложение 68579
Какой-то трафик доходит и по сей день. Вот стата из тдс с 1 сентября по 9 декабря:
Посмотреть вложение 68584
P.s. В прикрепленном архиве шаблон NPreger.zp. В нем я попытался собрать максимально упрощенный скелет методов и запросов для работы с НП. Перед публикацией я проверил, все работает, за исключением запроса на регистрацию. Если кто-то сможет разобраться с safetynet recaptcha, то еще вполне можно что-то выжимать из НП.
По поводу приема смс для активаций на эти номера. Большинство популярных сервисов блокируют активации на виртуальные номера. Также сам НП имеет свои фильтры. И тем не менее хватает малоизвестных сайтов и сервисов, которые можно активировать на номера НП.