text.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. function get_text_results($query, $page)
  3. {
  4. global $config;
  5. $mh = curl_multi_init();
  6. $query_encoded = urlencode($query);
  7. $results = array();
  8. $domain = $config->google_domain;
  9. $language = isset($_COOKIE["google_language"]) ? htmlspecialchars($_COOKIE["google_language"]) : $config->google_language;
  10. $url = "https://www.google.$domain/search?&q=$query_encoded&start=$page";
  11. if (3 > strlen($language))
  12. {
  13. $url .= "&hl=$language&lr=lang_$language";
  14. }
  15. if (isset($_COOKIE["safe_search"]))
  16. {
  17. $url .= "&safe=medium";
  18. }
  19. $google_ch = curl_init($url);
  20. curl_setopt_array($google_ch, $config->curl_settings);
  21. curl_multi_add_handle($mh, $google_ch);
  22. $special_search = $page ? 0 : check_for_special_search($query);
  23. $special_ch = null;
  24. $url = null;
  25. if ($special_search != 0)
  26. {
  27. switch ($special_search)
  28. {
  29. case 1:
  30. $url = "https://cdn.moneyconvert.net/api/latest.json";
  31. break;
  32. case 2:
  33. $split_query = explode(" ", $query);
  34. $reversed_split_q = array_reverse($split_query);
  35. $word_to_define = $reversed_split_q[1];
  36. $url = "https://api.dictionaryapi.dev/api/v2/entries/en/$word_to_define";
  37. break;
  38. case 5:
  39. $url = "https://wttr.in/@" . $_SERVER["REMOTE_ADDR"] . "?format=j1";
  40. break;
  41. case 6:
  42. $url = "https://check.torproject.org/torbulkexitlist";
  43. break;
  44. case 7:
  45. $url = "https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded";
  46. break;
  47. }
  48. if ($url != NULL)
  49. {
  50. $special_ch = curl_init($url);
  51. curl_setopt_array($special_ch, $config->curl_settings);
  52. curl_multi_add_handle($mh, $special_ch);
  53. }
  54. }
  55. $running = null;
  56. do {
  57. curl_multi_exec($mh, $running);
  58. } while ($running);
  59. if ($special_search != 0)
  60. {
  61. $special_result = null;
  62. switch ($special_search)
  63. {
  64. case 1:
  65. require "engines/special/currency.php";
  66. $special_result = currency_results($query, curl_multi_getcontent($special_ch));
  67. break;
  68. case 2:
  69. require "engines/special/definition.php";
  70. $special_result = definition_results($query, curl_multi_getcontent($special_ch));
  71. break;
  72. case 3:
  73. require "engines/special/ip.php";
  74. $special_result = ip_result();
  75. break;
  76. case 4:
  77. require "engines/special/user_agent.php";
  78. $special_result = user_agent_result();
  79. break;
  80. case 5:
  81. require "engines/special/weather.php";
  82. $special_result = weather_results(curl_multi_getcontent($special_ch));
  83. break;
  84. case 6:
  85. require "engines/special/tor.php";
  86. $special_result = tor_result(curl_multi_getcontent($special_ch));
  87. break;
  88. case 7:
  89. require "engines/special/wikipedia.php";
  90. $special_result = wikipedia_results($query, curl_multi_getcontent($special_ch));
  91. break;
  92. }
  93. if ($special_result != null)
  94. array_push($results, $special_result);
  95. }
  96. $xpath = get_xpath(curl_multi_getcontent($google_ch));
  97. foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result)
  98. {
  99. $url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0];
  100. if ($url == null)
  101. continue;
  102. if (!empty($results)) // filter duplicate results, ignore special result
  103. {
  104. if (!array_key_exists("special_response", end($results)))
  105. if (end($results)["url"] == $url->textContent)
  106. continue;
  107. }
  108. $url = $url->textContent;
  109. $url = check_for_privacy_frontend($url);
  110. $title = $xpath->evaluate(".//h3", $result)[0];
  111. $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0];
  112. array_push($results,
  113. array (
  114. "title" => htmlspecialchars($title->textContent),
  115. "url" => htmlspecialchars($url),
  116. "base_url" => htmlspecialchars(get_base_url($url)),
  117. "description" => $description == null ?
  118. "No description was provided for this site." :
  119. htmlspecialchars($description->textContent)
  120. )
  121. );
  122. }
  123. return $results;
  124. }
  125. function print_text_results($results)
  126. {
  127. $special = $results[0];
  128. if (array_key_exists("special_response", $special))
  129. {
  130. $response = $special["special_response"]["response"];
  131. $source = $special["special_response"]["source"];
  132. echo "<p class=\"special-result-container\">";
  133. if (array_key_exists("image", $special["special_response"]))
  134. {
  135. $image_url = $special["special_response"]["image"];
  136. echo "<img src=\"image_proxy.php?url=$image_url\">";
  137. }
  138. echo $response;
  139. if ($source)
  140. echo "<a href=\"$source\" target=\"_blank\">$source</a>";
  141. echo "</p>";
  142. array_shift($results);
  143. }
  144. echo "<div class=\"text-result-container\">";
  145. foreach($results as $result)
  146. {
  147. $title = $result["title"];
  148. $url = $result["url"];
  149. $base_url = $result["base_url"];
  150. $description = $result["description"];
  151. echo "<div class=\"text-result-wrapper\">";
  152. echo "<a href=\"$url\">";
  153. echo "$base_url";
  154. echo "<h2>$title</h2>";
  155. echo "</a>";
  156. echo "<span>$description</span>";
  157. echo "</div>";
  158. }
  159. echo "</div>";
  160. }
  161. ?>