• 2024/05/04

Captcha Breaker – 캡챠 브레이커

업무를 자동화하고자 하는 사람들 사이에서는 캡챠가 항상 이슈였다.
파이썬과 같은 언어 레벨을 다루는 사람부터
UiPath, BrityWorks, BluePrism 등의 솔루션으로 자동화를 구현하는 사람들까지
캡챠를 무력화하고 자동화를 수행 혹은 구현해야 하는 사람들에게
이를 어떻게 무력화할 것인가가 가장 큰 관건이었다.

이러한 이유는 나에게도 적용되는 사안이라서,
Captcha에 관한 이슈를 조금이나마 해소하기 위해서 여기에 기록으로 남겨둔다.

Captcha Cracker – 오픈소스 캡챠 브레이커

머신러닝이 널리 알려지고, 그에 따라 파이썬에 대한 관심이 폭발적으로 증가함으로써,
상당히 다양한 오픈 소스들이 공개되었고, 그에 따라 파이썬을 활용할 줄 아는 사람이라면
누구나가 쉽게 구현할 수 있는 기능과 소스들이 공개되었다.

파이썬의 오픈소스 패키지로 배포되고 있는 것 중,
직접 구현하여 작동이 잘 되는지 확인해 본 패키지로 Captcha Cracker를 소개하고자 한다.

이 Captcha Cracker는 실제 인터넷에서 많이 소개되고 있으며,
공개된 소스 코드에 좀 더 덧붙인 코드를 만들 때 참조했던 블로그도 Captcha Cracker를 다루고 있었다.

Captcha Cracker는 선행 패키지로 다음과 같은 패키지를 요구한다.
– numpy(tensorflow의 선행 패키지)
– tensorflow(captchacracker의 선행 패키지)
– CaptchaCracker

Captcha Cracker를 이용한 코드

본 코드의 원본은 인터넷 검색으로 알게 된 블로그에서 찾았다.
(원본 링크: [파이썬] 머신러닝을 이용한 자동방지 문자 캡챠 뚫어보기)

# 선행 설치 패키지: CaptchaCracker, TensorFlow
import glob
import CaptchaCracker as cc
import os
from datetime import datetime

img_width = 120
img_height = 40
running_mode = "r" # r: 실행 모드, l:학습 모드

#이미지 학습
def learn_img():
    path = "LearnData"
    isLearnPathExist = os.path.isdir(path)
    if isLearnPathExist:
        img_path_list = glob.glob('LearnData/*.png')    #학습 데이터 이미지 경로 (파일명이 이미지 내용과 같아야함)
        CM = cc.CreateModel(img_path_list, img_width, img_height)   #학습모델 생성
        model = CM.train_model(epochs=len(img_path_list))  #파일 갯수만큼 반복학습
        model.save_weights('weights.h5')    #학습 결과 가중치 저장
    else:
        print("학습 폴더가 존재하지 않습니다. LearnData 폴더가 필요합니다.")
        

#가중치로 결과 도출
def result_img():
    target_img_path = 'analysisImage.png'    #타겟 이미지 경로
    img_length = 6  #타겟 이미지가 포함한 문자 수
    img_char = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}   #타겟 이미지안에 포함된 문자들
    weights_path = 'weights.h5' #학습 결과 가중치 경로
    AM = cc.ApplyModel(weights_path, img_width, img_height, img_length, img_char)   # 가중치 파일을 기준으로 이미지 판독
    pred = AM.predict(target_img_path)  #결과 도출
    print(pred) # 콘솔에서 실행할 경우, 결과값 남기기
    f=open(pred +".result",'w') # 파일명은 판독결과, 확장자는 result로 파일 생성
    f.close()
    return pred
        

if running_mode == 'l':
    learn_img()
elif running_mode == 'r':
    result_img()
elif running_mode == 'end':
    print("프로그램을 종료합니다. 결과값은 없습니다.")

위 코드를 실행할 때, running_mode 값을 어떻게 바꿔주느냐에 따라서
학습 모드 / 실행 모드로 구분하게 된다.

학습 모드의 경우에는 LearnData 폴더를 만들어, 해당 경로에 데이터를 넣고 실행해야 하며,
폴더 내에는 학습 대상 이미지 파일의 이름이 이미지 판독 결과와 일치해야 한다.

실행 모드의 경우에는 weights.h5 파일이 py 파일이 있는 경로에 같이 포함되어 있어야 한다.
또한, 판독 대상이 되는 이미지 파일의 이름은 analysisImage.png 여야 한다.
이 스크립트가 실행되면, 정상적인 경우에는 [판독결과값].result 라는 파일이 생성된다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다