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


Preview Image