brave.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. class BraveSearchRequest extends EngineRequest {
  3. public function get_request_url() {
  4. $query_encoded = str_replace("%22", "\"", urlencode($this->query));
  5. $results_language = $this->opts->language;
  6. $number_of_results = $this->opts->number_of_results;
  7. // TODO find the right parameters for the url
  8. $url = "https://search.brave.com/search?q=$query_encoded&nfpr=1&spellcheck=0&start=$this->page";
  9. if (3 > strlen($results_language) && 0 < strlen($results_language)) {
  10. $url .= "&lr=lang_$results_language";
  11. $url .= "&hl=$results_language";
  12. }
  13. if (3 > strlen($number_of_results) && 0 < strlen($number_of_results))
  14. $url .= "&num=$number_of_results";
  15. if (isset($_COOKIE["safe_search"]))
  16. $url .= "&safe=medium";
  17. return $url;
  18. }
  19. public function parse_results($response) {
  20. $results = array();
  21. $xpath = get_xpath($response);
  22. if (!$xpath)
  23. return $results;
  24. foreach($xpath->query("//div[@id='results']//div[contains(@class, 'snippet')]") as $result) {
  25. $url = $xpath->evaluate(".//a[contains(@class, 'h')]//@href", $result)[0];
  26. if ($url == null)
  27. continue;
  28. $url = $url->textContent;
  29. if (!empty($results) && array_key_exists("url", end($results)) && end($results)["url"] == $url->textContent)
  30. continue;
  31. $title = $xpath->evaluate(".//a[contains(@class, 'h')]//div[contains(@class, 'url')]", $result)[0];
  32. if ($title == null)
  33. continue;
  34. $title = $title->textContent;
  35. $title = end(explode("›", $title));
  36. $description = ($xpath->evaluate(".//div[contains(@class, 'snippet-content')]//div[contains(@class, 'snippet-description')]", $result)[0] ?? null) ?->textContent ?? '';
  37. array_push($results,
  38. array (
  39. "title" => htmlspecialchars($title),
  40. "url" => htmlspecialchars($url),
  41. // base_url is to be removed in the future, see #47
  42. "base_url" => htmlspecialchars(get_base_url($url)),
  43. "description" => $description == null ?
  44. TEXTS["result_no_description"] :
  45. htmlspecialchars($description)
  46. )
  47. );
  48. }
  49. return $results;
  50. }
  51. }
  52. ?>