coding地址
最近在刷leetocode,使用goland上的插件 leetcode editor 虽然可以将题目下载下来,但是复制粘贴到自己的 github 上很麻烦。于是发挥一下主观能动性。
1、先登录 leetcode,观察一下是如何获取到所有的题目的
从这里可以看出来,通过 graphql 查询的,这里也不需要特别关注这个语法结构,只需要知道我们通过 post 请求,传入body来获取题目列表。然后这里会需要 LEETCODE_SESSION ,这里session是我们登陆网站的凭证,通过登陆那里获取到,不过我们可以直接使用这里的 LEETCODE_SESSION ,这个session不会变得十分频繁。
2、获取题目详情
同样这里也是通过 graphql 查询题目详情,这里的 variables 里的 titleSlug 是上面题目列表中查询到的。
到了这里我们可以正式开始写获取题目的代码了
3、代码
var (
configOnce sync.Once
configCookie string
)
func GetConfigCookie() string {
configOnce.Do(func() {
v := viper.New()
v.SetConfigName("config")
v.AddConfigPath("helper")
v.SetConfigType("yaml")
v.ReadInConfig()
configCookie = v.GetString("Cookie")
})
return configCookie
}
func NewRequest(method string, url string, body io.Reader) ([]byte, error) {
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, err
}
viper.AutomaticEnv()
viper.AddConfigPath("./helper")
req.Header.Set("Cookie", GetConfigCookie())
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}