使用 Swift 識別英文數字驗證碼

啊飒飒大苏打發表於2024-10-21
  1. 環境準備
    在開始之前,請確保你的專案中已經整合了以下庫:

Alamofire(用於網路請求)
TesseractOCRiOS(用於 OCR 識別)
可以透過 CocoaPods 安裝這些庫,首先在你的 Podfile 中新增:

ruby

pod 'Alamofire', '~> 5.4'
pod 'TesseractOCRiOS', '~> 4.0.0'
然後執行 pod install。

  1. 下載驗證碼圖片
    使用 Alamofire 下載驗證碼圖片並儲存到本地:

swift

import Alamofire

class CaptchaDownloader {
static func downloadCaptcha(url: String, savePath: String, completion: @escaping (Bool) -> Void) {
AF.download(url).responseData { response in
switch response.result {
case .success(let data):
do {
try data.write(to: URL(fileURLWithPath: savePath))
print("驗證碼圖片已儲存為 (savePath)")
completion(true)
} catch {
print("儲存圖片失敗: (error)")
completion(false)
}
case .failure(let error):
print("下載失敗: (error)")
completion(false)
}
}
}
}
3. 影像處理與 OCR 識別
使用 TesseractOCR 進行 OCR 識別:

swift

import TesseractOCR

class CaptchaRecognizer {
static func recognizeCaptcha(imagePath: String) -> String? {
if let tesseract = G8Tesseract(language: "eng") {
tesseract.image = UIImage(contentsOfFile: imagePath)?.g8_blackAndWhite()
tesseract.recognize()
let result = tesseract.recognizedText?.trimmingCharacters(in: .whitespacesAndNewlines)
print("識別結果: (result ?? "")")
return result
}
return nil
}
}
4. 自動化登入
使用 Alamofire 傳送 POST 請求,模擬登入操作:

swift
更多內容聯絡1436423940
class Login {
static func login(username: String, password: String, captcha: String) {
let url = "https://captcha7.scrape.center/login"
let parameters: [String: Any] = [
"username": username,
"password": password,
"captcha": captcha
]

    AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
        switch response.result {
        case .success:
            print("登入成功")
        case .failure(let error):
            print("登入失敗: \(error)")
        }
    }
}

}
5. 主程式
整合上述程式碼,建立主程式:

swift

import Foundation

class Program {
static func run() {
let captchaUrl = "https://captcha7.scrape.center/captcha.png"
let captchaPath = "captcha.png"

    // 下載驗證碼圖片
    CaptchaDownloader.downloadCaptcha(url: captchaUrl, savePath: captchaPath) { success in
        if success {
            // 識別驗證碼
            if let captchaText = CaptchaRecognizer.recognizeCaptcha(imagePath: captchaPath) {
                // 模擬登入
                Login.login(username: "admin", password: "admin", captcha: captchaText)
            }
        }
    }
}

}

// 啟動程式
Program.run()

相關文章