Лучшие VPN для Opera

Современные санкции все чаще касаются пользовательского времяпрепровождения в интернете. За последнее время Роскомнадзор заблокировал значительное количество VPN-сервисов и не желает останавливаться. Недавно под раздачу попал даже Opera VPN. Однако есть некоторые инструменты, которыми еще разрешено пользоваться.
В сегодняшней статье я расскажу о лучших VPN-расширениях для браузера Opera, которые доступны на территории РФ.
Что такое VPN
VPN (от англ. Virtual Private Network – виртуальная частная сеть) – это безопасное зашифрованное подключение пользователя к сети, с которым он может обходить локальные ограничения и сохранять конфиденциальность.
Зачем VPN нужен в браузере
Казалось бы, на рынке есть масса предложений, которые могут и разделять трафик по браузерам, и шифровать электронную почту, и при этом управлять всем трафиком. Зачем же выпускать отдельные решения для конкретного браузера?
На это есть несколько причин:
- Дешевизна. Большинство VPN-расширений распространяются в свободном доступе, а если речь идет о платных, то они на порядок дешевле специальных программ.
- Простота. В установке расширения нет ничего сложного, достаточно открыть интернет-магазин браузера, скачать и активировать нужный VPN-плагин.
- Доступность. Многие VPN-сервисы постепенно блокируются. С расширениями ситуация обстоит немного лучше.
- Экономия. Некоторые программы довольно тяжеловесны и занимают оперативную память. Браузерные решения экономичнее и легче – достаточно одного браузера, который можно использовать в нужное время, а после закрыть и не занимать память. Это актуально, если вы пользуетесь слабым компьютером.
- Мобильность. Можно подключаться к любой сети в любое время. При этом не нужно заново вводить пароли или логины, достаточно просто нажать на одну кнопку.
В общем случае VPN-расширения в браузере – это быстрая возможность посетить заблокированный ресурс и/или остаться анонимным в сети.
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Топ-6 VPN для Opera
Как я уже говорил ранее, большинство расширений распространяются в свободном доступе, но есть и платные решения, которые, как правило, обладают большим функционалом, анонимностью и так далее. Ниже я покажу и те, и другие варианты, а вы уже сами сможете определиться, что вам больше нравится.
Обратите внимание, что большинство рассмотренных расширений разработаны под Chrome, но это никак не мешает установить их в Opera. Достаточно установить расширение Install Chrome Extensions, после чего откроется возможность скачивать дополнения из официального магазина Google Chrome.

PureVPN

PureVPN – расширение для быстрого серфинга по интернету с режимом полной конфиденциальности. Оно обеспечивает максимальную скорость соединения и открывает доступ к серверам в 141 стране.
С точки зрения удобства PureVPN чрезвычайно прост в использовании. Он не только совместим со всеми основными операционными системами, но также позволяет одновременно работать с 5 устройствами по одной подписке. Да, расширение платное, однако есть 7-дневная пробная версия.
В PureVPN также есть функция экстренного отключения от интернета, данные шифруются при помощи 256-битного шифрования. Кроме стандартных для VPN услуг, PureVPN предлагает множество бонусов, например раздельное туннелирование. Благодаря ему часть трафика проходит через VPN-туннель, в то время как другая часть передается в сеть как обычно.
Работает с рядом протоколов безопасности, включая PPTP, L2TP, IKEv2, SSTP и OpenVPN. Расширения браузера включают WebRTC и защиту от утечки IP.
Плюсы:
- выделенная поддержка потоковой передачи;
- 2000+ серверов в 141 стране;
- 31-дневная политика возврата;
- 7-дневный пробный период;
- защита от раскрытия IP-адреса через WebRTC.
Минусы:
- нет бесплатной версии;
- скорость передачи может быть медленной на некоторых серверах.
Стоимость: $10.95 в месяц
Surfshark

Surfshark – один из лучших VPN для браузера Opera с точки зрения P2P-сетей. Он предлагает 256-битное шифрование и различные протоколы безопасного туннелирования для обеспечения максимальной безопасности. Имеет 1000+ серверов в более чем 60 странах.
Surfshark серьезно относится к безопасности своих пользователей, что обусловлено такой функцией, как MultiHop, режимом Camouflage и функцией экстренного разрыва, позволяющей мгновенно отключаться от сети. Кроме того, расширение ни при каких обстоятельствах не собирает и не хранит IP-адрес и прочие персональные данные. Также Surfshark попадет под юрисдикцию Британских Виргинских островов, известных своим лояльным подходом к конфиденциальности.
Другая особенность заключается в том, что Surfshark позволяет одновременно использовать VPN по одной подписке не на 5, а на неограниченном количестве девайсов.
Плюсы:
- высокая степень безопасности благодаря использованию последних технологий шифрования и таких инструментов, как MultiHop и Camouflage;
- конфиденциальность и отсутствие логов;
- более 1000 серверов в 60+ странах;
- неограниченные мульти-логины.
Минусы:
- нет бесплатной версии.
Стоимость: 950 ₽ в месяц
TunnelBear

Миловидный мишка предлагает бесплатное VPN-расширение под названием TunnelBear. Оно обеспечивает отличную защиту истории посещений и активности в общественных сетях Wi-Fi.
Сеть TunnelBear защищена AES 256-битным шифрованием. Существуют две дополнительные функции безопасности: VigilantBear и GhostBear. VigilantBear – это встроенная функция экстренного разрыва интернет-соединения, а GhostBear – двойной VPN, который добавляет дополнительный уровень безопасности ко всему потоку данных, что делает уже зашифрованные данные еще менее заметными для интернет-провайдеров.
Политика конфиденциальности TunnelBear очень проста: она определяет, какая информация регистрируется, а какая нет. Эта информация не включает в себя активность пользователя, историю просмотров и IP-адрес.
Плюсы:
- высокий уровень шифрования;
- серверы в 20+ странах;
- быстрая скорость соединения;
- функции VigilantBear и GhostBear.
Минусы:
- у конкурентов есть серверы в большем количестве стран.
Стоимость: бесплатно или $3.33
Ivacy

Ivacy – это одно из самых надежных VPN-расширений. Оно предлагает высокий уровень конфиденциальности, обеспечивая защиту 256-битным шифрованием AES. У компании есть серверы в 100+ странах с 3500+ серверами и 12000+ IP-адресами.
Основное преимущество данного расширения – отсутствие журнала логов. Офис зарегистрирован в Сингапуре, благодаря чему пользователи защищены местными законами о нераспространении информации.
Другое преимущество Ivacy – отличная круглосуточная техническая поддержка. На все возникающие вопросы сотрудники отвечают оперативно и результативно, что бывает не у всех VPN-сервисов. Можно отправить запрос по электронной почте, через специальную систему или в круглосуточном онлайн-чате.
Несмотря на, казалось бы, хороший подход к клиенту, на главной странице до сих пор висит новогоднее предложение, что как-то не очень убедительно выглядит.
Бесплатной версии, к сожалению, нет, но в течение 30 дней можно вернуть деньги, если сервис не подойдет.
Плюсы:
- 3500+ серверов в 100+ локациях;
- мощное шифрование и протоколы: не ведет никаких логов;
- 30-дневная политика возврата;
- хорошая служба поддержки.
Минусы:
- скорость передачи данных сильно разниться в разных регионах;
- нет бесплатной версии.
Стоимость: $9.95 в месяц
CyberGhost

CyberGhost – одно из самых популярных VPN-расширений для Opera и других браузеров. Оно предлагает более 7100 стабильных серверов по всему миру, с помощью которых можно получить доступ к Netflix US и другим стриминговым площадкам.
Некоторые сервисы требуют зарегистрироваться и только потом открывают бесплатный доступ к контенту. В случае с CyberGhost большую роль играет защита персональных данных, поэтому расширение доступно без каких-либо регистраций.
По сравнению с предыдущими аналогами, данным расширением можно пользоваться бесплатно, однако в этом случае действуют некоторые ограничения. Доступно всего 8 серверов в 4 странах: Германия, Нидерланды, Румыния и США. Также может быть медленная скорость загрузки, нет технической поддержки, безопасного доступа к Flash-контенту и многого другого, что есть в премиум-версии.
Premium-аккаунт можно подключить за 11.99€ в месяц с 14-дневной гарантией возврата денег либо за 1.9€ в месяц при оплате за 2 года – в таком случае действует 45-дневный возврат денег, а также в подарок дается 2 бесплатных месяца использования.
Плюсы:
- обеспечивает поддержку сетей P2P;
- следует четкой политике отсутствия регистрации;
- 45-дневная политика возврата при оплате за 2 года;
- есть бесплатная версия.
Минусы:
- в бесплатной версии доступно всего 8 серверов;
- проблемы с подключением на некоторых серверах.
Стоимость: бесплатно либо 11.99€ в месяц
Browsec

Последнее расширение, о котором мы поговорим – это Browsec, бесплатный инструмент российской компании, позволяющий установить VPN-соединение в Opera и других браузерах. Сервис утверждает, что защищает трафик везде и гарантирует, что пользователь получает полностью анонимный просмотр веб-страниц.
Бесплатный тариф предлагает доступ только к 4 серверам, расположенным в Сингапуре, Нидерландах, США и Великобритании. Скорость соединения ограничена 1 Мбит/с, но нет никаких ограничений в отношении объема данных.
Премиум-пользователи получают доступ к 40+ доступным серверам, включая следующие страны: Россия, США, Бельгия, Болгария, Великобритания, Германия и другие. При этом используется скоростное соединение, а стоимость составляет всего $4.99 в месяц.
Плюсы:
- не требует регистрации;
- бесплатная версия обеспечивает высокий уровень защиты данных;
- 256-битное шифрование AES;
- разблокирует Netflix US.
Минусы:
- в бесплатной версии доступно всего 4 сервера;
- ограничение скорости соединения в бесплатной версии;
- некоторые серверы периодически недоступны.
Стоимость: бесплатно или $4.99 в месяц
Заключение
Рассмотренные расширения для браузера Opera подойдут всем, кто хочет свободно и анонимно находиться в интернете. Если вы планируете активно пользоваться заблокированными сервисами, то лучше использовать платные решения. Бесплатные расширения, конечно, также подходят для регулярного использования, но это не всегда полностью конфиденциальный серфинг и стабильное подключение.
Обход капч с помощью Headless Chrome
Вот уже лет десять мы видим капчи по всему интернету. Все эти волнистые линии, слова или числа, мешающие нам при попытке залогиниться, зарегистрироваться или написать где-нибудь комментарий.
Amazon’s CAPTCHA fallback
КАПЧА (от CAPTCHA англ. – полностью автоматизированный и общедоступный тест Тьюринга для различения компьютеров и людей) задумана как врата, которые пропускают людей и отсеивают роботов (программ). Волнистые линии и слова сейчас уже не так распространены –их заменила вторая версия реКАПЧИ от Google. Эта капча выдает вам зеленую галочку, если ваш «коэффициент человечности» оценивается как достаточно высокий.
Если же вы не дотянули до заданного порога «человечности», то реКАПЧА прибегает к использованию подобной паззлу картинки, которая на удивление эффективна скорее в том, чтобы еще сильнее действовать на нервы, по сравнению с расшифровкой пары слов.
При том, что людей КАПЧИ раздражают, их можно было бы и потерпеть, если бы они хотя бы выполняли свою работу, однако, зачастую гораздо проще автоматизировать их распознавание, чем постоянно доказывать, что вы человек.
Как работает 2Captcha
2Captcha решает много разных типов капчи. Для взаимодействия с 2Captcha используются два адреса: на in.php присылается задача и в ответ Вы получаете captcha_id, на res.php вы по captcha_id получаете ответ, когда он будет готов.
2Captcha решает капчи в нескольких различных стилях с помощью двух, по большей части одних и тех же, конечных точек обработки запросов. Первый запрос передает данные, необходимые для решения капчи, и возвращает ID запроса. В случае капчи на основе изображения, данные будут изображением самой капчи, закодированным в 64base.
После получения ID запроса, вам нужно будет повторно отправлять его на сервер 2капчи, пока решение не будет готово.

С Recaptcha V2 история немного другая. Вы по-прежнему имеете дело с двухступенчатым процессом, что и представленный выше, но отправляете другие данные. Теперь вам нужно отправлять публичный ключ рекапчи (reCAPTCHA sitekey), который можно найти среди атрибутов элемента-контейнера капчи, независимо от того, был ли загружен
Получаемый ответ – это токен, который нужно отправить вместе с формой и ввести в скрытое текстовое поле с идентификатором g-recaptcha-response. Скриншот ниже показывает, где оно находится, и я специально отключил CSS-свойство display: none, чтобы показать его на странице. Имея возможность редактировать это поле, вам будет проще вручную протестировать ответ 2Captcha, чтобы сократить количество переменных при тестовой интеграции.
Для капч, основанных на изображениях, результат доступен почти мгновенно. Для реКАПЧ версии 2 может потребоваться от 15 до 30 секунд.
Автоматизация через Puppeteer
Прежде чем беспокоиться о капче, нужно разобраться со всем прочим, но прежде чем мы сможем это сделать, нужно определиться с нашими инструментами. 3 причины, по которым в данном посте мы будем использовать Google’s Chrome:
- В нем все очень легко автоматизируется через Puppeteer API.
- На нем можно работать как в headless-режиме, так и с графическим интерфейсом, что очень удобно и практично.
- Это самый распространенный в мире браузер, поэтому все имеющиеся на сайтах приемы анти-автоматизации имеют меньший шанс срабатывания (например, блокировка Selenium или PhantomJS)
Использование Puppeteer
Необязательно устанавливать хром, если не хочется, в Puppeteer есть все необходимое, в том числе Chromium. Но можете использовать и локально установленный Chrome, решать вам.
$ npm install puppeteer
Убедитесь, что все настроено, устроив предварительный тест. Для этого упражнения мы будем автоматизировать страницу регистрации Reddit, просто потому что это была первая страница с рекапчей, которая мне попалась.
const puppeteer = require('puppeteer'); const chromeOptions = < headless:false, defaultViewport: null>; (async function main() < const browser = await puppeteer.launch(chromeOptions); const page = await browser.newPage(); await page.goto('https://old.reddit.com/login'); >)()
В этом коде мы указываем два свойства конфигурации при запуске: headless: false, чтобы видеть то, что мы делаем, и defaultViewport: null, чтобы учесть неприятный визуальный глитч, при котором область просмотра не заполняет окно. Ни тот, ни другой не важны для работы браузера в headless-режиме, просто с ними удобней видеть и, что самое важное, делать скриншоты. Например, такой:
Это было просто! Теперь мы готовы перейти к следующему шагу – автоматизировать регистрацию так, будто капчи никогда и не было. Вот где возможность включать/ выключать headless-режим будет полезна, ведь мы можем управлять браузером от лица человека, когда нужно. Сначала следует понять, как получить доступ к элементам на странице, которые нужно поменять. Запустите браузер и просмотрите открытую страницу через инструменты разработчика Google Chrome (горячая клавиша – F12). Далее, найдите текстовые поля, которые нужно будет изменить. (горячие клавиши: ⌘+Shift+C на Mac и Ctrl+Shift+C на Windows) В случае с Reddit, нам нужно получить прямой доступ к полю ввода логина, двум полям ввода пароля и кнопке. Электронная почта необязательна, так что можем ее проигнорировать. Печать в текстовых полях через API библиотеки Puppeteer почти до смешного проста: вы просто передаете селектор, который идентифицирует элемент, и желаемую строку с помощью метода .type().
await page.type('#user_reg', 'some_username'); await page.type('#passwd_reg', 'SuperStrongP@ssw0rd'); await page.type('#passwd2_reg', 'SuperStrongP@ssw0rd');
Производить операции с кнопкой так же удобно, разве что у кнопки на странице Reddit нет связанного с ней идентификатора, так что нам нужен более сложный селектор. Если вы не знакомы с селекторами CSS, то для краткого ознакомления посмотрите Mozilla Developer Network.
await page.click('#register-form button[type=submit]');
Вот и всё! Протестируйте скрипт, чтобы удостовериться, что отправка логина работает. Из-за КАПЧИ, конечно, ничего не получится, но зато мы можем протестировать работу хуков.
Подождите-ка! Мы ведь даже не видим капчу, и консоль JavaScript жалуется на ошибки. Что здесь происходит? Во время автоматизации веб-страниц, помимо капч, есть множество других препятствий, которые могут встать у вас на пути. И одна из них – настолько высокая скорость выполнения операций, что страница ломается. Когда браузеры автоматизированы, они работают во много-много раз быстрее, чем на то способен обычный человек, и зачастую это приводит к выполнению кода в таком порядке, в каком разработчики его не тестировали (это называется состоянием гонки или неопределённость параллелизма).
Страница Reddit страдает от состояния гонки, тогда как Google выводит реКАПЧУ после фокусировки на втором поле ввода пароля. То есть наш скрипт выполняется c такой скоростью, что смена фокуса происходит до того, как готов скрипт реКАПЧИ. Есть много решений этой проблемы, но самое простое – добавить минимальную задержку, необходимую, чтобы миновать это состояние гонки. Мы могли бы добавить хуки и обработчики событий, чтобы убедиться, что мы действуем только после того, как рекапча загрузилась, но, похоже, самих разработчиков Reddit состояние гонки устраивает, так что нам нет необходимости умничать. Есть много способов организовать задержку, но в опциях Puppeteer, связанных с запуском браузера, есть параметр «slowMo», который глобально задерживает все действия на заданное значение. Это очень грубый подход, так как замедляются вообще все действия Puppeteer, но начать с этого можно.
const chromeOptions = < headless:false, defaultViewport: null, slowMo:10, >;
После добавления этой опции мы видим, что капча снова работает. Ради забавного эксперимента, можно попробовать пройти капчу прямо сейчас и посмотреть что будет. Поскольку мы используем вариант Chromium с настройками по умолчанию, который запускается библиотекой Puppeteer, и мы управляем им через средства автоматизации, то реКАПЧА будет изо всех сил пытаться доказать, что мы не человек. Вам, вероятно, придется пройти несколько уровней проверки, даже если вы разберетесь со всеми картинками. Когда я тестировал это, мне пришлось пройти через 10 различных повторений, прежде чем я получил зеленую галочку.
К счастью, все это можно сделать намного легче.
Настройка 2Captcha
2Captcha требует API ключ, который выдается при регистрации. Вам также потребуется какое-то количество средств, потому что, не всё в жизни бесплатно. И просто ради смеха, конечно же, вам понадобиться пройти КАПЧУ.
`http://2captcha.com/res.php?key=$&action=get&id=$`;
2Captcha’s API работает через двухступенчатый процесс, где вы отправляете данные КАПЧИ и получаете результат после возврата ID запроса. Поскольку мы имеем дело с reCaptcha v2, нам нужно будет отправить публичный ключ Reddit, о котором говорилось ранее. Нам также нужно убедиться, что мы выбрали метод userrecaptcha и отправляем URL страницы, на которой расположена реКАПЧА.
const formData = < method: 'userrecaptcha', key: apiKey, // your 2Captcha API Key googlekey: '6LeTnxkTAAAAAN9QEuDZRpn90WwKk_R1TRW_g-JC', pageurl: 'https://old.reddit.com/login', json: 1 >; const response = await request.post('http://2captcha.com/in.php', ); const requestId = JSON.parse(response).request;
После того как вы сделали этот запрос и получили обратно идентификатор запроса, вам нужно запросить URL «res.php», используя ваши ключ API и идентификатор запроса, чтобы получить ответ.
Если ваша капча не готова, вы получите ответ «CAPTCHA_NOT_READY», что указывает на то, что нужно попробовать ещё раз через секунду или две. Когда капча готова, ответом будут данные, соответствующие выбранному методу отправки. Для капчи, основанной на изображении – это будет решение. Для reCaptcha V2 – данные, которые нужно отправить в полях формы.
Для reCaptcha V2 время нахождения решения может различаться – минимум 15 секунд, максимум – 45. Ниже показан пример механизма опроса, но в этот раз простого запроса по URL, который может быть интегрирован в ваше приложение так, как вам будет удобно.
async function pollForRequestResults( key, id, retries = 30, interval = 1500, delay = 15000 ) < await timeout(delay); return poll(< taskFn: requestCaptchaResults(key, id), interval, retries >); > function requestCaptchaResults(apiKey, requestId) < const url = `http://2captcha.com/res.php?key=$&action=get&id=$&json=1`; return async function() < return new Promise(async function(resolve, reject)< const rawResponse = await request.get(url); const resp = JSON.parse(rawResponse); if (resp.status === 0) return reject(resp.request); resolve(resp.request); >); > > const timeout = millis => new Promise(resolve => setTimeout(resolve, millis))
Как только у вас есть данные ответа, вам нужно вставить результат в скрытое текстовое поле g-recaptcha-response в форме регистрации Reddit. Это не так просто, как использование метода .type() библиотеки Puppeteer, так как элемент невидим и не может получить фокус ввода. Можно сделать его видимым и затем использовать .type(), или же использовать JavaScript, чтобы внедрить значение на страницу. Для добавления JavaScript на страницу, при использовании Puppeteer, у нас есть метод .evaluate(), который принимает либо функцию, либо строку (при передаче функции она просто преобразуется в строку с помощью метода .toString()), и запускает ее в контексте страницы.
const response = await pollForRequestResults(apiKey, requestId); const js = `document.getElementById("g-recaptcha-response").innerHTML="$";` await page.evaluate(js);
После внедрения этого значения у нас все готово для завершения регистрации. Это действительно так просто.
Полный скрипт доступен ниже, если вам захочется поэкспериментировать с Puppeteer и/или 2Captcha.
Что вы теперь можете сделать?
Этот пост был написан ради двух вещей:
1. Показать вам, насколько капчи нехорошая вещь
2. Показать вам, что капчам нет необходимости блокировать вас
Капчи существуют, как правило, чтобы блокировать нехороших субъектов, манипулирующих контентом в мошеннических или вредоносных целях в ходе спланированных атак, которые выливаются в многомиллионные запросы. Есть много легитимных причин, по которым вам может потребоваться программно управлять сайтом, и если капчи не останавливают плохих парней, то вас-то уж точно они останавливать не должны.
Окей, Google: как пройти капчу?
Здравствуйте. Меня зовут Ибадов Илькин, я студент Уральского федерального университета.
В данной статье я хочу рассказать о своем опыте автоматизированного решения капчи компании «Google» — «reCAPTCHA». Хотелось бы заранее предупредить читателя о том, что на момент написания статьи прототип работает не так эффективно, как может показаться из заголовка, однако, результат демонстрирует, что реализуемый подход способен решать поставленную задачу.
Наверное, каждый в своей жизни сталкивался с капчей: ввести текст из картинки, решить несложное выражение или сложное уравнение, выбрать автомобили, пожарные гидранты, пешеходные переходы… Защита ресурсов от автоматизированных систем необходима и играет немалую роль в безопасности: капча защищает от DDoS-атак, автоматических регистраций и постингов, парсинга, предотвращает от спама и подбора паролей к учетным записям.

Форма регистрации на «Хабре» могла бы быть и с такой капчей.
С развитием технологий машинного обучения эффективность работы капчи может оказаться под угрозой. В данной статье я описываю ключевые моменты работы программы, которая может решить проблему ручного выбора изображений в «Google reCAPTCHA» (к радости, пока не всегда).
Чтобы пройти капчу, необходимо решить такие задачи как: определение требуемого капчей класса, обнаружение и классификация объектов, обнаружение ячеек капчи, имитация деятельности человека в решении капчи (движение курсором, клик).
Для поиска объектов на изображении используются обученные нейронные сети, которые можно загрузить на компьютер и распознавать объекты на изображениях или видео. Но для решения капчи недостаточно одного лишь обнаружения объектов: необходимо определить положение ячеек и узнать, какие именно ячейки требуется выбрать (или не выбирать ячейки вообще). Для этого используются средства компьютерного зрения: в данной работе это известная библиотека «OpenCV».
Для того, чтобы найти объекты на изображении, во-первых, требуется само изображение. Я получаю скриншот части экрана при помощи модуля «PyAutoGUI» с достаточными для обнаружения объектов размерами. В оставшейся части экрана я вывожу окна для отладки и мониторинга процессов программы.
Обнаружение объектов
Обнаружение и классификация объектов — это то, чем занимается нейросеть. Библиотека, которая позволяет нам работать с нейронными сетями называется «Tensorflow» (разработана компанией «Google»). Сегодня к Вашему выбору есть множество различных обученных моделей на разных данных, а значит, что все они могут возвращать различный результат обнаружения: какие-то модели будут лучше обнаруживать объекты, а какие-то хуже.
В данной работе я использую модель «ssd_mobilenet_v1_coco». Выбранная модель обучена на наборе данных « COCO », в котором выделены 90 различных классов (от людей и автомобилей до зубной щетки и расчески). Сейчас есть и другие модели, которые обучены на тех же данных, но с другими параметрами. Кроме того, данная модель имеет оптимальные параметры производительности и точности, что немаловажно для настольного компьютера. В источнике сообщается, что время обработки одного кадра размером 300 x 300 пикселей составляет 30 миллисекунд. На «Nvidia GeForce GTX TITAN X».
Результатом работы нейросети является набор массивов:
- с перечнем классов обнаруженных объектов (их идентификаторами);
- со списком оценок обнаруженных объектов (в процентах);
- со списком координат обнаруженных объектов («боксов»).

Выбранная модель позволяет обнаруживать объекты из 90 классов в реальном времени.
Обнаружение ячеек
«OpenCV» предоставляет нам возможность оперирования сущностями, которые называются «контуры»: Их можно обнаружить одной лишь функцией «findContours()» из библиотеки «OpenCV». На вход такой функции необходимо подать бинарное изображение, которое можно получить функцией порогового преобразования:
_retval, binImage = cv2.threshold(image,254,255,cv2.THRESH_BINARY) contours = cv2.findContours(binImage, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
Установив крайние значения параметров функции порогового преобразования, мы еще и избавляемся от различного рода зашумлений. Также, для минимизации количества лишних мелких элементов и шумов, можно применить морфологические преобразования: функции эрозии (сжатия) и наращивания (расширения). Данные функции так же входят в состав «OpenCV». После преобразований отбираются контуры, число вершин у которых равно четырем (предварительно выполнив над контурами функцию аппроксимации).

В первом окне результат порогового преобразования. Во втором — пример морфологического преобразования. В третьем окне уже отобраны ячейки и шапка капчи: выделены цветом программно.
После всех преобразований в конечный массив с ячейками всё равно попадают контуры, которые не являются ячейками. Для того, чтобы отсеять ненужные шумы, я произвожу отбор по значениям длины (периметра) и площади контуров.
Экспериментально выявлено, что величины интересуемых контуров лежат в диапазоне от 360 до 900 единиц. Данная величина подобрана на экране с диагональю 15,6 дюймов и разрешением 1366 x 768 пикселей. В дальнейшем, указанные величины контуров можно вычислять в зависимости от размера экрана пользователя, но в создаваемом прототипе такой привязки нет.
Главное преимущество выбранного подхода к обнаружению ячеек заключается в том, что нам всё равно, как будет выглядеть сетка и сколько всего будет показано ячеек на странице капчи: 8, 9 или 16.

На изображении показаны разновидности сеток капчи. Обратите внимание, что расстояние между ячейками — разное. Отделить ячейки друг от друга позволяет морфологическое сжатие.
Дополнительным преимуществом обнаружения контуров является и то, что «OpenCV» позволяет нам обнаружить их центры (они нужны нам для определения координат перемещения и клика мышкой).
Отбор ячеек для выбора
Имея массив с чистыми контурами ячеек капчи без лишних контуров шумов, мы можем в цикле пройти по каждой ячейке капчи («контуру» в терминологии «OpenCV») и проверить её на факт пересечения с обнаруженным «боксом» объекта, полученным от нейросети.
Для установления этого факта, применялся перевод обнаруженного «бокса» в аналогичный ячейкам контур. Но такой подход оказался неправильным, потому что случай, когда объект располагается внутри ячейки, не считается за пересечение. Естественно, что такие ячейки не выделялись в капче.
Проблема была решена перерисовкой контура каждой ячейки (с белой заливкой) на черный лист. Аналогичным образом было получено бинарное изображение рамки с объектом. Возникает вопрос — как теперь установить факт пересечения ячейки с закрашенной рамкой объекта? В каждой итерации массива с ячейками, над двумя бинарными изображениями производится операция дизъюнкци (логическое или). В её результате мы получаем новое бинарное изображение, в котором будут выделены пересекаемые участки. То есть, если такие участки имеются — значит ячейка и рамка объекта пересекаются. Программно такую проверку можно сделать методом «.any()»: она вернет «True» если в массиве имеется хотя бы один элемент равный единице или «False», если единиц нет.
Функция «any()» для изображения «Logical OR» в данном случае вернет истину и тем самым установит факт пересечения ячейки с областью рамки обнаруженного объекта.
Управление
Управление курсором в «Python» становится доступным благодаря модулю «win32api» (однако позднее выяснилось, что уже импортированный в проект «PyAutoGUI» тоже умеет это делать). Нажатие и отпускание левой кнопки мыши, а также перемещение курсора в нужные координаты производится соответствующими функциями модуля «win32api». Но в прототипе они были завернуты в пользовательские функции для того, чтобы обеспечить визуальное наблюдение за движением курсора. Это негативно влияет на производительность и было реализовано исключительно для демонстрации.
В процессе разработки возникла идея выбора ячеек в случайном порядке. Возможно, что это не имеет практического смысла (по объяснимым причинам «Google» не дает нам комментариев и описания механизмов работы капчи), однако перемещение курсора по ячейкам в хаотичном порядке выглядит забавнее.
На анимации результат «random.shuffle(boxesForSelect)».
Распознавание текста
Для того, чтобы объединить все имеющиеся наработки в единое целое, требуется еще одно звено: блок распознавания требуемого от капчи класса. Мы уже умеем распознавать и отличать разные объекты на изображении, мы умеем кликать на произвольные ячейки капчи, однако мы не знаем на какие именно ячейки нужно нажать. Одно из направлений решения данной проблемы — распознавать текст из шапки капчи. Первым делом я попробовал реализовать распознавание текста при помощи средства оптического распознавания символов «Tesseract-OCR».
В последних версиях имеется возможность установки языковых пакетов прямо в окне программы установки (раньше это делалось вручную). После установки и импорта «Tesseract-OCR» в свой проект, я попытался распознать текст из шапки капчи.
Результат, к сожалению, меня совершенно не впечатлил. Я решил, что текст в шапке выделен жирным и слитным начертанием не просто так, поэтому я попробовал применить к изображению различные преобразования: операции бинаризации, сужения, расширения, размытия, искажения и изменения размеров. К сожалению, это не дало хорошего результата: в лучших случаях определялась лишь часть букв класса, а когда результат получался удовлетворительным, я применял эти же преобразования, но для других шапок (с другим текстом), и результат снова получался плохим.

Распознавание шапки с «Tesseract-OCR» обычно приводило к неудовлетворительным результатам.
Нельзя однозначно сказать, что «Tesseract-OCR» плохо распознает текст, это не так: с другими изображениями (не шапками капчи) инструмент справляется значительно лучше.
Я решил воспользоваться сторонним сервисом, который бесплатно предлагал API для работы с ним (требуется регистрация и получение ключа на электронный адрес). В сервисе установлено ограничение на 500 распознаваний в день, однако за весь период разработки никаких проблем с ограничениями у меня не возникло. Напротив: я подавал в сервис оригинальное изображение шапки (не применяя абсолютно никаких преобразований) и результат меня приятно впечатлил.
Слова от сервиса возвращались практически без ошибок (обычно даже те, которые написаны мелким шрифтом). Более того, они возвращались в очень удобном формате — разбитые по строкам символами переноса строки. Во всех изображениях меня интересовала только вторая строка, поэтому я напрямую обращался к ней. Это не могло не радовать, так как такой формат освободил меня от необходимости подготавливать строку: мне не пришлось резать начало или конец всего текста, делать «тримы», замены, работать с регулярными выражениями и совершать прочие операции над строкой, направленные на выделение одного слова (а иногда двух!) — приятный бонус!
text = serviceResponse['ParsedResults'][0]['ParsedText'] #получил текст из JSON lines = text.splitlines() #Разбил на элементы print("Recognized " + lines[1]) #Готово к использованию!
Сервис, который распознавал текст, практически никогда не ошибался с названием класса, но я всё равно решил оставить часть названия класса для возможной ошибки. Это необязательно, но я заметил, что «Tesseract-OCR» в некоторых случаях неправильно распознавал конец слова начиная с середины. Кроме того, такой подход исключает ошибку приложения, в случае длинного названия класса или названия из двух слов (в таком случае сервис вернет не 3, а 4 строки, и я не смогу найти во второй строке вхождение полного наименования класса).

Сторонний сервис хорошо распознает наименование класса без каких-либо преобразований над изображением.
Слияние наработок
Получить текст из шапки — мало. Его нужно сопоставить с идентификаторами имеющихся классов модели, потому что в массиве классов нейронная сеть возвращает именно идентификатор класса, а не его название, как это может показаться. При обучении модели, как правило, создается файл, в котором сопоставляются названия классов и их идентификаторы (он же «label map»). Я решил поступить проще и указать идентификаторы классов вручную, так как капча всё равно требует классы на русском языке (к слову, это можно изменить):
if "автом" in query: # ищем вхождение класса в запросе капчи classNum = 3 # присваиваем соответствующий "label map" идентификатор elif "свето" in query: classNum = 10 elif "пожар" in query: classNum = 11 .
Все описанное выше, воспроизводится в основном цикле программы: определяются рамки объекта, ячейки, их пересечения, производятся перемещения курсора и клики. При обнаружении шапки производится распознавание текста. Если нейронная сеть не может обнаружить требуемый класс, то совершается произвольный сдвиг изображения до 5 раз (то есть меняются входные в нейросеть данные), и если обнаружения по прежнему не произошло, то выполняется клик на кнопку «Пропустить/Подтвердить» (её положение обнаруживается аналогично обнаружению ячеек и шапки).
Если Вы часто решаете капчу, Вы могли наблюдать картину, когда выбранная ячейка пропадает, а на её месте медленно и не спеша появляется новая. Поскольку прототип запрограммирован на моментальный переход к следующей странице после выбора всех ячеек, мной было принято решение делать 3 секундные паузы, чтобы исключить нажатия на кнопку «Далее» без обнаружения объектов на медленно появляющейся ячейке.
Статья была бы не полной, если бы в ней не было описания самого главного — галочки успешного прохождения капчи. Я решил, что с такой задачей может справиться простое сравнение по шаблону. Стоит отметить, что сравнение по шаблону — далеко не самый лучший путь для обнаружения объектов. Мне, например, пришлось выставить чувствительность обнаружения на значение «0.01», чтобы функция перестала во всем видеть галочки, но видела её, когда галочка действительно есть. Аналогичным образом я поступил с пустым чекбосом, который встречает пользователя и с которого начинается прохождение капчи (там проблем с чувствительностью не было).
Результат
Результатом всех описанных действий стало приложение, работоспособность которого я протестировал на «Тостере»:
Стоит признать, что ролик снят не с первой попытки, так как я нередко сталкивался с необходимостью выбора классов, которые отсутствуют в модели (например, пешеходные переходы, лестницы или витрины).
«Google reCAPTCHA» возвращает сайту некую величину, показывающую насколько «Вы робот», а администраторы сайта, в свою очередь, могут установить порог прохождения этой величины. Возможно, что на «Тостере» был установлен относительно низкий порог прохождения капчи. Это объясняет достаточно легкое прохождение капчи программой, несмотря на то, что она дважды ошиблась, не увидев светофор из первой страницы и пожарный гидрант из четвертой страницы капчи.
Помимо «Тостера», были проведены эксперименты на официальной демонстрационной странице «reCAPTCHA». В результате, замечено, что после множественных ошибочных обнаружений (и необнаружений), пройти капчу становится крайне затруднительно даже человеку: требуются новые классы (вроде тракторов и пальм), в выборках появляются ячейки без объектов (почти монотонные цвета) и резко увеличивается количество страниц, которые нужно пройти.
Это было особенно заметно, когда я решил попробовать кликать по случайным ячейкам в случае необнаружения объектов (ввиду их отсутствия в модели). Поэтому можно точно утверждать, что случайные клики не приведут к решению задачи. Чтобы избавиться от такого «завала» экзаменатором, производился реконнект Интернет-соединения и очистка данных браузера, потому что пройти такой тест становилось невозможным — он был практически бесконечным!

При сомнении в Вашей человечности возможен и такой исход.
Развитие
Если статья и приложение вызовет интерес у читателя, я с удовольствием продолжу его реализацию, тесты и дальнейшее описание в более детальном виде.
Речь идет об обнаружении классов, которые не входят в состав текущей сети, это значительно улучшит эффективность работы приложения. На данный момент имеется острая необходимость в распознавании как минимум таких как классов как: пешеходные переходы, витрины и дымовые трубы — я расскажу, как можно переобучить модель. Во время разработки я составил небольшой список наиболее часто встречающихся классов:
- пешеходные переходы;
- пожарные гидранты;
- витрины;
- дымовые трубы;
- автомобили;
- автобусы;
- светофоры;
- велосипеды;
- транспортные средства;
- лестницы;
- знаки.
Другой способ улучшения качества обнаружения объектов — изменение входного в нейросеть изображения: на видео можно увидеть, что при необнаружении объектов я несколько раз делаю произвольное смещение изображения (в пределах 10 пикселей по горизонтали и вертикали), и зачастую такая операция позволяет увидеть объекты, которые ранее не были обнаружены.
К выявлению необнаруженных объектов приводит и увеличение изображения из маленького квадрата в большой (до 300 x 300 пикселей).

Слева объекты не обнаружены: оригинальный квадрат стороной 100 пикселей. Справа автобус обнаружен: увеличенный квадрат до 300 x 300 пикселей.
Еще одним интересным преобразованием можно отметить удаление белой сетки над изображением средствами «OpenCV»: возможно, что пожарный гидрант на видео не обнаружился именно по этой причине (такой класс присутствует в нейронной сети).

Слева оригинальное изображение, а справа — измененное в графическом редакторе: сетка удалена, ячейки перемещены друг к другу.
Итоги
Данной статьей я хотел рассказать Вам о том, что капча, вероятно, не самая лучшая защита от ботов, и вполне возможно, что в скором времени возникнет потребность в новых средствах защиты от автоматизированных систем.
Разработанный прототип, даже будучи в незавершенном состоянии, демонстрирует, что при наличии требуемых классов в модели нейронной сети и применении преобразований над изображениями, можно достигнуть автоматизации процесса, который автоматизированным быть не должен.
Также, я хотел бы обратить внимание компании «Google» на то, что помимо способа обхода капчи, описанного в данной статье, имеется еще и иной способ, в котором производится транскрибация аудио-образца. На мой взгляд, уже сейчас необходимо принимать меры, связанные с улучшением качества программных продуктов и алгоритмов против роботов.
Из содержания и сути материала может показаться, что я не люблю «Google» и в частности «reCAPTCHA», однако это далеко не так, и, если следующей реализации быть — я расскажу почему.
Разработано и продемонстрировано в целях повышения уровня образования и улучшения методов, направленных на обеспечение безопасности информации.
Спасибо за внимание.
- automation
- captcha
- computer vision
- machine learning
- neural network
- optical character recognition
- python
- recaptcha
- автоматизация
- безопасность
- капча
- компьютерное зрение
- машинное обучение
- нейросети
- оптическое распознавание символов
- Информационная безопасность
- Python
- Обработка изображений
- Машинное обучение
Не «Оперой» единой. Выбираем proxy-сервис вместо Opera VPN

Признаюсь, я никогда не считал себя преданным фанатом Opera. Тем не менее этот браузер был установлен на всех моих компьютерах — из-за простой и удобной функции VPN (который даже не VPN, а, скорее, продвинутый прокси), позволявшей при необходимости быстро менять внешний IP-адрес и локацию, что бывает просто необходимо в целом ряде случаев — скажем, в процессе отладки веб-приложений. Да мало ли по какой причине благородному дону вдруг понадобится предстать в сети канадским фермером или испанским кабальеро? И вот с недавних пор сервис Opera VPN был отключен для российских пользователей разработчиками браузера. Что ж, настало время искать альтернативу!
Конечно, есть надежный и безотказный, как автомат Калашникова, Tor Browser, но лично я его не люблю, прежде всего, из-за очень медленного процесса соединения с сетью и общей тормознутости. Да и в целом эта программа предназначена для совершенно иных задач. В той же «Опере» VPN-сервис можно подключить в виде отдельного плагина, но у меня он почему-то упорно слетает после каждого перезапуска браузера. Еще есть возможность подкрутить конфиг программы, изменив геолокацию. Говорят, помогает — до следующего обновления браузера. Ну и, конечно, существует полноценный VPN, но за эту услугу нужно либо платить, либо рисковать утечкой данных куда-нибудь налево. Тем более для примитивных задач, вроде простого переключения IP, он по большому счету и не нужен — достаточно какого-нибудь быстрого прокси. В общем, есть повод задуматься о максимально простой замене для Opera, не требующей каких-либо настроек, возни с конфигами и прочих танцев с бубном.
Chrome: Fractal VPN
VPN-подобных плагинов для Chrome великое множество, правда, примерно половина из них нормально не работает. Один из работающих — бесплатный Fractal VPN. Это, скорее, не полноценный VPN, а прокси, подменяющий ваш IP-адрес. Удобство плагина состоит в его простоте: выбираешь страну из списка, жмешь Connect, и вот ты уже где-нибудь на другом конце земного шара.

Государства в перечне плагина, правда, в массе своей диковинные — Бенин, Бангладеш, Чили, Гондурас, Кения, но если выбрать, например, Германию, то скорость обращения к сайтам сохраняется на вполне достойном уровне. Минус Fractal VPN состоит в том, что соединение временами самопроизвольно слетает, после чего приходится нажимать кнопку Connect заново. Какие-то прокси более стабильны, но медленны, другие работают шустрее, но время от времени вылетают или начинают тормозить. Еще один крупный недостаток плагина — при перезапуске браузера он не запоминает выбор пользователя и предлагает первую в списке стран Аргентину. Все эти неудобства позволяют в целом оценить плагин на троечку.
Chrome: Earth VPN
Еще одно расширение из той же серии — но в отличие от Fractal VPN оно хотя бы запоминает предпочтения пользователя в плане страны, через которую выполняется подключение. Включается и отключается плагин крайне просто — щелчком мыши на значке в инструментальной панели браузера.

Стабильность работы плагина весьма относительна: некоторые прокси изрядно тормозят, другие, несмотря на то, что плагин показывает успешное подключение, не обеспечивают стабильного соединения вообще. В общем, если подобрать подходящий режим работы расширения, пользоваться им вполне можно.
Chrome: 1ClickVPN
Разработчики называют этот плагин «простейшим VPN для Chrome», и в целом это так и есть — расширение не имеет практически никаких настроек, кроме списка из пяти стран, через которые ты можешь подключиться к Интернету (США, Канада, Нидерланды, Испания и Великобритания), а также кнопки Disconnect.

В принципе, это почти то же самое, что выпилила у себя Opera: примитивный и надежный прокси, включаемый и отключаемый в один клик. Работает довольно-таки шустро и стабильно, при выгрузке браузера запоминает не только предыдущий выбор прокси-сервера, но и состояние подключения. За пару дней использования никаких нареканий этот плагин не вызвал.
FireFox: TouchVPN
Да, для FireFox есть великолепный FoxyProxy, но в нем нужно вводить адреса прокси-серверов вручную, а мне, понятное дело, лень. Несколько других протестированных мною плагинов либо предлагают тормознутые прокси где-то в Зимбабве, а подключение с нормальной скоростью через Европу доступно только платным подписчикам (Browsec VPN ), либо не дают пользоваться сервисом, пока ты не зарегистрируешься и не подпишешься на спам-рассылку (Hoxx VPN Proxy, SetupVPN), либо в открытую собирают приватные данные (Hola).
Потому я решил установить в этом браузере плагин TouchVPN, который в Chrome у меня по непонятным причинам не завелся. Здесь расширение на удивление заработало и заработало довольно-таки шустро, что меня крайне порадовало.

К несомненным достоинствам TouchVPN стоит отнести довольно интересный набор настроек: помимо страны подключения можно указать конкретный список сайтов, доступ к которым осуществляется только через прокси, или, наоборот, задать перечень URL, для которых прокси будет всегда отключен. Очень удобно, если FireFox используется в качестве основного браузера, и смена IP требуется только для нескольких ресурсов, а при просмотре остальных сайтов мешает.
Yandex Browser
Браузер от «Яндекса» работает на движке Blink, и потому к нему подходят некоторые совместимые аддоны от Opera. Доступных плагинов в этой категории для Yandex Browser предлагается относительно немного: я попробовал несколько, и ни один из них не заработал нормально. Тем приятнее было выяснить, что в этом браузере прекрасно запускается тот же 1ClickVPN, который можно установить с помощью плагина Install Chrome Extensions.

Выводы
Несмотря на то, что Opera выпилила свой прокси-сервис, ради которого я, собственно, когда-то и установил этот браузер, вместо него вполне можно использовать плагины в других программах. Для Chrome и «Яндекс.Браузера» я выбрал 1ClickVPN, в FireFox лучше всего себя зарекомендовал TouchVPN. Возможно, существуют альтернативные решения, но перечисленных выше вполне достаточно для решения простых задач вроде разовой смены IP. Вы отыскали какие-то иные, простые и надежные инструменты? Делитесь своими находками в комментариях!
- браузеры
- информационная безопасность
- сетевые технологии
- Блог компании Timeweb Cloud
- Браузеры
- Софт