// text-quant.go package main import ( "encoding/json" "fmt" "net/http" "net/url" "time" ) // QwantTextAPIResponse represents the JSON response structure from Qwant API type QwantTextAPIResponse struct { Data struct { Result struct { Items []struct { Title string `json:"title"` Url string `json:"url"` Snippet string `json:"desc"` } `json:"items"` } `json:"result"` } `json:"data"` } func PerformQwantTextSearch(query, safe, lang string) ([]TextSearchResult, error) { const resultsPerPage = 10 apiURL := fmt.Sprintf("https://api.qwant.com/v3/search/web?t=web&q=%s&count=%d&locale=%s&safesearch=%s", url.QueryEscape(query), resultsPerPage, lang, safe) client := &http.Client{Timeout: 10 * time.Second} req, err := http.NewRequest("GET", apiURL, nil) if err != nil { return nil, fmt.Errorf("creating request: %v", err) } req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36") resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("making request: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) } var apiResp QwantTextAPIResponse if err := json.NewDecoder(resp.Body).Decode(&apiResp); err != nil { return nil, fmt.Errorf("decoding response: %v", err) } var results []TextSearchResult for _, item := range apiResp.Data.Result.Items { results = append(results, TextSearchResult{ URL: item.Url, Header: item.Title, Description: item.Snippet, }) } return results, nil }