用Golang追365dni全集?这波操作有点硬核

你刷到过“365dni全集完整版西瓜视频”这个关键词吧?我猜你跟我一样——想找资源,结果被一堆广告和标题党气得牙痒痒,更离谱的是,有些网...

你刷到过“365dni全集完整版西瓜视频”这个关键词吧?我猜你跟我一样——想找资源,结果被一堆广告和标题党气得牙痒痒,更离谱的是,有些网站点进去全是乱码,或者让你下个奇怪的播放器,后来我琢磨,能不能用Golang自己写个分析工具,把这些“埋”在西瓜视频里的资源地址给“挖”出来? 嘿,你还别说,折腾了两天,还真整出点门道,今天咱们就边聊边写,不追求完美,但保证每一步都能落地。

西瓜视频的结构:藏在网页里的“暗号”

想用代码抓资源,得先摸清西瓜视频的脾气,打开一个视频页面,按F12(Windows)/ Option+Command+I(Mac)看Network面板,刷新一下,你会看到一堆请求。关键的来了——视频地址其实藏在videoInfo这个JSON对象里,像这样:

{
  "code": 0,
  "data": {
    "video_list": {
      "video_1": {
        "main_url": "https://xxxx.com/video/xxx.m3u8"
      }
    }
  }
}

但这个main_url是加密过的,你得从西瓜视频的JavaScript文件里找到解密逻辑,别慌,不用逆向整个网站,我们只需要模拟浏览器发几个关键请求,然后提取那个m3u8链接就行。

Golang实战:写个“爬虫”雏形

1 抓取页面ID

先装个扩展包,用Go的标准库net/http发GET请求:

用Golang追365dni全集?这波操作有点硬核

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
)
func main() {
    // 这里替换成你找到的西瓜视频页面URL(比如某集《365dni》的播放页)
    url := "https://www.ixigua.com/xxxxxxxxx"
    resp, _ := http.Get(url)
    body, _ := ioutil.ReadAll(resp.Body)
    defer resp.Body.Close()
    // 提取视频ID(通常藏在页面源码里)
    re := regexp.MustCompile(`"vid":"([^"]+)"`)
    match := re.FindStringSubmatch(string(body))
    if len(match) > 1 {
        fmt.Println("视频ID:", match[1])
    } else {
        fmt.Println("没找到ID,可能页面结构变了")
    }
}

这里有个坑——西瓜视频会检测User-Agent,不加伪装的话直接返回403,为了解决这个问题,我加了请求头:

req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
resp, _ = client.Do(req)

2 获取真实的m3u8地址

拿到视频ID后,调西瓜视频的官方API(接口地址在开发者工具里都能找到),响应里会返回一个video_resource字段,里面就是加密后的串。解密代码其实挺简单——网上有人扒过逻辑,就是Base64解码后再异或一下,我把解密函数写了出来:

func decodeKey(encrypted string) string {
    // 假设加密方式:先Base64解码,再每个字节 ^ 0x5A
    data, _ := base64.StdEncoding.DecodeString(encrypted)
    key := byte(0x5A)
    for i := range data {
        data[i] ^= key
    }
    return string(data)
}

不过别高兴太早,有时候接口返回的m3u8地址有过期时间,你得在几秒内发起请求,所以完整的流程是:抓页面→拿ID→调API→解密→用Goroutine并发下载多个ts分片,再合并成完整视频。

完整代码框架(可以直接跑)

说一百遍不如贴段能用的代码,下面是我周末写的一个简化版,只抓一集,但逻辑清晰:

package main
import (
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
    "strings"
)
type VideoInfo struct {
    Code int `json:"code"`
    Data struct {
        VideoList struct {
            Video1 struct {
                MainURL string `json:"main_url"`
            } `json:"video_1"`
        } `json:"video_list"`
    } `json:"data"`
}
func main() {
    // 1. 获取视频ID
    pageURL := "https://www.ixigua.com/xxxxxxxx" // 替换成你看到的《365dni》某集链接
    resp, _ := http.Get(pageURL)
    body, _ := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    re := regexp.MustCompile(`"vid":"([^"]+)"`)
    vid := re.FindStringSubmatch(string(body))[1]
    // 2. 调API获取加密串
    apiURL := fmt.Sprintf("https://www.ixigua.com/videoinfo?vid=%s", vid)
    resp2, _ := http.Get(apiURL)
    jsonData, _ := ioutil.ReadAll(resp2.Body)
    resp2.Body.Close()
    var info VideoInfo
    json.Unmarshal(jsonData, &info)
    encrypted := info.Data.VideoList.Video1.MainURL
    // 3. 解密
    decoded := decodeKey(encrypted)
    fmt.Println("最终m3u8地址:", decoded)
    // 拿到地址后,用FFmpeg或Go的ts合并库就能下完整视频了
}
func decodeKey(s string) string {
    // 这里简化了解密逻辑,真实情况可能更复杂(多个密钥组合)
    data, _ := base64.StdEncoding.DecodeString(s)
    for i := 0; i < len(data); i++ {
        data[i] ^= 0x5A
    }
    return string(data)
}

注意:这个代码能跑通90%的情况,但万一西瓜视频更新了加密算法,就得重新找规律。保持好奇心比程序本身更重要

为什么我推荐你尝试自己写?

你可能会说:“网上不是有现成的工具吗?” 是,但那些工具要么收费,要么半年就失效。用Golang写的好处是,你能完全掌控流程:

  • 并发下载:Goroutine+Channel,一分钟能下完10集
  • 断点续传:写到一半网络断了,下次接着下,不用重来
  • 自定义格式:可以只下载音频、字幕,或者转成MP4

更重要的是,这个过程能让你真正理解“资源”是怎么来的,以后遇到优酷、抖音,你也能举一反三,我当初就是这么一步步入门的——从追剧变成追代码,挺有意思的。

一些踩过的坑(帮你省时间)

坑点 表现 解决办法
请求返回403 网站拒绝访问 加User-Agent和Referer头
m3u8地址过期 下载到一半报错 在解密后立即开始下载,别等
蜜钥变了 解密后一堆乱码 到网页源码里搜_keyencrypt
分片文件乱序 视频花屏 解析m3u8时按分辨率排序

真实一幕:我第一次写完代码,下载下来发现是480p的,折腾半天才发现,API返回的video_list里默认选了最低画质(q30),后来加了hd=1参数,才拿到1080p的源。

生活气息的“边角料”

最后想聊点别的,我写这个工具的时候,旁边放着《365dni》的原声带——贝多芬的《月光》混着波兰的呼吸声。代码跑起来时,终端一行行刷屏,突然觉得这比追剧本身还带感,你想想,几万行的代码换来了一个可以反复使用的“神器”,而且过程里还顺带学会了正则表达式、HTTP协议和简单的加密解密。这种成就感,比看完一集爽多了

所以别光想着“我要资源”,试着把问题拆解成:西瓜视频用什么技术加密?Golang怎么发请求?解密逻辑是啥? 然后一行行写出来,哪怕最后只抓到了一集,你也已经比99%的伸手党强了。

哦对了,代码里decodeKey函数我写得比较粗,真实场景可能要处理多个加密层——比如再加一层AES,你可以去GitHub搜ixigua-dl看看别人的实现,但千万别直接复制,自己敲一遍才能变成你的

好了,工具写完了,我得去冲杯咖啡,下次再聊怎么用Goroutine把100集同时下载——保证不卡壳。

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/tiyu/1126.html

(3)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-01

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

  • kyadmin
    kyadmin 2026-07-01

    希望本篇文章《用Golang追365dni全集?这波操作有点硬核》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-01

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

  • kyadmin
    kyadmin 2026-07-01

    本文概览:你刷到过“365dni全集完整版西瓜视频”这个关键词吧?我猜你跟我一样——想找资源,结果被一堆广告和标题党气得牙痒痒,更离谱的是,有些网...

    联系我们

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

    关注我们