From ee73fc066ac927d94084d77f416834b6f909abf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Thu, 11 Jan 2024 01:18:11 +0100 Subject: sear.php --- prog/sear.php/index.php | 307 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 prog/sear.php/index.php (limited to 'prog/sear.php/index.php') diff --git a/prog/sear.php/index.php b/prog/sear.php/index.php new file mode 100644 index 0000000..cd684b8 --- /dev/null +++ b/prog/sear.php/index.php @@ -0,0 +1,307 @@ +childNodes as $n) + if ($n->nodeType == XML_TEXT_NODE) + $r .= $n->nodeValue; + return $r; +} +function query_google ($s, $image = false, $noredirect = false, $bindstring = false) { + $us = urlencode($s); + $a = ""; + if ($image) + $a .= "&tbm=isch"; + if ($noredirect) + $a .= "&nfpr=1"; + $url = "http://wap.google.com/search?q=$us&num=100&ie=UTF-8$a"; + $sockarr = []; + if ($bindstring) + $sockarr["bindto"] = $bindstring; + $txtdoc = file_get_contents($url, false, stream_context_create(["socket" => $sockarr, "http" => ["ignore_errors" => true, "header" => "User-Agent: Nokia WAP Gateway 4.1 CD1/ECD13_D/4.1.04)\r\n"]])); + if ($txtdoc == false) + return ["status" => false, "code" => "failed"]; + if (str_contains($txtdoc, "In the meantime, solving the above CAPTCHA will let you continue")) + return ["status" => false, "code" => "captcha", "url" => $url]; + $resultsforclass = find_class($txtdoc, "{color:#1967d2}"); + if ($image) { + $imageclass = find_class($txtdoc, "{font-family:Roboto,Helvetica,Arial,sans-serif}"); + if (!$imageclass) + return ["status" => false, "code" => "noimgclass"]; + } else { + $titleclass = find_class($txtdoc, "{color:#1967D2;font-size:14px;line-height:16px}"); + $descclass = find_class($txtdoc, "{word-break:break-word}"); + if (!$titleclass || !$descclass) + return ["status" => false, "code" => "noclass"]; + } + $results = []; + $x = new DOMDocument(); + $x->loadHTML($txtdoc); + if ($image) + foreach ($x->getElementsByTagName("div") as $div) { + if ($div->getAttribute("class") != $imageclass) + continue; + $hreflink = $div->getElementsByTagName("a")[0]->getAttribute("href"); + if (!$hreflink) + continue; + preg_match(",.*s?imgurl=([^&]*)&imgrefurl=([^&]*).*,", $hreflink, $matches); + $imgurl = $matches[1]; + $imgrefurl = $matches[2]; + if (!$imgurl && !$imgrefurl) + continue; + $imgurl = urldecode(fix_url($imgurl)); + $imgrefurl = urldecode(fix_url($imgrefurl)); + $results[] = ["imgsrc" => $imgurl, "url" => $imgrefurl]; + } + else + foreach ($x->getElementsByTagName("a") as $a) { + if (!$a->getAttribute("class")) + continue; + if (!str_contains($a->getAttribute("class"), $titleclass)) + continue; + $hreflink = fix_url($a->getAttribute("href")); + if (!$hreflink) + continue; + $firstspan = null; + foreach ($a->getElementsByTagName("span") as $span) { + if ($firstspan == null) + $firstspan = $span; + if ($span->getAttribute("class") == $descclass) + $breadcrumbs = $span->nodeValue; + } + foreach ($a->parentNode->parentNode->getElementsByTagName("table")[0]->getElementsByTagName("span") as $span) + if ($span->getAttribute("class") == $descclass) + $description = $span->nodeValue; + $results[] = ["url" => $hreflink, "title" => $firstspan->nodeValue, "breadcrumbs" => $breadcrumbs, "description" => $description]; + } + $suggested = []; + if ($resultsforclass) + foreach ($x->getElementsByTagName("a") as $a) + if (str_contains($a->getAttribute("class"), $resultsforclass)) + if (str_contains($a->getAttribute("href"), "&spell=1&") || (str_contains($a->getAttribute("href"), "&nfpr=1&") && sizeof($suggested) > 0)) + $suggested[] = $a->nodeValue; + if (sizeof($suggested) > 1 && !$noredirect) // aaaaaaaaaaa tukaj obstaja še ... "Skupaj z rezultati za" response!!!!!!!! + $s = $suggested[0]; + $suggestion = false; + if (sizeof($suggested) == 1 || ($noredirect && sizeof($suggested) > 0)) + $suggestion = $suggested[0]; + return ["status" => true, "query" => $s, "suggestion" => $suggestion, "results" => $results]; +} +function template ($title, $queryinfo, $body, $query = "", $additionalform = "", $imgfirst = false) { + $query = htmlspecialchars($query); + $title = htmlspecialchars($title); + $buttons = " + + + + "; + if ($imgfirst) { + $buttons = " + + + + "; + } + return " + + + + + $title :: sear.c + + + + + + +
+ + $buttons + $additionalform +
+

+ $queryinfo +

+ $body +
+

+ sear.php + +

+ + + "; +} +function results_html ($results, $plaintext, $limit) { + $r = ""; + $i = 0; + foreach ($results as $result) { + if ($limit && $i == $limit) + return $r; + $safeurl = htmlspecialchars($result["url"]); + if ($plaintext) + $safeurl = htmlspecialchars(str_replace("https:", "http:", $result["url"], 1)); + if (isset($result["imgsrc"])) { + $safeimgsrc = htmlspecialchars($result["imgsrc"]); + if ($plaintext) + $safeimgsrc = htmlspecialchars(str_replace("https:", "http:", $result["imgsrc"], 1)); + $r .= " + + + + "; + } else { + $safetitle = trim(htmlspecialchars($result["title"])); + $safebreadcrumb = htmlspecialchars($result["breadcrumbs"]); + $safedesc = htmlspecialchars($result["description"]); + $r .= " +
+

+ $safetitle + + $safebreadcrumb + +

+

+ $safedesc +

+
+ "; + } + $i++; + } + return $r; +} +function handle_response ($query, $response, $limit, $plaintext, $horseshoe, $add_url, $add_form, $image) { + if (sizeof($response["results"]) == 0) + die(template($query, "ni rezultatov", "vaše iskanje ni obrodilo sadov.", $query, "", $image)); + if ($horseshoe) + header("Location: " . $response["results"][0]["url"]); + $queryinfo = ""; + if ($response["query"] != $query) { + $safequeryurl = urlencode($query); + $safequeryhtml = htmlspecialchars($query); + $queryinfo .= "preusmeril sem vas iz $safequeryhtml | "; + } + if ($response["suggestion"] != false) { + $safequeryurl = urlencode($response["suggestion"]); + $safequeryhtml = htmlspecialchars($response["suggestion"]); + $queryinfo .= "predlagam iskanje $safequeryhtml | "; + } + $queryinfo .= sizeof($response["results"]) . " zadetkov"; + $resultshtml = results_html($response["results"], $plaintext, $limit); + die(template($response["query"], $queryinfo, $resultshtml, $response["query"], $add_form, $image)); +} +$add_form = ""; +$add_url = ""; +$q = null; +if (isset($_REQUEST["q"])) + $q = $_REQUEST["q"]; +$image = false; +if (!empty($_REQUEST["i"])) + $image = true; +$exact = false; +if (!empty($_REQUEST["e"])) { + $add_url .= "&e=e"; + $exact = true; + $add_form .= ""; +} +if (!empty($_REQUEST["json"])) { + header("Content-Type: application/json"); + die(json_encode(query_google($q, $image, $exact))); +} +$limit = false; +if (!empty($_REQUEST["l"])) { + $limit = int($_REQUEST["l"]); + $add_url .= "&l=$limit"; + $add_form .= ""; +} +$plaintext = false; +if (!empty($_REQUEST["h"])) { + $plaintext = true; + $add_url .= "&h=h"; + $add_form .= ""; +} +$horseshoe = false; +if (!empty($_REQUEST["f"])) { + $horseshoe = true; + $add_url .= "&f=f"; + $add_form .= ""; +} +if ($q == null) { + die(template("", "iskalnik sear.php", "dobrodošli v iskalniku sear.php, naslednjiku programa sear.c. za iskanje po spletu nekaj vnesite v iskalno vrstico zgoraj in pritisnite na gumb.")); +} +$bindstrings = []; +foreach (net_get_interfaces() as $interface) + foreach ($interface["unicast"] as $unicast) { + if (!isset($unicast["address"])) + continue; + $address = $unicast["address"]; + if ($address == "::1") // tu timeouta + continue; + $bindstring = "$address:0"; + if (str_contains($address, ":")) + $bindstring = "[$address]:0"; + $bindstrings[] = $bindstring; + } +if (getenv("BINDSTRINGS")) + $bindstrings = explode(",", getenv("BINDSTRINGS")); +foreach ($bindstrings as $bindstring) { + // file_put_contents("/dev/stderr", "trying bindstring $bindstring\n"); + $response = query_google($q, $image, $exact, $bindstring); + if ($response["status"] == true) + break; + if ($response["code"] == "captcha") + continue; + if ($response["code"] == "failed") + continue; + break; +} +if ($response["status"] != true) { + if ($response["code"] == "captcha") { + foreach (["http://searc.oliwerix.com/sear.php?ref=b"] as $fallback) { + $add_url = ""; + if ($exact) + $add_url .= "&e=e"; + $json = json_decode(file_get_contents($fallback . $add_url . "&q=" . urlencode($q)), true); + if (!isset($json["status"])) + continue; + if ($json["status"] == false) { + if ($json["code"] == "captcha") + continue; + die(template("napaka", "napaka pri posredovanju zahteve", "ker je poizvedba vrnila captcho, sem jo posredoval na drug strežnik, ta pa je vrnil napako " . $json["code"] . ".", $q)); + } + handle_response($q, $json, $limit, $plaintext, $horseshoe, $add_url, $add_form, $image); + } + die(template("napaka", "iskalno zaledje omejuje iskanja", "iskalno zaledje se je odzvalo s CAPTCHO, češ, da ta instanca prehitro pošilja zahteve. obenem se je enako zgodilo tudi vsem rezervnim strežnikom. iščete lahko ročno preko spletne strani zaledne storitve: kliknite sem.", $q)); + } + die(template("napaka", "napaka pri poizvedbi", "poizvedba na iskalno zaledje je vrnila napako " . $response["code"] . ".", $q)); +} +handle_response($q, $response, $limit, $plaintext, $horseshoe, $add_url, $add_form, $image); +?> -- cgit v1.2.3