effectprocess 추가

git-svn-id: svn://192.168.0.12/source@306 8346c931-da38-4b9b-9d4c-e48b93cbd075
This commit is contained in:
admin
2016-10-28 10:10:05 +00:00
parent 6d62c97b54
commit 9b479f3e9a
19 changed files with 560 additions and 129 deletions

View File

@@ -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

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.3.0, 2016-10-27T19:07:05. -->
<!-- Written by QtCreator 3.3.0, 2016-10-28T18:38:52. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -8,7 +8,7 @@
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
<value type="int">2</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
@@ -227,7 +227,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">EffectProcess</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments">&quot;naver&quot; &quot;blog&quot; &quot;656563516&quot; &quot;http://blog.naver.com/mymisunzzzz/220737293892&quot;</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">EffectProcess.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
@@ -434,7 +434,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.4.1 MSVC2013 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.4.1 MSVC2013 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{481b3484-407d-4ae0-ba41-458f5e9d2bf2}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
@@ -595,15 +595,16 @@
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">-1</value>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="bool" key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal">false</value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">EffectProcess</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments">&quot;naver&quot; &quot;blog&quot; &quot;656563516&quot; &quot;http://blog.naver.com/mymisunzzzz/220737293892&quot;</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">EffectProcess.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
@@ -781,15 +782,16 @@
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">-1</value>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="bool" key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal">false</value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">EffectProcess</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments">&quot;naver&quot; &quot;blog&quot; &quot;656563516&quot; &quot;http://blog.naver.com/mymisunzzzz/220737293892&quot;</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">EffectProcess.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
@@ -967,15 +969,16 @@
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">-1</value>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="bool" key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal">false</value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">EffectProcess</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/source/EffectProcess/EffectProcess.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments">&quot;naver&quot; &quot;blog&quot; &quot;656563516&quot; &quot;http://blog.naver.com/mymisunzzzz/220737293892&quot;</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">EffectProcess.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>

View File

@@ -1,35 +1,37 @@
#include <QCoreApplication>
#include <QApplication>
#include <QSqlDatabase>
#include <QSettings>
#include <QString>
#include "seffectprocess.h"
#include "snaverblogprocess.h"
#include <iostream>
namespace
std::shared_ptr<SEffectProcess>
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<SEffectProcess>(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<SEffectProcess> 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();
}

View File

@@ -1,23 +1,32 @@
#include "seffectprocess.h"
#include "sutilclass.h"
#include "sutilfunction.h"
#include <QDebug>
#include <iostream>
#include <QApplication>
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();
@@ -25,9 +34,37 @@ void SEffectProcess::slotOk()
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);
}

View File

@@ -3,6 +3,7 @@
#include <QObject>
#include <QString>
#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<SResultSender> m_pResultSender;
};
#endif // SEFFECTPROCESS

View File

@@ -0,0 +1,72 @@
#include "seffectstatistics.h"
#include <QSet>
#include <QDate>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
int getReplyCount(const EffectData& _data)
{
QSet<QString> 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<QDate, int> 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;
}

View File

@@ -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

View File

@@ -7,7 +7,7 @@
#include <QChar>
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<QWebPage> _page):m_pWebPage(_page),
SNaverBlog::SNaverBlog(std::shared_ptr<SWebPage> _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<QWebPage>(new QWebPage);
m_pWebPage = std::make_shared<SWebPage>(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,6 +244,9 @@ DataForm SNaverBlog::getBody()
bool SNaverBlog::check(const DataForm &_data)
{
if (_data.data[ARTICLE_PROFILE].isEmpty() || _data.data[REPLY_URL].isEmpty())
return false;
else
return true;
}
@@ -224,9 +258,157 @@ bool SNaverBlog::check(const QVector<DataForm> &_data)
QVector<DataForm> SNaverBlog::getReply()
{
QVector<DataForm> 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();
}
{

View File

@@ -3,44 +3,10 @@
#include <QObject>
#include "sutilclass.h"
#include <QWebPage>
#include <QNetworkRequest>
#include <QMutex>
#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<DataForm> reply;
};
enum class E_CRAWL_MODE
{
@@ -53,7 +19,7 @@ class SNaverBlog: public QObject
Q_OBJECT
public:
explicit SNaverBlog(std::shared_ptr<QWebPage> _page = nullptr);
explicit SNaverBlog(std::shared_ptr<SWebPage> _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<QWebPage> m_pWebPage;
std::shared_ptr<SWebPage> m_pWebPage;
std::unique_ptr<QNetworkRequest> m_pNetworkRequest;
E_CRAWL_MODE m_eMode;
bool m_bReplyProcessed;
bool m_bBodyProcessed;
bool m_bReplyProcessed;
QMutex m_mutexBody;
QMutex m_mutexReply;
/*

View File

@@ -0,0 +1,34 @@
#include "snaverblogprocess.h"
#include "seffectstatistics.h"
#include <QDebug>
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);
}

View File

@@ -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<SNaverBlog> m_pSNaverBlog;
};
#endif // SNAVERBLOGPROCESS

View File

@@ -4,6 +4,9 @@
#include <QSettings>
#include <QSqlError>
#include <QSqlQuery>
#include <QString>
#include <QVariant>
#include <QDebug>
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;
}

View File

@@ -5,23 +5,6 @@
#include <QObject>
#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();

View File

@@ -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<DataForm> 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

View File

@@ -37,8 +37,8 @@ void messageBoxError(const QString &title, const QString &body)
QString errorCodeToString(E_ERROR_CODE _error_code)
{
if (0 <= static_cast<int>(_error_code) &&
static_cast<int>(_error_code) < static_cast<int>(E_ERROR_CODE::MAX))
if ((0 <= static_cast<int>(_error_code)) &&
(static_cast<int>(_error_code) < static_cast<int>(E_ERROR_CODE::MAX)))
return ERROR_MESSAGE[static_cast<int>(_error_code)];
else
return ERROR_MESSAGE[static_cast<int>(E_ERROR_CODE::UNKNOWN_ERROR)];

View File

@@ -1,6 +1,6 @@
#include "swebpage.h"
#include <iostream>
#include <QDebug>
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;
}

View File

@@ -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);
};

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.3.0, 2016-10-27T19:07:05. -->
<!-- Written by QtCreator 3.3.0, 2016-10-28T13:07:39. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -8,7 +8,7 @@
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">3</value>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
@@ -61,7 +61,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.4.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.4.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.54.win32_mingw491_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.3.0, 2016-10-05T15:40:28. -->
<!-- Written by QtCreator 3.3.0, 2016-10-28T13:07:39. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>