使用 C++ 實現驗證碼識別與自動化登入

啊飒飒大苏打發表於2024-10-20
  1. 安裝所需依賴
    確保你已經安裝以下庫:

libcurl:用於傳送 HTTP 請求。
OpenCV:用於影像處理。
Tesseract:用於 OCR 識別。
在 Ubuntu 系統中,你可以使用以下命令安裝這些依賴:

bash

sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libopencv-dev
sudo apt-get install tesseract-ocr libleptonica-dev
2. 下載驗證碼圖片
使用 libcurl 下載驗證碼圖片並儲存到本地:

cpp

include

include <curl/curl.h>

include

size_t write_data(void ptr, size_t size, size_t nmemb, std::ofstream &stream) {
size_t written = stream.write(reinterpret_cast<const char
>(ptr), size * nmemb).tellp();
return written;
}更多內容聯絡1436423940

void download_captcha(const std::string &url, const std::string &save_path) {
CURL *curl;
std::ofstream file(save_path, std::ios::binary);
CURLcode res;

curl = curl_easy_init();
if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &file);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    file.close();
    if (res != CURLE_OK) {
        std::cerr << "下載失敗: " << curl_easy_strerror(res) << std::endl;
    } else {
        std::cout << "驗證碼圖片已儲存為 " << save_path << std::endl;
    }
}

}
3. 影像處理和 OCR 識別
使用 OpenCV 和 Tesseract 進行影像處理和 OCR 識別:

cpp

include <opencv2/opencv.hpp>

include <tesseract/baseapi.h>

include <tesseract/ocrclass.h>

std::string recognize_captcha(const std::string &image_path) {
cv::Mat image = cv::imread(image_path, cv::IMREAD_GRAYSCALE);
cv::threshold(image, image, 127, 255, cv::THRESH_BINARY);

tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();
ocr->Init(NULL, "eng");
ocr->SetImage(image.data, image.cols, image.rows, 1, image.step[0]);
char *outText = ocr->GetUTF8Text();

std::string result(outText);
delete[] outText;
ocr->End();
return result;

}
4. 自動化登入
使用 libcurl 傳送 POST 請求,模擬登入操作,並傳遞使用者名稱、密碼和識別出的驗證碼:

cpp

void login(const std::string &username, const std::string &password, const std::string &captcha) {
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "https://captcha7.scrape.center/login");
    curl_easy_setopt(curl, CURLOPT_POST, 1L);

    std::string post_fields = "username=" + username + "&password=" + password + "&captcha=" + captcha;
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_fields.c_str());

    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    if (res != CURLE_OK) {
        std::cerr << "登入失敗: " << curl_easy_strerror(res) << std::endl;
    } else {
        std::cout << "登入成功" << std::endl;
    }
}

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

cpp

int main() {
const std::string captcha_url = "https://captcha7.scrape.center/captcha.png";
const std::string captcha_path = "captcha.png";

// 下載驗證碼
download_captcha(captcha_url, captcha_path);

// 識別驗證碼
std::string captcha_text = recognize_captcha(captcha_path);
std::cout << "識別結果: " << captcha_text << std::endl;

// 登入
login("admin", "admin", captcha_text);

return 0;

}

相關文章