Closed urandon closed 7 years ago
Эхъ, ну ладно :)
Я просто нашёл атомную бомбу среди запросов, которая сейчас в 100% случаев отключает капчу и вообще авторизацию. Думаю использовать её перед запросом капчи.
Если будет усложнение капч и закрытие дыр, то могу предложить как опцию распознавание капч через сервисы по типу рукапчи, где можно внести деньги и происходит распознавание. Единичное распознавание стоит порядка нескольких копеек.
К слову, эти сервисы можно подключать одним хешкодом.
@uburuntu Мне уже несколько раз такое предлагали и это действительно могло бы быть хорошей идеей. Но такие сервисы ведь требуют доступ в интернет, ради которого нам и нужно ввести капчу. А если интернет есть, то зачем её тогда распознавать?
В последних версиях андроид есть режим "параллельного" подключения к двум сетям, поэтому пока поезд не ушёл со станции и не потерян сигнал GSM вышки сеть есть, за это время вполне реально попытаться разгадать капчу. Данный функционал естественно можно сделать опциональным.
7 дек. 2016 г. 12:54 пользователь "Дмитрий Карих" notifications@github.com написал:
@uburuntu https://github.com/uburuntu Мне уже несколько раз такое предлагали и это действительно могло бы быть хорошей идеей. Но такие сервисы ведь требуют доступ в интернет, ради которого нам и нужно ввести капчу. А если интернет есть, то зачем её тогда распознавать?
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-265404103, or mute the thread https://github.com/notifications/unsubscribe-auth/AAyPZyCrTA7CETMwqLJA80BUvoTHlZWOks5rFoJvgaJpZM4LBF4N .
@alexeyknyshev У меня, например, сигнал пропадает ещё на входе (Теле2). Да и если услуга платная, она должна работать в 100% случаев, а с двумя сетями мы такого не сможем гарантировать. Также непонятно, как быть с тем, что связь обрывается по нескольку раз из-за этой же капчи. Хотя идея нравится, конечно :)
Сегодня должно быть обновление, которое решит все проблемы с капчей. Скорее всего, решение не продержится вечно, но сам факт того, что его получилось реализовать, уже вселяет надежду.
Можно разгадывать капчу оффлайн, но тогда нужно смотреть в сторону torch/opencv/whatever. Наверное стоит пообщаться с чуваками с профилем ML/DL. Но тогда скорее всего придётся в apk тащить нативные либы, что раздует и усложнит проект в целом.
7 дек. 2016 г. 13:04 пользователь "Дмитрий Карих" notifications@github.com написал:
@alexeyknyshev https://github.com/alexeyknyshev У меня, например, сигнал пропадает ещё на входе (Теле2). Да и если услуга платная, она должна работать в 100% случаев, а с двумя сетями мы такого не сможем гарантировать. Также непонятно, как быть с тем, что связь обрывается по нескольку раз из-за этой же капчи. Хотя идея нравится, конечно :)
Сегодня должно быть обновление, которое решит все проблемы с капчей. Скорее всего, решение не продержится вечно, но сам факт того, что его получилось реализовать, уже вселяет надежду.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-265406367, or mute the thread https://github.com/notifications/unsubscribe-auth/AAyPZ872Q1ZIQ8lnN4iwQ_47M5g8Txp_ks5rFoS8gaJpZM4LBF4N .
Здравствуйте Я пользователь вашего приложения, и по совместительству, занимаюсь глубинный обучением и распознаванием, и у меня есть большое желание помочь автоматизировать распознавание. Для реализации придется подключить OpenCV и Caffe, то есть jni использовать, это приемлемо?
@Luonic Думаю, что у нас всё-равно нет выбора. Остаётся только надеяться, что объем итогового APK увеличится хотя-бы не в 100 раз (сейчас он находится в районе 550 КБ).
А так, это было бы отлично! Такого до нас точно никто не делал (в плане автоматизации подключения к публичным сетям).
Сегодня, 07.02.17, собрал датасет из ~1700 каптч. Надо разметить, в одиночку это многовато размечать, поэтому я разбил на 17 архивов по 100 изображений, чтобы можно было разметить и залить сюда результат. Размечать надо в формате <старое_название>.jpg -> <4_буквы/цифрыметки><старое_название>.jpg Я подумал-подумал, и пришел к выводу, что самым оптимальным методом будет распознавание тем же методом, каким распознавались номера на домах в Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks. Есть простор для аугментации этих картинок, например, можно безболезненно делать сдвиг по каналу Hue цветового пространства HSL, помимо смещений, поворотов и деформаций. Кстати, все каптчи деформированы одним и тем же образом, так что если кто знает, как его можно вычислить, чтобы выпрямить картинки и исказить самостоятельно, дабы улучшить аугментацию, то предложения приветствуются.
Еще появилась такая идея: ведь на устройстве можно отследить, введена была каптча верно или нет, и если верно, то сохранить и отправить на какой-то сервер для пополнения датасета. Она уже будет размеченной. Получается очень дешевый способ собирать всегда актуальный датасет для распознавания.
Ну и последнее, ПОМОГИТЕ РАЗМЕТИТЬ ДАТАСЕТ, напишите здесь номер, когда берете размечать какой-то архив, чтобы никто не размечал одно и то же одновременно.
@Luonic Сбор решённых капч очень легко вписывается в существующие конструкции. На самом деле он уже почти готов, осталось только придумать, как их на сервере хранить, чтобы удобно было потом их обрабатывать.
Просто я надеялся, что удастся расковырять исходный код этой капчи и получить бесконечный поток уже решённых капч. Только вот ссылку на репозиторий потерял. Он где-то на GitHub есть.
Скрипт для разметки:
#!/bin/sh
for file in *.jpg; do
sxiv $file
read captcha
mv "$file" "${captcha}_$file"
done
Вместо sxiv
подойдет любой вьювер, sxiv
можно поставить с http://git.suckless.org/sxiv
Ссылка на размеченный архив номер 15: http://rgho.st/6Q8KvNVjw
@ilabdsf, отличная работа! Спасибо!
@TheDrHax хранить можно просто сохраняя на диск и периодически сюда заливать архивы с ними, они же совсем маленькие. Я тоже думал написать эмулятор каптчи этой, по наводке нашел 2 варианта готовых, не 1 в 1, но похожие: 1, 2. Похоже, что второй вариант - это и есть наша каптча, просто ее упростили и сделали покрасивее
В нашей капче все символы это шестнадцатеричные цифры. Буквы только от a до f используются.
@ilabdsf да, я заметил это, это заметно сократить должно количество ошибок при распознавании
@TheDrHax Когда ждать первый собранный датасет? Для начала экспериментов хватило бы и тысячи каптч, я их аугментирую
@Luonic Похоже, идея оказалась не совсем удачной, ведь буквально в предыдущей сборке я добавил новый метод обхода этой самой капчи. Хотя возможно, что он не идеален и на большей выборке даст некоторый процент запросов капчи. Последнюю сборку скачали 100 раз, но собрать получилось только одну капчу (и та — моя). Но теперь, по крайней мере, можно сделать централизованное обучение, чтобы ресурсы на устройствах сэкономить.
Мне кажется, что мы не успеем реализовать эту функцию к следующему релизу, так что я планирую скоро выпустить новую бету, а потом и полноценный релиз. В случае проблем с обходом мы сможем быстро накопить очень много данных.
Зарезервирую 1,2,3 и 4 архивы из сообщения выше. Ссылки сюда добавлю, когда решу все. Хотя бы свою нейросеть в голове потренирую :)
UPD: Готово.
Взял на себя архив номер 6
8 февраля 2017 г., 23:10 пользователь Дмитрий Карих < notifications@github.com> написал:
@Luonic https://github.com/Luonic Похоже, идея оказалась не совсем удачной, ведь буквально в предыдущей сборке я добавил новый метод обхода этой самой капчи. Хотя возможно, что он не идеален и на большей выборке даст некоторый процент запросов капчи. Последнюю сборку скачали 100 раз, но собрать получилось только одну капчу (и та — моя). Но теперь, по крайней мере, можно сделать централизованное обучение, чтобы ресурсы на устройствах сэкономить.
Мне кажется, что мы не успеем реализовать эту функцию к следующему релизу, так что я планирую скоро выпустить новую бету, а потом и полноценный релиз. В случае проблем с обходом мы сможем быстро накопить очень много данных.
Зарезервирую 1,2,3 и 4 архивы из сообщения выше. Ссылки сюда добавлю, когда решу все. Хотя бы свою нейросеть в голове потренирую :)
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-278446933, or mute the thread https://github.com/notifications/unsubscribe-auth/AAyPZ_QjVXSJx3BDy8yBYweMvcCp7VTfks5raiE2gaJpZM4LBF4N .
-- linkedin.com/profile https://www.linkedin.com/profile/view?id=AAMAABn6oKQBDhBteiQnWsYm-S9yxT7wQkfWhSw
github.com/alexeyknyshev bitbucket.org/alexeyknyshev
@TheDrHax зачем обучать нейросети на устройствах? Так никто не делает, насколько я знаю, только очень маленькие модели, и уж точно не сверточные. Я собирался обучить сверточно-рекуррентную сеть с помощью Keras, в итоге получив Tensorflow модель, ее будет очень легко встроить в приложение, ведь TF разработан гуглом)
@alexeyknyshev - обратите внимание на скрипт) Так же я улучшил скрипт разметки, предложенный выше, теперь очень приятно и комфортно размечать каптчи, картинка выводится сразу в терминал. Потребуется терминальный вьювер catimg Для пущего удобства, рядом с папкой, где лежат картинки, надо создать папку labeled, в которую будут класться размеченые каптчи, чтобы случайно 2 раза не разметить одно и то же
#!/bin/sh
for file in *.jpg; do
catimg $file
read captcha
mv "$file" "../labeled/${captcha}_$file"
if pgrep sxiv &> /dev/null ; then sudo pkill sxiv ; fi
done
@Luonic Ого, такого с терминалом я точно ещё не делал. Гораздо проще открыть один раз eog
и каждый раз подменять картинку на новую. Она сразу подгружается в то же окно.
for name in $(ls | grep -v _); do cp $name ../tmp.jpg; read code; mv $name ${code}_$name; done
Или вообще капчи брать напрямую с сервера и сидеть решать, пока не надоест :)
@TheDrHax я не гуру баша и линукса, даже не знал, что еог следит за изменениями файлов. Я сегодня собрал еще 3 тысячи, как размечу все, или как только мне надоест, выложу сюда и можно будет начать играться. А вот по поводу того, что размечать с сервера - не понял, зачем, если можно на сервер сразу размечнную слать, если пользователю удалось авторизоваться. И слать лучше через другой вайфай/сотовую сеть, дабы максима не забанила айпи сервера твоего и не банила людей, если они пытаются до него достучаться.
@Luonic Я имел ввиду то, что можно вместо таких наборов по одной капче получать с их сервера и сразу разгадывать её в терминале, чтобы не нужно было их распределять.
Со сбором всё немного по-другому:
@TheDrHax они могут начать точно так же смотреть в гитхаб, блокируя всегда актуальный домен/айпи может, прикрутить динамическую генерацию домена на основе даты, да еще и в .onion? Но это уже паранойя)
@Luonic Пока что с доменами такой проблемы нет, ведь в метро до сих пор работает даже wi-fi.metro-it.com, который я довольно давно использовал. Да и thedrhax.pw они заблокировали из-за того, что приложение через него доступ к интернету проверяло (надеялись сломать, наверно). Но я это вовремя предусмотрел и в актуальной версии к тому моменту перешёл на независимые проверки :)
Хотя ладно, коммуникация с сервером — это уже моя проблема ;)
captcha_6 sorted: http://rgho.st/8GVTSSXxf
8 февраля 2017 г., 23:23 пользователь Luonic notifications@github.com написал:
@TheDrHax https://github.com/TheDrHax зачем обучать нейросети на устройствах? Так никто не делает, насколько я знаю, только очень маленькие модели, и уж точно не сверточные. Я собирался обучить сверточно-рекуррентную сеть с помощью Keras, в итоге получив Tensorflow модель, ее будет очень легко встроить в приложение, ведь TF разработан гуглом) Так же я улучшил скрипт разметки, предложенный выше, теперь очень приятно и комфортно размечать каптчи, картинка выводится сразу в терминал.
!/bin/sh
for file in *.jpg; do catimg $file read captcha mv "$file" "${captcha}_$file" done
[image: image] https://cloud.githubusercontent.com/assets/13236173/22755775/9c2f3fdc-ee55-11e6-91a6-1c7c1b3c9186.png
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-278450437, or mute the thread https://github.com/notifications/unsubscribe-auth/AAyPZztYSWBYK0mmuOTZojp6cAHrqZZkks5raiRNgaJpZM4LBF4N .
-- linkedin.com/profile https://www.linkedin.com/profile/view?id=AAMAABn6oKQBDhBteiQnWsYm-S9yxT7wQkfWhSw
github.com/alexeyknyshev bitbucket.org/alexeyknyshev
@alexeyknyshev спасибо!
Разметил 400 каптч, которых нет в архивах, выложенных выше MaximaTelecom_Captcha_400pcs_08.02.17.zip
А если капча не решена, то можно в хранилище какое класть, потом отправить, когда будет коннект. Хоть через тот же LTE (но тут уже придётся пользователя спросить, хочет ли он по LTE отдавать статистику).
Если каптча не решена, то собирать ее нет особого смысла, поскольку размечать очень утомительно. Смысл в сборе с устройства имеют только правильно введенные каптчи
On Thu, Feb 9, 2017, 10:15 Khomutov Nikita notifications@github.com wrote:
А если капча не решена, то можно в хранилище какое класть, потом отправить, когда будет коннект. Хоть через тот же LTE (но тут уже придётся пользователя спросить, хочет ли он по LTE отдавать статистику).
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-278565209, or mute the thread https://github.com/notifications/unsubscribe-auth/AMn3zWd7V2U6Y9b676Z96KIsprhbN8Csks5rar0ggaJpZM4LBF4N .
Когда ждать первый собранный датасет?
Вот тут будут автоматически выкладываться архивы с собранными капчами. Архивация производится раз в 6 часов и только если капч накопилось больше 100 штук (с чем сейчас проблема). Когда введём распознавание, можно будет таким же образом собирать автоматически решённые капчи и тогда их станет заметно больше.
Для обучения автоматически распознает каптчи мало годятся, потому что они и так распознаются, они могут немного улучшить качество, но не значительно За ссылку спасибо, последние несколько суток шаманю над распознавание как раз, скоро будет какой-то результат. Кстати, как оказалось, в каптча используются не все символы шестнадцатеричной системы исчисления, например, нет единицы.
On Sat, Feb 11, 2017, 22:46 Дмитрий Карих notifications@github.com wrote:
Когда ждать первый собранный датасет?
Вот тут https://mosmetro.duckdns.org/captcha/ будут автоматически выкладываться архивы с собранными капчами. Архивация производится раз в 6 часов и только если капч накопилось больше 100 штук (с чем сейчас проблема). Когда введём распознавание, можно будет таким же образом собирать автоматически решённые капчи и тогда их станет заметно больше.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TheDrHax/mosmetro-android/issues/75#issuecomment-279170838, or mute the thread https://github.com/notifications/unsubscribe-auth/AMn3zUHnBRysPvw6XTL1FeuKZy36Sap2ks5rbhAtgaJpZM4LBF4N .
@TheDrHax сервер с карточки создает новые архивы, но они пустые Что-то поломалось
@Luonic Ой, да, забыл условие раскомментировать после тестирования :)
Вчера вечером выпустил версию со сбором капч в Google Play. Сбор пошёл бодрее, так что теперь надо будет следить за тем, чтобы сервер не убился, т.к. это только начало.
@TheDrHax это потрясающая новость! Я как раз собрал и оттестировал все необходимое для обучения, теперь все зависит только от количества данных. Надо еще немного поиграться с архитектурой, все-таки это не распознавание обычных одноцветных строк
Ребят, я не спец во всем этом деле, но думал, что можно как раз таки приводить задачу к распознаванию капчи посимвольно, в монохромной расцветке. То есть по шагам: 1) Люди часто вводят капчу -> автоматически наполняется датасет 2) На сервере для каждой картинки находятся одноцветные области(это уже CV) - символы, нормализуются по цвету и размеру. 3) Далее уже на этой выборке из символов обучается какая-нибудь сетка 4) В итоге в приложение встраивается разбиватель изображения на символы + нормализатор + обученная сетка
@Gampr это самая первая идея, которая мне пришла в голову, когда я увидел эти каптчи. Но мне хочется постарасться сделать end-to-end распознавание с помощью одной только сети. И на сервере не стоит ничего делать, лучше выкладывать необработанные датасеты, чтобы каждый мог обработать их самостоятельно. 1-ый шаг уже реализован, ссылка выше
@Luonic а датасет наполняется как картинками, так и результатами(то есть руками юзеров)? Можешь расшифровать значение end-to-end распознавания? P.S.: Я говорю про работу на сервере - как просто предварительную работу до релиза. P.P.S.: Почему-то думал, сеть для полной картинки сложнее обучить, чем для символов отдельных P.P.P.S.: Там ведь не обязательно сеть должна быть )
На самом деле круто, что уже есть какие-то датасеты. Надо выделить время и побаловаться с ними
@Gampr в распознавании и машинном обученнии результат называется лейбл/метка Да, собираются только размеченные людьми каптчи, уже собрано ~1100 каптч, нужно на порядок больше (по моим прикидкам примерно 240 000, но это не точно) End-to-end значит, что от начала до конца весь процесс выполняется только сетью, без необходимости сегментации и прочего. Для полной картинки сеть действительно сложнее обучить, но у этого подхода есть один большой плюс, не придется в приложение встраивать OpenCV, а он весит прилично. А tensorflow граф можно очень сильно сжать, веса тоже можно сжать и получится, что приложение весом в 500кб сейчас станет весить 1.5-2мб в конечном итоге. Как показали последние несколько лет работы с распознаванием чего-либо, во всех случаях выигрывало машинное обучение у алгоритмических подходов, главное достаточно данных собрать.
@Luonic распознавание образов можно написать вручную и не тащить за собой гиганта OpenCV(но это не точно) Одно дело, когда у тебя 16 меток, другое - когда 16^4=65536. Плюс в исходных картинках есть шумы, и нужно аккуратно форму сети выбрать.
@Gampr лично мне не интересно писать самостоятельно то, что давно уже устарело. И форму сети не выбирают, выбирают архитектуру, т.е. количество слоев, их размер, и т.д., вообще у меня мысли использовать полный перебор всех параметров с определенным шагом, попробовать таким образом найти оптимальную архитектуру Но это когда будет много каптч надо только делать будет, не раньше
@Luonic У меня есть одна очень хорошая новость :)
Производительность: ~666 изображений в минуту (в 50 потоков). Сервер особо не напрягается, а NGINX вообще нагрузки не заметил. Так что я, похоже, раскопал месторождение капч.
Только есть одна проблема: картинки кэшируются. Попробую отключить эту функцию, чтобы всегда уникальные были.
@TheDrHax только надо настроить правильно Есть возможность генерировать через питон такое на лету? Чтобы не хранить на диске картинки и не обращаться к нему. Я так понимаю, что сейчас можно делать запрос к тебе и получать в ответ картинку, но можно где-то исходники всего этого посмотреть, рукапчи этой
@Luonic Я не разбирался, как оно работает, но там проект на Ruby. Так что проще генератор на сервере оставить, так как даже тут его запуск проблемным был. А так, картинки можно и не сохранять, а просто с сервера запрашивать. Хотя можно попробовать алгоритм генерации повторить.
@TheDrHax на ночь оставлю ноутбук выкачивать каптчи с сервера, завтра посмотрю на генератор Как удалось откапать это сокровище то? И еще Сервер генерит для одного и того же числа одну и ту же каптчу Можно ли добавить случайную инициализацию в генератор?
@Luonic Просто Google и ничего больше :)
В форме ввода капчи есть поле _rucaptcha, по которому и гуглил. Только они используют очень старую версию, так что эту я случайно нашёл среди остальных ревизий кода в репозитории. Актуальная совсем по-другому выглядит.
Вот питоновский скриптик для автоматического выкачивания каптч:
import urllib
small_letters = map(chr, range(ord('a'), ord('f')+1))
digits = map(chr, range(ord('0'), ord('9')+1))
base_16 = digits + small_letters
for i in range(0, len(base_16)):
for j in range(0, len(base_16)):
for m in range(0, len(base_16)):
for n in range(0, len(base_16)):
try:
label = base_16[i] + base_16[j] + base_16[m] + base_16[n]
urllib.urlretrieve("http://localhost:3000/rucaptcha/?" + str(label), str(label) + ".png")
print("Downloaded " + str(label))
except Exception as e:
print(str(e))
print("Finished all downloads")
EDIT 22.07.19 by @TheDrHax: Вырезал адрес генератора капчи, так как он уже давно неактивен. На старом домене теперь работает только Nextcloud, а он никак не может справиться с таким потоком запросов. Если вам нужен этот генератор, вы можете запустить его у себя с помощью Docker (скрипт уже отредактирован под localhost).
В один поток может быть очень медленно. Может, получится мой скрипт прикрутить?
import requests
import multiprocessing.pool
MAX_THREADS = 50
class SafePool(multiprocessing.pool.Pool):
def __init__(self, processes=MAX_THREADS):
super().__init__(processes)
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
self.join()
def captcha(code):
r = requests.get("http://localhost:3000/rucaptcha/?" + code)
with open("captcha/" + code + ".png", "wb") as png:
png.write(bytes(r.content))
if __name__ == "__main__":
with SafePool() as pool:
pool.map(captcha, ["%04d" % i for i in range(1000)])
Тут только от 0 до 1000, но можно и другое условие поставить. Я просто забыл, как создавать последовательности так, чтобы не хранить их в памяти :)
EDIT 22.07.19 by @TheDrHax: Вырезал адрес генератора капчи, так как он уже давно неактивен. На старом домене теперь работает только Nextcloud, а он никак не может справиться с таким потоком запросов. Если вам нужен этот генератор, вы можете запустить его у себя с помощью Docker (скрипт уже отредактирован под localhost).
@TheDrHax в чем проблема? super() надо какие-то параметры передать, но какие?
Traceback (most recent call last):
File "downloader.py", line 46, in <module>
with SafePool() as pool:
File "downloader.py", line 14, in __init__
super().__init__(processes)
TypeError: super() takes at least 1 argument (0 given)
[ ] Собрать примеры капч
[ ] Фильтрация
[ ] Бинаризация
[ ] Сегментация
[ ] Распознавание сегментов
[ ] Аггрерированние