Nodejs 12306验证码识别

Nodejs 12306验证码识别

今天刷票,发现主流的刷票软件下订单都不需要验证码。 所以求大神们给个12306验证码识别包, 或者给个思路,给个例子的。我也研究一下。

5 回复

Node.js 12306验证码识别

今天刷票时发现主流的刷票软件下订单都不需要验证码。因此,我决定自己实现一个验证码识别功能。虽然12306的验证码比较复杂,但通过一些开源工具和技术,我们仍然可以尝试解决这个问题。

技术选型

  1. Tesseract.js: 这是一个JavaScript版本的OCR(光学字符识别)引擎,可以直接在浏览器或Node.js中使用。
  2. Puppeteer: 用于自动化网页操作,例如获取验证码图片。

示例代码

首先,我们需要安装必要的依赖库:

npm install tesseract.js puppeteer

接下来,我们可以编写一个简单的脚本来获取验证码并进行识别:

const puppeteer = require('puppeteer');
const Tesseract = require('tesseract.js');

async function getCaptcha() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // 访问12306登录页面
    await page.goto('https://www.12306.cn/index/otn/login/init');

    // 获取验证码图片的URL
    const captchaUrl = await page.$eval('#J-loginImg', el => el.src);

    // 下载验证码图片
    const response = await fetch(captchaUrl);
    const buffer = await response.buffer();

    // 使用Tesseract.js识别验证码
    const { data } = await Tesseract.recognize(
        buffer,
        'eng',
        {
            logger: m => console.log(m)
        }
    );

    console.log(data.text);  // 输出识别结果

    // 关闭浏览器
    await browser.close();
}

getCaptcha().catch(console.error);

解释

  1. Puppeteer: 我们使用Puppeteer来自动化访问12306登录页面,并获取验证码图片的URL。
  2. Tesseract.js: 通过fetch下载验证码图片,并使用Tesseract.js进行OCR识别。data.text将包含识别出的文字。

注意事项

  • 12306的验证码可能包含复杂的背景噪声、扭曲的文字等,这会增加识别难度。
  • Tesseract.js的识别准确率可能会受到图像质量的影响。对于更复杂的验证码,可能需要更高级的图像处理技术,如OpenCV等。
  • 频繁请求验证码可能会触发12306的安全机制,导致IP被封禁。

通过上述方法,你可以初步实现12306验证码的识别。如果遇到识别困难,建议结合其他图像处理技术或使用机器学习模型进行更精准的识别。


一些好用的验证码设别都是买的商用设别技术…

开源的不用想了…如果真想研究…去找找那家卖…

不知道是不是合法的,总之见过铁友的会自动识别验证码,看过一些写图像识别的文章,为什么我觉得12306的验证码很好处理呢?

去網上買個按次的驗證碼識別服務不就好了,都是人工識別。什麼驗證碼都沒問題

要实现12306验证码识别,可以借助机器学习模型来进行验证码图像的识别。这里提供一种基于Python的方案,因为Python有更多的图像处理和机器学习库,例如TensorFlow、PyTorch等。但如果你坚持使用Node.js,可以通过调用Python脚本或API来完成这一任务。

示例方案

步骤一:准备训练数据

首先,你需要收集大量的12306验证码图片,并手动标注每个图片对应的字符。例如,你可以创建一个CSV文件,其中每一行包含一张图片的路径和对应的标签(验证码字符)。

步骤二:训练模型

使用Python和TensorFlow/Keras等库来训练一个验证码识别模型。以下是一个简单的训练模型的代码示例:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# 定义模型
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(60, 160, 3)),
    MaxPooling2D(pool_size=(2, 2)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(6, activation='softmax')  # 假设验证码为6位数字/字母组合
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 加载数据
data = ...  # 你的数据加载逻辑
train_data = ...
train_labels = ...

# 训练模型
model.fit(train_data, train_labels, epochs=10)

步骤三:Node.js调用Python模型

一旦模型训练完毕,你可以将它保存并加载到Node.js中进行调用。这里使用child_process模块来调用Python脚本。

const { exec } = require('child_process');

function recognizeCaptcha(imagePath) {
    return new Promise((resolve, reject) => {
        exec(`python3 recognize.py ${imagePath}`, (error, stdout, stderr) => {
            if (error) {
                reject(stderr);
                return;
            }
            resolve(stdout.trim());
        });
    });
}

// 使用示例
recognizeCaptcha('/path/to/captcha.png').then(result => {
    console.log('Recognized:', result);
}).catch(error => {
    console.error('Error:', error);
});

结论

通过上述方法,你可以使用Node.js调用Python编写的验证码识别模型。当然,这只是一个基本的框架,实际应用中可能需要更复杂的处理和优化。

回到顶部