Procházet zdrojové kódy

url redirect bypass

lolcat před 1 týdnem
rodič
revize
57a72e5b5e
1 změnil soubory, kde provedl 269 přidání a 31 odebrání
  1. 269 31
      scraper/google.php

+ 269 - 31
scraper/google.php

@@ -10,8 +10,9 @@ class google{
 		include "lib/backend.php";
 		$this->backend = new backend("google");
 		
-		$this->proc = curl_multi_init();
-		$this->handles = [];
+		$this->urls_to_resolve = [];
+		
+		$this->init_multi_curl();
 	}
 	
 	public function getfilters($page){
@@ -617,23 +618,57 @@ class google{
 		];
 	}
 	
-	private function redirect_add_url($url){
+	private function init_multi_curl(){
+		
+		$this->proc = curl_multi_init();
+		$this->handles = [];
+	}
+	
+	private function redirect_add_url($url, $replace = null){
 		
 		if(
 			preg_match(
 				'/^\/goto\?url=([^&]+)/',
 				$url,
 				$slug
-			) === 0
+			) === 1
 		){
 			
-			// not a google redirect
-			return $url;
+			// normal goto
+			$this->urls_to_resolve[] = [
+				"replace" => $url,
+				"slug" => $slug[1],
+				"type" => "goto"
+			];
 		}
 		
+		elseif(
+			preg_match(
+				'/https?:\/\/share\.google\/([^"]+)+/',
+				$url,
+				$link_regex
+			) === 1
+		){
+			
+			// share.google
+			$this->urls_to_resolve[] = [
+				"replace" => $replace,
+				"slug" => $link_regex[1],
+				"type" => "share"
+			];
+		}
+		
+		// rest is ignored, since its not a redirect
+		
+		// always return url
+		return $url;
+	}
+	
+	private function urlfuck_goto($url, $slug){
+		
 		$curlproc = curl_init();
 		
-		curl_setopt($curlproc, CURLOPT_URL, "https://www.google.com/goto?url=" . urlencode($slug[1]));
+		curl_setopt($curlproc, CURLOPT_URL, "https://www.google.com/goto?url=" . rawurlencode($slug));
 		
 		curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
 		curl_setopt($curlproc, CURLOPT_HTTPHEADER,
@@ -658,7 +693,7 @@ class google{
 		curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
 		curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
 		
-		$this->backend->assign_proxy($curlproc, $this->backend->get_ip(null, true));
+		//$this->backend->assign_proxy($curlproc, $this->backend->get_ip(null, true));
 		
 		curl_multi_add_handle($this->proc, $curlproc);
 		$this->handles[] = [
@@ -669,7 +704,92 @@ class google{
 		return $url;
 	}
 	
-	private function resolve_urls(&$scraped_data){
+	private function urlfuck_shareservice($url, $slug){
+		
+		$curlproc = curl_init();
+		
+		curl_setopt($curlproc, CURLOPT_URL, "https://www.google.com/httpservice/retry/SearchApiService/GetShortenedKpSharingUrl?udm=14&reqpld=[[[\"/goto?url%3D" . rawurlencode($slug) . "\"],1,null,null,null,null,35,[\"st\"]]]&msc=gwsrpc");
+		
+		curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
+		curl_setopt($curlproc, CURLOPT_HTTPHEADER,
+			["User-Agent: " . config::USER_AGENT,
+			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
+			"Accept-Language: en-US,en;q=0.5",
+			"Accept-Encoding: gzip, deflate, br, zstd",
+			"DNT: 1",
+			"Sec-GPC: 1",
+			"Connection: keep-alive",
+			"Upgrade-Insecure-Requests: 1",
+			"Sec-Fetch-Dest: document",
+			"Sec-Fetch-Mode: navigate",
+			"Sec-Fetch-Site: none",
+			"Sec-Fetch-User: ?1",
+			"Priority: u=0, i"]
+		);
+		
+		curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
+		curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
+		curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
+		curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
+		
+		//$this->backend->assign_proxy($curlproc, $this->backend->get_ip(null, true));
+		
+		curl_multi_add_handle($this->proc, $curlproc);
+		$this->handles[] = [
+			"replacement" => $url,
+			"handle" => $curlproc
+		];
+		
+		return $url;
+	}
+	
+	private function urlfuck_share($url, $slug){
+		
+		$curlproc = curl_init();
+		
+		curl_setopt($curlproc, CURLOPT_URL, "https://www.google.com/share.google?q=" . rawurlencode($slug));
+		
+		curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
+		curl_setopt($curlproc, CURLOPT_HTTPHEADER,
+			["User-Agent: " . config::USER_AGENT,
+			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
+			"Accept-Language: en-US,en;q=0.5",
+			"Accept-Encoding: gzip, deflate, br, zstd",
+			"DNT: 1",
+			"Sec-GPC: 1",
+			"Connection: keep-alive",
+			"Upgrade-Insecure-Requests: 1",
+			"Sec-Fetch-Dest: document",
+			"Sec-Fetch-Mode: navigate",
+			"Sec-Fetch-Site: none",
+			"Sec-Fetch-User: ?1",
+			"Priority: u=0, i"]
+		);
+		
+		curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
+		curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
+		curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
+		curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
+		
+		//$this->backend->assign_proxy($curlproc, $this->backend->get_ip(null, true));
+		
+		curl_multi_add_handle($this->proc, $curlproc);
+		$this->handles[] = [
+			"replacement" => $url,
+			"handle" => $curlproc
+		];
+		
+		return $url;
+	}
+	
+	private function resolve_gotos(&$scraped_data){
+		
+		foreach($this->urls_to_resolve as $item){
+			
+			$this->urlfuck_goto($item["replace"], $item["slug"]);
+		}
 		
 		do{
 			do{
@@ -741,6 +861,140 @@ class google{
 		curl_multi_close($this->proc);
 	}
 	
+	private function resolve_share(&$scraped_data){
+		
+		foreach($this->urls_to_resolve as $item){
+			
+			$this->urlfuck_shareservice($item["replace"], $item["slug"]);
+		}
+		
+		do{
+			do{
+				$status = curl_multi_exec($this->proc, $active);
+			}while($status === CURLM_CALL_MULTI_PERFORM);
+
+			if($active){
+				curl_multi_select($this->proc);
+			}
+
+		}while($active && $status === CURLM_OK);
+		
+		//
+		// if we reach this, we're done downloading garbage
+		//
+		
+		// get the share links
+		$this->urls_to_resolve = [];
+		
+		for($i=0; $i<count($this->handles); $i++){
+			
+			$html = curl_multi_getcontent($this->handles[$i]["handle"]);
+			
+			if(
+				preg_match(
+					'/https?:\/\/share\.google\/(?:[^"]+)/',
+					$html,
+					$link_regex
+				) !== 1
+			){
+				
+				// failed to find link, will serve a resolver target as fallback
+				$fallback = true;
+				$slug = explode("url=", $this->handles[$i]["replacement"]);
+				$link = "/resolver?scraper=google&target=" . rawurlencode($slug[1]);
+			}else{
+				
+				$fallback = false;
+				$link = $link_regex[0];
+			}
+			
+			if(
+				(
+					$fallback === false &&
+					preg_match(
+						'/^(https?:|)\/\//',
+						$link
+					)
+				) ||
+				$fallback === true
+			){
+				
+				$this->redirect_add_url($link, $this->handles[$i]["replacement"]);
+			}
+		}
+		
+		// resolve shareable urls
+		$this->init_multi_curl();
+		
+		foreach($this->urls_to_resolve as $item){
+			
+			$this->urlfuck_share($item["replace"], $item["slug"]);
+		}
+		
+		do{
+			do{
+				$status = curl_multi_exec($this->proc, $active);
+			}while($status === CURLM_CALL_MULTI_PERFORM);
+
+			if($active){
+				curl_multi_select($this->proc);
+			}
+
+		}while($active && $status === CURLM_OK);
+		
+		// parse downloaded garbage
+		$keys = [];
+		$replacements = [];
+		
+		for($i=0; $i<count($this->handles); $i++){
+			
+			$html = curl_multi_getcontent($this->handles[$i]["handle"]);
+			
+			$this->fuckhtml->load($html);
+			
+			$a =
+				$this->fuckhtml
+				->getElementsByTagName(
+					"a"
+				);
+			
+			if(count($a) === 0){
+				
+				// failed to find link, will serve a resolver target as fallback
+				$fallback = true;
+				$slug = explode("url=", $this->handles[$i]["replacement"]);
+				$link = "/resolver?scraper=google&target=" . rawurlencode($slug[1]);
+			}else{
+				
+				$fallback = false;
+				$link =
+					$this->fuckhtml
+					->getTextContent(
+						$a[0]["attributes"]["href"]
+					);
+			}
+			
+			if(
+				(
+					$fallback === false &&
+					preg_match(
+						'/^(https?:|)\/\//',
+						$link
+					)
+				) ||
+				$fallback === true
+			){
+				
+				$keys[] = $this->handles[$i]["replacement"];
+				$replacements[] = $link;
+			}
+		}
+		
+		$this->recursive_replace($keys, $replacements, $scraped_data);
+		
+		curl_multi_close($this->proc);
+	}
+	
 	private function recursive_replace(&$keys, &$replacements, &$pointer){
 		
 		foreach($pointer as $key => &$value){
@@ -794,22 +1048,6 @@ class google{
 				
 				throw new Exception("Search term is empty!");
 			}
-			/*
-			$session = $this->backend->session_get();
-			
-			if(config::FPLAY_ENABLE_API === false){
-				
-				throw new Exception("This scraper requires the 4play session generator. Check the documentation for more information");
-			}
-			
-			if($session === false){
-				
-				throw new Exception("Session database is empty");
-			}
-			
-			$proxy = &$session["proxy"];
-			$headers = &$session["headers"];
-			*/
 			
 			$proxy = $this->backend->get_ip();
 			
@@ -1475,7 +1713,7 @@ class google{
 			];
 		}
 		
-		$this->resolve_urls($out);
+		$this->resolve_share($out);
 		
 		return $out;
 	}
@@ -1603,8 +1841,6 @@ class google{
 			}
 		}
 		
-		//$html = file_get_contents("scraper/google.html");
-				
 		$data = $this->get(
 			$proxy,
 			"https://www.google.com/search",
@@ -1615,6 +1851,8 @@ class google{
 		$html = &$data["data"];
 		$container = &$data["container"];
 		
+		//$html = file_get_contents("scraper/google.html");
+		
 		$this->fuckhtml->load($html);
 		
 		// parse all <style> tags
@@ -1721,7 +1959,7 @@ class google{
 				);
 		}
 		
-		$this->resolve_urls($out);
+		$this->resolve_gotos($out);
 		
 		return $out;
 	}
@@ -2129,7 +2367,7 @@ class google{
 			];
 		}
 		
-		$this->resolve_urls($out);
+		$this->resolve_share($out);
 		
 		return $out;
 	}
@@ -2495,7 +2733,7 @@ class google{
 			];
 		}
 		
-		$this->resolve_urls($out);
+		$this->resolve_share($out);
 		
 		return $out;
 	}