From 987254bf420571a7b89391d8227569a1b5774019 Mon Sep 17 00:00:00 2001
From: wumu <mayi@mayi.com>
Date: 星期五, 21 二月 2025 23:25:48 +0800
Subject: [PATCH] 250221

---
 historydata.cpp |  227 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 226 insertions(+), 1 deletions(-)

diff --git a/historydata.cpp b/historydata.cpp
index 0cae05a..8dd2e2b 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),
@@ -11,7 +19,54 @@
 {
     ui->setupUi(this);
 
+    // 娉ㄥ唽鍏冪被鍨�
+    qRegisterMetaType<QVector<QVector<QString>>>("QVector<QVector<QString>>");
+    qRegisterMetaType<QVector<QVector<QString>>>("QVector<QVector<QString>> &");
+
+    // ui鐩稿叧
+    ui->dateEdit->setDate(QDate::currentDate());
+    m_model = new QStandardItemModel(1,9,this);
+
+    m_customModel = new CustomSortProxyModel; // 鍙嚜瀹氫箟鎺掑簭鐨勬ā鍨�
+    m_customModel->setSourceModel(m_model); // 璁剧疆婧愭ā鍨�
+
+    //ui->tableView->setModel(m_model);
+    ui->tableView->setModel(m_customModel);
+    // 琛ㄦ牸鍒楁帓搴�
+    ui->tableView->setSortingEnabled(true);
+
+    QStringList labels;
+    labels<<"鑲$エ鍚嶅瓧"<<"鑲$エ浠e彿"<<"甯傚��(浜�)"<<"娑ㄨ穼骞�"<<"鏀剁洏浠�"<<"鎴愪氦棰�(浜�)"<<"鎴愪氦閲�"<<"鎹㈡墜鐜�"<<"PE_TTM";
+    m_model->setHorizontalHeaderLabels(labels);
+
     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 +117,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 +132,169 @@
     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();
+        }
+    }
+
+}
+
+void HistoryData::on_pushButton_search_clicked()
+{
+    // 鎻愮ず鏌ヨ绛夊緟
+    ui->statusbar->showMessage("鏌ヨ涓�...璇疯�愬績绛夊緟缁撴灉...");
+
+    QString searchTime = ui->dateEdit->text();
+    qDebug()<<"鏌ヨ鐨勬椂闂�:"<<searchTime;
+    QString sql = QString("select name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm from stock_day_info where time_trade = '%1'").arg(searchTime);
+    qDebug()<<"sql:"<<sql;
+
+    m_modelDatas.clear(); // 娓呯┖鏁扮粍涓殑鏁版嵁
+
+    qint64 tt = QDateTime::currentMSecsSinceEpoch();
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"select ok";
+        m_model->setRowCount(0); // 閲嶇疆妯″瀷琛屾暟
+        int rows = 0;
+        while (que.next()) {
+            QString name = que.value(0).toString();
+            QString code = que.value(1).toString();
+            QString market_capital = QString::number(que.value(2).toDouble()/100000000);
+            QString percent = que.value(3).toString();
+            QString close = que.value(4).toString();
+            QString amount = QString::number(que.value(5).toDouble()/100000000);
+            QString volume = que.value(6).toString();
+            QString turnover_rate = que.value(7).toString();
+            QString pe_ttm = que.value(8).toString();
+
+            m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm});
+
+            QList<QStandardItem*> items;
+            items.append(new QStandardItem(name));
+            items.append(new QStandardItem(code));
+            items.append(new QStandardItem(market_capital));
+            //items.append(new QStandardItem(percent));
+            QStandardItem *percentItem =  new QStandardItem(percent);
+            if(percent.toDouble() > 0){
+                percentItem->setData(QColor("red"),Qt::DecorationRole); // 娣诲姞涓�涓楗扮殑棰滆壊涓虹孩鑹�
+                percentItem->setData(QColor("red"),Qt::TextColorRole);  // 灏嗗瓧浣撻鑹茶缃负绾㈣壊
+                items.at(0)->setData(QColor("red"),Qt::TextColorRole);  // 灏嗚偂绁ㄥ悕瀛楄缃负绾㈣壊
+             }
+            else if(percent.toDouble() < 0){
+                percentItem->setData(QColor("green"),Qt::BackgroundColorRole);
+                items.at(0)->setData(QColor("green"),Qt::TextColorRole);
+            }
+            items.append(percentItem);
+
+            items.append(new QStandardItem(close));
+            items.append(new QStandardItem(amount));
+            items.append(new QStandardItem(volume));
+            items.append(new QStandardItem(turnover_rate));
+            items.append(new QStandardItem(pe_ttm));
+            m_model->appendRow(items);
+            rows++;
+        }
+        qDebug()<<"鏌ヨ鍒拌鏁�:"<<rows;
+
+    }else{
+        qDebug()<<"select fail"<<que.lastError().text();
+    }
+    // 鏈�鍚庢彁绀哄畬鎴�
+    qint64 need = QDateTime::currentMSecsSinceEpoch()-tt;
+    ui->statusbar->showMessage(QString("鑰楁椂:%1 姣,鏌ヨ瀹屾垚.").arg(QString::number(need)),10*1000);
+    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+    //emit sendHistoryModel(m_modelDatas); // 缁欎俊鎭睍绀哄彂妯″瀷
+
+    ui->textBrowser->append(QString("鏌ヨ鏃ユ湡:%1 鑰楁椂: %2 姣 鏌ュ埌鏉℃暟:%3").arg(searchTime).arg(QString::number(need)).arg(QString::number(m_model->rowCount())));
+}
+
+void HistoryData::on_pushButton_2_clicked()
+{
+    //emit sendHistoryModel(m_modelDatas); // 缁欎俊鎭睍绀哄彂妯″瀷
+    emit sendHistoryModel(m_model);
+}

--
Gitblit v1.8.0