Cherry-picking of railway tickets from RZD based on price
| Revision | e5b7300545e7a01ba321c8a972c34912c75e5d84 (tree) |
|---|---|
| Time | 2024-03-03 15:08:17 |
| Author | Sergey Gusarov <laborer2008@gmai...> |
| Commiter | Sergey Gusarov |
Loading proxy list to the object
| @@ -11,7 +11,8 @@ | ||
| 11 | 11 | #include <ctools/predef/external_headers.h> |
| 12 | 12 | |
| 13 | 13 | CT_BEGIN_EXTERNAL_HEADERS |
| 14 | -#include <QNetworkAccessManager> | |
| 14 | +# include <QNetworkAccessManager> | |
| 15 | +# include <QNetworkProxy> | |
| 15 | 16 | CT_END_EXTERNAL_HEADERS |
| 16 | 17 | |
| 17 | 18 | #include <cpptools/string.hpp> |
| @@ -42,10 +43,12 @@ | ||
| 42 | 43 | |
| 43 | 44 | private: |
| 44 | 45 | static const std::string kPath; |
| 46 | + QList<QNetworkProxy> proxyList; | |
| 45 | 47 | |
| 46 | 48 | QNetworkAccessManager networkAccessManager; |
| 47 | 49 | |
| 48 | 50 | void reset(); |
| 51 | + void loadProxyList(); | |
| 49 | 52 | |
| 50 | 53 | private slots: |
| 51 | 54 | void slotFinished(QNetworkReply* networkReply); |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | <RCC> |
| 2 | 2 | <qresource prefix="/"> |
| 3 | 3 | <file>resources/qtbase_ru.qm</file> |
| 4 | + <file>proxy_list/http.txt</file> | |
| 4 | 5 | </qresource> |
| 5 | 6 | </RCC> |
| @@ -9,9 +9,15 @@ | ||
| 9 | 9 | #include "rzd.hpp" |
| 10 | 10 | |
| 11 | 11 | CT_BEGIN_EXTERNAL_HEADERS |
| 12 | +# include <random> | |
| 13 | + | |
| 14 | +# include <QFile> | |
| 12 | 15 | CT_END_EXTERNAL_HEADERS |
| 13 | 16 | |
| 17 | +#include <ctools/std/math.h> | |
| 18 | + | |
| 14 | 19 | #include <qttools/safe_connect.hpp> |
| 20 | +#include <qttools/types.hpp> | |
| 15 | 21 | |
| 16 | 22 | |
| 17 | 23 | /* *INDENT-OFF* */ |
| @@ -22,8 +28,11 @@ | ||
| 22 | 28 | |
| 23 | 29 | Rzd::Rzd() |
| 24 | 30 | : |
| 31 | + proxyList(), | |
| 25 | 32 | networkAccessManager() |
| 26 | 33 | { |
| 34 | + loadProxyList(); | |
| 35 | + | |
| 27 | 36 | qttools::safeConnect(&networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotFinished(QNetworkReply*))); |
| 28 | 37 | qttools::safeConnect(&networkAccessManager, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), |
| 29 | 38 | this, SLOT(slotNetworkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility))); |
| @@ -36,6 +45,55 @@ | ||
| 36 | 45 | networkAccessManager.clearAccessCache(); |
| 37 | 46 | } |
| 38 | 47 | |
| 48 | +void Rzd::loadProxyList() | |
| 49 | +{ | |
| 50 | + const QString kFolder = ":/proxy_list/"; | |
| 51 | + const QString kFile = kFolder + "http.txt"; | |
| 52 | + | |
| 53 | + QFile file(kFile); | |
| 54 | + QByteArray ba; | |
| 55 | + QByteArrayList baList; | |
| 56 | + | |
| 57 | + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) | |
| 58 | + CPT_THROW(cpptools::exceptions::IllegalStateException); | |
| 59 | + | |
| 60 | + ba = file.readAll(); | |
| 61 | + baList = ba.split('\n'); | |
| 62 | + | |
| 63 | + file.close(); | |
| 64 | + | |
| 65 | + const size_t kNumberOfProxies = 100; | |
| 66 | + | |
| 67 | + for (size_t i = 0; i < kNumberOfProxies; i++) | |
| 68 | + { | |
| 69 | + const int kRandomIndex = ctools::iround16((static_cast<double>(std::rand()) / RAND_MAX) * (baList.length() - 1)); | |
| 70 | + const QString kS = baList[kRandomIndex]; | |
| 71 | + | |
| 72 | + const QStringList kParts = kS.split(':'); | |
| 73 | + | |
| 74 | + CPT_THROW_IF(kParts.length() != 2, cpptools::exceptions::UnexpectedValueException); | |
| 75 | + | |
| 76 | + const QString kIp = kParts[0]; | |
| 77 | + const QString kPort = kParts[1]; | |
| 78 | + | |
| 79 | + bool ok; | |
| 80 | + uint port = kPort.toUInt(&ok); | |
| 81 | + | |
| 82 | + CPT_THROW_IF(!ok, cpptools::exceptions::StringConvertionException); | |
| 83 | + | |
| 84 | + quint16 port16; | |
| 85 | + | |
| 86 | + if (port <= UINT16_MAX) | |
| 87 | + port16 = static_cast<quint16>(port); | |
| 88 | + else | |
| 89 | + CPT_THROW(cpptools::exceptions::UnexpectedValueException); | |
| 90 | + | |
| 91 | + QNetworkProxy networkProxy(QNetworkProxy::HttpProxy, kIp, port16); | |
| 92 | + | |
| 93 | + proxyList.append(networkProxy); | |
| 94 | + } | |
| 95 | +} | |
| 96 | + | |
| 39 | 97 | std::string Rzd::getQuery(const std::string path, const std::list<std::string> params, const QNetworkAccessManager::Operation operation) |
| 40 | 98 | { |
| 41 | 99 |