129 lines
3.7 KiB
Go
129 lines
3.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
// SearchRequest represents the structure of the input JSON for the API request.
|
||
|
type SearchRequest struct {
|
||
|
Query string `json:"query"`
|
||
|
Sort string `json:"sort"`
|
||
|
Set string `json:"set"`
|
||
|
Filters []interface{} `json:"filters"`
|
||
|
Limit int `json:"limit"`
|
||
|
VariantLimit bool `json:"variantLimit"`
|
||
|
CollectionLimit bool `json:"collectionLimit"`
|
||
|
Direction string `json:"direction"`
|
||
|
}
|
||
|
|
||
|
// Input represents the top-level structure of the input JSON for the API request.
|
||
|
type Input struct {
|
||
|
Part0 SearchRequest `json:"0"`
|
||
|
Part1 SearchRequest `json:"1"`
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
// Parameterize the Limit value
|
||
|
limit := 35
|
||
|
|
||
|
// Define the input data structure
|
||
|
input := Input{
|
||
|
Part0: SearchRequest{
|
||
|
Query: "",
|
||
|
Sort: "relevance",
|
||
|
Set: "*",
|
||
|
Filters: []interface{}{},
|
||
|
Limit: limit,
|
||
|
VariantLimit: false,
|
||
|
CollectionLimit: false,
|
||
|
Direction: "forward",
|
||
|
},
|
||
|
Part1: SearchRequest{
|
||
|
Query: "",
|
||
|
Sort: "relevance",
|
||
|
Set: "*",
|
||
|
Filters: []interface{}{},
|
||
|
CollectionLimit: false,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
// Serialize the input data structure to JSON
|
||
|
jsonData, err := json.Marshal(input)
|
||
|
if err != nil {
|
||
|
logErrorAndExit(fmt.Errorf("failed to marshal input data: %w", err))
|
||
|
}
|
||
|
|
||
|
// URL encode the JSON data
|
||
|
urlEncodedInput := url.QueryEscape(string(jsonData))
|
||
|
|
||
|
// Construct the full URL
|
||
|
apiURL := fmt.Sprintf("https://curiosa.io/api/trpc/card.search,card.count?batch=1&input=%s", urlEncodedInput)
|
||
|
|
||
|
// Create a new HTTP request
|
||
|
req, err := http.NewRequest("GET", apiURL, nil)
|
||
|
if err != nil {
|
||
|
logErrorAndExit(fmt.Errorf("failed to create request: %w", err))
|
||
|
}
|
||
|
|
||
|
// Set headers
|
||
|
setHeaders(req)
|
||
|
|
||
|
// Perform the HTTP request
|
||
|
client := &http.Client{}
|
||
|
resp, err := client.Do(req)
|
||
|
if err != nil {
|
||
|
logErrorAndExit(fmt.Errorf("failed to perform request: %w", err))
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
// Check for non-200 status codes
|
||
|
if resp.StatusCode != http.StatusOK {
|
||
|
logErrorAndExit(fmt.Errorf("non-200 response: %s", resp.Status))
|
||
|
}
|
||
|
|
||
|
// Read and pretty print the JSON response
|
||
|
var prettyJSON json.RawMessage
|
||
|
err = json.NewDecoder(resp.Body).Decode(&prettyJSON)
|
||
|
if err != nil {
|
||
|
logErrorAndExit(fmt.Errorf("failed to decode response body: %w", err))
|
||
|
}
|
||
|
|
||
|
prettyData, err := json.MarshalIndent(prettyJSON, "", " ")
|
||
|
if err != nil {
|
||
|
logErrorAndExit(fmt.Errorf("failed to marshal pretty JSON: %w", err))
|
||
|
}
|
||
|
|
||
|
// Output the pretty JSON to stdout
|
||
|
fmt.Println(string(prettyData))
|
||
|
}
|
||
|
|
||
|
// setHeaders sets the necessary headers for the HTTP request.
|
||
|
func setHeaders(req *http.Request) {
|
||
|
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0")
|
||
|
req.Header.Set("Accept", "*/*")
|
||
|
req.Header.Set("Accept-Language", "en-US,en;q=0.5")
|
||
|
req.Header.Set("Accept-Encoding", "gzip, deflate")
|
||
|
req.Header.Set("Referer", "https://curiosa.io/cards")
|
||
|
req.Header.Set("Content-Type", "application/json")
|
||
|
req.Header.Set("x-build-id", "a68dd8c6f6e3b605951c534ad22e788557cabd0d")
|
||
|
req.Header.Set("x-trpc-source", "nextjs-react")
|
||
|
req.Header.Set("DNT", "1")
|
||
|
req.Header.Set("Sec-GPC", "1")
|
||
|
req.Header.Set("Connection", "keep-alive")
|
||
|
req.Header.Set("Sec-Fetch-Dest", "empty")
|
||
|
req.Header.Set("Sec-Fetch-Mode", "cors")
|
||
|
req.Header.Set("Sec-Fetch-Site", "same-origin")
|
||
|
req.Header.Set("Priority", "u=4")
|
||
|
req.Header.Set("TE", "trailers")
|
||
|
}
|
||
|
|
||
|
// logErrorAndExit logs the error to stderr and exits with a non-zero status code.
|
||
|
func logErrorAndExit(err error) {
|
||
|
fmt.Fprintln(os.Stderr, err)
|
||
|
os.Exit(1)
|
||
|
}
|