Home / 开发 / Golang 利用Chromedp爬取m3u8地址,无视一切加密
原理是直接监听Network,发现关键字m3u8直接返回地址。
无视各种隐藏m3u8或加密,直接获取结果。
package main
import (
"context"
"log"
"strings"
"time"
"github.com/chromedp/cdproto/network"
"github.com/chromedp/chromedp"
)
func main() {
GetNbyyUrlM3u4("需要获取m3u8地址的页面url")
}
//浏览器获取视频页面的 m3u8地址
func GetNbyyUrlM3u4(urlstr string) string {
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.NoDefaultBrowserCheck, //不检查默认浏览器
chromedp.Flag("window-size", "50,400"),
chromedp.Flag("headless", false), //开启图像界面,重点是开启这个
chromedp.Flag("ignore-certificate-errors", true), //忽略错误
chromedp.Flag("disable-web-security", true), //禁用网络安全标志
chromedp.NoFirstRun, //设置网站不是首次运行
chromedp.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"), //设置UserAgent
)
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
// create chrome instance
ctx, cancel := chromedp.NewContext(
allocCtx,
// chromedp.WithDebugf(log.Printf),
)
defer cancel()
// create a timeout
ctx, cancel = context.WithTimeout(ctx, 80*time.Second)
defer cancel()
// ensure that the browser process is started
// 确保浏览器进程已启动
if err := chromedp.Run(ctx); err != nil {
panic(err)
}
// listen network event
c := make(chan string)
// 监听网络事件
listenUrlForNetworkEvent(ctx, urlstr, c)
chromedp.Run(ctx,
network.Enable(),
chromedp.Navigate(urlstr),
chromedp.WaitVisible(`body`, chromedp.BySearch),
)
m3u8Url := <-c
return m3u8Url
}
//监听 获取m3u8
func listenUrlForNetworkEvent(ctx context.Context, urlstr string, c chan string) {
chromedp.ListenTarget(ctx, func(ev interface{}) {
switch ev := ev.(type) {
case *network.EventResponseReceived: //收到事件响应
resp := ev.Response
if len(resp.Headers) != 0 {
// log.Printf("received headers: %s", resp.Headers)
if strings.Index(resp.URL, "m3u8") != -1 {
log.Printf("下载m3u8地址: %s", resp.URL)
c <- resp.URL
}
}
}
// other needed network Event
})
}
go run .\main.go
2023/05/20 13:58:24 下载m3u8地址: https://xxxxxxxxxx/xxx