package main import ( "encoding/json" "fmt" "io" "net/http" "net/url" "strings" ) // Wikipedia API response structure type WikipediaResponse struct { Query struct { Pages map[string]struct { PageID int `json:"pageid"` Title string `json:"title"` Extract string `json:"extract"` } `json:"pages"` } `json:"query"` } // Get Wikipedia summary func getWikipediaSummary(query string) (title, text, link string, ok bool) { // Clean and prepare query query = strings.TrimSpace(query) if query == "" { return "", "", "", false } // API request apiURL := fmt.Sprintf( "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&exintro&explaintext&redirects=1&titles=%s", url.QueryEscape(query), ) resp, err := http.Get(apiURL) if err != nil { return "", "", "", false } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "", "", "", false } // Parse JSON response var result WikipediaResponse if err := json.Unmarshal(body, &result); err != nil { return "", "", "", false } // Extract first valid page for _, page := range result.Query.Pages { if page.PageID == 0 || page.Extract == "" { continue } // Format text text = page.Extract if len(text) > 500 { text = text[:500] + "..." } // Create link titleForURL := strings.ReplaceAll(page.Title, " ", "_") link = fmt.Sprintf("https://en.wikipedia.org/wiki/%s", url.PathEscape(titleForURL)) return page.Title, text, link, true } return "", "", "", false }