#include "pageManager.h" PageManager::PageManager(std::string sock5ProxyOnlyAddress, std::string cookieFilePath) : sock5Proxy("socks5://" + sock5ProxyOnlyAddress), cookieFilePath(cookieFilePath) { curl_global_init(CURL_GLOBAL_ALL); } PageManager::~PageManager() { curl_global_cleanup(); } void PageManager::setProxy(std::string ip, int port) { this->sock5Proxy = "socks5://" + ip + ":" + std::to_string(port); } void PageManager::setCookieFilePath(std::string path) { this->cookieFilePath = path; } void PageManager::setDebugMode(bool status) { this->debugMode = status; } size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { //Function für CURL static_cast(userp)->append(static_cast(contents),size * nmemb); return size * nmemb; } Reply PageManager::getServerRequest(std::string Url, bool useCookies, std::string data, bool generateCookieFile) { CURL *curl; CURLcode res; std::string readBuffer; char *url; std::string returnUrl; std::cout << ( "\33[2K\rLade: '" + Url + "'..." ) << std::flush; curl = curl_easy_init(); if(!curl) { perror("\33[2K\r => Error: Curl easy init failed"); return Reply("-1"); } //Settings curl_easy_setopt(curl, CURLOPT_URL, Url.c_str()); //Url für Curl curl_easy_setopt(curl, CURLOPT_PROXY, sock5Proxy.c_str() ); //Sock5Proxy für Curl 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 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"); if(useCookies) curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFilePath.c_str()); if(data != "") curl_easy_setopt (curl, CURLOPT_POSTFIELDS, data.c_str()); if(generateCookieFile) curl_easy_setopt (curl, CURLOPT_COOKIEJAR, cookieFilePath.c_str()); int maxTimeout = 10; for (int timeout = 1; timeout <= maxTimeout; ++timeout) { /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); std::cout << "\33[2K\r" << std::flush; if(res != CURLE_OK) { if(timeout == maxTimeout) { perror((std::string("\33[2K\r => Error: curl_easy_perform() failed: ") + curl_easy_strerror(res)).c_str()); return Reply("-1"); } else { std::cout << std::string( "\33[2K\r => Warning: Versuch " + std::to_string(timeout) + " von " + std::to_string(maxTimeout) + ": curl_easy_perform() failed: " + curl_easy_strerror(res) )<< std::flush; sleep(1); } } else { break; } } //Get Url 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()); return Reply("-1"); } else returnUrl=url; /* always cleanup */ /* Mach den Griff zu, schreib die Kekse! */ curl_easy_cleanup(curl); return Reply(readBuffer, returnUrl); } int PageManager::login(Account account) { if(debugMode) std::cout << " > Melde mit neuem Account an: Email: " << account.Email << " Passowort: " << account.Password << std::endl; std::string html = getServerRequest("https://s.to/login", false, std::string("email=" + account.Email + "&password=" + account.Password), true ).html; if(html == "" ) return 0; else if (html.find("Das Feld Email muss eine gültige E-Mail-Adresse enthalten.") != std::string::npos) std::cout << " => Error: Login failed: Das Feld Email muss eine gültige E-Mail-Adresse enthalten." << std::endl << " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl; else if (html.find("Das Passwort ist nicht korrekt") != std::string::npos) std::cout << " => Error: Login failed: Das Passwort ist nicht korrekt." << std::endl << " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl; else if (html.find("Ein Account mit dieser E-Mail Adresse wurde nicht gefunden.") != std::string::npos) std::cout << " => Error: Login failed: Ein Account mit dieser E-Mail Adresse wurde nicht gefunden." << std::endl << " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl; else if(html == "-1") return -1; else std::cout << " => Error: Login failed: Keine Weiterleitung bei Login." << std::endl << " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl; return -1; } std::string PageManager::getUrlAfterRedirect(std::string Url) { return getServerRequest(Url, true).url; } std::string PageManager::checkName(std::string Name) { std::string name = replace(Name, " ", "-"); std::string html = getServerRequest("https://s.to/serie/stream/" + name).html; if(html.find("Die gewünschte Serie wurde nicht gefunden oder ist im Moment deaktiviert.") != std::string::npos) { std::cout << "\33[2K\r => Error: Die gewünschte Serie wurde nicht gefunden oder ist im Moment deaktiviert: " << Name << std::endl; return "-1"; } else if (html.find("404 - Seite nicht gefunden") != std::string::npos) { std::cout << "\33[2K\r => Error: Ungültiger Name: " << Name << std::endl; return "-1"; } else if (html == "-1") { return "-1"; } else { std::cout << "\33[2K\r > Name: " << name << std::endl; return name; } } std::string PageManager::getLinks(std::string HTML) { size_t pos = HTML.find("