Browse Source

trying to get it to work by basically copying librex and trying to customize it for pinterest

Ahwx 2 years ago
parent
commit
d55a062d4d
7 changed files with 409 additions and 33 deletions
  1. 8 0
      README.txt
  2. 0 22
      board.php
  3. 62 1
      config.php
  4. 59 0
      engines/pinterest.php
  5. 19 0
      image_proxy.php
  6. 246 0
      misc/tools.php
  7. 15 10
      search.php

+ 8 - 0
README.txt

@@ -0,0 +1,8 @@
+The main concept is that you don't want the random popups forcing you to log in, and you don't want a bunch of JS.
+
+
+Credits:
+
+https://github.com/hnhx/librex | https://femboy.hu - image proxy
+
+

+ 0 - 22
board.php

@@ -1,22 +0,0 @@
-<?php
-
-$api_url = "https://api.pinterest.com/v1/boards/{board_id}/pins/";
-
-$board_id = "replace_with_actual_board_id";
-
-$access_token = "replace_with_actual_access_token";
-
-$request_url = $api_url . "?access_token=" . $access_token;
-
-$response = file_get_contents($request_url);
-
-$pins = json_decode($response, true);
-
-foreach ($pins["data"] as $pin) {
-  echo '<div>';
-  echo '<img src="' . $pin["image"]["original"]["url"] . '" alt="' . $pin["description"] . '">';
-  echo '<p>' . $pin["description"] . '</p>';
-  echo '</div>';
-}
-
-?>

+ 62 - 1
config.php

@@ -1,7 +1,68 @@
 <?php
 
+    return (object) array(
 
-// options
+        // e.g.: fr -> https://google.fr/
+        "google_domain" => "com",
 
+        // Google results will be in this language
+        "google_language" => "en",
+
+        // If you have a local instance you can change this to http://localhost:3000
+        "invidious_instance_for_video_results" => "https://invidious.namazso.eu",
+
+        "disable_bittorent_search" => false,
+        "bittorent_trackers" => "&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce",
+
+        "disable_hidden_service_search" => false,
+
+        /*
+            Preset privacy friendly frontends for users, these can be overwritten by users in settings
+            e.g.: "invidious" => "https://yewtu.be",
+        */
+        "invidious" => "", // youtube
+        "bibliogram" => "", // instagram
+        "rimgo" => "", // imgur
+        "scribe" => "", // medium
+        "librarian" => "", // odysee
+        "gothub" => "", // github
+        "nitter" => "", // twitter
+        "libreddit" => "", // reddit
+        "proxitok" => "", // tiktok
+        "wikiless" => "", // wikipedia
+        "quetre" => "", // quora
+        "libremdb" => "", // imdb,
+        "breezewiki" => "", // fandom,
+        "anonymousoverflow" => "", // stackoverflow
+
+        /*
+            To send requests trough a proxy uncomment CURLOPT_PROXY and CURLOPT_PROXYTYPE:
+
+            CURLOPT_PROXYTYPE options:
+
+                CURLPROXY_HTTP
+                CURLPROXY_SOCKS4
+                CURLPROXY_SOCKS4A
+                CURLPROXY_SOCKS5
+                CURLPROXY_SOCKS5_HOSTNAME
+
+            !!! ONLY CHANGE THE OTHER OPTIONS IF YOU KNOW WHAT YOU ARE DOING !!!
+        */
+        "curl_settings" => array(
+            // CURLOPT_PROXY => "ip:port",
+            // CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_ENCODING => "",
+            CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
+            CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
+            CURLOPT_CUSTOMREQUEST => "GET",
+            CURLOPT_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP,
+            CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP,
+            CURLOPT_MAXREDIRS => 5,
+            CURLOPT_TIMEOUT => 18,
+            CURLOPT_VERBOSE => false
+        )
+
+    );
 
 ?>

+ 59 - 0
engines/pinterest.php

@@ -0,0 +1,59 @@
+<?php
+
+    require "misc/tools.php";
+
+    function get_image_results($query) 
+    {
+        $url = "https://www.pinterest.com/search/pins/?q=$query";
+        $response = request($url);
+        $xpath = get_xpath($response);
+
+        $results = array();
+
+        foreach($xpath->query("//a[@rel='noopener']") as $result)
+        {       
+                $image = $xpath->evaluate(".//img", $result)[0];
+
+                if ($image)
+                {
+                    $encoded_url = $result->getAttribute("href");
+                    $encoded_url_split1 = explode("==/", $encoded_url)[1];
+                    $encoded_url_split2 = explode("?position", $encoded_url_split1)[0];
+                    $real_url = urldecode(base64_decode($encoded_url_split2));
+                    $real_url = check_for_privacy_frontend($real_url);
+
+                    $alt = $image->getAttribute("alt");
+                    $thumbnail = urlencode($image->getAttribute("src"));
+
+                    array_push($results, 
+                        array (
+                            "thumbnail" => urldecode(htmlspecialchars($thumbnail)),
+                            "alt" => htmlspecialchars($alt),
+                            "url" => htmlspecialchars($real_url)
+                        )
+                    );
+    
+                }
+        }
+
+        return $results;
+    }
+
+    function print_image_results($results)
+    {
+        echo "<div class=\"image-result-container\">";
+
+            foreach($results as $result)
+            {
+                $thumbnail = urlencode($result["thumbnail"]);
+                $alt = $result["alt"];
+                $url = $result["url"];
+
+                echo "<a title=\"$alt\" href=\"$url\" target=\"_blank\">";
+                echo "<img src=\"image_proxy.php?url=$thumbnail\">";
+                echo "</a>";
+            }
+
+        echo "</div>";
+    }
+?>

+ 19 - 0
image_proxy.php

@@ -0,0 +1,19 @@
+<?php
+
+require "misc/tools.php";
+
+$url = $_REQUEST["url"];
+$requested_root_domain = get_root_domain($url);
+
+$allowed_domains = array("pinterest.com", "i.pinimg.com", "pinimg.com");
+
+if (in_array($requested_root_domain, $allowed_domains))
+{
+  $image = $url;
+  $image_src = request($image);
+
+  header("Content-Type: image/jpeg");
+  echo $image_src;
+}
+?>
+

+ 246 - 0
misc/tools.php

@@ -0,0 +1,246 @@
+<?php
+
+$config = require "config.php";
+
+function get_base_url($url)
+{
+    $split_url = explode("/", $url);
+    $base_url = $split_url[0] . "//" . $split_url[2] . "/";
+    return $base_url;
+}
+
+function get_root_domain($url)
+{
+    $split_url = explode("/", $url);
+    $base_url = $split_url[2];
+
+    $base_url_main_split = explode(".", strrev($base_url));
+    $root_domain = strrev($base_url_main_split[1]) . "." . strrev($base_url_main_split[0]);
+
+    return $root_domain;
+}
+
+function try_replace_with_frontend($url, $frontend, $original)
+{
+    $config = require "config.php";
+
+    if (isset($_COOKIE[$frontend]) || isset($_REQUEST[$frontend]) || !empty($config->$frontend))
+    {
+        if (isset($_COOKIE[$frontend]))
+            $frontend = $_COOKIE[$frontend];
+        else if (isset($_REQUEST[$frontend]))
+            $frontend = $_REQUEST[$frontend];
+        else if (!empty($config->$frontend))
+            $frontend = $config->$frontend;
+
+       if ($original == "instagram.com")
+        {
+            if (!strpos($url, "/p/"))
+                $frontend .= "/u";
+        }
+
+        if (empty(trim($frontend)))
+            return $url;
+
+        if (strpos($url, "wikipedia.org") !== false)
+        {
+            $wiki_split = explode(".", $url);
+            if (count($wiki_split) > 1)
+            {
+                $lang = explode("://", $wiki_split[0])[1];
+                $url =  $frontend . explode($original, $url)[1] . "?lang=" . $lang;
+            }
+        }
+        else if (strpos($url, "fandom.com") !== false)
+        {
+            $fandom_split = explode(".", $url);
+            if (count($fandom_split) > 1)
+            {
+                $wiki_name = explode("://", $fandom_split[0])[1];
+                $url =  $frontend . "/" . $wiki_name . explode($original, $url)[1];
+            }
+        }
+        else
+        {
+            $url =  $frontend . explode($original, $url)[1];
+        }
+
+
+        return $url;
+    }
+
+    return $url;
+}
+
+function check_for_privacy_frontend($url)
+{
+    if (isset($_COOKIE["disable_frontends"]))
+        return $url;
+
+    $frontends = array(
+        "youtube.com" => "invidious",
+        "instagram.com" => "bibliogram",
+        "imgur.com" => "rimgo",
+        "medium.com" => "scribe",
+        "github.com" => "gothub",
+        "odysee.com" => "librarian",
+        "twitter.com" => "nitter",
+        "reddit.com" => "libreddit",
+        "tiktok.com" => "proxitok",
+        "wikipedia.org" => "wikiless",
+        "quora.com" => "quetre",
+        "imdb.com" => "libremdb",
+        "fandom.com" => "breezewiki",
+        "stackoverflow.com" => "anonymousoverflow"
+    );
+
+    foreach($frontends as $original => $frontend)
+    {
+        if (strpos($url, $original))
+        {
+            $url = try_replace_with_frontend($url, $frontend, $original);
+            break;
+        }
+    }
+
+    return $url;
+}
+
+function check_ddg_bang($query)
+{
+
+    $bangs_json = file_get_contents("static/misc/ddg_bang.json");
+    $bangs = json_decode($bangs_json, true);
+
+    if (substr($query, 0, 1) == "!")
+        $search_word = substr(explode(" ", $query)[0], 1);
+    else
+        $search_word = substr(end(explode(" ", $query)), 1);
+    
+    $bang_url = null;
+
+    foreach($bangs as $bang)
+    {
+        if ($bang["t"] == $search_word)
+        {
+            $bang_url = $bang["u"];
+            break;
+        }
+    }
+
+    if ($bang_url)
+    {
+        $bang_query_array = explode("!" . $search_word, $query);
+        $bang_query = trim(implode("", $bang_query_array));
+
+        $request_url = str_replace("{{{s}}}", $bang_query, $bang_url);
+        $request_url = check_for_privacy_frontend($request_url);
+
+        header("Location: " . $request_url);
+        die();
+    }
+}
+
+function check_for_special_search($query)
+{
+    if (isset($_COOKIE["disable_special"]) || isset($_REQUEST["disable_special"]))
+        return 0;
+
+     $query_lower = strtolower($query);
+     $split_query = explode(" ", $query);
+
+     if (strpos($query_lower, "to") && count($split_query) >= 4) // currency
+     {
+        $amount_to_convert = floatval($split_query[0]);
+        if ($amount_to_convert != 0)
+            return 1;
+     }
+     else if (strpos($query_lower, "mean") && count($split_query) >= 2) // definition
+     {
+         return 2;
+     }
+     else if (strpos($query_lower, "my") !== false)
+     {
+        if (strpos($query_lower, "ip"))
+        {
+            return 3;
+        }
+        else if (strpos($query_lower, "user agent") || strpos($query_lower, "ua"))
+        {
+            return 4;
+        }
+     }
+     else if (strpos($query_lower, "weather") !== false)
+     {
+            return 5;
+     }
+     else if ($query_lower == "tor")
+     {
+            return 6;
+     }
+     else if (3 > count(explode(" ", $query))) // wikipedia
+     {
+         return 7;
+     }
+
+    return 0;
+}
+
+function get_xpath($response)
+{
+    $htmlDom = new DOMDocument;
+    @$htmlDom->loadHTML($response);
+    $xpath = new DOMXPath($htmlDom);
+
+    return $xpath;
+}
+
+function request($url)
+{
+    global $config;
+
+    $ch = curl_init($url);
+    curl_setopt_array($ch, $config->curl_settings);
+    $response = curl_exec($ch);
+
+    return $response;
+}
+
+function human_filesize($bytes, $dec = 2)
+{
+    $size   = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
+    $factor = floor((strlen($bytes) - 1) / 3);
+
+    return sprintf("%.{$dec}f ", $bytes / pow(1024, $factor)) . @$size[$factor];
+}
+
+function remove_special($string)
+{
+    $string = preg_replace("/[\r\n]+/", "\n", $string);
+    return trim(preg_replace("/\s+/", ' ', $string));
+ }
+
+function print_elapsed_time($start_time)
+    {
+        $end_time = number_format(microtime(true) - $start_time, 2, '.', '');
+        echo "<p id=\"time\">Fetched the results in $end_time seconds</p>";
+    }
+
+function print_next_page_button($text, $page, $query, $type)
+{
+    echo "<form class=\"page\" action=\"search.php\" target=\"_top\" method=\"get\" autocomplete=\"off\">";
+    foreach($_REQUEST as $key=>$value)
+    {
+        if ($key != "q" && $key != "p" && $key != "t")
+        {
+            echo "<input type=\"hidden\" name=\"$key\" value=\"$value\"/>";
+        }
+    }
+    echo "<input type=\"hidden\" name=\"p\" value=\"" . $page . "\" />";
+    echo "<input type=\"hidden\" name=\"q\" value=\"$query\" />";
+    echo "<input type=\"hidden\" name=\"t\" value=\"$type\" />";
+    echo "<button type=\"submit\">$text</button>";
+    echo "</form>";
+}
+
+?>

+ 15 - 10
search.php

@@ -1,18 +1,23 @@
-<?php require "static/header.php";
+<?php
+require "static/header.php";
+require "engines/pinterest.php";
 
-  $q = $_GET['q'];
+$query = $_GET['q'];
 
-  $url = "https://pinterest.com/search/pins/?q=$q";
-  $pinterestPage = file_get_contents($url);
+//$url = "https://pinterest.com/search/pins/?q=$q";
+//$pinterestPage = file_get_contents($url);
 
-  $doc = new DOMDocument();
-  @$doc->loadHTML($html);
+//$doc = new DOMDocument();
+//@$doc->loadHTML($html);
 
-  $items = $doc->getElementsByTagName('img');
+//$items = $doc->getElementsByTagName('img');
 
-  foreach ($items as $item) {
-      echo "<img src='", $item, "'>";
-  }
+//foreach ($items as $item) {
+//    echo "<img src='", $item, "'>";
+//}
+
+$imgResults = get_image_results($query);
+print_image_results($imgResults);
 
 //  echo $pinterestPage;