From 8b717bccb1065ba5a38208fb073045e43fb8ef5e Mon Sep 17 00:00:00 2001 From: wumu <mayi@mayi.com> Date: 星期三, 12 二月 2025 23:08:00 +0800 Subject: [PATCH] 250212 --- historydata.h | 9 +++ historydata.cpp | 131 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletions(-) diff --git a/historydata.cpp b/historydata.cpp index 0cae05a..1ee12b0 100644 --- a/historydata.cpp +++ b/historydata.cpp @@ -4,6 +4,14 @@ #include <QMessageBox> #include <QDebug> #include <QDateTime> +#include <QNetworkCookie> +#include <QNetworkReply> +#include <QJsonDocument> +#include <QJsonObject> +#include <QJsonArray> +#include <QDateTime> + +#pragma execution_character_set("utf-8") HistoryData::HistoryData(QWidget *parent) : QMainWindow(parent), @@ -12,6 +20,33 @@ ui->setupUi(this); initMySQL(); // 鍒濆鍖朚ySQL + + // 澶勭悊鏁版嵁鐖彇鐨勬搷浣� + // 妯℃嫙娴忚鍣ㄧ殑鍙傛暟 + QString userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; + m_cookie = "__utma=1.731742638.1647403301.1699341909.1700229030.32; device_id=196eef62baf016c7d95a22752d9bdbab; smidV2=20240414233939e95389ecf7ecd2f4d08524ce770aacd500753aa68e9640320; s=c611de27gr; cookiesu=651726298794778; xq_a_token=220b0abef0fac476d076c9f7a3938b7edac35f48; xqat=220b0abef0fac476d076c9f7a3938b7edac35f48; xq_r_token=1d46f0ed628506486164e5055a4993f9b54b2f4c; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTcyOTIxMjc4NCwiY3RtIjoxNzI3NDkwOTU3MjA0LCJjaWQiOiJkOWQwbjRBWnVwIn0.C_GmKEhTaaioDMLWkgZyMXDl4duYEVmsdJHsTi7gbcNz0Tohc-uxHsaw0yBT5k-qmbrJ_RaLMCSxy06v14-R3dwL-MsiKRHxHa5qvQZN4BjEgvPRkqqvPgE_fkPLte8qQOEgd5iVkhr-4mjip0-9WCeXYiH7DygxFOBXGlgoPtpPzAtOTm5TWJmXh0ipDsIZxfNOl8jipXYaIdkv_kqLul5gqiBi5qqnwONDa24Zx-Kvpm8ySWiPFBLzZBqTuRBs4oKAMpSdOiYGLVL7dcSDDZyWqAexmrN4f19hkmd6gBHL4dCczRMDGYc1e98sQtlbZ5lgeEuuM24jjcuwCxsxXQ; u=651726298794778; Hm_lvt_1db88642e346389874251b5a1eded6e3=1727099939,1727251802,1727488707,1727491020; HMACCOUNT=1628106D67895387; acw_tc=2760828017275244258732552e9880f861be6db0c40facbdd5f223490decc2; acw_sc__v2=66f7ee8290dc3f63112948801ef331b8c97ccb35; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1727524485; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=t00N841S/BEpxTGOoJrbm0blWik12om0ew/whcq/V2DNtyEA8um7J+yzeGOli+6iP/TrvrH0YKH2kHlsmDb5EQ%3D%3D; ssxmod_itna=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GAqGNK3DZDiqAPGhDC8RzeL4Ko7+e2aeQvSeopd5pYDk0Ge5TB0PIjaIDB3DEx06TCCQxiiSDCeDIDWeDiDG4Gm4qGtDpxG=DjDytZ9TtDm4GWGqDmDGYBWqDgDYQDGwIXD7QDIqtW07tQDDNQKpAKDiYeHlL5uMRMtOrK7DtDjdTD/3+kZCbCcPwVFeFO=nPcDB6wxBjZRq00Un+g4mNqLYf4IDAxQuYKtgheYYoAfDhTKhhLSGx4tGY4+GDKSiMS2DDAIvdKeD; ssxmod_itna2=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GDA69mqD/YttDFhxMltFKApT7bCMH+bytp7GQQyCbBWukeAF3+jxeN2wLjbQAFcdwbeNeoohjQ4qtEnLg4TKyX2LqVL=CGaV=GqZZqbDby8DFnFbgWiZEH8zoBzBCbzqWeqwoPq7/TpL=gIRY8sVhEpnWWHQU8sz+S8=+8oRerHq0wtQnSzyQDK7Dmvr3a+VY7fezRmxKF=bDeqexYUbuuzw2eR3In9evW6tzHbQY6vp=AIOUc9l6vc0vOl9plD6D07zGGQ41uxpii2Y5s7KvYQDWGYExD7=DYKKeD=="; + QByteArray cookieByte = m_cookie.toUtf8(); + QList<QNetworkCookie> list; + list.push_back(QNetworkCookie(cookieByte)); + + QVariant var; + var.setValue(list); + // 璁剧疆瑕佽闂殑缃戝潃 + m_request.setUrl(QUrl("https://xueqiu.com/?md5__1038=QqGxcDnDyiitnD05o4%2Br%3Di%3De0KDtYqCDRWOoD")); + // 璁剧疆璇锋眰澶达紝鐢ㄦ埛浠g悊锛岀敤鏉ユā鎷熸祻瑙堝櫒 + m_request.setHeader(QNetworkRequest::UserAgentHeader,userAgent); + // 璁剧疆cookie + //m_request.setHeader(QNetworkRequest::CookieHeader, var); + + // 鏌ョ湅manager閮芥敮鎸佸摢浜涘崗璁� + qDebug()<<"鍘嗗彶鍒嗘瀽--鏀寔鐨勫崗璁�:"<<m_manager.supportedSchemes(); + // 鍏宠仈淇″彿妲斤紝褰撹姹傜鐞嗗璞″畬鍏ㄦ墦寮�缃戦〉涔嬪悗锛屼細灏嗘暟鎹粰妲藉嚱鏁板鐞� + connect(&m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(showAplyData(QNetworkReply*))); + + // 鍘昏姹傞椤� + m_manager.get(m_request); + + } HistoryData::~HistoryData() @@ -62,7 +97,11 @@ for(auto code:m_codeNames.keys()){ QString url = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%3&type=before&count=-%4&indicator=kline,pe,market_capital,ma").arg(code) .arg(time_tar).arg(type).arg(dayCnt); - qDebug()<<"url:"<<url; + //qDebug()<<"url:"<<url; + // 鍙戣捣璇锋眰 鐖彇鏁版嵁 + m_request.setUrl(QUrl(url)); + m_manager.get(m_request); + //break; // 娴嬭瘯鐢� } @@ -73,3 +112,93 @@ m_codeNames = codeNames; qDebug()<<"size:"<<m_codeNames.size(); } + +void HistoryData::showAplyData(QNetworkReply *reply) +{ + qDebug()<<"history鏀跺埌鍝嶅簲"; + // 灏嗗搷搴旂殑鏁版嵁锛屼竴鎶婅鍙栧畬锛屾斁鍒板瓧鑺傛暟缁勯噷闈㈡潵澶勭悊 + QByteArray buffer = reply->readAll(); + + // 灏嗘暟鎹啓鍒版枃浠朵腑锛屾柟渚胯瀵熸暟鎹唴瀹� +// QFile file("data_history.txt"); +// file.open(QIODevice::ReadWrite | QIODevice::Text); +// QTextStream out(&file); +// out << buffer << endl; +// file.close(); + + // 涓嬮潰浣跨敤JSON杩涜鏁版嵁澶勭悊 + if(reply->url().toString().indexOf("https://xueqiu.com/") != -1){ + qDebug()<<"鍙戠幇棣栭〉url"; + qDebug()<<buffer; + + }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/chart/kline.json") != -1){ + qDebug()<<"鏌ョ湅涓偂鎯呭喌:"; + getOneStock(buffer); + + } +} + +/* +{"data":{"symbol":"SZ301633","column": +["timestamp","volume","open","high","low","close","chg","percent","turnoverrate","amount","volume_post","amount_post","ma5","ma10","ma20","ma30","pe","market_capital"], +"item":[[1730908800000,10787401,187.0,187.0,133.1,137.13,99.19,261.44,77.5,1.608757505E9,1300,178269.0,null,null,null,null,67.0447,7.6353984E9], +[1730995200000,8348116,145.8,158.5,130.06,132.9,-4.23,-3.08,59.97,1.19303472E9,1000,132900.0,null,null,null,null,64.9765,7.399872E9], +*/ +void HistoryData::getOneStock(QByteArray &buffer) +{ + + QJsonDocument jd = QJsonDocument::fromJson(buffer); + if(jd.isObject()){ + QJsonObject jObject = jd.object(); + QJsonArray jArr = jObject.value("data").toObject().value("item").toArray(); // 閫氳繃閿�煎鍙栧�� + int cnt = jArr.count(); + qDebug()<<"鏁扮粍size:"<<cnt; + QString symbol = jObject.value("data").toObject().value("symbol").toString(); + QString code = symbol; // 鑲$エ浠e彿 + QString name = m_codeNames[code]; + qDebug()<<"鍘嗗彶:"<<code<<symbol; + + // 浠ユ壒閲忓啓鍏ョ殑鏂瑰紡鏉ヨ幏鍙栧骞存暟鎹� + QString sql = "insert into stock_day_info (name,code,market_capital,percent,open,high,low,close,amount,volume,turnover_rate,pe_ttm,time_trade) values "; + //qDebug()<<"sql 1:"<<sql; + for(int i=0;i<cnt;++i){ + qint64 timestamp = jArr.at(i).toArray().at(0).toVariant().toLongLong(); + double open = jArr.at(i).toArray().at(2).toVariant().toDouble(); + double high = jArr.at(i).toArray().at(3).toVariant().toDouble(); + double low = jArr.at(i).toArray().at(4).toVariant().toDouble(); + double close = jArr.at(i).toArray().at(5).toVariant().toDouble(); + double percent = jArr.at(i).toArray().at(7).toVariant().toDouble(); + double turnoverrate = jArr.at(i).toArray().at(8).toVariant().toDouble(); + double amount = jArr.at(i).toArray().at(9).toVariant().toDouble(); + double pe_ttm = jArr.at(i).toArray().at(16).toVariant().toDouble(); + double market_capital = jArr.at(i).toArray().at(17).toVariant().toDouble(); + long long volume = jArr.at(i).toArray().at(1).toVariant().toLongLong()/100; + + //long long amount = jArr.at(i).toArray().at(9).toVariant().toLongLong()/100000000; // 浜� + QString curDateTime = QDateTime::fromMSecsSinceEpoch(timestamp).toString("yyyy-MM-dd"); + //qDebug()<<curDateTime<<close<<volume<<amount; + + // 澶勭悊鏁版嵁淇濆瓨鍒版ā鍨嬩腑 + QString vals = QString("('%1','%2',%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,'%13')").arg(name).arg(code).arg(QString::number(market_capital)) + .arg(QString::number(percent)).arg(QString::number(open)).arg(QString::number(high)).arg(QString::number(low)). + arg(QString::number(close)).arg(QString::number(amount)).arg(QString::number(volume)).arg(QString::number(turnoverrate)) + .arg(QString::number(pe_ttm)).arg(curDateTime); + if(i != cnt - 1){ + vals.append(","); + } + sql.append(vals); + //qDebug()<<"sql 3:"<<sql; + + } + qDebug()<<"over:"<<sql.size(); + //qDebug()<<"sql 2:"<<sql; // 澶ぇ浜� 鏄剧ず涓嶅嚭鏉� + + QSqlQuery que(db); + if(que.exec(sql)){ + qDebug()<<"intsert ok"; + }else{ + qDebug()<<"intsert fail"<<que.lastError().text(); + } + } + +} diff --git a/historydata.h b/historydata.h index 5444940..1338cf3 100644 --- a/historydata.h +++ b/historydata.h @@ -3,6 +3,8 @@ #include <QMainWindow> #include <QMap> +#include <QNetworkAccessManager> +#include <QNetworkRequest> #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> @@ -27,6 +29,9 @@ void on_pushButton_update_clicked(); void putCodeNames(QMap<QString,QString> &codeNames); + + void showAplyData(QNetworkReply* reply); + void getOneStock(QByteArray &buffer); private: Ui::HistoryData *ui; @@ -34,6 +39,10 @@ QSqlDatabase db; QMap<QString,QString> m_codeNames; // 鑲$エ浠e彿鍜屽悕瀛� + + QNetworkRequest m_request; // 鐢ㄤ簬绠$悊璇锋眰澶寸殑 + QString m_cookie; // 缂撳瓨 + QNetworkAccessManager m_manager; // 鐢ㄤ簬绠$悊http璇锋眰鍙婂搷搴旂殑 }; #endif // HISTORYDATA_H -- Gitblit v1.8.0