KK课表抓取教务系统
字符串数据解析 太难看 = =
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(" "); 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(" </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(); }