url redirect bypass
This commit is contained in:
1 parent
9f0437d949
commit
57a72e5b5e
1 file changed
+268
-30
+268
-30
@@ -10,8 +10,9 @@ class google{
|
|||||||
include "lib/backend.php";
|
include "lib/backend.php";
|
||||||
$this->backend = new backend("google");
|
$this->backend = new backend("google");
|
||||||
|
|
||||||
$this->proc = curl_multi_init();
|
$this->urls_to_resolve = [];
|
||||||
$this->handles = [];
|
|
||||||
|
$this->init_multi_curl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getfilters($page){
|
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(
|
if(
|
||||||
preg_match(
|
preg_match(
|
||||||
'/^\/goto\?url=([^&]+)/',
|
'/^\/goto\?url=([^&]+)/',
|
||||||
$url,
|
$url,
|
||||||
$slug
|
$slug
|
||||||
) === 0
|
) === 1
|
||||||
){
|
){
|
||||||
|
|
||||||
// not a google redirect
|
// 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;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function urlfuck_goto($url, $slug){
|
||||||
|
|
||||||
$curlproc = curl_init();
|
$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_ENCODING, ""); // default encoding
|
||||||
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
curl_setopt($curlproc, CURLOPT_HTTPHEADER,
|
||||||
@@ -658,7 +693,7 @@ class google{
|
|||||||
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
|
||||||
curl_setopt($curlproc, CURLOPT_TIMEOUT, 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);
|
curl_multi_add_handle($this->proc, $curlproc);
|
||||||
$this->handles[] = [
|
$this->handles[] = [
|
||||||
@@ -669,7 +704,92 @@ class google{
|
|||||||
return $url;
|
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{
|
||||||
do{
|
do{
|
||||||
@@ -741,6 +861,140 @@ class google{
|
|||||||
curl_multi_close($this->proc);
|
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){
|
private function recursive_replace(&$keys, &$replacements, &$pointer){
|
||||||
|
|
||||||
foreach($pointer as $key => &$value){
|
foreach($pointer as $key => &$value){
|
||||||
@@ -794,22 +1048,6 @@ class google{
|
|||||||
|
|
||||||
throw new Exception("Search term is empty!");
|
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();
|
$proxy = $this->backend->get_ip();
|
||||||
|
|
||||||
@@ -1475,7 +1713,7 @@ class google{
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->resolve_urls($out);
|
$this->resolve_share($out);
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
@@ -1603,8 +1841,6 @@ class google{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//$html = file_get_contents("scraper/google.html");
|
|
||||||
|
|
||||||
$data = $this->get(
|
$data = $this->get(
|
||||||
$proxy,
|
$proxy,
|
||||||
"https://www.google.com/search",
|
"https://www.google.com/search",
|
||||||
@@ -1615,6 +1851,8 @@ class google{
|
|||||||
$html = &$data["data"];
|
$html = &$data["data"];
|
||||||
$container = &$data["container"];
|
$container = &$data["container"];
|
||||||
|
|
||||||
|
//$html = file_get_contents("scraper/google.html");
|
||||||
|
|
||||||
$this->fuckhtml->load($html);
|
$this->fuckhtml->load($html);
|
||||||
|
|
||||||
// parse all <style> tags
|
// parse all <style> tags
|
||||||
@@ -1721,7 +1959,7 @@ class google{
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->resolve_urls($out);
|
$this->resolve_gotos($out);
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
@@ -2129,7 +2367,7 @@ class google{
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->resolve_urls($out);
|
$this->resolve_share($out);
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
@@ -2495,7 +2733,7 @@ class google{
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->resolve_urls($out);
|
$this->resolve_share($out);
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user