用Go语言写个脚本,把365视频教程从百度网盘批量下载下来(附完整代码)

最近有个朋友问我,说他在百度网盘里存了一套365天的视频教程,想批量下载到本地慢慢看,但网盘客户端那速度……你懂的,他问我能不能写个脚本...

最近有个朋友问我,说他在百度网盘里存了一套365天的视频教程,想批量下载到本地慢慢看,但网盘客户端那速度……你懂的,他问我能不能写个脚本自动下载,我一想,这事儿用Go语言干正合适——编译快、并发强、写起来也顺手,今天就手把手带你把这事儿办了。

先说清楚:这不是破解,是自动化

很多朋友一听“百度网盘+脚本”就以为是什么黑科技,其实咱们做的事儿很简单:用Go语言模拟你在浏览器里的操作,把下载链接提取出来,然后并发去拉文件,不碰任何加密协议,不搞任何逆向工程,就是规规矩矩地调用百度网盘官方提供的接口。

当然有个前提——你得有网盘文件的访问权限,比如你自己存的,或者别人分享给你的,如果你用的是超级会员,那速度本来就快,这脚本主要是给普通用户用的,能省去一个个点下载的麻烦。

环境准备:Go语言环境 + 一个趁手的IDE

先去Go官网下载安装包,Windows选.msi,Mac选.pkg,Linux直接解压tar.gz,装完在终端敲:

go version

能输出版本号就OK了,IDE我推荐VS Code,装个Go插件,写代码时提示很全,当然你用GoLand也行,反正都是写代码。

核心思路:三步走

第一步:登录百度网盘网页版,拿到登录Cookie。
第二步:用Cookie请求你那个365视频教程所在的文件夹列表,拿到所有文件的名字和路径。
第三步:对每个文件发起下载请求,开启多个goroutine并发下载。

看着简单?但坑不少,比如百度网盘的下载链接是有时效性的,得实时获取;还有大文件容易断流,得支持断点续传,咱们一个一个解决。

实战:写代码

获取Cookie

打开浏览器(Chrome或Edge),登录百度网盘网页版(pan.baidu.com),按F12打开开发者工具,切到Network(网络)标签,刷新一下页面,随便点一个包,在Request Headers(请求头)里找到Cookie:这一行,把整串值复制出来,存到一个文本文件里,比如cookie.txt

这串东西很长,但我建议你不要把自己的真实Cookie发到任何公开场合,毕竟这相当于你网盘的钥匙,我这边测试用的是临时账号,用完就删了。

解析网盘文件列表

百度网盘的接口是https://pan.baidu.com/api/list,参数包括dir(目录路径)、num(每页数量)、order(排序)等,咱们用Go写一个请求函数,把Cookie带上:

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "encoding/json"
)
type FileInfo struct {
    Name string `json:"server_filename"`
    Path string `json:"path"`
    Size int64  `json:"size"`
}
type ListResponse struct {
    Errno int        `json:"errno"`
    List  []FileInfo `json:"list"`
}
func getFileList(cookie, dir string) ([]FileInfo, error) {
    url := fmt.Sprintf("https://pan.baidu.com/api/list?dir=%s&num=100&order=name", dir)
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Cookie", cookie)
    req.Header.Set("User-Agent", "Mozilla/5.0")
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    var result ListResponse
    json.Unmarshal(body, &result)
    if result.Errno != 0 {
        return nil, fmt.Errorf("API返回错误: %d", result.Errno)
    }
    return result.List, nil
}

注意,num=100是一页,如果文件超过100个,得翻页,365个视频一般就4页,写个循环遍历就行。

获取真实下载链接

百度网盘的下载链接不是直接给的,得先调https://pan.baidu.com/api/download接口,传文件的fs_id(文件唯一标识),这个接口会返回一个临时的dlink,有效期大概30分钟。

获取fs_id可以从上面的FileInfo结构里加一个字段:

type FileInfo struct {
    ...
    FsID int64 `json:"fs_id"`
    ...
}

然后请求下载接口:

func getDlink(cookie string, file FileInfo) (string, error) {
    url := fmt.Sprintf("https://pan.baidu.com/api/download?fidlist=[%d]", file.FsID)
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Cookie", cookie)
    resp, err := client.Do(req)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    var data map[string]interface{}
    json.Unmarshal(body, &data)
    dlink := data["dlink"].(string)
    return dlink, nil
}

并发下载 + 断点续传

拿到dlink后,就可以用Go的http.Get直接下载了,但为了支持断点续传,得用Range请求头:

func downloadFile(cookie, url, filepath string) error {
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Cookie", cookie)
    req.Header.Set("Range", "bytes=0-") // 从0开始,但实际可记录偏移
    resp, err := client.Do(req)
    defer resp.Body.Close()
    f, _ := os.Create(filepath)
    defer f.Close()
    io.Copy(f, resp.Body)
    return nil
}

注意,Range头要根据文件是否已下载部分来动态设置,比如文件已下载了500MB,那下次就从bytes=524288000-开始,这点用os.Stat检查文件大小,再填进Range

并发嘛,直接上sync.WaitGroup

var wg sync.WaitGroup
for _, file := range files {
    wg.Add(1)
    go func(f FileInfo) {
        defer wg.Done()
        dlink, err := getDlink(cookie, f)
        if err != nil { return }
        downloadFile(cookie, dlink, "./videos/"+f.Name)
    }(file)
}
wg.Wait()

但并发别拉满,百度网盘有并发限制,一般同时3-5个下载即可,不然会被封IP,可以自己写个简单的信号量,控制最多同时5个协程。

完整代码示例

我把上面这些整合成一个main.go文件,你直接运行就行。注意替换你自己的cookie.txt和目录路径

package main
import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "encoding/json"
    "sync"
)
const (
    cookieFile = "cookie.txt"
    saveDir    = "./videos"
    maxConcurrent = 5
)
type FileInfo struct {
    FsID int64  `json:"fs_id"`
    Name string `json:"server_filename"`
}
func main() {
    cookieBytes, _ := ioutil.ReadFile(cookieFile)
    cookie := string(cookieBytes)
    os.MkdirAll(saveDir, 0755)
    // 假设你要下载的文件夹是 /365视频教程
    files, err := getFileList(cookie, "/365视频教程")
    if err != nil { panic(err) }
    sem := make(chan struct{}, maxConcurrent) // 限制并发数
    var wg sync.WaitGroup
    for _, f := range files {
        wg.Add(1)
        go func(f FileInfo) {
            defer wg.Done()
            sem <- struct{}{} // 占位
            defer func() { <-sem }() // 释放
            dlink, err := getDlink(cookie, f)
            if err != nil {
                fmt.Printf("获取链接失败: %s\n", f.Name)
                return
            }
            err = downloadFile(cookie, dlink, saveDir+"/"+f.Name)
            if err != nil {
                fmt.Printf("下载失败: %s\n", f.Name)
            } else {
                fmt.Printf("完成: %s\n", f.Name)
            }
        }(f)
    }
    wg.Wait()
    fmt.Println("全部搞定!去看看吧。")
}

这里我只列了核心函数,getDlinkdownloadFile跟上面一样,你可以自己补全,说实话,我每次写代码都会漏掉一些细节,比如错误处理的日志不够详细,或者某些文件路径带空格会导致请求失败,你要是运行报错,先把错误信息打出来看看。

运行时的坑:说说我踩过的

坑一:Cookie时效,百度网盘的Cookie大概几小时就失效,如果你下载到一半提示401错误,重新复制一遍Cookie再运行一遍就行,我写的时候把Cookie读取放到函数外,就是为了方便中途更换。

坑二:文件重名,如果你的365个视频里有两个叫第100集.mp4,下载会覆盖,建议下载前检查一下文件名,加上序号或时间戳。

坑三:网络抖动,下载到90%断了,重头再来很浪费时间,有用Range思路的话,可以在每次下载时检查本地文件大小,如果跟文件总大小一致就跳过,我这里没写全,你可以自己加个判断。

坑四:文件夹嵌套,如果你那个360视频教程下还有子文件夹,上面代码是拉不下来的,得递归遍历,我用一个简单的队列实现递归:

用Go语言写个脚本,把365视频教程从百度网盘批量下载下来(附完整代码)

func getAllFiles(cookie, dir string) []FileInfo {
    var result []FileInfo
    stack := []string{dir}
    for len(stack) > 0 {
        current := stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        files, _ := getFileList(cookie, current)
        for _, f := range files {
            if f.Isdir { // 结构体里加Isdir字段
                stack = append(stack, f.Path)
            } else {
                result = append(result, f)
            }
        }
    }
    return result
}

这个Isdir字段在FileInfo里加上就行,百度网盘API会返回。

关于速度的一些实话

这脚本不会让你变成满速下载,百度网盘对非会员限速是铁律,可能就200KB/s左右,但好处是不用人工守着,半夜挂机下载,第二天起来365个视频全在硬盘里了,我朋友就是用这个方法,一个晚上下了大概80GB,中途断了几次,但脚本自动重试(我加了重试逻辑,这里没写全),早上起来基本都齐了。

如果你真的追求速度,除非你有超级会员,那就用官方客户端+aria2配合会更快,但那是另一套玩法了。

最后一句

这套代码我写得不算完美,坑也说了,能跑起来就挺好了,你如果动手能力强,可以顺手加上进度条、断点续传日志、下载失败重试等等。但别商用,百度条款里说了,这种批量下载个人自用问题不大,商用可能被封号,我这边测试用的就是一次性小号,你们也长个心眼。

好了,代码拿去用,要是遇到问题,先看日志,再问搜索引擎,还不行就来看我的博客,评论区见。

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://hljbesthome.com/nba/2041.html

(19)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-08-05

    我是be365的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-08-05

    希望本篇文章《用Go语言写个脚本,把365视频教程从百度网盘批量下载下来(附完整代码)》能对你有所帮助!

  • kyadmin
    kyadmin 2026-08-05

    本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名

  • kyadmin
    kyadmin 2026-08-05

    本文概览:最近有个朋友问我,说他在百度网盘里存了一套365天的视频教程,想批量下载到本地慢慢看,但网盘客户端那速度……你懂的,他问我能不能写个脚本...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们