如何获取leetcode的题库

时间:2024-10-11 07:13:42
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
	}