PythonでCAPTCHAを作る
1. はじめに
ねえ、コーディングちゃん!CAPTCHAって知ってる?あれって、私たちが本当に人間かどうか確認するためのテストなんだよ!
もちろん知ってるわ、デジタリアちゃん。CAPTCHAは、歪んだ文字や数字を含む画像を表示して、それを入力させることでボットのアクセスを防ぐのよ。
このブログではPyCharmを使います。
ダウンロードの仕方や、使い方はこちらのブログから↓
CAPTCHAとは?
CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)は、ユーザーが人間であることを確認するためのテストです。通常、歪んだ文字や数字を含む画像を表示し、ユーザーにその内容を入力させることで、自動化されたボットのアクセスを防ぎます。
CAPTCHAの重要性
CAPTCHAは、不正アクセスやスパムを防ぐために広く使用されています。特に、フォームの送信やアカウントの作成時に導入されることが多く、ウェブサイトのセキュリティを高める重要な役割を果たしています。
フォームの送信やアカウントの作成時に使われるんだね!ウェブサイトのセキュリティを高めるために重要なんだね。
その通りよ。CAPTCHAがないと、不正アクセスやスパムが簡単に行われてしまうわ。
PythonでCAPTCHAを作成する準備
必要なライブラリのインストール
CAPTCHA生成に必要なライブラリをインストールします。
以下のコマンドを使用してください!!
1pip install -U opencv-python
2pip install -U numpy
3pip install -U captcha
PythonでCAPTCHAを作成するには、まずライブラリをインストールしないとね。簡単だよ!このコマンドを使えばいいんだ。
基本的な設定
constants.py
ファイルにはCAPTCHA生成に必要な設定が定義されています。
次に、CAPTCHA生成に必要な設定をconstants.py
ファイルに定義するの。内容は以下の通りよ。
1# constants.py
2
3CAPTCHA_FOLDER = 'generated_captchas'
4LETTERS_FOLDER = 'generated_letters'
5
6CHARACTERS = list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
7NR_CAPTCHAS = 1000
8NR_CHARACTERS = 5
9
10MODEL_FILE = 'captcha_model.h5'
11LABELS_FILE = 'captcha_labels.dat'
12
13MODEL_SHAPE = (100, 100)
次に、CAPTCHA生成用のスクリプトgenerate.py
です:
さあ、次はCAPTCHA生成用のスクリプトだよ!これを使えば、ランダムな文字列のCAPTCHA画像を生成して保存できるんだ。
1# generate.py
2
3from random import choice
4from captcha.image import ImageCaptcha
5import os
6from constants import *
7
8# CAPTCHA保存フォルダを作成
9if not os.path.exists(CAPTCHA_FOLDER):
10 os.makedirs(CAPTCHA_FOLDER)
11
12image = ImageCaptcha()
13
14# 指定された数のCAPTCHA画像を生成
15for i in range(NR_CAPTCHAS):
16 captcha = ''.join([choice(CHARACTERS) for _ in range(NR_CHARACTERS)])
17 filename = os.path.join(CAPTCHA_FOLDER, '{}_{}.png'.format(captcha, i))
18 image.write(captcha, filename)
19 print('Captcha {} created'.format(filename))
このスクリプトは、指定されたフォルダにランダムな文字列のCAPTCHA画像を生成し保存します。
これで、指定したフォルダにランダムな文字列のCAPTCHA画像が生成されて保存されるのね。
文字ベースのCAPTCHAの作成
ランダムな文字列の生成
ランダムな文字列は、以下のコード部分で生成されています:
1captcha = ''.join([choice(CHARACTERS) for _ in range(NR_CHARACTERS)])
これは、CHARACTERS
リストからランダムに5文字(NR_CHARACTERS
)を選び出し、それを連結して文字列にしています。
画像の生成と表示
生成された文字列を画像として保存するために、captcha.image.ImageCaptcha
クラスを使用しています。このクラスは、文字列を画像に変換し、指定したファイルパスに保存する機能を持っています。
1image = ImageCaptcha()
2filename = os.path.join(CAPTCHA_FOLDER, '{}_{}.png'.format(captcha, i))
3image.write(captcha, filename)
このコードは、生成した文字列を画像に変換し、指定したフォルダに保存します。
CAPTCHAの検証
CAPTCHAをユーザーが入力した値と比較して検証する方法について説明します。このプロセスでは、CAPTCHA画像から文字を抽出し、ユーザーが入力した値と比較します。提供されたコードを基に、画像の前処理と文字認識の流れを解説します。
画像の前処理とノイズ除去
提供されたコードは、画像をグレースケールに変換し、しきい値処理を行い、ノイズを除去する手順を含んでいます。
ノイズを追加すると、ボットが解読するのがもっと難しくなるんだよ!OpenCVとNumPyを使って、画像のランダムな線や点を除去してみよう!
以下は、前処理のコードです:
1import cv2
2import numpy as np
3import os
4
5# 画像ファイルのパスを指定
6image_file = 'generated_captchas/GFaIH_420.png'
7
8# 画像を読み込む
9image = cv2.imread(image_file)
10
11# グレースケールに変換してから、白黒にしきい値処理
12gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
13_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
14cv2.imshow('Black and white', thresh)
15
16# オープニングの適用:収縮後に膨張
17denoised = thresh.copy()
18kernel = np.ones((4, 3), np.uint8)
19denoised = cv2.erode(denoised, kernel, iterations=1)
20kernel = np.ones((6, 3), np.uint8)
21denoised = cv2.dilate(denoised, kernel, iterations=1)
22cv2.imshow('Denoised', denoised)
23
24# 輪郭の検出
25contours, _ = cv2.findContours(denoised.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
26cv2.drawContours(image, contours, contourIdx=-1, color=(255, 0, 0), thickness=1)
27cv2.imshow('Contours', image)
28
29cv2.waitKey(0)
30cv2.destroyAllWindows()
このコードは以下の処理を行います:
- 画像の読み込み
- 画像をグレースケールに変換
- しきい値処理を行い、白黒画像に変換
- オープニング(収縮後に膨張)を適用してノイズを除去
- 輪郭の検出と表示
CAPTCHAの検証方法
画像の前処理が完了したら、次に文字認識のステップに進みます。ここでは、Tesseract OCRなどのツールを使用して、画像から文字を認識し、ユーザーが入力した文字列と比較します。
さて、生成されたCAPTCHAを検証するよ。ユーザーが入力した値と比較して、認証を行うんだ。
1import pytesseract
2
3# 画像のパス
4image_file = 'generated_captchas/GFaIH_420.png'
5
6# 画像を読み込む
7image = cv2.imread(image_file)
8
9# 画像の前処理
10gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
11_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
12denoised = thresh.copy()
13kernel = np.ones((4, 3), np.uint8)
14denoised = cv2.erode(denoised, kernel, iterations=1)
15kernel = np.ones((6, 3), np.uint8)
16denoised = cv2.dilate(denoised, kernel, iterations=1)
17
18# Tesseract OCRを使用して文字を認識
19recognized_text = pytesseract.image_to_string(denoised, config='--psm 8')
20
21# ユーザーが入力した文字列(例)
22user_input = 'GFaIH'
23
24# 検証
25if recognized_text.strip() == user_input:
26 print("CAPTCHA認証成功")
27else:
28 print("CAPTCHA認証失敗")
このコードは、以下の処理を行います:
- 画像を読み込み、前処理を実行
- Tesseract OCRを使用して、画像から文字を認識
- 認識した文字列とユーザーが入力した文字列を比較
画像を前処理して、Tesseract OCRを使って文字を認識するのね。そして、ユーザーが入力した文字列と比較して検証するわ。
まとめ
CAPTCHAは、ウェブサイトのセキュリティを高め、不正アクセスやスパムを防ぐための重要なツールです。Pythonと適切なライブラリを使用することで、効果的なCAPTCHAシステムを構築できます。この記事で紹介した方法を基に、CAPTCHAの生成と検証を行い、セキュリティを強化するための様々なテクニックを取り入れることができます。
CAPTCHAはウェブサイトのセキュリティを高めるために本当に重要なんだね。Pythonを使えば、簡単に効果的なCAPTCHAシステムを作れるよ!
そうね、デジタリアちゃん。CAPTCHAの複雑性と多様性を維持することで、最新の攻撃方法に対抗できるように継続的な改善が必要よ。
CAPTCHAの実装は、継続的な改善が求められる分野です。常に最新の攻撃方法に対抗できるよう、CAPTCHAの複雑性と多様性を維持することが重要です。