Comment contourner un Captcha (simple) avec Python3 et Pytesseract?

Sasha Bouloudnine
April 14, 2023
4 min read

Un CAPTCHA, acronyme qui signifie Completely Automated Public Turing test to tell Computers and Humans Apart, est un test utilisé par les sites internets partout dans le monde, pour déterminer si un utilisateur est véritablement un humain.

How to bypass a (simple) Captcha with Python3 and Pytesseract?-image-1.png

D’après cet excellent article de Cloudflare posté en Mai 2021, avec 4,6 milliards d’internautes chaque jour, et un captcha résolu en moyenne une fois tous les 10 jours, c’est donc près de 500 millions de captcha qui sont résolus chaque jour.

S’il est possible de résoudre ces challenges en faisant appel à des services tierces, comme la société 2captcha, cela devient rapidement lent et coûteux, puisqu’il faut compter en moyenne 30 secondes par résolution, et 2 USD pour 1000 captchas résolus. Sans parler des implications éthiques.

Dans cet article, nous allons voir comment contourner un CAPTCHA (simple) de façon entièrement programmatique, avec Python et la librairie Pytesseract.

Le code est disponible en intégralité ici: https://gist.github.com/lobstrio/da95d31bff3f83a5e95ee9daeb253107#file-bypass_simple_captcha_pytesseract-py

Prérequis

Afin de réaliser ce tutoriel de bout en bout, soyez sur d’avoir les éléments suivants installés sur votre ordinateur.

  1. python3
  2. SublimeText

Vous pouvez cliquer sur les liens ci-dessous, qui vous dirigeront soit vers un tutoriel d’installation, soit vers le site en question.

Pour préciser l’utilité de chacun des éléments cités ci-dessus: python3 est le langage informatique avec lequel nous allons scraper le pdf, et SublimeText est un éditeur de texte. Sublime.

À nous de jouer!

Installation

On va procéder comme suit:

  1. Installer open-cv
  2. Installer pytesseract
  3. Installer tesseract
  4. Télécharger le Captcha

Pour les 2 premières librairies, Il suffit dans la console, de taper les commandes suivantes:

$ pip3 install opencv-python $ pip3 install pytesseract

Enfin, il faut installer tesseract, qui est un OCR, l’acronyme de Optical Character Recognition, c'est-à-dire la technologie qui va permettre de déchiffrer les caractères du Captcha.

Mac OS

$ brew install tesseract

Linux

sudo apt update sudo apt install tesseract-ocr sudo apt install libtesseract-dev

Et l’ensemble des informations détaillés d’installation présentes ici: https://stackoverflow.com/questions/50655738/how-do-i-resolve-a-tesseractnotfounderror

Et voilà, les librairies sont installées!

Enfin, on va télécharger notre captcha (simple). Rendez-vous sur ce site de génération de captcha: https://fakecaptcha.com/. Taper le mot clé de votre choix. Enfin, télécharger l’image, à conserver précieusement:

How to bypass a (simple) Captcha with Python3 and Pytesseract?-image-2.png

Allons désormais déchiffrer cette image. Et prouvez notre humanité. Sans aucune intervention humaine.

🤖

Guide Complet

Nous allons passer par 3 étapes distinctes:

  1. Resize
  2. Close
  3. Threshold

Avec les 3 transformations comme suit:

How to bypass a (simple) Captcha with Python3 and Pytesseract?-image-3.png

1. Resize

D’abord, nous allons redimensionner l’image. Le redimensionnement de l'image permet à l'algorithme OCR de détecter les traits de caractères ou de chiffres dans l'image d'entrée.

Le code comme suit:

filename = 'lobstr.jpeg' img = cv2.imread(filename) gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) (h, w) = gry.shape[:2] gry = cv2.resize(gry, (w*2, h*2))

2. Close

Le closing est une opération morphologique visant à supprimer les petits trous dans l'image d'entrée. Si nous regardons attentivement les caractères l et b se composent de beaucoup de petits trous.

Le code:

cls = cv2.morphologyEx(gry, cv2.MORPH_CLOSE, None)

3. Threshold

Nous appliquerons un seuil simple pour binariser l'image. Notre objectif est de supprimer tous les artefacts restants de l'image, qui nuisent à la lisibilité.

Le code:

thr = cv2.threshold(cls, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

4. Decrypt

Enfin, une fois l’image suffisamment clarifiée, on décode le message avec la librairie tesseract pour Python.

Et on imprime le message décodé dans la console:

txt = image_to_string(thr) print(txt)

Le Code

Voilà le code en intégralité:

import cv2 from pytesseract import image_to_string # pip3 install opencv-python # pip3 install pytesseract # brew install tesseract filename = 'lobstr.jpeg' img = cv2.imread(filename) gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) (h, w) = gry.shape[:2] gry = cv2.resize(gry, (w*2, h*2)) cls = cv2.morphologyEx(gry, cv2.MORPH_CLOSE, None) thr = cv2.threshold(cls, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] txt = image_to_string(thr) print(txt)

Pour exécuter le code:

  1. Télécharger le code .py
  2. Changer le chemin de l’image
  3. Lancer le script via la ligne de commande

Et voilà ce qui va apparaître directement sur votre terminal:

$ python3 bypass-captcha-pytesseract-tutorial.py lobstr

Eureka!

Limitations

Ce code va vous permettre de convertir rapidement des images, générées depuis https://fakecaptcha.com/, en texte. Et donc de contourner les challenges possiblement posés lors d’un scraping de données.

Toutefois, ce script ne fonctionne que pour des captchas simples . Essayons pour voir avec un Captcha Amazon, ci-après:

How to bypass a (simple) Captcha with Python3 and Pytesseract?-image-4.png

On lance le script:

$ python3 bypass-captcha-pytesseract-tutorial.py nrrth

Qui ne fonctionne tout simplement pas.

🤷‍♀️

Conclusion

Et c’est la fin du tutoriel!

Dans ce tutoriel, nous avons vu comment contourner un Captcha simple avec Python3 et Pytesseract, et ce de façon programmatique.

Si vous avez des questions, ou si vous avez besoin d’un service de scraping sur-mesure, solide et scalable, capable de contourner les captchas les plus robustes, contactez-nous ici.

Happy scraping!

🦀

Share this article
Code

Related Articles