mosmetro-android / mosmetro-android

Основной репозиторий приложения "Wi-Fi в метро"
GNU General Public License v3.0
318 stars 30 forks source link

Добавить автоматическое распознавание капчи #75

Closed urandon closed 7 years ago

urandon commented 7 years ago
TheDrHax commented 7 years ago

Эхъ, ну ладно :)

Я просто нашёл атомную бомбу среди запросов, которая сейчас в 100% случаев отключает капчу и вообще авторизацию. Думаю использовать её перед запросом капчи.

uburuntu commented 7 years ago

Если будет усложнение капч и закрытие дыр, то могу предложить как опцию распознавание капч через сервисы по типу рукапчи, где можно внести деньги и происходит распознавание. Единичное распознавание стоит порядка нескольких копеек.

К слову, эти сервисы можно подключать одним хешкодом.

TheDrHax commented 7 years ago

@uburuntu Мне уже несколько раз такое предлагали и это действительно могло бы быть хорошей идеей. Но такие сервисы ведь требуют доступ в интернет, ради которого нам и нужно ввести капчу. А если интернет есть, то зачем её тогда распознавать?

alexeyknyshev commented 7 years ago

В последних версиях андроид есть режим "параллельного" подключения к двум сетям, поэтому пока поезд не ушёл со станции и не потерян сигнал 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 .

TheDrHax commented 7 years ago

@alexeyknyshev У меня, например, сигнал пропадает ещё на входе (Теле2). Да и если услуга платная, она должна работать в 100% случаев, а с двумя сетями мы такого не сможем гарантировать. Также непонятно, как быть с тем, что связь обрывается по нескольку раз из-за этой же капчи. Хотя идея нравится, конечно :)

Сегодня должно быть обновление, которое решит все проблемы с капчей. Скорее всего, решение не продержится вечно, но сам факт того, что его получилось реализовать, уже вселяет надежду.

alexeyknyshev commented 7 years ago

Можно разгадывать капчу оффлайн, но тогда нужно смотреть в сторону 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 .

Luonic commented 7 years ago

Здравствуйте Я пользователь вашего приложения, и по совместительству, занимаюсь глубинный обучением и распознаванием, и у меня есть большое желание помочь автоматизировать распознавание. Для реализации придется подключить OpenCV и Caffe, то есть jni использовать, это приемлемо?

TheDrHax commented 7 years ago

@Luonic Думаю, что у нас всё-равно нет выбора. Остаётся только надеяться, что объем итогового APK увеличится хотя-бы не в 100 раз (сейчас он находится в районе 550 КБ).

А так, это было бы отлично! Такого до нас точно никто не делал (в плане автоматизации подключения к публичным сетям).

Luonic commented 7 years ago

Сегодня, 07.02.17, собрал датасет из ~1700 каптч. Надо разметить, в одиночку это многовато размечать, поэтому я разбил на 17 архивов по 100 изображений, чтобы можно было разметить и залить сюда результат. Размечать надо в формате <старое_название>.jpg -> <4_буквы/цифрыметки><старое_название>.jpg Я подумал-подумал, и пришел к выводу, что самым оптимальным методом будет распознавание тем же методом, каким распознавались номера на домах в Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks. Есть простор для аугментации этих картинок, например, можно безболезненно делать сдвиг по каналу Hue цветового пространства HSL, помимо смещений, поворотов и деформаций. Кстати, все каптчи деформированы одним и тем же образом, так что если кто знает, как его можно вычислить, чтобы выпрямить картинки и исказить самостоятельно, дабы улучшить аугментацию, то предложения приветствуются.

Еще появилась такая идея: ведь на устройстве можно отследить, введена была каптча верно или нет, и если верно, то сохранить и отправить на какой-то сервер для пополнения датасета. Она уже будет размеченной. Получается очень дешевый способ собирать всегда актуальный датасет для распознавания.

Ну и последнее, ПОМОГИТЕ РАЗМЕТИТЬ ДАТАСЕТ, напишите здесь номер, когда берете размечать какой-то архив, чтобы никто не размечал одно и то же одновременно.

TheDrHax commented 7 years ago

@Luonic Сбор решённых капч очень легко вписывается в существующие конструкции. На самом деле он уже почти готов, осталось только придумать, как их на сервере хранить, чтобы удобно было потом их обрабатывать.

Просто я надеялся, что удастся расковырять исходный код этой капчи и получить бесконечный поток уже решённых капч. Только вот ссылку на репозиторий потерял. Он где-то на GitHub есть.

link2xt commented 7 years ago

Скрипт для разметки:

#!/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

Luonic commented 7 years ago

@ilabdsf, отличная работа! Спасибо!

Luonic commented 7 years ago

@TheDrHax хранить можно просто сохраняя на диск и периодически сюда заливать архивы с ними, они же совсем маленькие. Я тоже думал написать эмулятор каптчи этой, по наводке нашел 2 варианта готовых, не 1 в 1, но похожие: 1, 2. Похоже, что второй вариант - это и есть наша каптча, просто ее упростили и сделали покрасивее

link2xt commented 7 years ago

В нашей капче все символы это шестнадцатеричные цифры. Буквы только от a до f используются.

Luonic commented 7 years ago

@ilabdsf да, я заметил это, это заметно сократить должно количество ошибок при распознавании

Luonic commented 7 years ago

@TheDrHax Когда ждать первый собранный датасет? Для начала экспериментов хватило бы и тысячи каптч, я их аугментирую

TheDrHax commented 7 years ago

@Luonic Похоже, идея оказалась не совсем удачной, ведь буквально в предыдущей сборке я добавил новый метод обхода этой самой капчи. Хотя возможно, что он не идеален и на большей выборке даст некоторый процент запросов капчи. Последнюю сборку скачали 100 раз, но собрать получилось только одну капчу (и та — моя). Но теперь, по крайней мере, можно сделать централизованное обучение, чтобы ресурсы на устройствах сэкономить.

Мне кажется, что мы не успеем реализовать эту функцию к следующему релизу, так что я планирую скоро выпустить новую бету, а потом и полноценный релиз. В случае проблем с обходом мы сможем быстро накопить очень много данных.

Зарезервирую 1,2,3 и 4 архивы из сообщения выше. Ссылки сюда добавлю, когда решу все. Хотя бы свою нейросеть в голове потренирую :)

UPD: Готово.

alexeyknyshev commented 7 years ago

Взял на себя архив номер 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

Luonic commented 7 years ago

@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

image

TheDrHax commented 7 years ago

@Luonic Ого, такого с терминалом я точно ещё не делал. Гораздо проще открыть один раз eog и каждый раз подменять картинку на новую. Она сразу подгружается в то же окно.

for name in $(ls | grep -v _); do cp $name ../tmp.jpg; read code; mv $name ${code}_$name; done

Или вообще капчи брать напрямую с сервера и сидеть решать, пока не надоест :)

Luonic commented 7 years ago

@TheDrHax я не гуру баша и линукса, даже не знал, что еог следит за изменениями файлов. Я сегодня собрал еще 3 тысячи, как размечу все, или как только мне надоест, выложу сюда и можно будет начать играться. А вот по поводу того, что размечать с сервера - не понял, зачем, если можно на сервер сразу размечнную слать, если пользователю удалось авторизоваться. И слать лучше через другой вайфай/сотовую сеть, дабы максима не забанила айпи сервера твоего и не банила людей, если они пытаются до него достучаться.

TheDrHax commented 7 years ago

@Luonic Я имел ввиду то, что можно вместо таких наборов по одной капче получать с их сервера и сразу разгадывать её в терминале, чтобы не нужно было их распределять.

Со сбором всё немного по-другому:

  1. Решённая капча дойдёт только если она решена правильно (очевидно).
  2. Для сбора капчи используется запрос, который и так отправляется уже в течение многих месяцев (все его поля можно посмотреть здесь).
  3. Домен для сбора статистики уже блокировался в метро ранее: thedrhax.pw, например, в метро уже давно не открывается, а wi-fi.metro-it.com был заблокирован в Netbynet. Это легко обходится через GitHub, т.к. в репозитории всегда лежит актуальный домен, а сам GitHub они не трогают.
  4. По IP почему-то не блокировали ещё. Возможно, они понимают, что его поменять довольно легко.
  5. Недавно я начал использовать HTTPS для этого запроса, так что теперь будет сложнее понять, что в нём. Осталось только SSL Pinning приделать для большего спокойствия.
Luonic commented 7 years ago

@TheDrHax они могут начать точно так же смотреть в гитхаб, блокируя всегда актуальный домен/айпи может, прикрутить динамическую генерацию домена на основе даты, да еще и в .onion? Но это уже паранойя)

TheDrHax commented 7 years ago

@Luonic Пока что с доменами такой проблемы нет, ведь в метро до сих пор работает даже wi-fi.metro-it.com, который я довольно давно использовал. Да и thedrhax.pw они заблокировали из-за того, что приложение через него доступ к интернету проверяло (надеялись сломать, наверно). Но я это вовремя предусмотрел и в актуальной версии к тому моменту перешёл на независимые проверки :)

Хотя ладно, коммуникация с сервером — это уже моя проблема ;)

alexeyknyshev commented 7 years ago

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

Luonic commented 7 years ago

@alexeyknyshev спасибо!

Luonic commented 7 years ago

Разметил 400 каптч, которых нет в архивах, выложенных выше MaximaTelecom_Captcha_400pcs_08.02.17.zip

urandon commented 7 years ago

А если капча не решена, то можно в хранилище какое класть, потом отправить, когда будет коннект. Хоть через тот же LTE (но тут уже придётся пользователя спросить, хочет ли он по LTE отдавать статистику).

Luonic commented 7 years ago

Если каптча не решена, то собирать ее нет особого смысла, поскольку размечать очень утомительно. Смысл в сборе с устройства имеют только правильно введенные каптчи

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 .

TheDrHax commented 7 years ago

Когда ждать первый собранный датасет?

Вот тут будут автоматически выкладываться архивы с собранными капчами. Архивация производится раз в 6 часов и только если капч накопилось больше 100 штук (с чем сейчас проблема). Когда введём распознавание, можно будет таким же образом собирать автоматически решённые капчи и тогда их станет заметно больше.

Luonic commented 7 years ago

Для обучения автоматически распознает каптчи мало годятся, потому что они и так распознаются, они могут немного улучшить качество, но не значительно За ссылку спасибо, последние несколько суток шаманю над распознавание как раз, скоро будет какой-то результат. Кстати, как оказалось, в каптча используются не все символы шестнадцатеричной системы исчисления, например, нет единицы.

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 .

Luonic commented 7 years ago

@TheDrHax сервер с карточки создает новые архивы, но они пустые Что-то поломалось

TheDrHax commented 7 years ago

@Luonic Ой, да, забыл условие раскомментировать после тестирования :)

TheDrHax commented 7 years ago

Вчера вечером выпустил версию со сбором капч в Google Play. Сбор пошёл бодрее, так что теперь надо будет следить за тем, чтобы сервер не убился, т.к. это только начало.

Luonic commented 7 years ago

@TheDrHax это потрясающая новость! Я как раз собрал и оттестировал все необходимое для обучения, теперь все зависит только от количества данных. Надо еще немного поиграться с архитектурой, все-таки это не распознавание обычных одноцветных строк

dvordrova commented 7 years ago

Ребят, я не спец во всем этом деле, но думал, что можно как раз таки приводить задачу к распознаванию капчи посимвольно, в монохромной расцветке. То есть по шагам: 1) Люди часто вводят капчу -> автоматически наполняется датасет 2) На сервере для каждой картинки находятся одноцветные области(это уже CV) - символы, нормализуются по цвету и размеру. 3) Далее уже на этой выборке из символов обучается какая-нибудь сетка 4) В итоге в приложение встраивается разбиватель изображения на символы + нормализатор + обученная сетка

Luonic commented 7 years ago

@Gampr это самая первая идея, которая мне пришла в голову, когда я увидел эти каптчи. Но мне хочется постарасться сделать end-to-end распознавание с помощью одной только сети. И на сервере не стоит ничего делать, лучше выкладывать необработанные датасеты, чтобы каждый мог обработать их самостоятельно. 1-ый шаг уже реализован, ссылка выше

dvordrova commented 7 years ago

@Luonic а датасет наполняется как картинками, так и результатами(то есть руками юзеров)? Можешь расшифровать значение end-to-end распознавания? P.S.: Я говорю про работу на сервере - как просто предварительную работу до релиза. P.P.S.: Почему-то думал, сеть для полной картинки сложнее обучить, чем для символов отдельных P.P.P.S.: Там ведь не обязательно сеть должна быть )

dvordrova commented 7 years ago

На самом деле круто, что уже есть какие-то датасеты. Надо выделить время и побаловаться с ними

Luonic commented 7 years ago

@Gampr в распознавании и машинном обученнии результат называется лейбл/метка Да, собираются только размеченные людьми каптчи, уже собрано ~1100 каптч, нужно на порядок больше (по моим прикидкам примерно 240 000, но это не точно) End-to-end значит, что от начала до конца весь процесс выполняется только сетью, без необходимости сегментации и прочего. Для полной картинки сеть действительно сложнее обучить, но у этого подхода есть один большой плюс, не придется в приложение встраивать OpenCV, а он весит прилично. А tensorflow граф можно очень сильно сжать, веса тоже можно сжать и получится, что приложение весом в 500кб сейчас станет весить 1.5-2мб в конечном итоге. Как показали последние несколько лет работы с распознаванием чего-либо, во всех случаях выигрывало машинное обучение у алгоритмических подходов, главное достаточно данных собрать.

dvordrova commented 7 years ago

@Luonic распознавание образов можно написать вручную и не тащить за собой гиганта OpenCV(но это не точно) Одно дело, когда у тебя 16 меток, другое - когда 16^4=65536. Плюс в исходных картинках есть шумы, и нужно аккуратно форму сети выбрать.

Luonic commented 7 years ago

@Gampr лично мне не интересно писать самостоятельно то, что давно уже устарело. И форму сети не выбирают, выбирают архитектуру, т.е. количество слоев, их размер, и т.д., вообще у меня мысли использовать полный перебор всех параметров с определенным шагом, попробовать таким образом найти оптимальную архитектуру Но это когда будет много каптч надо только делать будет, не раньше

TheDrHax commented 7 years ago

@Luonic У меня есть одна очень хорошая новость :)

Производительность: ~666 изображений в минуту (в 50 потоков). Сервер особо не напрягается, а NGINX вообще нагрузки не заметил. Так что я, похоже, раскопал месторождение капч.

Только есть одна проблема: картинки кэшируются. Попробую отключить эту функцию, чтобы всегда уникальные были.

Luonic commented 7 years ago

@TheDrHax только надо настроить правильно Есть возможность генерировать через питон такое на лету? Чтобы не хранить на диске картинки и не обращаться к нему. Я так понимаю, что сейчас можно делать запрос к тебе и получать в ответ картинку, но можно где-то исходники всего этого посмотреть, рукапчи этой

TheDrHax commented 7 years ago

@Luonic Я не разбирался, как оно работает, но там проект на Ruby. Так что проще генератор на сервере оставить, так как даже тут его запуск проблемным был. А так, картинки можно и не сохранять, а просто с сервера запрашивать. Хотя можно попробовать алгоритм генерации повторить.

Luonic commented 7 years ago

@TheDrHax на ночь оставлю ноутбук выкачивать каптчи с сервера, завтра посмотрю на генератор Как удалось откапать это сокровище то? И еще Сервер генерит для одного и того же числа одну и ту же каптчу Можно ли добавить случайную инициализацию в генератор?

TheDrHax commented 7 years ago

@Luonic Просто Google и ничего больше :)

В форме ввода капчи есть поле _rucaptcha, по которому и гуглил. Только они используют очень старую версию, так что эту я случайно нашёл среди остальных ревизий кода в репозитории. Актуальная совсем по-другому выглядит.

Luonic commented 7 years ago

Вот питоновский скриптик для автоматического выкачивания каптч:

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).

TheDrHax commented 7 years ago

В один поток может быть очень медленно. Может, получится мой скрипт прикрутить?

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).

Luonic commented 7 years ago

@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)