diff --git a/ProxyUI/ProxyUI.pro b/ProxyUI/ProxyUI.pro index f2e4582..e0a7074 100644 --- a/ProxyUI/ProxyUI.pro +++ b/ProxyUI/ProxyUI.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui +QT += core gui network sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets diff --git a/ProxyUI/widget.cpp b/ProxyUI/widget.cpp index 61763be..2e72425 100644 --- a/ProxyUI/widget.cpp +++ b/ProxyUI/widget.cpp @@ -1,6 +1,11 @@ #include "widget.h" #include "ui_widget.h" +#define UPDATE_TIMER 43200000 +#define CHECK_TIMER 180000 +#define MIN_PROXY 200 + + Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) @@ -8,6 +13,7 @@ Widget::Widget(QWidget *parent) : ui->setupUi(this); { + m_index = 0; p_labelUrl = new QLabel(tr("URL: ")); p_labelTime = new QLabel(tr("Update Time Period(sec): ")); p_labelProxyFile = new QLabel(tr("Save Location: ")); @@ -18,7 +24,7 @@ Widget::Widget(QWidget *parent) : p_labelNext = new QLabel("Next Update Time: "); p_lineUrl = new QLineEdit("http://proxylist.hidemyass.com/search-1305249#listable"); - p_lineTime = new QLineEdit("1800"); + p_lineTime = new QLineEdit("12"); p_lineProxyFile = new QLineEdit(qApp->applicationDirPath()); p_btnChoose = new QPushButton("Choose"); @@ -55,7 +61,19 @@ Widget::Widget(QWidget *parent) : connect(p_chkDb,SIGNAL(clicked()),this, SLOT(chkDb())); connect(p_chkLocal,SIGNAL(clicked()),this, SLOT(chkLocal())); - + m_slIpUrl = readList("proxylist.txt"); + if(m_slIpUrl.size() < 1) + { + m_slIpUrl << "http://proxylist.hidemyass.com/search-1305249#listable" + << "http://www.cybersyndrome.net/pla.html" + << "https://nordvpn.com/free-proxy-list/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/2/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/3/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/4/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/5/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/6/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500" + << "https://nordvpn.com/free-proxy-list/7/?country=&ports=&speed%5B1%5D=on&proto%5BHTTP%5D=on&anon%5BHigh%5D=on&by=l&order=ASC&perpage=500"; + } /* for(int i = 0; i < 4; i++) { @@ -87,21 +105,24 @@ Widget::Widget(QWidget *parent) : p_btnStart = new QPushButton(tr("Timer Start")); p_btnStop = new QPushButton(tr("Timer Stop")); p_labelTimerOnOff = new QLabel(tr("Timer OFF")); - p_labelStatus = new QLabel(tr("Waiting")); // vlayoutButton = new QVBoxLayout(); glayout->addWidget(p_btnStart,0, 4); glayout->addWidget(p_btnStop, 1, 4); glayout->addWidget(p_labelTimerOnOff, 2, 4); - glayout->addWidget(p_labelStatus,3 , 4); + + m_pResultList = new QListWidget; + + + + glayout->addWidget(m_pResultList, 5, 0, 1, 5); - QLabel *blank2 = new QLabel; - glayout->addWidget(blank2, 5, 0, 1, 4); } p_timer = new QTimer(this); - - connect(p_timer,SIGNAL(timeout()),this,SLOT(update())); + p_checkTimer = new QTimer(this); + connect(p_timer,SIGNAL(timeout()),this,SLOT(updateProxy())); + connect(p_checkTimer,SIGNAL(timeout()),this,SLOT(checkProxy())); connect(p_btnStart, SIGNAL(clicked()), this, SLOT(btnStart())); connect(p_btnStop, SIGNAL(clicked()), this, SLOT(btnStop())); connect(p_btnChoose, SIGNAL(clicked()), this, SLOT(btnChoose())); @@ -114,7 +135,7 @@ Widget::Widget(QWidget *parent) : hlayoutDefault->addLayout(vlayoutButton); */ setLayout(glayout); - resize(700, 200); + resize(700, 400); } Widget::~Widget() @@ -136,14 +157,27 @@ void Widget::btnChoose() void Widget::btnStart() { qDebug("btnStart()"); - if(p_timer->isActive()) + if(p_timer->isActive() && p_checkTimer->isActive()) return; - update(); + InsertLog("Proxy Update Executed"); + updateProxy(); + + if(!p_timer->isActive()) + { + //p_timer->start(p_lineTime->text().toInt()*3600000); + //p_timer->start(43200000); + p_timer->start(UPDATE_TIMER); + InsertLog("Update Timer Start"); + } + if(!p_checkTimer->isActive()) + { + //p_checkTimer->start(1200000); + p_checkTimer->start(CHECK_TIMER); + InsertLog("Proxy DB Check Timer Start"); + } - p_timer->start(p_lineTime->text().toInt()*1000); p_labelTimerOnOff->setText("Timer ON"); - } void Widget::btnStop() @@ -151,70 +185,110 @@ void Widget::btnStop() qDebug("btnStop()"); if(p_timer->isActive()) + { p_timer->stop(); - + InsertLog("Update Timer Stop"); + } + if(p_checkTimer->isActive()) + { + p_checkTimer->stop(); + InsertLog("Proxy DB Check Timer Timer Stop"); + } p_labelTimerOnOff->setText("Timer OFF"); p_labelNextTime->setText(""); - p_labelStatus->setText("Waiting"); + m_index = 0; } void Widget::update() { - qDebug("update()"); - //QDateTime time = QDateTime::currentDateTime(); - QString strCheck; - - if(p_chkDb->isChecked()) - strCheck = "db"; - if(p_chkLocal->isChecked()) - strCheck = "local"; - if(p_chkDb->isChecked() && p_chkLocal->isChecked()) - strCheck = "both"; - - v_pro.start("ProxyProcess",QStringList() << p_lineUrl->text() << p_lineProxyFile->text() << strCheck); - //p_labelRecentTime->setText(time.toLocalTime().toString("yyyy-MM-dd hh:mm:ss")); - p_labelNextTime->setText(QDateTime::currentDateTime().toLocalTime().addSecs(p_lineTime->text().toInt()).toString("yyyy-MM-dd hh:mm:ss")); - p_labelStatus->setText("Updating"); + InsertLog("Update Executed"); + if(p_checkTimer->isActive()) + { + p_checkTimer->stop(); + InsertLog("Proxy DB Check Timer Timer Stop"); + } + InsertLog(m_slIpUrl.at(m_index)); + v_pro.start("ProxyProcess",QStringList() << m_slIpUrl.at(m_index++) << p_lineProxyFile->text()); + //p_labelStatus->setText("Updating"); } void Widget::processFinished(int exitCode, QProcess::ExitStatus exitStatus) { - qDebug("process finished"); + //qDebug("process finished"); QProcess *pPro = (QProcess*)sender(); QString str = pPro->readAllStandardOutput(); QString message; if(str.right(2).compare("ok") == 0) { - message = "Update Done"; + m_slIpPortList << str.split("\n"); + m_slIpPortList.removeAt(m_slIpPortList.size() - 1); + InsertLog("Successfully Get Proxy : " + QString::number(str.split("\n").length() - 1)); } else if(str.right(7).compare("dbcfail") == 0) { - message = "DB connection\nFail"; + InsertLog("DB Connection Fail"); } else if(str.right(7).compare("dbufail") == 0) { - message = "DB update Fail"; + InsertLog("DB Update Fail"); } else if(str.right(8).compare("savefail") == 0) { - message = "Saving file\nFail"; + InsertLog("File Save Failed"); } else if(str.right(7).compare("timeout") == 0) { - message = "TimeOut"; + InsertLog("Timeout"); } else if(str.right(8).compare("sitedown") == 0) { - message = "Proxy Crawler\nFail"; + InsertLog("Proxy Crawler Failed"); } else - message = "Unknown Error"; + InsertLog("Unknown error occurs"); pPro->kill(); - p_labelRecentTime->setText(QDateTime::currentDateTime().toLocalTime().toString("yyyy-MM-dd hh:mm:ss")); - p_labelStatus->setText(message); + if(m_index < m_slIpUrl.length()) + { + update(); + } + else + { + m_index = 0; + int nDuplicate = m_slIpPortList.removeDuplicates(); + InsertLog("Remove Duplications : " + QString::number(nDuplicate)); + + if(p_chkDb->isChecked()) + { + if(SendIpList(m_slIpPortList)) + { + InsertLog("Proxy DB Update Complete Successfully : " + QString::number(m_slIpPortList.length())); + } + else + { + InsertLog("Proxy DB Update Failed"); + } + } + if(p_chkLocal->isChecked()) + { + if(Debug("proxy.txt",m_slIpPortList.join("\n"))) + { + InsertLog("proxy.txt is saved Successfully : " + QString::number(m_slIpPortList.length())); + } + else + { + InsertLog("proxy.txt Failed"); + } + } + p_labelRecentTime->setText(QDateTime::currentDateTime().toLocalTime().toString("yyyy-MM-dd hh:mm:ss")); + if(!p_checkTimer->isActive()) + { + p_checkTimer->start(); + InsertLog("Proxy DB Check Timer Start"); + } + } } void Widget::chkDb() @@ -227,3 +301,182 @@ void Widget::chkLocal() { p_chkDb->setChecked(true); } + +bool Widget::SendIpList(QStringList _slIpList) +{ + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); + db.setHostName("bigbird.iptime.org"); + db.setUserName("admin"); + db.setPassword("admin123"); + db.setDatabaseName("concepters"); + + if (db.open() == false) + { + InsertLog("DB open Failed in SendIpList()"); + return false; + } + + QSqlQuery sql; + //QString strQuery = "truncate table Proxy"; + /* + QString strQuery = "delete from Proxy"; + QString strUtf8(strQuery.toUtf8()); + + if (sql.exec(strUtf8) == false) + { + p_labelStatus->setText("Delete Query\n Fail"); + return false; + } + */ + QString strQuery; + QString strUtf8; + InsertLog("Sending ip list : " + QString::number(_slIpList.length())); + foreach(QString str, _slIpList) + { + strQuery = "insert into Proxy set Proxy='"; + strQuery += str.split(',').at(0).trimmed(); + strQuery += "', Port="; + strQuery += str.split(',').at(1).trimmed(); + if(str.split(',').size() > 2) + { + strQuery += ", Source='"; + strQuery += str.split(',').at(2).trimmed(); + strQuery += "'"; + } + strUtf8 = strQuery.toUtf8(); + if (sql.exec(strUtf8) == false) + { + InsertLog(sql.lastQuery() + "is Failed"); + //return false; + } + } + db.close(); + return true; +} + +bool Widget::Debug(QString _strFilename,QString _strData) +{ + QFile file(_strFilename); + QFile::remove(_strFilename); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) + { + +// if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) + // cout << "savefail" << endl; + + return false; + } + QTextStream out(&file); + out << _strData; + file.close(); + return true; +} + +QStringList Widget::readList(QString strPath) +{ + QFile file(strPath); + QStringList slProxyList; + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + return slProxyList; + } + QTextStream in(&file); + + while(!in.atEnd()) + { + QString str = in.readLine().trimmed(); + if(str.at(0) == '#') + { + continue; + } + if(str.size() > 0) + slProxyList << str; + } + + file.close(); + return slProxyList; +} + +void Widget::checkProxy() +{ + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); + db.setHostName("bigbird.iptime.org"); + db.setUserName("admin"); + db.setPassword("admin123"); + db.setDatabaseName("concepters"); + + + + if (db.open() == false) + { + InsertLog("DB open Failed in checkProxy()"); + return; + } + + + QSqlQuery query; + + QString strQuery; + + InsertLog("Check Proxy DB"); + strQuery = "select count(*) from Proxy"; + if(!query.exec(strQuery.toUtf8())) + { + InsertLog("Db open Failed in checkProxy()"); + return; + } + int result = 0; + while(query.next()) + result = query.value(0).toInt(); + + InsertLog("Number of Proxy in DB : " + QString::number(result)); + + if(result < MIN_PROXY) + { + if(p_timer->isActive()) + { + p_timer->stop(); + InsertLog("Update Timer Stop in CheckProxy()"); + } + p_timer->start(UPDATE_TIMER); + updateProxy(); + } + db.close(); +} + + + +void Widget::InsertLog(QString str) +{ + QTime time = QTime::currentTime(); + QString strOut = time.toString("[hh:mm:ss] ") + str; + m_pResultList->addItem(strOut); + QDate date = QDate::currentDate(); + + //QFile file(date.toString(Qt::ISODate)+ "_" + QString::number(QCoreApplication::applicationPid())+ ".log"); + QFile file(date.toString(Qt::ISODate)+ "_" + "proxy" + ".log"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) + return; + + QTextStream out(&file); + out << strOut << "\n"; + file.close(); + + if (m_pResultList->count() > 1024) + { + m_pResultList->removeItemWidget(m_pResultList->item(0)); + QListWidgetItem* item = m_pResultList->takeItem(0); + delete item; + } + m_pResultList->setCurrentRow( m_pResultList->count() - 1 ); + m_pResultList->repaint(); +} + +void Widget::updateProxy() +{ + p_labelNextTime->setText(QDateTime::currentDateTime().toLocalTime().addSecs(p_lineTime->text().toInt()).toString("yyyy-MM-dd hh:mm:ss")); + InsertLog("update Proxy Timer Executed"); + m_slIpPortList.clear(); + InsertLog("Ip List Clear()"); + update(); +} diff --git a/ProxyUI/widget.h b/ProxyUI/widget.h index 60c3dde..2eab5c4 100644 --- a/ProxyUI/widget.h +++ b/ProxyUI/widget.h @@ -11,6 +11,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include namespace Ui { class Widget; } @@ -22,7 +28,10 @@ class Widget : public QWidget public: explicit Widget(QWidget *parent = 0); ~Widget(); - + bool SendIpList(QStringList _str); + bool Debug(QString _strFilename,QString _strData); + void InsertLog(QString str); + QStringList readList(QString strPath); private: Ui::Widget *ui; @@ -44,19 +53,21 @@ private: QLabel *p_labelTimerOnOff; QLabel *p_labelRecent; QLabel *p_labelNext; - QLabel *p_labelStatus; QCheckBox *p_chkDb; QCheckBox *p_chkLocal; QFileDialog *p_FileDialog; - + QListWidget *m_pResultList; QPushButton *p_btnStart; QPushButton *p_btnStop; QPushButton *p_btnChoose; QProcess v_pro; QTimer *p_timer; - + QTimer *p_checkTimer; + QStringList m_slIpPortList; + QStringList m_slIpUrl; + int m_index; public slots: void btnStart(); void btnStop(); @@ -66,6 +77,8 @@ public slots: void processFinished(int exitCode, QProcess::ExitStatus exitStatus); void chkDb(); void chkLocal(); + void checkProxy(); + void updateProxy(); }; #endif // WIDGET_H