diff --git a/src/pageManager.cpp b/src/pageManager.cpp index a660688..69c677e 100644 --- a/src/pageManager.cpp +++ b/src/pageManager.cpp @@ -150,7 +150,7 @@ Reply PageManager::getServerRequest(std::string protocol, std::string Url, bool curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); //follows redirection curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); // Funktion zum Speichern des outputs in einem string curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); //Legt die Variable readbuffer fest - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"); + curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT); /*"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0" */ if(useCookies) curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFilePath.c_str()); @@ -205,6 +205,7 @@ Reply PageManager::getServerRequest(std::string protocol, std::string Url, bool res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); if( res != CURLE_OK || !url ) { perror((std::string("\33[2K\r => Error: curl_easy_getinfo failed: ") + curl_easy_strerror(res)).c_str()); + curl_easy_cleanup(curl); return Reply("-1"); } else returnUrl=url; @@ -248,8 +249,15 @@ Reply PageManager::getServerRequest(std::string protocol, std::string Url, bool } -int PageManager::downLoadToFile(std::string filePath, std::string url) +int PageManager::downLoadToFile(std::string filePath, std::string url, int rek_num) { + if(rek_num > 15) { + if(debugMode) + std::cout << " -> EXIT(): downLoadToFile Out of trys..." << std::endl; + exit(0); + } + + CURL *curl_handle; FILE *pagefile; CURLcode res; @@ -290,11 +298,28 @@ int PageManager::downLoadToFile(std::string filePath, std::string url) /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); - //Sock5Proxy für Curl - if(sock5Proxy != "") + //Settings + if(sock5Proxy != "") { + curl_easy_setopt(curl_handle, CURLOPT_PROXY, sock5Proxy.c_str() ); //Sock5Proxy für Curl - if(debugMode) - std::cout << "\33[2K\r => INFO: Proxy:'" << sock5Proxy << "'" << std::endl; + if(debugMode) + std::cout << "\33[2K\r => INFO: Proxy for download:'" << sock5Proxy << "'" << std::endl; + + if(cloudflare_protec) { + if(debugMode) + std::cout << "\33[2K\r => INFO: Proxy username for cloudflare :'" << torAnmeldeNamen << ":passwd" << "'" << std::endl; + CURLcode setoptResult = curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, (torAnmeldeNamen + ":passwd").c_str()); + if (setoptResult != CURLE_OK) { + std::cerr << "Setting CURLOPT_URL failed: " << curl_easy_strerror(setoptResult) << std::endl; + } + } + + } else { + if(debugMode) + std::cout << "\33[2K\r => INFO: Es wird kein Proxy verwendet: ADDR of PM:" << this << " -> prox: " << sock5Proxy << std::endl; + } + + //User Agent curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0"); @@ -305,6 +330,10 @@ int PageManager::downLoadToFile(std::string filePath, std::string url) //Error 404, for example => not found curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, true); + //Against cloudflare! + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); //follows redirection + curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, USER_AGENT); + int maxTimeOut = 5; bool failed = false; for (int timeout = 1; timeout <= maxTimeOut; ++timeout) { @@ -319,6 +348,7 @@ int PageManager::downLoadToFile(std::string filePath, std::string url) sleep(1); } } else { + //Sonst ( wenns functioniert) schleife verlassen break; } @@ -330,6 +360,48 @@ int PageManager::downLoadToFile(std::string filePath, std::string url) return 4; } + + char *url_after; + //Get Url + res = curl_easy_getinfo(curl_handle, CURLINFO_EFFECTIVE_URL, &url_after); + if( res != CURLE_OK || !curl_handle ) { + perror((std::string("\33[2K\r => Error: curl_easy_getinfo failed: ") + curl_easy_strerror(res)).c_str()); + curl_easy_cleanup(curl_handle); + return 12; + } else if(url_after){ + + if(std::string(url_after).find("/_ray/pow") != std::string::npos) { + std::cout << " \33[2K\r => CLOUD FLARE PROTECTION (Try " << rek_num << "/15)..." << std::flush; + usleep(400000); + + if(this->debugMode && std::string(url_after) != "ifconfig.me/ip") { + std::string out_ip = this->getServerRequest("https://", "ifconfig.me/ip").html; + + if(out_ip.find("") == std::string::npos && [](const std::string& str) { return std::count(str.begin(), str.end(), '.'); }(out_ip) == 3) + std::cout << "\33[2K\r -> Current IP: " << out_ip << std::endl; + else + std::cout << "\33[2K\r -> Current IP: " << "Unknown: " << std::endl; + + } + cloudflare_protec = true; + generateNewTorAnmeldeNamen(torAnmeldeNamen); + + return this->downLoadToFile(filePath, url, rek_num + 1); + + // std::cout << "/_ray/pow:\n" << readBuffer << std::endl; + // this->writeToFile( std::vector{"./output.text"}, readBuffer ); + + // QWebEngineView view; + // view.load(QUrl("https://qt-project.org/")); + // view.resize(1024, 750); + // view.show(); + + // qApp->exec(); + } + + } + + /* cleanup curl stuff */ curl_easy_cleanup(curl_handle); diff --git a/src/pageManager.h b/src/pageManager.h index 5a08f45..06a9a8a 100644 --- a/src/pageManager.h +++ b/src/pageManager.h @@ -24,6 +24,10 @@ #include + +#define USER_AGENT "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + + struct Reply { Reply() {} Reply(std::string value_both) : html(value_both), url(value_both) {} @@ -56,7 +60,7 @@ public: void get_terminal_size(int& width); Reply getServerRequest(std::string protocol, std::string Url, bool useCookies = false, std::string data = "", bool generateCookieFile = false, bool UrlAfterRedirectOnlyNeeded = false, std::string cookieFilePath = "", int rek_num = 0); - int downLoadToFile(std::string filePath, std::string url); + int downLoadToFile(std::string filePath, std::string url, int rek_num = 0); int login(PAGE page, Account account, std::string cookieFilePath); Reply getUrlAfterRedirect(std::string p, std::string Url, std::string cookieFilePath); diff --git a/src/parameterManager.h b/src/parameterManager.h index 4d0225c..0536452 100644 --- a/src/parameterManager.h +++ b/src/parameterManager.h @@ -25,7 +25,7 @@ #define UpdaterCloudUrlWithPath "https://cloud.obermui.de/s/tXz7SWdaPJ7TacZ/download?path=%2F&files=" #define SecondUpdaterCloudUrlWithPath "https://snew4.obermui.de/download?path=%2F&files=" -#define VERSION "6.1.0" +#define VERSION "6.1.1" #define DEFAULT_FILE_VERSION "2.5" //default, anime, normal,