duckduckgo.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. class DuckDuckGoRequest extends EngineRequest {
  3. public function get_request_url() {
  4. $query_encoded = str_replace("%22", "\"", urlencode($this->query));
  5. $results = array();
  6. $domain = 'com';
  7. $results_language = $this->opts->language;
  8. $number_of_results = $this->opts->number_of_results;
  9. $url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $this->page;
  10. if (3 > strlen($results_language) && 0 < strlen($results_language))
  11. $url .= "&lr=lang_$results_language";
  12. if (3 > strlen($number_of_results) && 0 < strlen($number_of_results))
  13. $url .= "&num=$number_of_results";
  14. if (isset($_COOKIE["safe_search"]))
  15. $url .= "&safe=medium";
  16. return $url;
  17. }
  18. public function parse_results($response) {
  19. $results = array();
  20. $xpath = get_xpath($response);
  21. if (!$xpath)
  22. return $results;
  23. foreach($xpath->query("/html/body/div[1]/div[". count($xpath->query('/html/body/div[1]/div')) ."]/div/div/div[contains(@class, 'web-result')]/div") as $result) {
  24. $url = $xpath->evaluate(".//h2[@class='result__title']//a/@href", $result)[0];
  25. if ($url == null)
  26. continue;
  27. if (!empty($results)) { // filter duplicate results
  28. if (end($results)["url"] == $url->textContent)
  29. continue;
  30. }
  31. $url = $url->textContent;
  32. $title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0];
  33. $description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0];
  34. array_push($results,
  35. array (
  36. "title" => htmlspecialchars($title->textContent),
  37. "url" => htmlspecialchars($url),
  38. // base_url is to be removed in the future, see #47
  39. "base_url" => htmlspecialchars(get_base_url($url)),
  40. "description" => $description == null ?
  41. TEXTS["result_no_description"] :
  42. htmlspecialchars($description->textContent)
  43. )
  44. );
  45. }
  46. return $results;
  47. }
  48. }
  49. ?>