1
0

web.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. <?php
  2. /*
  3. Initialize random shit
  4. */
  5. include "lib/frontend.php";
  6. $frontend = new frontend();
  7. [$scraper, $filters] = $frontend->getscraperfilters("web");
  8. $get = $frontend->parsegetfilters($_GET, $filters);
  9. /*
  10. Captcha
  11. */
  12. include "lib/captcha_gen.php";
  13. new captcha($frontend, $get, $filters, "web", true);
  14. $payload = [
  15. "class" => "",
  16. "right-left" => "",
  17. "right-right" => "",
  18. "left" => ""
  19. ];
  20. try{
  21. $results = $scraper->web($get);
  22. }catch(Exception $error){
  23. echo
  24. $frontend->drawerror(
  25. "Shit",
  26. 'This scraper returned an error:' .
  27. '<div class="code">' . htmlspecialchars($error->getMessage()) . '</div>' .
  28. 'Things you can try:' .
  29. '<ul>' .
  30. '<li>Use a different scraper</li>' .
  31. '<li>Remove keywords that could cause errors</li>' .
  32. '<li>Use another 4get instance</li>' .
  33. '</ul><br>' .
  34. 'If the error persists, please <a href="/about">contact the administrator</a>.'
  35. );
  36. die();
  37. }
  38. /*
  39. Prepend Oracle output, if applicable
  40. */
  41. include("oracles/encoder.php");
  42. include("oracles/calc.php");
  43. include("oracles/time.php");
  44. include("oracles/numerics.php");
  45. $oracles = [new calculator(), new encoder(), new time(), new numerics()];
  46. $fortune = "";
  47. foreach ($oracles as $oracle) {
  48. if ($oracle->check_query($_GET["s"])) {
  49. $resp = $oracle->generate_response($_GET["s"]);
  50. if ($resp != "") {
  51. $fortune .= "<div class=\"infobox\">";
  52. foreach ($resp as $title => $r) {
  53. if ($title) {
  54. $fortune .= "<h3>".htmlspecialchars($title)."</h3><div class=\"code\">".htmlspecialchars($r)."</div>";
  55. }
  56. else {
  57. $fortune .= "<i>".$r."</i><br>";
  58. }
  59. }
  60. $fortune .= "<small>Answer provided by oracle: ".$oracle->info["name"]."</small></div>";
  61. }
  62. break;
  63. }
  64. }
  65. $payload["left"] = $fortune;
  66. $answerlen = 0;
  67. /*
  68. Spelling checker
  69. */
  70. if($results["spelling"]["type"] != "no_correction"){
  71. switch($results["spelling"]["type"]){
  72. case "including":
  73. $type = "Including results for";
  74. break;
  75. case "not_many":
  76. $type = "Not many results contains";
  77. break;
  78. }
  79. $payload["left"] .=
  80. '<div class="infobox">' .
  81. $type . ' <b>' . htmlspecialchars($results["spelling"]["using"]) . '</b>.<br>' .
  82. 'Did you mean <a href="?s=' .
  83. urlencode($results["spelling"]["correction"]) .
  84. '&' .
  85. $frontend->buildquery($get, true) .
  86. '&spellcheck=no">' .
  87. $results["spelling"]["correction"] .
  88. '</a>?' .
  89. '</div>';
  90. }
  91. /*
  92. Populate links
  93. */
  94. if(count($results["web"]) === 0){
  95. $payload["left"] .=
  96. '<div class="infobox">' .
  97. "<h1>Nobody here but us chickens!</h1>" .
  98. 'Have you tried:' .
  99. '<ul>' .
  100. '<li>Using a different scraper</li>' .
  101. '<li>Using fewer keywords</li>' .
  102. '<li>Defining broader filters (Is NSFW turned off?)</li>' .
  103. '</ul>' .
  104. '</div>';
  105. }
  106. foreach($results["web"] as $site){
  107. $n = null;
  108. if($site["date"] !== null){
  109. $date = date("jS M y @ g:ia", $site["date"]);
  110. }else{
  111. $date = null;
  112. }
  113. $payload["left"] .= $frontend->drawtextresult($site, $date, $n, $get["s"]);
  114. }
  115. $right = [];
  116. /*
  117. Generate images
  118. */
  119. if(count($results["image"]) !== 0){
  120. $answerlen++;
  121. $right["image"] =
  122. '<div class="answer-wrapper">' .
  123. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  124. '<div class="answer">' .
  125. '<div class="answer-title">' .
  126. '<a class="answer-title" href="/images?s=' . urlencode($get["s"]) . '"><h2>Images</h2></a>' .
  127. '</div>' .
  128. '<div class="images">';
  129. foreach($results["image"] as $image){
  130. $right["image"] .=
  131. '<a class="image" href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow" title="' . htmlspecialchars($image["title"]) . '" data-json="' . htmlspecialchars(json_encode($image["source"])) . '" tabindex="-1">' .
  132. '<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "square") . '" alt="thumb">' .
  133. '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>' .
  134. '</a>';
  135. }
  136. $right["image"] .=
  137. '</div></div>' .
  138. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  139. }
  140. /*
  141. Generate videos
  142. */
  143. if(count($results["video"]) !== 0){
  144. $answerlen++;
  145. $right["video"] =
  146. '<div class="answer-wrapper">' .
  147. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  148. '<div class="answer">' .
  149. '<div class="answer-title">' .
  150. '<a class="answer-title" href="/videos?s=' . urlencode($get["s"]) . '"><h2>Videos</h2></a>' .
  151. '</div>';
  152. foreach($results["video"] as $video){
  153. if($video["views"] !== null){
  154. $greentext = number_format($video["views"]) . " views";
  155. }else{
  156. $greentext = null;
  157. }
  158. if($video["date"] !== null){
  159. if($greentext !== null){
  160. $greentext .= " • ";
  161. }
  162. $greentext .= date("jS M y @ g:ia", $video["date"]);
  163. }
  164. if($video["duration"] !== null){
  165. if($video["duration"] == "_LIVE"){
  166. $duration = 'LIVE';
  167. }else{
  168. $duration = $frontend->s_to_timestamp($video["duration"]);
  169. }
  170. }else{
  171. $duration = null;
  172. }
  173. $right["video"] .= $frontend->drawtextresult($video, $greentext, $duration, $get["s"], false);
  174. }
  175. $right["video"] .=
  176. '</div>' .
  177. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  178. }
  179. /*
  180. Generate news
  181. */
  182. if(count($results["news"]) !== 0){
  183. $answerlen++;
  184. $right["news"] =
  185. '<div class="answer-wrapper">' .
  186. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  187. '<div class="answer">' .
  188. '<div class="answer-title">' .
  189. '<a class="answer-title" href="/news?s=' . urlencode($get["s"]) . '"><h2>News</h2></a>' .
  190. '</div>';
  191. foreach($results["news"] as $news){
  192. if($news["date"] !== null){
  193. $greentext = date("jS M y @ g:ia", $news["date"]);
  194. }else{
  195. $greentext = null;
  196. }
  197. $right["news"] .= $frontend->drawtextresult($news, $greentext, null, $get["s"], false);
  198. }
  199. $right["news"] .=
  200. '</div>' .
  201. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  202. }
  203. /*
  204. Generate answers
  205. */
  206. if(count($results["answer"]) !== 0){
  207. $right["answer"] = "";
  208. foreach($results["answer"] as $answer){
  209. $answerlen++;
  210. $right["answer"] .=
  211. '<div class="answer-wrapper">' .
  212. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  213. '<div class="answer"><div class="wiki-head">';
  214. if(!empty($answer["title"])){
  215. $right["answer"] .=
  216. '<div class="answer-title">';
  217. if(!empty($answer["url"])){
  218. $right["answer"] .= '<a class="answer-title" href="' . htmlspecialchars($answer["url"]) . '" rel="noreferrer nofollow">';
  219. }
  220. $right["answer"] .= '<h1>' . htmlspecialchars($answer["title"]) . '</h1>';
  221. if(!empty($answer["url"])){
  222. $right["answer"] .= '</a>';
  223. }
  224. $right["answer"] .= '</div>';
  225. }
  226. if(!empty($answer["url"])){
  227. $right["answer"] .=
  228. $frontend->drawlink($answer["url"]);
  229. }
  230. $right["answer"] .= '<div class="description">';
  231. if(!empty($answer["thumb"])){
  232. $right["answer"] .=
  233. '<a href="' . htmlspecialchars($answer["thumb"]) . '" rel="noreferrer nofollow" class="photo">' .
  234. '<img src="' . $frontend->htmlimage($answer["thumb"], "cover") . '" alt="thumb" class="openimg">' .
  235. '</a>';
  236. }
  237. foreach($answer["description"] as $description){
  238. switch($description["type"]){
  239. case "text":
  240. $right["answer"] .= $frontend->highlighttext($get["s"], $description["value"]);
  241. break;
  242. case "title":
  243. $right["answer"] .=
  244. '<h2>' .
  245. htmlspecialchars($description["value"]) .
  246. '</h2>';
  247. break;
  248. case "italic":
  249. $right["answer"] .=
  250. '<i>' .
  251. $frontend->highlighttext($get["s"], $description["value"]) .
  252. '</i>';
  253. break;
  254. case "quote":
  255. $right["answer"] .=
  256. '<div class="quote">' .
  257. $frontend->highlighttext($get["s"], $description["value"]) .
  258. '</div>';
  259. break;
  260. case "code":
  261. $right["answer"] .=
  262. '<div class="code" tabindex="-1">' .
  263. $frontend->highlightcode($description["value"], true) .
  264. '</div>';
  265. break;
  266. case "inline_code":
  267. $right["answer"] .=
  268. '<div class="code-inline">' .
  269. htmlspecialchars($description["value"]) .
  270. '</div>';
  271. break;
  272. case "link":
  273. $right["answer"] .=
  274. '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" class="underline" tabindex="-1">' . htmlspecialchars($description["value"]) . '</a>';
  275. break;
  276. case "image":
  277. $right["answer"] .=
  278. '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" tabindex="-1"><img src="' . $frontend->htmlimage($description["url"], "thumb") . '" alt="image" class="fullimg openimg"></a>';
  279. break;
  280. case "audio":
  281. $right["answer"] .=
  282. '<audio src="/audio?s=' . urlencode($description["url"]) . '" controls><a href="/audio.php?s=' . urlencode($description["url"]) . '">Listen to the pronunciation audio</a></audio>';
  283. break;
  284. }
  285. }
  286. $right["answer"] .= '</div>';
  287. if(count($answer["table"]) !== 0){
  288. $right["answer"] .= '<table>';
  289. foreach($answer["table"] as $info => $value){
  290. $right["answer"] .=
  291. '<tr>' .
  292. '<td>' . $info . '</td>' .
  293. '<td>' . $value . '</td>' .
  294. '</tr>';
  295. }
  296. $right["answer"] .= '</table>';
  297. }
  298. if(count($answer["sublink"]) !== 0){
  299. $right["answer"] .= '<div class="socials">';
  300. $icons = glob("static/icon/*");
  301. foreach($answer["sublink"] as $website => $url){
  302. $flag = false;
  303. $icon = str_replace(" ", "", strtolower($website));
  304. foreach($icons as $path){
  305. if(pathinfo($path, PATHINFO_FILENAME) == $icon){
  306. $flag = true;
  307. break;
  308. }
  309. }
  310. if($flag === false){
  311. $icon = "website";
  312. }
  313. $right["answer"] .=
  314. '<a href="' . htmlspecialchars($url) . '" rel="noreferrer nofollow" tabindex="-1">' .
  315. '<div class="center">' .
  316. '<img src="/static/icon/' . $icon . '.png" alt="icon">' .
  317. '<div class="title">' . $website . '</div>' .
  318. '</div>' .
  319. '</a>';
  320. }
  321. $right["answer"] .= '</div>';
  322. }
  323. $right["answer"] .=
  324. '</div></div>' .
  325. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  326. }
  327. }
  328. /*
  329. Add right containers
  330. */
  331. if(isset($right["answer"])){
  332. if(count($right) >= 2){
  333. $payload["right-right"] = $right["answer"];
  334. unset($right["answer"]);
  335. }
  336. }
  337. $c = 0;
  338. foreach($right as $snippet){
  339. if($c % 2 === 0){
  340. $payload["right-left"] .= $snippet;
  341. }else{
  342. $payload["right-right"] .= $snippet;
  343. }
  344. $c++;
  345. }
  346. if($c !== 0){
  347. $payload["class"] = " has-answer";
  348. }
  349. /*
  350. Generate related searches
  351. */
  352. $c = count($results["related"]);
  353. if($c !== 0){
  354. $payload["left"] .= '<h3>Related searches</h3><table class="related">';
  355. $opentr = false;
  356. for($i=0; $i<$c; $i++){
  357. if(($i % 2) === 0){
  358. $opentr = true;
  359. $payload["left"] .= '<tr>';
  360. }else{
  361. $opentr = false;
  362. }
  363. $payload["left"] .=
  364. '<td>' .
  365. '<a href="/web?s=' .
  366. urlencode($results["related"][$i]) . "&" .
  367. $frontend->buildquery($get, true) .
  368. '">' .
  369. htmlspecialchars($results["related"][$i]) .
  370. '</a>';
  371. $payload["left"] .= '</td>';
  372. if($opentr === false){
  373. $payload["left"] .= '</tr>';
  374. }
  375. }
  376. if($opentr === true){
  377. $payload["left"] .= '<td></td></tr>';
  378. }
  379. $payload["left"] .= '</table>';
  380. }
  381. /*
  382. Load next page
  383. */
  384. if($results["npt"] !== null){
  385. $payload["left"] .=
  386. '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "web") . '" class="nextpage">Next page &gt;</a>';
  387. }
  388. echo $frontend->load("search.html", $payload);