Created
December 23, 2023 17:52
-
-
Save minhphong306/d7de92d80b664539e1326dcfa7712152 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/json" | |
"fmt" | |
"io/ioutil" | |
"net/http" | |
) | |
type AutoGenerated struct { | |
ID string `json:"id"` | |
Slug string `json:"slug"` | |
Language string `json:"language"` | |
Title string `json:"title"` | |
Difficulty string `json:"difficulty"` | |
Points int `json:"points"` | |
Free bool `json:"free"` | |
Videos []struct { | |
URL string `json:"url"` | |
Title string `json:"title"` | |
} `json:"videos"` | |
Tags []string `json:"tags"` | |
Course string `json:"course"` | |
Sort int `json:"sort"` | |
Code struct { | |
Status string `json:"status"` | |
} `json:"code"` | |
} | |
func main() { | |
// read data from data.json | |
data, err := ioutil.ReadFile("./data.json") | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
// parse data into array of strings | |
var raw []AutoGenerated | |
err = json.Unmarshal(data, &raw) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
// fetch data for each handle | |
for _, handle := range raw { | |
fetchAndWriteData(handle.Slug) | |
} | |
} | |
func fetchAndWriteData(handle string) { | |
url := fmt.Sprintf("https://www.smartcontract.engineer/_next/data/JRDyRmSvbq7qtJLBd3OUY/challenges/%v.json?course=sol&slug=%v", handle, handle) | |
method := "GET" | |
client := &http.Client { | |
} | |
req, err := http.NewRequest(method, url, nil) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
req.Header.Add("authority", "www.smartcontract.engineer") | |
req.Header.Add("accept", "*/*") | |
req.Header.Add("accept-language", "en-US,en;q=0.9") | |
req.Header.Add("cookie", "xxx") | |
req.Header.Add("referer", "https://www.smartcontract.engineer/challenges?course=sol") | |
req.Header.Add("sec-ch-ua", "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"") | |
req.Header.Add("sec-ch-ua-mobile", "?0") | |
req.Header.Add("sec-ch-ua-platform", "\"macOS\"") | |
req.Header.Add("sec-fetch-dest", "empty") | |
req.Header.Add("sec-fetch-mode", "cors") | |
req.Header.Add("sec-fetch-site", "same-origin") | |
req.Header.Add("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") | |
req.Header.Add("x-nextjs-data", "1") | |
res, err := client.Do(req) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
defer res.Body.Close() | |
body, err := ioutil.ReadAll(res.Body) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
// fmt.Println(string(body)) | |
// Save response body to file in data folder | |
ioutil.WriteFile(fmt.Sprintf("./data/%v.json", handle), body, 0644) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment