Search/ia-wiki.go

75 lines
1.5 KiB
Go
Raw Normal View History

2025-06-25 23:23:33 +02:00
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
}