KK课表抓取教务系统

Wesley13
• 阅读 527

字符串数据解析 太难看 = =

login_widget::login_widget(QWidget *parent) ://QWidget(parent),
ui(new Ui::login_widget)
{

    ui->setupUi(this);
    p = (MainWindow*)parent;

    //loading = new loading_widget(this);


#ifndef Q_OS_WIN32
    FixScreen();
#endif


    timer_timeout = new QTimer(this);

    connect(timer_timeout, SIGNAL(timeout()), this, SLOT(slot_timer()));

    manager = new QNetworkAccessManager(this);


    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(doManagerFinished(QNetworkReply*)));

    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(slot_verfy()));
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(slot_close()));
    connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(slot_shuom()));

    QMovie *pm = new QMovie(":/loading.gif");

    ui->label_7->setMovie(pm);

    pm->setScaledSize(QSize(100 * PublicFunc::getFactory(), 30 * PublicFunc::getFactory()));

    pm->start(); //才会开始动

    QPixmap pix;
    pix.load(":/1.png");

    ui->label_6->setPixmap(pix);

    setHide();


}



void login_widget::slot_timer()
{
    timer_timeout->stop();
    setHide();

    QMessageBox::warning(this, char_net_error, char_net_error_center);

    slot_close();


}




void login_widget::setShow()
{
    ui->label_6->setVisible(true);
    ui->label_7->setVisible(true);

}


void login_widget::setStart(int time)/*超时15 S*/
{
    timer_timeout->start(time);

}


void   login_widget::setHide()
{

    ui->label_6->setVisible(false);
    ui->label_7->setVisible(false);

}





void login_widget::setLoginVisiable(bool is)
{
    ui->pushButton->setVisible(is);

    ui->pushButton_2->setVisible(is);

    ui->lineEdit->setVisible(is);

    ui->lineEdit_2->setVisible(is);

    ui->lineEdit_3->setVisible(is);

    ui->label->setVisible(is);

    ui->label_2->setVisible(is);

    ui->label_3->setVisible(is);

    ui->label_4->setVisible(is);

}





void login_widget::doManagerFinished(QNetworkReply *reply)
{
    timer_timeout->stop();

    QByteArray binary = reply->readAll();
    if (binary.size() <= 0)
    {
        setHide();
        QMessageBox::warning(this, "\347\275\221\347\273\234\351\224\231\350\257\257", "\350\257\267\346\243\200\346\237\245\347\275\221\347\273\234\350\277\236\346\216\245");
        
    //reply->deleteLater();
        delete reply;

        return;

    }



    QString result = QTextCodec::codecForName("gb2312")->toUnicode(binary);
    if (reply->url() == homepageUrl)
    {
        /*登陆*/

        if (reply->operation() == QNetworkAccessManager::GetOperation)
        {
            QRegExp reg("name=\"__VIEWSTATE\" value=\"([^\"]+)\"");
            if (reg.indexIn(result) != -1)
            {
                viewstate = reg.cap(1);
            }

            if (reply->rawHeader("Set-Cookie").length())
            {
                jsessionid = reply->rawHeader("Set-Cookie");
                jsessionid = jsessionid.left(jsessionid.indexOf(';'));
            }
            else
            {

            }

            slot_verfy();
        }
        else
        {

            setStart();
            QNetworkRequest request;
            request.setRawHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/8.0)");
            request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            request.setRawHeader("Accept-Encoding", "gzip, deflate");
            request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8");
            request.setRawHeader("Cache-Control", "max-age=0");
            request.setRawHeader("Cookie", jsessionid.toLatin1());
            request.setRawHeader("Connection", "Keep-Alive");

            //     qDebug() << mainpageUrl;
            request.setUrl(QUrl(mainpageUrl));
            manager->get(request);


            setShow();
        }
    }


    else if (reply->url() == captchaUrl)
    {
        /*验证码*/
        QPixmap pixmap;

        if (pixmap.loadFromData(binary))
        {

            setHide();


            ui->label->setVisible(true);
            ui->pushButton->setVisible(true);


#ifndef Q_OS_WIN32
            ui->label->setPixmap(pixmap.scaled(72 * 2.2 * PublicFunc::getFactory(), 27 * 2.2*PublicFunc::getFactory(), Qt::KeepAspectRatio));
#else
            ui->label->setPixmap(pixmap);
#endif

        }
    }

    else if (reply->url() == url_kebiao)
    {
        /*课表*/

        dataTable.clear();

        //ui->textEdit->append(QString::fromLocal8Bit(binary.data()));
        
        QString data = QString::fromLocal8Bit(binary.data());

        /**/
        int x = data.indexOf("trbg1") + 10;
        int y = data.indexOf("datelist");
        data = data.mid(x, y - x);

        x = data.indexOf("trbg1") + 10;


        info = (data.mid(x, data.indexOf("labTip") - x));


        x = data.indexOf("Table1") - 11;
        y = data.indexOf("</table>");

        data = data.mid(x, data.size() - x);
        data = data.mid(0, data.indexOf("</table>"));


        x = data.indexOf("</tr>") + 5;
        data = data.mid(x, -1);

        x = data.indexOf("</tr>") + 5;
        data = data.mid(x, -1);

        QString tm;

        x = info.indexOf("&nbsp");
        info = info.mid(0, x);

        x = info.indexOf(">");
        info = info.mid(x + 1, -1);

        info.remove("|");

        info.remove("</span>");

        info.remove(info.indexOf("<"), info.indexOf(">") - info.indexOf("<") + 1);
        info.remove(info.indexOf("<"), info.indexOf(">") - info.indexOf("<") + 1);
        info.remove(info.indexOf("<"), info.indexOf(">") - info.indexOf("<") + 1);
        info.remove(info.indexOf("<"), info.indexOf(">") - info.indexOf("<") + 1);
        info.remove(info.indexOf("<"), info.indexOf(">") - info.indexOf("<") + 1);

        info.remove("\t");

        setHide();


        info.insert(0, "\n");

        QMessageBox::warning(this, "\350\257\276\350\241\250\344\277\241\346\201\257", info);/*课表信息*/

        QSettings set("kebiao", "1");
        set.setValue("info", info);

        /*分割完成 接下来 提取每一行数据 一共14行*/


        for (int i = 0; i < 14; i++)
        {
            x = data.indexOf("<tr>");
            y = data.indexOf("</tr>") + 5;
            class_arry[i] = data.mid(x, y - x);
            data = data.mid(y, -1);

            //    data.remove(class_arry[i]);

        }

        /*提取每一行完毕 开始分割列*/
        QString day[15];

        QString tmp;

        for (int xx = 0; xx < 14; xx += 2)
        {

            class_arry[xx].remove("</tr>");
            class_arry[xx].remove("<tr>");


            for (int i = 0; i < 7; i++)
            {
                x = class_arry[xx].lastIndexOf("<td");
                y = class_arry[xx].lastIndexOf("</td>") + 5;
                day[i] = class_arry[xx].mid(x, y - x);

                class_arry[xx] = class_arry[xx].mid(0, x);
                day[i].remove(day[i].mid(0, day[i].indexOf(">") + 1));

                day[i].remove("&nbsp;</td>");

                day[i].remove("</td>");
                day[i].replace("<br>", ".");


                /*取出每一节课完成 开始取出每一节课信息*/

                for (int iii = 0; iii < 3; iii++)
                {

                    /*取出名字*/
                    y = day[i].indexOf(".");
                    tmp = day[i].mid(0, y);
                    dataTable.data[6 - i][xx][iii].class_name = tmp;
                    //    day[i].remove(tmp + ".");

                    day[i] = day[i].mid(y + 1, -1);

                    /*课程性质*/
                    y = day[i].indexOf(".");
                    tmp = day[i].mid(0, y);
                    dataTable.data[6 - i][xx][iii].class_pro = tmp;
                    tmp = tmp + ".";
                    //    day[i].remove(tmp);

                    day[i] = day[i].mid(y + 1, -1);


                    /*时间*/
                    y = day[i].indexOf(".");
                    tmp = day[i].mid(0, y);
                    dataTable.data[6 - i][xx][iii].class_time = tmp;
                    tmp = tmp + ".";
                    //day[i].remove(tmp);

                    day[i] = day[i].mid(y + 1, -1);


                    /*老师*/
                    y = day[i].indexOf(".");
                    tmp = day[i].mid(0, y);
                    dataTable.data[6 - i][xx][iii].class_techer = tmp;
                    tmp = tmp + ".";
                    //day[i].remove(tmp);
                    day[i] = day[i].mid(y + 1, -1);



                    /*地点*/
                    y = day[i].indexOf(".");
                    if (y <= 0)
                    {
                        dataTable.data[6 - i][xx][iii].class_posi = day[i];
                        day[i] = "";
                    }
                    else
                    {

                        tmp = day[i].mid(0, y);
                        dataTable.data[6 - i][xx][iii].class_posi = tmp;
                        tmp = tmp + "..";
                        //day[i].remove(tmp);

                        day[i] = day[i].mid(y + 2, -1);


                    }
                    if (day[i].size() < 1)break;

                }

                /*    QTableWidgetItem* z = new QTableWidgetItem(day[i]);
                    z->setTextAlignment(Qt::AlignCenter);


                    p->ui->tableWidget->setItem(xx, 6 - i, z);
                    p->ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑

                    p->ui->tableWidget->horizontalHeader()->resizeSection(6 - i, 80 * PublicFunc::getFactory()); //设置表头第一列的宽度为150

                    p->ui->tableWidget->setRowHeight(xx, PublicFunc::getFactory() * 100);
                    p->ui->tableWidget->setRowHeight(xx + 1, 0);

                    QFont font;
                    font.setPointSize(12);


                    font.setFamily("simsun");

                    z->setFont(font);*/

            }


        }
        p->syncTable(setCenter::current_week);


        QMessageBox::information(this, "\346\217\220\347\244\272", "\345\257\274\345\205\245\350\257\276\350\241\250\346\210\220\345\212\237");/*错误*/

        /*提示 导入课表成功*/


        ui->pushButton->setVisible(true);

        slot_close();

    }


    else if (reply->url() == url_chenji)
    {

        if (reply->operation() == QNetworkAccessManager::GetOperation)
        {
            /*get*/
            QRegExp reg("name=\"__VIEWSTATE\" value=\"([^\"]+)\"");
            if (reg.indexIn(result) != -1)
            {
                viewstate = reg.cap(1);
            }

            if (reply->rawHeader("Set-Cookie").length())
            {
                jsessionid = reply->rawHeader("Set-Cookie");
                jsessionid = jsessionid.left(jsessionid.indexOf(';'));
            }

            setStart();
        
            QNetworkRequest request;
            request.setRawHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/8.0)");
            request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            request.setRawHeader("Accept-Encoding", "gzip, deflate");
            request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8");
            request.setRawHeader("Cache-Control", "max-age=0");
            request.setRawHeader("Cookie", jsessionid.toLatin1());
            request.setRawHeader("Connection", "Keep-Alive");
        
            request.setRawHeader("Referer", ss.toStdString().c_str());

            QUrl mainpageUrl = QUrl(ss);
            request.setUrl(QUrl(url_chenji));

            QUrlQuery query;
            query.addQueryItem("__EVENTTARGET", "ddlxn");
            query.addQueryItem("__EVENTARGUMENT", "");
            query.addQueryItem("__VIEWSTATE", viewstate);
            QString xueqi;
            char xuen[30];


            QDate date = QDate::currentDate();

            if (date.month() >= 6 && date.month() <= 10)
            {
                /*第二学期*/
                xueqi = "2";
                sprintf(xuen, "%d-%d", date.year() - 1, date.year());
            }
            else     if (date.month() > 10)
            {
                /*第1学期*/
                xueqi = "1";
                sprintf(xuen, "%d-%d", date.year(), date.year() + 1);
            }

            else
            {
                /*第1学期*/
                xueqi = "1";
                sprintf(xuen, "%d-%d", date.year() - 1, date.year());

            }
            query.addQueryItem("ddlxn", xuen);
            query.addQueryItem("ddlxq", xueqi);

            query.addQueryItem("btnCx", "+%B2%E9++%D1%AF+");

            QByteArray postData = query.toString(QUrl::FullyEncoded).replace("+", "%2B").toLatin1();

            manager->post(request, postData);

            setShow();


        }
        else if (reply->operation() == QNetworkAccessManager::PostOperation)
        {
            /*post*/


            ui->pushButton->setVisible(true);
            setHide();

            do_chengji(binary);

        }

    }
    else
    {

        setHide();

        /*登陆后*/
        QString s = binary.data();

        if (s.indexOf("main_html") <= 0)
        {
            /*登陆失败*/
            slot_verfy();
            QMessageBox::warning(this, "\351\224\231\350\257\257", "\345\257\206\347\240\201\346\210\226\351\252\214\350\257\201\347\240\201");/*错误*/

            /*登陆失败*/
        }
        else
        {
            /*登陆成功 开始获取课表*/

            if (is_kebiao)
            {
                slot_getKebiao();
            }
            else
                slot_getChenJi();

            //    setLoginVisiable(false);

        }
    }


    //reply->deleteLater();
    delete reply;

}



void login_widget::on_pushButton_clicked()
{


    /*输入规则判断*/
    if (ui->lineEdit_2->text().length() < 11)
    {
        QMessageBox::warning(this, char_tixing, "\350\257\267\346\255\243\347\241\256\350\276\223\345\205\245\345\255\246\345\217\267");

        return;
    }


    if (ui->lineEdit_3->text().length() == 0)
    {
        QMessageBox::warning(this, char_tixing, "\345\257\206\347\240\201\344\270\215\350\203\275\344\270\272\347\251\272");

        return;
    }

    if (ui->lineEdit->text().length() == 0)
    {
        QMessageBox::warning(this, char_tixing, "\350\257\267\350\276\223\345\205\245\351\252\214\350\257\201\347\240\201");

        return;
    }


    if (ui->lineEdit->text().length() < 4)
    {
        QMessageBox::warning(this, char_tixing, "\351\252\214\350\257\201\347\240\201\351\224\231\350\257\257");

        return;
    }

    ui->pushButton->setVisible(false);


    /*登陆*/

    setStart();
    setShow();

    QNetworkRequest request;
    request.setUrl(homepageUrl);
    request.setRawHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/8.0)");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    request.setRawHeader("Accept-Encoding", "gzip, deflate");
    request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8");
    request.setRawHeader("Cache-Control", "max-age=0");
    request.setRawHeader("Cookie", jsessionid.toLatin1());
    request.setRawHeader("Connection", "Keep-Alive");

    query.addQueryItem("txtUserName", ui->lineEdit_2->text());
    query.addQueryItem("TextBox2", ui->lineEdit_3->text());
    query.addQueryItem("txtSecretCode", ui->lineEdit->text());
    query.addQueryItem("RadioButtonList1", "%D1%A7%C9%FA");
    QByteArray postData = query.toString(QUrl::FullyEncoded).replace("+", "%2B").toLatin1();

    //  qDebug() << postData;

    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    request.setHeader(QNetworkRequest::ContentLengthHeader, postData.length());
    manager->post(request, postData);


}



void login_widget::slot_getChenJi()
{
    setShow();

    setStart();


    QNetworkRequest request;
    request.setRawHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/8.0)");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    request.setRawHeader("Accept-Encoding", "gzip, deflate");
    request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8");
    request.setRawHeader("Cache-Control", "max-age=0");
    request.setRawHeader("Cookie", jsessionid.toLatin1());
    request.setRawHeader("Connection", "Keep-Alive");

    request.setRawHeader("Referer", ss.toStdString().c_str());


    QUrl mainpageUrl = QUrl(ss);
    request.setUrl(QUrl(url_chenji));
    manager->get(request);


}






void login_widget::slot_close()
{

    manager->clearAccessCache();
    
    timer_timeout->stop();
    setHide();

    this->hide();
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
QT中QWidget动态增加控件
环境:QT版本:5.6.21.前言QWidget动态增加控件,并且铺满控件。2.实现原理voidQWidget::setSizePolicy(QSizePolicy::Policyhorizontal,QSizePolicy::Policyvertical)T
Wesley13 Wesley13
3年前
Oracle一条SQL语句时快时慢
今天碰到一个非常奇怪的问题问题,一条SQL语句在PL/SQLdeveloper中很慢,需要9s,问题SQL:SELECT\FROMGG\_function\_locationfWHEREf.parent\_id'03000000000001'; 表GG\_function\_location有5千万的数据,parent\_id上
Wesley13 Wesley13
3年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者
Stella981 Stella981
3年前
Duang,HUAWEI DevEco IDE全面升级啦
想感受全新UI带来的视觉及交互体验、HiKey970开发板调测、HiAIAPI推荐和收藏、深度AI模型分析等新功能,体验高清晰度和流畅度的远程AI真机调测吗?!(https://oscimg.oschina.net/oscnet/f4e1bb24ff00b8c6ea27f75370a53bfbacd.jpg)全新的UI设计
Stella981 Stella981
3年前
Android ImageView 的scaletype属性详细介绍
android:scaleType是控制图片如何resized/moved来匹对ImageView的size,我们可以这样啦使用1.<ImageViewandroid:id"@id/img\_weibo\_img"2.android:layout\_width"fill\_parent"3.and
Stella981 Stella981
3年前
Layer 关闭弹窗
var index  parent.layer.getFrameIndex(window.name); //获取窗口索引parent.layer.close(index);layer.open({                            type : 2,                            skin : '
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx