git-svn-id: svn://192.168.0.12/source@347 8346c931-da38-4b9b-9d4c-e48b93cbd075

This commit is contained in:
admin
2017-05-30 01:35:44 +00:00
parent fab5f51c85
commit dad0365a79
26 changed files with 813 additions and 506 deletions

View File

@@ -22,7 +22,8 @@ SOURCES += main.cpp \
seffectprocess.cpp \
snaverblog.cpp \
seffectstatistics.cpp \
snaverblogprocess.cpp
snaverblogprocess.cpp \
snaverurlvalidator.cpp
HEADERS += \
swebpage.h \
@@ -32,4 +33,5 @@ HEADERS += \
seffectprocess.h \
seffectstatistics.h \
snaverblog.h \
snaverblogprocess.h
snaverblogprocess.h \
snaverurlvalidator.h

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.2.0, 2017-04-13T14:15:14. -->
<!-- Written by QtCreator 4.2.0, 2017-05-22T18:05:04. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@@ -5,6 +5,8 @@
#include "seffectprocess.h"
#include "snaverblogprocess.h"
#include <iostream>
#include "sutilfunction.h"
#include "snaverurlvalidator.h"
std::shared_ptr<SEffectProcess>
getProcess(const QString& _platform_name, const QString& _platform_form,
@@ -28,10 +30,24 @@ int main(int argc, char *argv[])
return 0;
}
std::shared_ptr<SEffectProcess> process = getProcess(argv[1], argv[2], argv[3], argv[4], argv[5]);
process->run(argv[4]);
QString platform_name = argv[1];
QString platform_form = argv[2];
QString event_code = argv[3];
QString url = argv[4];
QString date = argv[5];
if (platform_name.trimmed() == "naver" && platform_form.trimmed() == "blog")
{
SNaverUrlValidator naverUrlValidator(url);
url = naverUrlValidator.makeUrl();
if (url == "")
{
std::cout << "x!@#!@#!@#e010!@#checkUrl";
return 0;
}
}
std::shared_ptr<SEffectProcess> process = getProcess(platform_name, platform_form, event_code, url, date);
process->run(url);
return a.exec();
}

View File

@@ -49,12 +49,6 @@ QString getReplyBuzz(const EffectData& _data)
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);
@@ -83,19 +77,13 @@ QString getReplyBuzz(const EffectData& _data)
return result;
}
QString getReplyBuzz(const EffectData& _data, const QString& _startdate)
QJsonArray getReplyBuzz(const EffectData& _data, const QString& _startdate)
{
QMap<QDate, int> mapDate;
QDate firstDate = QDateTime::fromString(_startdate, "yyyy-MM-dd").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);
@@ -110,16 +98,77 @@ QString getReplyBuzz(const EffectData& _data, const QString& _startdate)
continue;
mapDate[date]++;
}
QJsonArray jArray;
QJsonArray jArray;
int nAccReplyCount = 0;
for (auto iter = mapDate.cbegin(); iter != mapDate.cend(); ++iter)
{
int nValue = iter.value();
nAccReplyCount += nValue;
QJsonObject jObj;
jObj["date"] = iter.key().toString("MM-dd-yyyy");
jObj["value"] = iter.value();
jObj["date"] = iter.key().toString("yyyyMMdd");
jObj["reply_day"] = nValue;
jObj["reply_acc"] = nAccReplyCount;
jArray.append(jObj);
}
return jArray;
}
QJsonArray getLikeBuzz(const EffectData& _data, const QString& _startdate)
{
QMap<QString, int> mapDate;
QDate firstDate = QDateTime::fromString(_startdate, "yyyy-MM-dd").date();
QDate lastDate = QDate::currentDate();
for (QDate date = firstDate; date <= lastDate; date = date.addDays(1))
{
mapDate.insert(date.toString("yyyyMMdd"), 0);
}
QMapIterator<QString, int> iter(_data.like);
while (iter.hasNext())
{
iter.next();
QString date = iter.key();
mapDate[date] = iter.value();
}
QJsonArray jArray;
int nAccLikeCount = 0;
for (auto iter = mapDate.cbegin(); iter != mapDate.cend(); ++iter)
{
int nValue = iter.value();
nAccLikeCount += nValue;
QJsonObject jObj;
jObj["date"] = iter.key();
jObj["like_day"] = nValue;
jObj["like_acc"] = nAccLikeCount;
jArray.append(jObj);
}
return jArray;
}
QString summaryLikeAndReply(QJsonArray _replyBuzz, QJsonArray _likeBuzz)
{
QJsonArray jArray;
for (int i=0; i<_replyBuzz.count(); i++)
{
QJsonObject jObj;
jObj["date"] = _replyBuzz.at(i).toObject()["date"];
jObj["reply_day"] = _replyBuzz.at(i).toObject()["reply_day"];
jObj["reply_acc"] = _replyBuzz.at(i).toObject()["reply_acc"];
jObj["like_day"] = _likeBuzz.at(i).toObject()["like_day"];
jObj["like_acc"] = _likeBuzz.at(i).toObject()["like_acc"];
jArray.append(jObj);
}
QJsonDocument jDoc(jArray);
QString result = jDoc.toJson(QJsonDocument::Compact);
return result;
}

View File

@@ -20,7 +20,11 @@ QString getViewBuzz(const EffectData& _data);
QString getReplyBuzz(const EffectData& _data);
QString getReplyBuzz(const EffectData& _data, const QString& _startdate);
QJsonArray getReplyBuzz(const EffectData& _data, const QString& _startdate);
QJsonArray getLikeBuzz(const EffectData& _data, const QString& _startdate);
QString summaryLikeAndReply(QJsonArray _replyBuzz, QJsonArray _likeBuzz);
#endif // SEFFECTSTATISTICS

View File

@@ -279,8 +279,38 @@ const QString SNaverBlog::scriptReply =
" }"
" return result;"
"}"
"getReply();"
;
"getReply();";
const QString SNaverBlog::scriptLike =
"function getLike()"
"{"
" var result = [];"
" var datemap = new Map();"
" var likeTableBody = document.querySelector('#comment>table>tbody');"
" var likeTrs = likeTableBody.querySelectorAll('tr');"
" for (var i=0; i<likeTrs.length; i++)"
" {"
" var span = likeTrs[i].querySelector('th>span');"
" var rawdate = span.textContent;"
" var date = rawdate.split(' ')[0];"
""
" if (datemap.get(date) == undefined)"
" {"
" datemap.set(date, 1);"
" }"
" else"
" {"
" datemap.set(date, datemap.get(date)+1);"
" }"
" }"
" datemap.forEach(function (item, key) {"
" var datecount = [key, item];"
" result.push(datecount);"
" });"
""
" return result;"
"}"
"getLike();";
QString GetSafeUtf(const QString& _strData)
@@ -467,6 +497,12 @@ void SNaverBlog::slotLoadFinished(bool ok)
*/
break;
}
case E_CRAWL_MODE::LIKE:
{
m_pWebPage->runJavaScript(scriptLike, std::bind(&SNaverBlog::cbLike,this, _1));
break;
}
}
//emit signalDataOk(m_efData);
}
@@ -572,6 +608,24 @@ QString SNaverBlog::makeReplyUrl(const QString& _url)
}
QString SNaverBlog::makeLikeUrl(const QString& _url)
{
QStringList strList = _url.split("/");
QString strOut = "";
if(strList.size() < 4)
emit signalError(E_ERROR_CODE::OUT_DATED_CRAWLER, "Check Body and LikeUrl\n");
//url example : http://blog.naver.com/SympathyHistoryList.nhn?blogId=yewonerang&logNo=220984900374
strOut += "http://blog.naver.com/SympathyHistoryList.nhn?blogId=";
strOut += strList.at(3);
strOut += "&logNo=";
strOut += strList.at(4);
return strOut;
}
void SNaverBlog::cbBodyArticleDate(const QVariant& _result)
{
//qDebug() << "articledate";
@@ -743,6 +797,19 @@ void SNaverBlog::goReplyUrl()
go(makeReplyUrl(m_strUrl), E_CRAWL_MODE::REPLY);
}
void SNaverBlog::goLikeUrl()
{
m_bBodyProcessed = true;
if (!check(m_efData.body))
{
emit signalError(E_ERROR_CODE::BLOCK_ERROR, "Block or Check naver");
return;
}
go(makeLikeUrl(m_strUrl), E_CRAWL_MODE::LIKE);
}
void SNaverBlog::cbReply(const QVariant& _result)
{
//id, nickname, date, commment, order, strParent;
@@ -770,6 +837,24 @@ void SNaverBlog::cbReply(const QVariant& _result)
qDebug() << "cbReply";
qDebug() << m_efData.reply.size();
*/
// emit signalDataOk(m_efData);
goLikeUrl();
}
void SNaverBlog::cbLike(const QVariant& _result)
{
if (_result.isValid() && !_result.isNull())
{
QList<QVariant> results = _result.toList();
foreach (auto &result, results)
{
QStringList slResult = result.toStringList();
QString date = ((QString)slResult.at(0)).replace(".", "");
m_efData.like[date] = ((QString)slResult.at(1)).toInt();
}
}
emit signalDataOk(m_efData);
}

View File

@@ -11,7 +11,8 @@
enum class E_CRAWL_MODE
{
BODY = 0,
REPLY
REPLY,
LIKE
};
static const QString scriptArticleDate;
@@ -42,11 +43,13 @@ public:
private:
QString makeReplyUrl(const QString& _url);
QString makeLikeUrl(const QString& _url);
QString changeUrl(const QString& _url);
void initConnect();
bool check(const DataForm& _data);
bool check(const QVector<DataForm>& _data);
void goReplyUrl();
void goLikeUrl();
/*
DataForm getBody();
@@ -73,6 +76,8 @@ private:
void cbBodyArticleOrder(const QVariant& result);
void cbBodyReplyUrl(const QVariant& _result);
void cbBodyLikeCount(const QVariant& _result);
void cbReply(const QVariant& _result);
void cbLike(const QVariant& _result);
bool doneBodyCrawler(E_FUNC _func_type);
@@ -83,11 +88,10 @@ private:
static const QString scriptLikeCount;
static const QString scriptArticleNickname;
static const QString scriptArticleOrder;
bool m_abOk[E_FUNC_MAX];
void cbReply(const QVariant& _result);
static const QString scriptReply;
static const QString scriptLike;
bool m_abOk[E_FUNC_MAX];
private:
std::shared_ptr<SWebPage> m_pWebPage;

View File

@@ -15,8 +15,9 @@ State_s1_effect SNaverBlogProcess::processData(const EffectData& _data)
result.event_num = eventCode();
result.likecount = getlikeCount(_data);
//result.replybuzz = getReplyBuzz(_data);
result.replybuzz = getReplyBuzz(_data, m_pParam[E_PARAM_START_DATE]);
result.likebuzz = getLikeBuzz(_data, m_pParam[E_PARAM_START_DATE]);
result.totalbuzz = summaryLikeAndReply(result.replybuzz, result.likebuzz);
result.viewcount = getViewCount(_data);
result.interactioncount = getInteractionCount(_data);
result.replycount = getReplyCount(_data);

View File

@@ -0,0 +1,128 @@
#include "snaverurlvalidator.h"
#include <QStringList>
#include <QDebug>
const QString SNaverUrlValidator::m_strSubDomain = "www";
const QString SNaverUrlValidator::m_strProtocol = "http";
const QString SNaverUrlValidator::m_strBaseHost = "blog.naver.com";
const QString SNaverUrlValidator::m_strSecondaryHost = "blog.me";
SNaverUrlValidator::SNaverUrlValidator(QString url) : m_isBaseHost(false), m_isSecondaryHost(false)
{
m_strUrl = url.trimmed();
}
QString SNaverUrlValidator::makeUrl()
{
if (!validateUrl())
{
return "";
}
QString strUrl = m_strProtocol + "://" + m_strBaseHost + "/" + m_strUserId + "/" + m_strArticleNum;
return strUrl;
}
bool SNaverUrlValidator::validateUrl()
{
int nStartIndex = getHostStartPosition();
if (nStartIndex < 0)
{
return false;
}
nStartIndex = checkHost(nStartIndex);
if (nStartIndex < 0)
{
return false;
}
if (checkPath(nStartIndex) < 0)
{
return false;
}
return true;
}
int SNaverUrlValidator::getHostStartPosition()
{
int nHostStartPosition = m_strUrl.indexOf(':');
if (nHostStartPosition == -1)
{
return 0;
}
if (m_strUrl.at(nHostStartPosition+1) != '/' || m_strUrl.at(nHostStartPosition+2) != '/')
{
return -1;
}
return nHostStartPosition + 3;
}
int SNaverUrlValidator::checkHost(int _nHostStartPosition)
{
int nHostEndPosition = m_strUrl.indexOf('/', _nHostStartPosition) - 1;
if (nHostEndPosition < 0)
{
return -1;
}
m_isBaseHost = m_strUrl.contains(m_strBaseHost);
m_isSecondaryHost = m_strUrl.contains(m_strSecondaryHost);
if ((m_isBaseHost == false) && (m_isSecondaryHost == false))
{
return -2;
}
if (m_isSecondaryHost)
{
int nHostLength = nHostEndPosition - _nHostStartPosition + 1;
QString strHost = m_strUrl.mid(_nHostStartPosition, nHostLength);
QStringList listHostSplit = strHost.split('.');
for (int i=0; i<listHostSplit.count(); i++)
{
QString strHostSplit = listHostSplit.at(i);
if (listHostSplit.at(i) == m_strSubDomain)
continue;
m_strUserId = strHostSplit;
break;
}
}
return nHostEndPosition + 2;
}
int SNaverUrlValidator::checkPath(int _nHostStartPosition)
{
int nUrlLength = m_strUrl.length();
int nPathLength = nUrlLength - _nHostStartPosition + 1;
QString strPath = m_strUrl.mid(_nHostStartPosition, nPathLength);
QStringList pathList = strPath.split('/');
if (m_isBaseHost)
{
if (pathList.size() < 2)
{
return -1;
}
m_strUserId = pathList[0];
m_strArticleNum = pathList[1];
}
if (m_isSecondaryHost)
{
if (pathList.size() < 1)
{
return -2;
}
m_strArticleNum = pathList[0];
}
return 0;
}

View File

@@ -0,0 +1,33 @@
#ifndef SNAVERURLVALIDATOR_H
#define SNAVERURLVALIDATOR_H
#include <QString>
class SNaverUrlValidator
{
private:
static const QString m_strSubDomain;
static const QString m_strProtocol;
static const QString m_strBaseHost;
static const QString m_strSecondaryHost;
QString m_strUserId;
QString m_strArticleNum;
QString m_strUrl;
bool m_isBaseHost;
bool m_isSecondaryHost;
private:
bool validateUrl();
int getHostStartPosition();
int checkHost(int _nHostStartPosition);
int checkPath(int _nHostStartPosition);
public:
SNaverUrlValidator(QString url);
QString makeUrl();
};
#endif // SNAVERURLVALIDATOR_H

View File

@@ -95,7 +95,8 @@ bool SResultSender::send(const State_s1_effect& _result)
QSqlQuery query(db);
query.prepare(strQuery);
query.bindValue(":event_num", _result.event_num);
query.bindValue(":replybuzz", _result.replybuzz);
// query.bindValue(":replybuzz", _result.replybuzz);
query.bindValue(":replybuzz", _result.totalbuzz);
query.bindValue(":replycount", _result.replycount);
query.bindValue(":likecount", _result.likecount);
query.bindValue(":interactioncount", _result.interactioncount);

View File

@@ -5,6 +5,7 @@
#include <QDate>
#include <QString>
#include <memory>
#include <QJsonArray>
class STableWidgetItem : public QTableWidgetItem
{
@@ -195,13 +196,16 @@ struct EffectData
{
DataForm body;
QVector<DataForm> reply;
QMap<QString, int> like;
};
struct State_s1_effect
{
int event_num;
QString view_buzz;
QString replybuzz;
QJsonArray replybuzz;
QJsonArray likebuzz;
QString totalbuzz;
int replycount;
int likecount;
int viewcount;

View File

@@ -67,5 +67,22 @@ QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code)
static_cast<int>(_code) < static_cast<int>(E_ERROR_CODE::MAX))
return ERROR_MESSAGE_CODE[static_cast<int>(_code)];
else
return ERROR_MESSAGE_CODE[static_cast<int>(E_ERROR_CODE::UNKNOWN_ERROR)];
return ERROR_MESSAGE_CODE[static_cast<int>(E_ERROR_CODE::UNKNOWN_ERROR)];
}
QString convertNaverBlogMeUrl(const QString& _str)
{
QStringList listSplitUrl = _str.split("/");
if (listSplitUrl.count() != 4)
return _str;
QString strPostNumber = listSplitUrl[3];
QStringList listSplitHostUrl = listSplitUrl[2].split(".");
if (listSplitHostUrl.count() != 3)
return _str;
QString strUserId = listSplitHostUrl[0];
QString strConvertedUrl = "http://blog.naver.com/" + strUserId + "/" + strPostNumber;
return strConvertedUrl;
}

View File

@@ -8,5 +8,6 @@ void messageBoxError(const QString& title, const QString &body);
QString errorCodeToString(E_ERROR_CODE _error_code);
E_ERROR_CODE strErrorCodeToEnumErrorCode(const QString& _str);
QString EnumErrorCodetostrErrorCode(E_ERROR_CODE _code);
QString convertNaverBlogMeUrl(const QString& _str);
#endif // SUTILFUNCTION