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

啊飒飒大苏打發表於2024-10-22
  1. 環境準備
    確保你已安裝 OCaml 和 OPAM(OCaml 包管理器)。然後安裝以下庫:

cohttp(用於 HTTP 請求)
ocaml-tesseract(用於 OCR 識別)
graphics(用於影像處理)
你可以透過 OPAM 安裝這些庫:

bash

opam install cohttp-lwt-unix ocaml-tesseract graphics
2. 下載驗證碼圖片
使用 Cohttp 下載驗證碼圖片並儲存到本地:

ocaml

open Lwt.Infix
open Cohttp_lwt_unix

let download_captcha url save_path =
Client.get (Uri.of_string url) >>= fun (resp, body) ->
let status = Response.status resp in
if Code.code_of_status status = 200 then
Lwt_io.(with_file ~mode:Output save_path (fun oc ->
Cohttp_lwt.Body.to_string body >>= fun body_string ->
Lwt_io.write oc body_string
)) >>= fun () ->
Printf.printf "驗證碼圖片已儲存為 %s\n" save_path;
Lwt.return ()
else
Printf.printf "下載失敗: %s\n" (Code.string_of_status status);
Lwt.return ()
3. 影像處理與 OCR 識別
使用 ocaml-tesseract 進行 OCR 識別:

ocaml

open Tesseract

let recognize_captcha image_path =
let img = Tesseract.Image.load image_path in
let result = Tesseract.Ocr.recognize img in
Printf.printf "識別結果: %s\n" result;
result
4. 自動化登入
使用 Cohttp 傳送 POST 請求,模擬登入操作:

ocaml

let login username password captcha =
let url = "https://captcha7.scrape.center/login" in
let body = Printf.sprintf "username=%s&password=%s&captcha=%s" username password captcha in
Client.post ~body:(Cohttp_lwt.Body.of_string body) (Uri.of_string url) >>= fun (resp, _) ->
let status = Response.status resp in
if Code.code_of_status status = 200 then
Printf.printf "登入成功\n"
else
Printf.printf "登入失敗: %s\n" (Code.string_of_status status);
Lwt.return ()
5. 主程式
整合上述程式碼,建立主程式:

ocaml

let main () =
let captcha_url = "https://captcha7.scrape.center/captcha.png" in
let captcha_path = "captcha.png" in

(* 下載驗證碼圖片 *)
download_captcha captcha_url captcha_path >>= fun () ->

(* 識別驗證碼 *)
let captcha_text = recognize_captcha captcha_path in

(* 模擬登入 *)
login "admin" "admin" captcha_text

let () =
Lwt_main.run (main ())

相關文章