事情是这样的,作为一个被“限时观看”逼疯的普通网友,我每天都在365dni这类在线视频站点上扒拉资源,中文字幕时有时无,网页刷新一下数据就可能丢失——这种体验,懂的人自然懂。

我尝试用Golang写个小工具,不是为了破解什么,纯粹是想在本地把视频和中文字幕一起整理成离线可用的格式,下面这个过程,可能就是个笨办法,但胜在干净、可控。
第一步:先搞清楚字幕到底藏在哪里
大多数365dni视频站点的中文字幕,其实是通过三种方式嵌入页面的:
| 字幕来源类型 | 典型特征 | 抓取难度 |
|---|---|---|
| 内嵌硬字幕 | 视频流本身就包含了字幕,无法分离 | |
| 外挂SRT/ASS | 独立字幕文件,通过API动态加载 | |
| 实时OCR字幕 | 后端对视频做语音识别后再推送 |
我主要对付的是第二种——外挂字幕,在365dni上点开一个视频,按F12,网络请求里找subtitle或者.ass、.srt,用Golang的net/http库把请求头伪装成普通浏览器(别偷懒,加User-Agent),直接GET那个文件的URL,有时候服务端会校验Referer,这时候把视频页面的地址填上就行。
一个坑:部分站点把中文字幕按段落存成JSON格式,字段名可能是
[chinese]或[chs],我用encoding/json反序列化的时候,习惯先把整个结构体定义好,否则数据会乱。
第二步:用Golang写个简陋的批量爬取逻辑
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
// 模拟一个常见的365dni视频ID列表
videoIDs := []string{"ep01", "ep02", "ep03"}
for _, v := range videoIDs {
url := "https://api.365dni.example/v1/video/" + v + "/subtitle?lang=zh"
resp, err := http.Get(url)
if err != nil {
fmt.Printf("获取 %s 失败: %v\n", v, err)
continue
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
// 保存为本地文件
os.WriteFile(v+".srt", body, 0644)
fmt.Printf("%s 字幕下载完成\n", v)
}
}
实际写的时候,这里的videoIDs我是写死的——因为365dni每部剧的ID规律根本没法统一,有的剧集ID是纯数字,有的混着字母和年月,我试过用正则[a-zA-Z0-9]{6,12}去匹配页面里的链接,误抓率很高。
后来我干脆手动维护一个文本列表,虽然麻烦,但至少不会把广告页面里的垃圾字幕也拖回来。
第三步:中文字幕编码和乱码治理
下载回来的字幕文件,直接拖进VLC播放器显示成乱码——这个问题困扰了我一整个下午,365dni上的中文字幕,经常用GBK编码保存,而Golang默认的字符串处理是UTF-8。
解决方法:用golang.org/x/text/encoding/charmap包做一层转换。
import (
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
)
func DecodeGBK(data []byte) ([]byte, error) {
reader := transform.NewReader(strings.NewReader(string(data)), simplifiedchinese.GBK.NewDecoder())
result, _ := io.ReadAll(reader)
return result, nil
}
调用这个函数之后,原本满屏“浜戞父”的字符,才变成了“云游”这种正常中文,顺带一提,有些比较老旧的365dni视频字幕里还夹杂着全角空格和繁体字,我单独写了个strings.ReplaceAll做清洗,效果凑合。
第四步:重命名和文件夹整理,比写代码本身还痛苦
下回来200多集,文件名全是subtitle_abc123.srt,根本分不清对应哪一集,我写了个小函数,根据字幕文件内容里的第一句对白来反推剧集编号——说实话这个方法很狡猾:
- 第1集字幕第一行通常是“(电话铃声)”
- 第2集可能是“早晨的阳光照进窗口”
准确率大概只有70%,剩下的30%,我还是手动改的,好在Golang里用os.Rename重命名效率还行,一条命令处理50个文件,响应很快。
第五步:一些没法用代码解决的事情
在折腾365dni视频中文字幕的过程中,我发现:
- 有些字幕发布时间比视频本身还晚,爬早了没有,爬晚了文件名又容易搞混
- 中文字幕经常包含多音字,行”:在“行不行”里读xing,在“一行字”里读hang——代码根本没法自动判断,但播放器渲染字幕时又不会出错,因为它是基于时间轴硬匹配的
- 部分平台对高频IP做了限制,同一IP一小时内不能访问超过50条字幕,我的解决办法:在代码里加个
time.Sleep(2 * time.Second),慢就慢一点,别被封号
我见过有人为了抢字幕把并发开到20,结果被365dni的反爬机制直接ban了整个家庭宽带IP——得不偿失。
最终的小成果
现在我的NAS上有个叫365dni_subtitles的文件夹,里面按剧集分组,每个字幕文件都是标准的SRT格式,时码精确到毫秒,想看哪集,把视频和对应的字幕文件丢到同一个文件夹里,播放器自动加载。
有时候就算字幕里有几个错别字,我也不太纠结了,毕竟,从一个自己控制不了的网络资源,变成能放在口袋里随时调用的文件,这个感觉本身就挺好的,至少下次想重温某段对白的时候,不用再担心网页挂掉,或者突然变成需要会员才能看的内容了。
折腾的过程比结果更有意思,大概这就是用命令行解决生活问题的乐趣所在吧。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.hljbesthome.com/tiyu/501.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《365dni在线视频中文字幕,我用Golang写了个批量下载器,结果治好了我的强迫症》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:事情是这样的,作为一个被“限时观看”逼疯的普通网友,我每天都在365dni这类在线视频站点上扒拉资源,中文字幕时有时无,网页刷新一下数据...