package main import ( "fmt" "io/ioutil" "net/http" "net/url" "strings" "time" "github.com/PuerkitoBio/goquery" ) // PerformBraveTextSearch performs a text search on Brave and returns the results. func PerformBraveTextSearch(query, safe, lang string, offset int) ([]TextSearchResult, time.Duration, error) { startTime := time.Now() // Start the timer var results []TextSearchResult // Build the search URL searchURL := fmt.Sprintf("https://search.brave.com/search?q=%s&offset=%d", url.QueryEscape(query), offset) req, err := http.NewRequest("GET", searchURL, nil) if err != nil { return nil, 0, fmt.Errorf("creating request: %v", err) } // Set headers including User-Agent TextUserAgent, err := GetUserAgent("Text-Search") if err != nil { return nil, 0, err } req.Header.Set("User-Agent", TextUserAgent) // Perform the HTTP request client := &http.Client{} resp, err := client.Do(req) if err != nil { return nil, 0, fmt.Errorf("performing request: %v", err) } defer resp.Body.Close() // Read the response body body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, 0, fmt.Errorf("reading response body: %v", err) } // Parse the response body doc, err := goquery.NewDocumentFromReader(strings.NewReader(string(body))) if err != nil { return nil, 0, fmt.Errorf("parsing response body: %v", err) } // Extract search results doc.Find(".snippet").Each(func(i int, s *goquery.Selection) { title := s.Find(".title").Text() description := s.Find(".snippet-description").Text() url, exists := s.Find("a").Attr("href") // Add to results only if all components are present if title != "" && description != "" && exists && url != "" { results = append(results, TextSearchResult{ Header: title, URL: url, Description: description, }) } }) duration := time.Since(startTime) // Calculate the duration // Return an error if no results are found if len(results) == 0 { return nil, duration, fmt.Errorf("no results found") } return results, duration, nil }