学习Go语言有段时间了,想要拿go来做点东西,首先想到的就是把《极客时间》买的专栏下载下来,这样方便自已搜索并且统一管理。

有了想法之后就开始动手实战,遇到的第一个问题就是怎么模拟用户的登录。有好几种方法可以做到,比如在代码中调用登录的接口,或者调用API的时候带着Cookie。这两种方法都需要我们在代码中配置用户名密码或者Cookie之类的,比较麻烦。

如果用户已经在浏览器中登录了,能不能直接拿着浏览器中的Cookie去登录呢?调研了一翻发现可行。以下是代码,供大家参考。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"

	"github.com/onyas/go-browsercookie"
)

func main() {
	var cookieJar, _ = browsercookie.Chrome("https://account.geekbang.org")
	var client = &http.Client{Jar: cookieJar}

	request, _ := http.NewRequest("POST", "https://time.geekbang.org/serv/v1/my/columns", strings.NewReader("{}"))

	request.Header.Set("Origin", "https://time.geekbang.org")
	request.Header.Set("Referer", "https://time.geekbang.org")
	request.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36")
	request.Header.Set("X-Real-IP", "211.161.244.200")
	request.Header.Set("Connection", "keep-alive")
	request.Header.Set("Content-Type", "application/json")
	request.Header.Add("Content-Length", "2")

	res, _ := client.Do(request)
	defer res.Body.Close()

	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}

首先要保证在Chrome里面登录极客时间,然后执行go run main.go, 会要求输入电脑的密码,用于取cookie用。然后就输出你已购买的课程。这里主要用到了一个go-browsercookie工具类,大家可以到github上面查看具体的用法go-browsercookie