一段模拟登陆极客学院的小程序。

nladuo · 2015-10-25 11:40:16 · 3468 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-10-25 11:40:16 的主题,其中的信息可能已经有所发展或是发生改变。

本来以为极客学院只有年费会员才可以下载视频的,月会员不能直接下载。用wget一个一个搞感觉太慢,于是用golang写了一段程序,直接生成一段shell脚本。后来知道视频其实也可以右键直接下载的,这段程序也没有什么卵用,还是贴出来分享一下吧。(现在还是小白,感觉代码写的不太好,见谅哈)

代码:

package main
import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "io"
    "io/ioutil"
    "net/http"
    "net/http/cookiejar"
    "net/url"
    "os"
)

var cookies []*http.Cookie

const (
    spider_base_url     string = "http://www.jikexueyuan.com/path/docker/"
    login_url           string = "http://passport.jikexueyuan.com/sso/login"
    verify_code_url     string = "http://passport.jikexueyuan.com/sso/verify"
    post_login_info_url string = "http://passport.jikexueyuan.com/submit/login?is_ajax=1"
    username            string = "用户名"
    password            string = "密码"
)

func getResultHtml(get_url string) *http.Response {
    c := &http.Client{}
    Jar, _ := cookiejar.New(nil)
    getURL, _ := url.Parse(get_url)
    Jar.SetCookies(getURL, cookies)
    c.Jar = Jar
    res, _ := c.Get(get_url)
    return res
}

func login() {
    //获取登陆界面的cookie
    c := &http.Client{}
    req, _ := http.NewRequest("GET", login_url, nil)
    res, _ := c.Do(req)

    req.URL, _ = url.Parse(verify_code_url)
    var temp_cookies = res.Cookies()

    for _, v := range res.Cookies() {
        req.AddCookie(v)
    }
    // 获取验证码
    var verify_code string
    for {
        res, _ = c.Do(req)
        file, _ := os.Create("verify.gif")
        io.Copy(file, res.Body)

        fmt.Println("请查看verify.gif, 然后输入验证码, 看不清输入0重新获取验证码")
        fmt.Scanf("%s", &verify_code)
        if verify_code != "0" {
            break
        }
        res.Body.Close()
    }
    //post数据
    postValues := url.Values{}
    postValues.Add("expire", "7")
    postValues.Add("referer", "http%3A%2F%2Fwww.jikexueyuan.com%2F")
    postValues.Add("uname", username)
    postValues.Add("password", password)
    postValues.Add("verify", verify_code)

    postURL, _ := url.Parse(post_login_info_url)
    Jar, _ := cookiejar.New(nil)
    Jar.SetCookies(postURL, temp_cookies)
    c.Jar = Jar
    res, _ = c.PostForm(post_login_info_url,
        postValues)

    cookies = res.Cookies()
    data, _ := ioutil.ReadAll(res.Body)
    res.Body.Close()
    fmt.Println(string(data))
}

type DownloadBean struct {
    dirname  string
    filename string
    href     string
}

func main() {

    login()
    for _, v := range cookies {
        fmt.Println(v)
    }
    var bash_str string = "#!/bin/bash \n"
    baseMap := map[string]string{}
    doc, _ := goquery.NewDocumentFromResponse(getResultHtml(spider_base_url))
    doc.Find(".lesson-info-h2").Each(func(i int, contentSelection *goquery.Selection) {
        selection := contentSelection.Find("a")
        base_href, _ := selection.Attr("href")
        dir_name := selection.Text()
        bash_str += "mkdir \"" + dir_name + "\"\n"
        baseMap[dir_name] = base_href
        fmt.Println(dir_name, "-->", base_href)

    })
    downloadList := []DownloadBean{}

    for k, v := range baseMap {
        doc, _ := goquery.NewDocumentFromResponse(getResultHtml(v))
        doc.Find(".lessonvideo-list dd h2").Each(func(i int, contentSelection *goquery.Selection) {
            selection := contentSelection.Find("a")
            href, _ := selection.Attr("href")
            filename := selection.Text()
            fmt.Println(k, "-->", filename, "-->", href)
            bean := DownloadBean{dirname: k, href: href, filename: filename}
            downloadList = append(downloadList, bean)
        })
    }

    for _, v := range downloadList {
        doc, _ := goquery.NewDocumentFromResponse(getResultHtml(v.href))
        doc.Find("source").Each(func(i int, contentSelection *goquery.Selection) {
            download_url, _ := contentSelection.Attr("src")
            one_file := "wget " + download_url + "  -O \"./" + v.dirname + "/" + v.filename + ".mp4\"\n"
            bash_str += one_file
            fmt.Println(one_file)
        })
    }

    err := ioutil.WriteFile("./download.sh", []byte(bash_str), 0x777)
    if err != nil {
        panic(err.Error())
    }

    fmt.Println("写入脚本完成")

}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3468 次点击  ∙  4 赞  
加入收藏 微博
1 回复  |  直到 2016-10-12 07:32:16
miles
miles · #1 · 8年之前

刚测试了,获取不了验证码

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传