diff --git a/EffectProcess/EffectProcess.pro b/EffectProcess/EffectProcess.pro index cb09fec..a439b84 100644 --- a/EffectProcess/EffectProcess.pro +++ b/EffectProcess/EffectProcess.pro @@ -20,7 +20,9 @@ SOURCES += main.cpp \ sutilfunction.cpp \ sresultsender.cpp \ seffectprocess.cpp \ - snaverblog.cpp + snaverblog.cpp \ + seffectstatistics.cpp \ + snaverblogprocess.cpp HEADERS += \ swebpage.h \ @@ -29,4 +31,5 @@ HEADERS += \ sutilfunction.h \ seffectprocess.h \ seffectstatistics.h \ - snaverblog.h + snaverblog.h \ + snaverblogprocess.h diff --git a/EffectProcess/EffectProcess.pro.user b/EffectProcess/EffectProcess.pro.user index 5541d31..b79d520 100644 --- a/EffectProcess/EffectProcess.pro.user +++ b/EffectProcess/EffectProcess.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -8,7 +8,7 @@ ProjectExplorer.Project.ActiveTarget - 0 + 2 ProjectExplorer.Project.EditorSettings @@ -227,7 +227,7 @@ EffectProcess Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro - + "naver" "blog" "656563516" "http://blog.naver.com/mymisunzzzz/220737293892" EffectProcess.pro false true @@ -434,7 +434,7 @@ Desktop Qt 5.4.1 MSVC2013 64bit Desktop Qt 5.4.1 MSVC2013 64bit {481b3484-407d-4ae0-ba41-458f5e9d2bf2} - 0 + 1 0 0 @@ -595,15 +595,16 @@ 13 14 - -1 + 2 - - - false - %{buildDir} - Custom Executable + EffectProcess - ProjectExplorer.CustomExecutableRunConfiguration + Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro + "naver" "blog" "656563516" "http://blog.naver.com/mymisunzzzz/220737293892" + EffectProcess.pro + false + true + 3768 false true @@ -781,15 +782,16 @@ 13 14 - -1 + 2 - - - false - %{buildDir} - Custom Executable + EffectProcess - ProjectExplorer.CustomExecutableRunConfiguration + Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro + "naver" "blog" "656563516" "http://blog.naver.com/mymisunzzzz/220737293892" + EffectProcess.pro + false + true + 3768 false true @@ -967,15 +969,16 @@ 13 14 - -1 + 2 - - - false - %{buildDir} - Custom Executable + EffectProcess - ProjectExplorer.CustomExecutableRunConfiguration + Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro + "naver" "blog" "656563516" "http://blog.naver.com/mymisunzzzz/220737293892" + EffectProcess.pro + false + true + 3768 false true diff --git a/EffectProcess/main.cpp b/EffectProcess/main.cpp index f483776..cb6329a 100644 --- a/EffectProcess/main.cpp +++ b/EffectProcess/main.cpp @@ -1,35 +1,37 @@ -#include +#include #include #include #include +#include "seffectprocess.h" +#include "snaverblogprocess.h" +#include -namespace +std::shared_ptr +getProcess(const QString& _platform_name, const QString& _platform_form, + const QString& _event_code, const QString& _url) { -const QString DBNAME = "database"; + if (_platform_name.trimmed() == "naver" && _platform_form.trimmed() == "blog") + return std::shared_ptr(new SNaverBlogProcess(_platform_name, _platform_form, _event_code, _url)); + else + return nullptr; } int main(int argc, char *argv[]) { - QCoreApplication a(argc, argv); + QApplication a(argc, argv); a.setApplicationName(QString("Chrome")); a.setApplicationVersion(QString("53.0.2785.143")); - QSettings settings(QString("effect.ini"), QSettings::IniFormat); - settings.setIniCodec("UTF-8"); - settings.beginGroup("database"); + if (argc != 5) + { + std::cout << "x!@#!@#!@#e010!@#checkArgument"; + return 0; + } - QString strHostname = settings.value("host", "182.162.171.147").toString(); - QString strUsername = settings.value("user", "admin").toString(); - QString strPassword = settings.value("pass", "admin123").toString(); - QString strDBName = settings.value("name", "bigbird").toString(); + std::shared_ptr process = getProcess(argv[1], argv[2], argv[3], argv[4]); - settings.endGroup(); + process->run(argv[4]); - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", DBNAME); - db.setHostName(strHostname); - db.setUserName(strUsername); - db.setPassword(strPassword); - db.setDatabaseName(strDBName); return a.exec(); } diff --git a/EffectProcess/seffectprocess.cpp b/EffectProcess/seffectprocess.cpp index 6470ded..2e03aae 100644 --- a/EffectProcess/seffectprocess.cpp +++ b/EffectProcess/seffectprocess.cpp @@ -1,33 +1,70 @@ #include "seffectprocess.h" #include "sutilclass.h" #include "sutilfunction.h" +#include #include #include namespace { const QString SEPERATOR = "!@#"; } + SEffectProcess::SEffectProcess(const QString& _platform_name, const QString& _platform_form, - const QString& _event_code, const QString& _url) + const QString& _event_code, const QString& _url): m_pResultSender(new SResultSender) { m_pParam[E_PARAM_URL] = _url; m_pParam[E_PARAM_EVENT_CODE] = _event_code; m_pParam[E_PARAM_PLATFORM_FORM] = _platform_form; m_pParam[E_PARAM_PLATFORM_NAME] = _platform_name; + initConnect(); +} + +int SEffectProcess::eventCode() +{ + return m_pParam[E_PARAM_EVENT_CODE].toInt(); } void SEffectProcess::slotOk() { + qDebug() << "slotOk"; std::cout << 'o' << SEPERATOR.toStdString() << m_pParam[E_PARAM_EVENT_CODE].toStdString() << SEPERATOR.toStdString() << m_pParam[E_PARAM_URL].toStdString(); QApplication::quit(); } -void SEffectProcess::slotError(E_ERROR_CODE _error, const QString &_msg) +void SEffectProcess::slotError(E_ERROR_CODE _error, const QString& _msg) { + qDebug() << "slotError"; + qDebug() << _msg; std::cout << 'x' << SEPERATOR.toStdString() << m_pParam[E_PARAM_EVENT_CODE].toStdString() - << SEPERATOR.toStdString() << m_pParam[E_PARAM_URL].toStdString() << EnumErrorCodetostrErrorCode(_error).toStdString() + << SEPERATOR.toStdString() << m_pParam[E_PARAM_URL].toStdString() + << SEPERATOR.toStdString() << EnumErrorCodetostrErrorCode(_error).toStdString() << SEPERATOR.toStdString() << _msg.toStdString(); QApplication::quit(); } +void SEffectProcess::slotDataOk(const EffectData& _data) +{ + qDebug() << "slotDataOk"; + State_s1_effect result = processData(_data); + qDebug() << "slotDataOK asdf"; + if (send(result)) + slotOk(); + /* + else + slotError(E_ERROR_CODE::DB_UNKNOWN_ERROR, ""); + */ +} + +void SEffectProcess::initConnect() +{ + QObject::connect(&(*m_pResultSender), &SResultSender::signalError, + this, &SEffectProcess::slotError); +} + +bool SEffectProcess::send(const State_s1_effect& _result) +{ + return m_pResultSender->send(_result); +} + + diff --git a/EffectProcess/seffectprocess.h b/EffectProcess/seffectprocess.h index 6026b3e..6c1dee6 100644 --- a/EffectProcess/seffectprocess.h +++ b/EffectProcess/seffectprocess.h @@ -3,6 +3,7 @@ #include #include #include "sutilclass.h" +#include "sresultsender.h" enum E_PARAM { @@ -13,6 +14,7 @@ enum E_PARAM E_PARAM_MAX }; +class EffectData; class SEffectProcess:public QObject { @@ -21,16 +23,29 @@ class SEffectProcess:public QObject public: SEffectProcess(const QString& _platform_name, const QString& _platform_form, const QString& _event_code, const QString& _url); - virtual void run() = 0; + virtual void run(const QString& _url) = 0; +protected: + virtual State_s1_effect processData(const EffectData& _data) = 0; + bool send(const State_s1_effect& _result); + int eventCode(); protected slots: void slotOk(); void slotError(E_ERROR_CODE _error, const QString& _msg); + void slotDataOk(const EffectData& _data); + +private: + void initConnect(); private: QString m_pParam[E_PARAM_MAX]; + std::unique_ptr m_pResultSender; + }; + + + #endif // SEFFECTPROCESS diff --git a/EffectProcess/seffectstatistics.cpp b/EffectProcess/seffectstatistics.cpp new file mode 100644 index 0000000..5949051 --- /dev/null +++ b/EffectProcess/seffectstatistics.cpp @@ -0,0 +1,72 @@ +#include "seffectstatistics.h" +#include +#include +#include +#include +#include +#include +#include + +int getReplyCount(const EffectData& _data) +{ + QSet set_id; + foreach (const DataForm& row, _data.reply) + { + if (_data.body.data[ARTICLE_ID].trimmed() != row.data[ARTICLE_ID].trimmed()) + set_id.insert(row.data[ARTICLE_ID].trimmed()); + } + return set_id.size(); +} + +int getlikeCount(const EffectData& _data) +{ + //qDebug() << "getlikeCount:" << _data.body.data[REPLY_URL]; + return _data.body.data[REPLY_URL].toInt(); +} + +int getViewCount(const EffectData& _data) +{ + return _data.body.data[ARTICLE_HIT].trimmed().replace(",","").toInt(); +} + +QString getViewBuzz(const EffectData& _data) +{ + QString str; + return str; +} + + +QString getReplyBuzz(const EffectData& _data) +{ + QMap mapDate; + + QDate firstDate = QDateTime::fromString(_data.body.data[ARTICLE_DATE].trimmed().replace("T", " ").replace(".","-").replace("- "," "), "yyyy-MM-dd hh:mm:ss").date(); + QDate lastDate = QDate::currentDate(); + /* + qDebug() << _data.body.data[ARTICLE_DATE]; + qDebug() << "firstDate:" << firstDate.toString("yyyy-MM-dd"); + qDebug() << "lastDate:" << lastDate.toString("yyyy-MM-dd"); + */ + + for (QDate date = firstDate; date <= lastDate; date = date.addDays(1)) + { + mapDate.insert(date, 0); + } + + foreach (auto &row, _data.reply) + { + QDate date = QDateTime::fromString(row.data[ARTICLE_DATE].trimmed().replace("T", " ").replace(".","-").replace("- "," "), "yyyy-MM-dd hh:mm:ss").date(); + if (!mapDate.contains(date)) + //mapDate.insert(date, 0); + continue; + mapDate[date]++; + } + QJsonObject jObj; + for (auto iter = mapDate.cbegin(); iter != mapDate.cend(); ++iter) + { + jObj[iter.key().toString("yyyyMMdd")] = iter.value(); + } + QJsonDocument jDoc(jObj); + QString result = jDoc.toJson(); + return result; +} diff --git a/EffectProcess/seffectstatistics.h b/EffectProcess/seffectstatistics.h index a3e6d00..70ce3ee 100644 --- a/EffectProcess/seffectstatistics.h +++ b/EffectProcess/seffectstatistics.h @@ -1,5 +1,22 @@ #ifndef SEFFECTSTATISTICS #define SEFFECTSTATISTICS +#include "sutilclass.h" + + +int getReplyCount(const EffectData& _data); + + +int getlikeCount(const EffectData& _data); + + +int getViewCount(const EffectData& _data); + + +QString getViewBuzz(const EffectData& _data); + + +QString getReplyBuzz(const EffectData& _data); + #endif // SEFFECTSTATISTICS diff --git a/EffectProcess/snaverblog.cpp b/EffectProcess/snaverblog.cpp index 28d15b2..5d3fda3 100644 --- a/EffectProcess/snaverblog.cpp +++ b/EffectProcess/snaverblog.cpp @@ -7,7 +7,7 @@ #include namespace { -const int TIME = 4000;//4 second +const int TIME = 3000;//3 second } QWebElement Find(const QWebElement& _FindElement, const QString& _strElement = "", @@ -78,28 +78,40 @@ private: -SNaverBlog::SNaverBlog(std::shared_ptr _page):m_pWebPage(_page), +SNaverBlog::SNaverBlog(std::shared_ptr _page):m_pWebPage(_page), m_eMode(E_CRAWL_MODE::BODY), m_bReplyProcessed(false), m_bBodyProcessed(false), //m_bReplyProcessing(false), m_bBodyProcessing(false), m_pNetworkRequest(new QNetworkRequest), m_nBodyRetry(3) { if (!_page) - _page = std::make_shared(new QWebPage); + m_pWebPage = std::make_shared(new SWebPage); initConnect(); } void SNaverBlog::initConnect() { - QObject::connect(&(*m_pWebPage), &QWebPage::loadFinished, + QObject::connect(&(*m_pWebPage), &SWebPage::loadFinished, this, &SNaverBlog::slotLoadFinished); + QObject::connect(&(*m_pWebPage), &SWebPage::signalAlert, + this, &SNaverBlog::slotAlert); + QObject::connect(&(*m_pWebPage), &SWebPage::loadProgress, + [](int n){ qDebug() << n; }); + QObject::connect(&(*m_pWebPage), &SWebPage::loadStarted, + [](){ qDebug() << "loadstart"; }); m_pWebPage->settings()->setAttribute(QWebSettings::AutoLoadImages, false); } +void SNaverBlog::slotAlert(const QString& msg) +{ + emit signalError(E_ERROR_CODE::DELETED_URL_ERROR, msg); +} + void SNaverBlog::go(const QString &_url, E_CRAWL_MODE _mode) { + qDebug() << _url; m_eMode = _mode; QUrl url(_url.trimmed()); if (_mode == E_CRAWL_MODE::BODY) @@ -108,47 +120,66 @@ void SNaverBlog::go(const QString &_url, E_CRAWL_MODE _mode) if (url.scheme().isEmpty()) url.setScheme("http"); + QNetworkRequest requests; + requests.setUrl(url); + requests.setRawHeader("Accept-Language", + "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,zh-CN;q=0.2,zh;q=0.2"); + m_pWebPage->mainFrame()->load(requests); + /* m_pNetworkRequest->setUrl(url); m_pNetworkRequest->setRawHeader( "Accept-Language", "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,zh-CN;q=0.2,zh;q=0.2" ); m_pWebPage->mainFrame()->load(*m_pNetworkRequest); + */ } void SNaverBlog::slotLoadFinished(bool ok) { + qDebug() << "slotLoadFinished"; if (!ok) { signalError(E_ERROR_CODE::UNKNOWN_ERROR, "UnkownError/BlockError/ProxyError"); return; } - + qDebug() << "slotLoadFinished"; switch(m_eMode) { case E_CRAWL_MODE::BODY: { Lock lock(&m_mutexBody); - if (m_bBodyProcessed) return; + qDebug() << "body loadfinished"; m_efData.body = getBody(); if (!check(m_efData.body) && m_nBodyRetry-- > 0) { - QTimer::singleShot(TIME, this, SLOT(slotLoadFinished(bool))); + //QTimer::singleShot(TIME, this, SLOT(slotLoadFinished(bool))); + QTimer::singleShot(TIME, [&](){ slotLoadFinished(true);}); return; } + qDebug() << m_efData.body.data[ARTICLE_ID]; + qDebug() << m_efData.body.data[ARTICLE_URL]; + qDebug() << m_efData.body.data[ARTICLE_PROFILE]; + qDebug() << m_efData.body.data[ARTICLE_NICKNAME]; + qDebug() << m_efData.body.data[ARTICLE_HIT]; + qDebug() << m_efData.body.data[REPLY_URL]; + qDebug() << m_efData.body.data[ARTICLE_TITLE]; m_bBodyProcessed = true; - break; + qDebug() << "body loadfinished"; + qDebug() << makeReplyUrl(m_strUrl); + go(makeReplyUrl(m_strUrl), E_CRAWL_MODE::REPLY); + return; } case E_CRAWL_MODE::REPLY: { Lock lock(&m_mutexReply); - if (m_bReplyProcessed) return; + qDebug() << "reply loadfinished"; m_efData.reply = getReply(); m_bReplyProcessed = true; @@ -213,7 +244,10 @@ DataForm SNaverBlog::getBody() bool SNaverBlog::check(const DataForm &_data) { - return true; + if (_data.data[ARTICLE_PROFILE].isEmpty() || _data.data[REPLY_URL].isEmpty()) + return false; + else + return true; } bool SNaverBlog::check(const QVector &_data) @@ -224,9 +258,157 @@ bool SNaverBlog::check(const QVector &_data) QVector SNaverBlog::getReply() { QVector data; + QWebFrame* frame = m_pWebPage->mainFrame(); + + QWebElement group = Find(frame->documentElement(),"ul","id","commentList"); + QWebElementCollection elements = group.findAll("li"); + QString strParent,strDate,strNick,strComm,strUrl,strId; + QStringList strList = m_strUrl.split("/"); + QString strCommUrl; + for (int i=0; i < strList.size() - 1; i++) + strUrl += strList.at(i) + "/"; + + { + int nStartIdPos = m_strUrl.indexOf("blogId=") + QString("blogId=").size(); + int nEndIdPos = m_strUrl.indexOf('&', nStartIdPos); + strUrl += m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos) + '/'; + + } + + { + int nStartIdPos = m_strUrl.indexOf("logNo=") + QString("logNo=").size(); + int nEndIdPos = m_strUrl.indexOf('&', nStartIdPos); + strUrl += m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos); + } + + int nCount=0; + foreach (QWebElement element, elements) + { + if (element.attribute("class") == "_countableComment ") + { + strNick = strParent = GetSafeUtf(Find(element,"a","class","nick pcol2").toPlainText()); + strDate = Find(element,"span","class","date fil5 pcol2").toPlainText(); + strComm = Find(element,"dd","class","comm pcol2").toPlainText(); + + strCommUrl = Find(element,"a","class","nick pcol2").attribute("href"); + if(strCommUrl.left(QString("http://blog.naver.com").length()).compare("http://blog.naver.com") == 0) + strId = strCommUrl.split("/").at(3).trimmed(); + if(strCommUrl.right(QString("blog.me").length()).compare("blog.me") == 0) + strId = strCommUrl.split("/").at(2).split(".").at(0).trimmed(); + if(strCommUrl.left(1) == "/") + { + QStringList strList = strCommUrl.split("&"); + foreach(QString str, strList) + { + if(str.left(3) == "id=") + { + strId = str.right(str.length() - 3); + } + } + } + + strComm = GetSafeUtf(strComm); + if (strComm.isEmpty()== false) + { + strComm.replace("'","\\'"); + strComm.replace("\"","\\\""); + strComm = strComm.trimmed(); + int nStartIdPos = m_strUrl.indexOf("blogId=") + QString("blogId=").size(); + int nEndIdPos = m_strUrl.indexOf('&', nStartIdPos); + DataForm form; + form.data[ARTICLE_URL] = strUrl.toUtf8(); + form.data[ARTICLE_ID] = strId.trimmed().toUtf8(); + form.data[PLATFORM_ID] = m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos); + form.data[ARTICLE_NICKNAME] = strNick.toUtf8(); + form.data[ARTICLE_DATA] = strComm.toUtf8(); + form.data[ARTICLE_DATE] = strDate.toUtf8(); + form.data[REPLY_URL] = m_strUrl.toUtf8(); + form.data[ARTICLE_ORDER] = QString::number(nCount++); + data.append(form); + /* + query.bindValue(":URL", strUrl.toUtf8()); + query.bindValue(":PLATFORMID",m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos)); + query.bindValue(":NICK",strNick.toUtf8()); + query.bindValue(":DATA",strComm.toUtf8()); + query.bindValue(":DATE",strDate.toUtf8()); + query.bindValue(":URLREPLY",m_strUrl.toUtf8()); + query.bindValue(":ROWNUM",(nCount++)); + + if (query.exec()==false) + cout << "error : " << query.lastError().text().toStdString(); + */ + } + } + if (element.attribute("class") == "reply _countableComment ") + { + strNick = Find(element,"a","class","nick pcol2").toPlainText(); + strDate = Find(element,"span","class","date fil5 pcol2").toPlainText(); + QWebElement subElement = Find(element,"dd","class","comm pcol2"); + QString subNick = Find(subElement,"a","class","nick pcol2").toPlainText(); + strComm = subElement.toPlainText(); + + strCommUrl = Find(element,"a","class","nick pcol2").attribute("href"); + if(strCommUrl.left(QString("http://blog.naver.com").length()).compare("http://blog.naver.com") == 0) + strId = strCommUrl.split("/").at(3).trimmed(); + if(strCommUrl.right(QString("blog.me").length()).compare("blog.me") == 0) + strId = strCommUrl.split("/").at(2).split(".").at(0).trimmed(); + if(strCommUrl.left(1) == "/") + { + QStringList strList = strCommUrl.split("&"); + foreach(QString str, strList) + { + if(str.left(3) == "id=") + { + strId = str.right(str.length() - 3); + } + } + } + + if(subNick.isEmpty() == false) + strComm = strComm.right(strComm.size()-subNick.size()-1); + + if (strComm.isEmpty() == false) + { + strComm = GetSafeUtf(strComm); + strComm.replace("'","\\'"); + strComm.replace("\"","\\\""); + strComm = strComm.trimmed(); + + int nStartIdPos = m_strUrl.indexOf("blogId=") + QString("blogId=").size(); + int nEndIdPos = m_strUrl.indexOf('&', nStartIdPos); + DataForm form; + form.data[ARTICLE_ID] = strId; + + form.data[ARTICLE_URL] = strUrl.toUtf8(); + form.data[PLATFORM_ID] = m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos); + form.data[ARTICLE_NICKNAME] = strNick.toUtf8(); + form.data[ARTICLE_DATA] = strComm.toUtf8(); + form.data[ARTICLE_DATE] = strDate.toUtf8(); + form.data[ARTICLE_PARENT] = strParent.toUtf8(); + form.data[REPLY_URL] = m_strUrl.toUtf8(); + form.data[ARTICLE_ORDER] = QString::number(nCount++); + + data.append(form); + /* + query.bindValue(":URL",strUrl.toUtf8()); + query.bindValue(":PLATFORMID",m_strUrl.mid(nStartIdPos, nEndIdPos - nStartIdPos)); + query.bindValue(":NICK",strNick.toUtf8()); + query.bindValue(":DATA",strComm.toUtf8()); + query.bindValue(":DATE",strDate.toUtf8()); + query.bindValue(":PARENT",strParent.toUtf8()); + query.bindValue(":URLREPLY",m_strUrl.toUtf8()); + query.bindValue(":ROWNUM",(nCount++)); + if (query.exec()==false) + { + cout << "error : " << query.lastError().text().toStdString(); + } + */ + } + } + } return data; } @@ -301,7 +483,7 @@ void SNaverBlog::getBody(QWebFrame *frame, DataForm &_data) if(_data.data[ARTICLE_NICKNAME].length() == 0) _data.data[ARTICLE_NICKNAME] = _data.data[ARTICLE_ID]; - image = Find(profile,"img","alt","프로필 이미지"); + image = Find(profile,"img","alt"," ̹"); strProfile = Find(profile, "p", "class", "caption align").toPlainText().trimmed(); } { diff --git a/EffectProcess/snaverblog.h b/EffectProcess/snaverblog.h index 0078fa6..cdc8418 100644 --- a/EffectProcess/snaverblog.h +++ b/EffectProcess/snaverblog.h @@ -3,44 +3,10 @@ #include #include "sutilclass.h" -#include #include #include +#include "swebpage.h" -enum E_COLUMN -{ - PLATFORM_NAME = 0, - PLATFORM_FORM, - PLATFORM_TITLE, - ARTICLE_FORM, - ARTICLE_PARENT, - ARTICLE_ID, - ARTICLE_NICKNAME, - ARTICLE_TITLE, - ARTICLE_DATA, - ARTICLE_URL, - ARTICLE_HIT, - ARTICLE_DATE, - ARTICLE_ORDER, - ARTICLE_PROFILE, - ARTICLE_PROFILEURL, - PLATFORM_ID, - KEYWORD_ID, - REPLY_URL, - ETC, - TOTAL_COUNT, -}; - -struct DataForm -{ - QString data[TOTAL_COUNT]; -}; - -struct EffectData -{ - DataForm body; - QVector reply; -}; enum class E_CRAWL_MODE { @@ -53,7 +19,7 @@ class SNaverBlog: public QObject Q_OBJECT public: - explicit SNaverBlog(std::shared_ptr _page = nullptr); + explicit SNaverBlog(std::shared_ptr _page = nullptr); void go(const QString& _url, E_CRAWL_MODE _mode = E_CRAWL_MODE::BODY); private: @@ -69,16 +35,21 @@ signals: void signalDataOk(const EffectData& _data); void signalError(E_ERROR_CODE _error, const QString& _msg); + public slots: void slotLoadFinished(bool ok = true); +private slots: + void slotAlert(const QString& msg); + + private: - std::shared_ptr m_pWebPage; + std::shared_ptr m_pWebPage; std::unique_ptr m_pNetworkRequest; E_CRAWL_MODE m_eMode; + bool m_bReplyProcessed; bool m_bBodyProcessed; - bool m_bReplyProcessed; QMutex m_mutexBody; QMutex m_mutexReply; /* diff --git a/EffectProcess/snaverblogprocess.cpp b/EffectProcess/snaverblogprocess.cpp new file mode 100644 index 0000000..5299307 --- /dev/null +++ b/EffectProcess/snaverblogprocess.cpp @@ -0,0 +1,34 @@ +#include "snaverblogprocess.h" +#include "seffectstatistics.h" +#include +SNaverBlogProcess::SNaverBlogProcess(const QString& _platform_name, const QString& _platform_form, + const QString& _event_code, const QString& _url): + SEffectProcess(_platform_name, _platform_form, _event_code, _url), m_pSNaverBlog(new SNaverBlog) +{ + connect(&(*m_pSNaverBlog), &SNaverBlog::signalDataOk, this, &SNaverBlogProcess::slotDataOk); +} + +State_s1_effect SNaverBlogProcess::processData(const EffectData& _data) +{ + State_s1_effect result; + + result.event_num = eventCode(); + qDebug() << result.event_num; + + result.likecount = getlikeCount(_data); + qDebug() << result.likecount; + result.replybuzz = getReplyBuzz(_data); + qDebug() << "replybuzz"; + result.viewcount = getViewCount(_data); + qDebug() << result.viewcount; + + result.replycount = getReplyCount(_data); + + qDebug() << result.replycount; + return result; +} + +void SNaverBlogProcess::run(const QString& _url) +{ + m_pSNaverBlog->go(_url); +} diff --git a/EffectProcess/snaverblogprocess.h b/EffectProcess/snaverblogprocess.h new file mode 100644 index 0000000..9a6cbf1 --- /dev/null +++ b/EffectProcess/snaverblogprocess.h @@ -0,0 +1,25 @@ +#ifndef SNAVERBLOGPROCESS +#define SNAVERBLOGPROCESS + +#include "seffectprocess.h" +#include "snaverblog.h" + +class SNaverBlogProcess: public SEffectProcess +{ + Q_OBJECT + +public: + SNaverBlogProcess(const QString& _platform_name, const QString& _platform_form, + const QString& _event_code, const QString& _url); + void run(const QString& _url) override; + +protected: + virtual State_s1_effect processData(const EffectData& _data) override; + +private: + std::unique_ptr m_pSNaverBlog; + +}; + +#endif // SNAVERBLOGPROCESS + diff --git a/EffectProcess/sresultsender.cpp b/EffectProcess/sresultsender.cpp index acf5c29..7130e7d 100644 --- a/EffectProcess/sresultsender.cpp +++ b/EffectProcess/sresultsender.cpp @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include namespace { const QString SEPERATOR = "!@#"; @@ -45,19 +48,19 @@ bool SResultSender::send(const State_s1_effect& _result) if (!db.open()) { - emit error(E_ERROR_CODE::DB_OPEN_ERROR, db.lastError().text()); + emit signalError(E_ERROR_CODE::DB_OPEN_ERROR, db.lastError().text()); return false; } DBContainer container(db); - QString strQuery = "delete from stats_s1_effect where eventcode = " + QString::number(_result.event_num); + QString strQuery = "delete from stats_s1_effect where event_num = " + QString::number(_result.event_num); QSqlQuery query(db); if (!query.exec(strQuery)) { - emit error(E_ERROR_CODE::DB_QUERY_ERROR, query.lastError().text() + SEPERATOR + query.lastQuery()); + emit signalError(E_ERROR_CODE::DB_QUERY_ERROR, query.lastError().text() + "\n" + query.lastQuery()); return false; } @@ -78,7 +81,9 @@ bool SResultSender::send(const State_s1_effect& _result) if (!query.exec()) { - emit error(E_ERROR_CODE::DB_QUERY_ERROR, query.lastError().text() + SEPERATOR + query.lastQuery()); + qDebug() << "insert error"; + + emit signalError(E_ERROR_CODE::DB_QUERY_ERROR, query.lastError().text() + "\n" + query.lastQuery()); return false; } diff --git a/EffectProcess/sresultsender.h b/EffectProcess/sresultsender.h index 1650eb8..fa2a49c 100644 --- a/EffectProcess/sresultsender.h +++ b/EffectProcess/sresultsender.h @@ -5,23 +5,6 @@ #include #include "sutilclass.h" -struct State_s1_effect -{ - int event_num; - QString view_buzz; - QString replybuzz; - int replycount; - int likecount; - int viewcount; - int interactioncount; - int reachcount; - int engagementcount; - State_s1_effect():event_num(0),replycount(0),likecount(0),viewcount(0), - interactioncount(0),reachcount(0),engagementcount(0) - { - } -}; - class SResultSender: public QObject { Q_OBJECT @@ -30,7 +13,7 @@ public: bool send(const State_s1_effect& _result); signals: - void error(E_ERROR_CODE _error, const QString& _error_msg); + void signalError(E_ERROR_CODE _error, const QString& _error_msg); private: void init(); diff --git a/EffectProcess/sutilclass.h b/EffectProcess/sutilclass.h index 6bdeac3..fa4a29e 100644 --- a/EffectProcess/sutilclass.h +++ b/EffectProcess/sutilclass.h @@ -31,7 +31,7 @@ enum class E_CRAWL_STATE:unsigned short NO }; -enum class E_ERROR_CODE:unsigned short +enum class E_ERROR_CODE { DB_OPEN_ERROR = 0, DB_FULL_ERROR, @@ -161,6 +161,58 @@ enum E_LOG_COLUMN ERROR_MSG }; +enum E_COLUMN +{ + PLATFORM_NAME = 0, + PLATFORM_FORM, + PLATFORM_TITLE, + ARTICLE_FORM, + ARTICLE_PARENT, + ARTICLE_ID, + ARTICLE_NICKNAME, + ARTICLE_TITLE, + ARTICLE_DATA, + ARTICLE_URL, + ARTICLE_HIT, + ARTICLE_DATE, + ARTICLE_ORDER, + ARTICLE_PROFILE, + ARTICLE_PROFILEURL, + PLATFORM_ID, + KEYWORD_ID, + REPLY_URL, + ETC, + TOTAL_COUNT, +}; + +struct DataForm +{ + QString data[TOTAL_COUNT]; +}; + +struct EffectData +{ + DataForm body; + QVector reply; +}; + +struct State_s1_effect +{ + int event_num; + QString view_buzz; + QString replybuzz; + int replycount; + int likecount; + int viewcount; + int interactioncount; + int reachcount; + int engagementcount; + State_s1_effect():event_num(0),replycount(0),likecount(0),viewcount(0), + interactioncount(0),reachcount(0),engagementcount(0) + { + } +}; + #endif // SUTILCLASS diff --git a/EffectProcess/sutilfunction.cpp b/EffectProcess/sutilfunction.cpp index f02f268..de98084 100644 --- a/EffectProcess/sutilfunction.cpp +++ b/EffectProcess/sutilfunction.cpp @@ -37,8 +37,8 @@ void messageBoxError(const QString &title, const QString &body) QString errorCodeToString(E_ERROR_CODE _error_code) { - if (0 <= static_cast(_error_code) && - static_cast(_error_code) < static_cast(E_ERROR_CODE::MAX)) + if ((0 <= static_cast(_error_code)) && + (static_cast(_error_code) < static_cast(E_ERROR_CODE::MAX))) return ERROR_MESSAGE[static_cast(_error_code)]; else return ERROR_MESSAGE[static_cast(E_ERROR_CODE::UNKNOWN_ERROR)]; diff --git a/EffectProcess/swebpage.cpp b/EffectProcess/swebpage.cpp index c800554..98197ec 100644 --- a/EffectProcess/swebpage.cpp +++ b/EffectProcess/swebpage.cpp @@ -1,6 +1,6 @@ #include "swebpage.h" #include - +#include SWebPage::SWebPage(QObject *parent): QWebPage(parent) { @@ -8,5 +8,33 @@ SWebPage::SWebPage(QObject *parent): QWebPage(parent) void SWebPage::javaScriptAlert(QWebFrame *frame, const QString &msg) { + qDebug() << "alert"; emit signalAlert(msg); } + +bool SWebPage::javaScriptConfirm(QWebFrame *frame, const QString &msg) +{ + qDebug() << "confirm"; + emit signalAlert(msg); + return false; +} + +void SWebPage::javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID) +{ + qDebug() << "console"; + emit signalAlert(message); +} + +bool SWebPage::javaScriptPrompt(QWebFrame * frame, const QString & msg, const QString & defaultValue, QString * result) +{ + qDebug() << "prompt"; + emit signalAlert(msg); + return false; +} + +QWebPage * SWebPage::createWindow(WebWindowType type) +{ + qDebug() << "createwindow"; + emit signalAlert("???"); + return nullptr; +} diff --git a/EffectProcess/swebpage.h b/EffectProcess/swebpage.h index b319656..2a32d61 100644 --- a/EffectProcess/swebpage.h +++ b/EffectProcess/swebpage.h @@ -10,8 +10,10 @@ public: protected: void javaScriptAlert(QWebFrame * frame, const QString & msg) override; - //bool javaScriptConfirm(QWebFrame * frame, const QString & msg){} - + bool javaScriptConfirm(QWebFrame * frame, const QString & msg) override; + void javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID); + bool javaScriptPrompt(QWebFrame * frame, const QString & msg, const QString & defaultValue, QString * result); + QWebPage * createWindow(WebWindowType type); signals: void signalAlert(const QString& msg); }; diff --git a/EffectUI/EffectUI.pro.user b/EffectUI/EffectUI.pro.user index 4edf9f4..614f588 100644 --- a/EffectUI/EffectUI.pro.user +++ b/EffectUI/EffectUI.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -8,7 +8,7 @@ ProjectExplorer.Project.ActiveTarget - 3 + 0 ProjectExplorer.Project.EditorSettings @@ -61,7 +61,7 @@ Desktop Qt 5.4.0 MinGW 32bit Desktop Qt 5.4.0 MinGW 32bit qt.54.win32_mingw491_kit - 0 + 1 0 0 diff --git a/sfilterprocess/sfilterprocess.pro.user b/sfilterprocess/sfilterprocess.pro.user index c639906..c8228c3 100644 --- a/sfilterprocess/sfilterprocess.pro.user +++ b/sfilterprocess/sfilterprocess.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId