Сервіс розпізнавання капч, який більше не потрібен

Я вже розповідав про свій досвід у галузі розпізнавання капчі. Зрозуміло, крім суто академічного інтересу у мене був і матеріальний - іноді доводиться скачувати кілька файлів з обмінника, а чекати паузу і вводити капчі я не люблю. Тому і користуюся програмою для закачування під назвою Universal Share Downloader, або скорочено USD. Нещодавно сервіс обміну файлами Turbobit в черговий раз вніс зміни в свій сайт, в результаті чого моя програма виявилася марною. Тепер я можу розповісти про сервіс розпізнавання детальніше, вже не побоюючись наблизити цей момент. Може, зростання кількості безкоштовних скачувань в результаті використання сервісу вже вплинуло. Або це просто традиційна червнева пакість від обмінника - то капчу поміняють, то швидкість скачування уріжуть.


Ну як так то?

USD має активну спільноту, в якій розробляються і поширюються плагіни для підтримки різних файлообмінників. Там я викладав свою програму для розпізнавання капчі, щоб полегшити процес скачування всім бажаючим. Версії з Тессерактом, потім з нейромережею і остаточний варіант - з використанням веб-сервісу на Heroku. Капча являла собою досить відому в минулому Kohana, зараз така більше ніде не використовується і спамерам нецікава. Надсилання файла здійснювалося POST запитом. Експериментальна клієнтська частина була написана на Пайтоні, потім для скорочення розміру і приміщення в збірці я переписав її на AutoIt. Це викликало проблеми із захисником у Windows 10 - він не оцінив ідею відправляти файли кудись в інтернет (а може, збіглися якісь сигнатури) і став її блокувати. І тут мене осінило: найкраща програма - це її відсутність. Я зв'язався з розробником плагіну і запропонував помістити відправку файлу на розпізнавання прямо в плагін Турбобіта. Правда, для цього довелося додати до сервісу можливість прийому файлів у вигляді Base64 тексту.

Технічно сервіс являв собою Flask додаток на Heroku, розпізнавання за допомогою Keras і Tensorflow. Мені вдалося вкластися в обмеження безкоштовного використання - споживання дискового простору склало 430 Мб. На самому початку приймалися файли, за якими можна було судити про номер спроби - у разі невдачі наступний файл йшов з іншою назвою. Я намагався вести статистику, але періодично прилітали серії з не залежними від очередності іменами - можливо, хтось використовував сервіс для розмітки своїх файлів. З відправленням капч у вигляді Base64 імена файлів стали недоступні, і я став просто рахувати капчі. Збереження файлів реалізував наступним чином: картинка і результат додаються до словника, при досягненні потрібної кількості в пам'яті створюється zip архів і капчі переносяться туди з додаванням до імені мітки часу, потім архів відправляється на зберігання. Безкоштовний сервіс на Heroku автоматично перезапускається приблизно раз на добу або при бездіяльності протягом 30 хвилин. При такому підході частина капч втрачається в разі перезапуску сервісу, але завдання зберегти абсолютно все і не ставилося. Потім додав можливість перегляду останньої розпізнаної картинки. Правда, через те що сторінка з текстом і картинка запитувалися не одночасно, іноді можна було побачити капчу, яка зовсім не відповідає тексту. Вирішив не виправляти, все одно крім мене ніхто цю сторінку не дивиться. У якийсь момент додав можливість перегляду власної IP адреси - чому б і ні, коли вже є сервіс, що постійно працює?

Два варіанти інтерфейсу для зневадження

Сервіс пропрацював близько 8 місяців, кількість розпізнаваних файлів за добу коливалася від півтори до трьох тисяч, були сплески до шести. Тренував нейромережу кілька разів на 15000 файлах, останній раз в січні з урахуванням 250 виявлених за місяць помилок. Логи я не зберігав, самі файли в цілях контролю точності можна було пакувати в архіви і відправляти на Cloudinary. Включав збереження два рази на пару місяців, тепер у мене є півтора гігабайта розпізнаних капч - трохи більше 300 тисяч файлів. Судячи зі збережених імен, явних помилок там всього 13 штук, неявних при вибірковому перегляді виявити не вдалося. По-моєму, непогана точність розпізнавання, сам такого не очікував.

Виявлені помилки розпізнавання

Код програми доступний на GitHub, налаштування Heroku і ключі авторизації Cloudinary передаються через змінні середовища.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND