Qt – 获取12306动态验证码图片

12306抢票软件开发过程

背景介绍

经常出行的人就知道买火车票是一件比较困难的事情,特别是节假日,抢票就更加艰难了,抢票的工具起始也很多,但是作为一个程序员,很想自己来实现一下自己抢票,虽然不知道最终能不能成功,但是还是要来尝试一下的,前期主要是做一些小demo来验证一些功能是否可以实现,本篇文章介绍获取12306验证码。

本次主要是简单的实现获取验证码这个小功能。

本次开发工具:qt、wireshark、chrome。

搭建工程环境

  1.  首先用qt创建一个widget工程,其他的类型也可以,本次实现是使用widget类型;
  2.  在工程文件中加入网络模块;
  3. 在界面中添加一个按钮及其槽函数、一个label用于显示图片
  4.  头文件中添加:
    #include <QtNetwork/QNetworkRequest>
    #include <QtNetwork/QNetworkReply>
    #include <QtNetwork/QNetworkAccessManager>
  5.  在自己的资源管理器中搜索libeay32.dll、ssleay32.dll两个动态库文件,然后放在自己编译出来的执行程序中(资源管理器找不到就需要去网上下载了),没有这两个动态库使用网络会失败的,这是由于12306是使用的https安全连接;
  6.  还需要添加一个槽函数用于接收数据,具体直接看代码。

代码

 
工程文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#-------------------------------------------------
#
# Project created by QtCreator 2018-09-15T11:40:51
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = UrlRequest
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

 
头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QDebug>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void oneProcessFinished(QNetworkReply*);

private:
    Ui::Widget *ui;
    QNetworkAccessManager *manage;
};

#endif // WIDGET_H

 
.cpp文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    manage = new QNetworkAccessManager(this);       //分配空间
    connect(manage,SIGNAL(finished(QNetworkReply*)),this,SLOT(oneProcessFinished(QNetworkReply*)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QString url = "https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date=2018-09-and=sjrand"; // 获取验证码
    manage->get(QNetworkRequest(QUrl(url)));    //请求实现
}

void Widget::oneProcessFinished(QNetworkReply *reply)
{
    QByteArray data = reply->readAll();
    QImage image;
    image.loadFromData(data, "jpg");
    ui->label_image->setPixmap(QPixmap::fromImage(image));
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注