Skip to content

Commit

Permalink
优化嗅探流程
Browse files Browse the repository at this point in the history
  • Loading branch information
1944876825 committed Mar 15, 2024
1 parent 4f53ee9 commit 68b0dee
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 78 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
* match 资源特征匹配(可填多个)
* wait 等待资源加载成功(可填多个,需要填写css选择器,如 .play #play,程序会等待这个元素加载完毕再开始嗅探)
* click 如果有需要点击播放按钮才加载媒体的网页,可以填这个,不过需要手动使用css选择器找到对应按钮的(可填多个,当wait执行完才会执行这个)
* contentType 要查找资源的 content-type 如:video/mp4
* white 资源特征白名单(可填多个,包含此特征的资源会被选择)
* black 资源特征白名单(可填多个,包含此特征的资源不会被选择)

Expand Down
28 changes: 9 additions & 19 deletions config.yaml
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
port: 8080
headless: false
hc_time: 300
port: 8081
headless: false # true 不弹出浏览器 false 弹窗浏览器
hc_time: 300 # 缓存保存时间 单位:秒
xt_time: 300 # 嗅探超时时间 单位:秒
parse:
- name: "西瓜视频" # 名称
match: # 资源特征
- "ixigua.com"
wait: # 等待此元素加载成功(使用css选择器)
click: # 点击此元素(使用css选择器)
contentType: # 查找资源的 content-type
- "application/vnd.apple.mpegurl"
- "video/mp4"
- "video" # 点击video标签
white: # 资源链接特征 白名单
- "media-video-avc1"
black: # 资源链接特征 黑名单

- name: "测试"
match:
- "xxxx"
wait:
click:
contentType:
- "application/vnd.apple.mpegurl"
- "video/mp4"
white:
- ".mp4"
- ".m3u8"
black:
- ".flv"
black: # 资源链接特征 黑名单
- "gg.mp4"
1 change: 1 addition & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var Config = configModel{}
type configModel struct {
Port int `yaml:"port"`
HcTime int64 `yaml:"hc_time"`
XtTime int `yaml:"xt_time"`
Headless bool `yaml:"headless"`
Parse []ParseItemModel
}
Expand Down
31 changes: 16 additions & 15 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ type UrlItemModel struct {
var Urls = make(map[string]UrlItemModel)

func main() {
fmt.Println("作者:By易仝 QQ:1944876825")
fmt.Println("开源地址:https://github.com/1944876825/sniffing.tools")

// 获取yaml配置
config.Config.GetConfig()

Expand All @@ -32,7 +35,7 @@ func main() {
// 嗅探
r.GET("/xt", router)

fmt.Println("API:", fmt.Sprintf("http://127.0.0.1:%d/xt?url=", config.Config.Port))
fmt.Println("程序启动成功 API:", fmt.Sprintf("http://127.0.0.1:%d/xt?url=", config.Config.Port))
err := r.Run(fmt.Sprintf(":%d", config.Config.Port))
if err != nil {
fmt.Println("启动失败", err)
Expand All @@ -45,7 +48,7 @@ func router(c *gin.Context) {
url := c.Query("url")
url = strings.TrimSpace(url)
log.Println("url:", url)
if len(url) == 0 {
if len(url) < 1 {
c.JSON(200, gin.H{"code": 404, "msg": "缺少URL"})
return
}
Expand Down Expand Up @@ -92,6 +95,7 @@ func router(c *gin.Context) {
func toParse(url string) {
var mat = false
var cuParse = config.ParseItemModel{}

for _, parse := range config.Config.Parse {
for _, match := range parse.Match {
if strings.Contains(url, match) {
Expand All @@ -109,23 +113,20 @@ func toParse(url string) {
ser.Url = url
ser.Data = cuParse

if mat {
if len(cuParse.Start) > 0 {
ser.Url = cuParse.Start + ser.Url
}
if len(cuParse.End) > 0 {
ser.Url = ser.Url + cuParse.End
}
} else {
ser.Data.ContentType = []string{
"application/vnd.apple.mpegurl",
"video/mp4",
}
}
//if mat {
// if len(cuParse.Start) > 0 {
// ser.Url = cuParse.Start + ser.Url
// }
// if len(cuParse.End) > 0 {
// ser.Url = ser.Url + cuParse.End
// }
//}
ser.Init()
playUrl, err := ser.StartFindResource()

timestamp := time.Now().Unix()
futureTimestamp := timestamp + config.Config.HcTime

if err == nil {
Urls[getMD5(url)] = UrlItemModel{
Status: 1,
Expand Down
84 changes: 41 additions & 43 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,46 +43,39 @@ func (s *Model) Init() {
}
func (s *Model) StartFindResource() (string, error) {
defer s.Cancel()
if len(s.Data.White) < 1 {
s.Data.White = []string{".mp4", ".m3u8", ".flv"}
}
// 监听请求日志
s.needListen = true
s.listenForNetworkEvent()

// 打开网页
err := chromedp.Run(s.ctx, chromedp.Navigate(s.Url))
if err != nil {
return "", err
}

// 监听请求日志
s.needListen = true
s.listenForNetworkEvent()

// 等待网页加载完成
if len(s.Data.Wait) > 0 {
for _, wait := range s.Data.Wait {
err = chromedp.Run(s.ctx, chromedp.WaitVisible(wait))
if err != nil {
return "", err
}
}
}

// 点击页面元素
if len(s.Data.Click) > 0 {
for _, click := range s.Data.Click {
err = chromedp.Run(s.ctx, chromedp.Click(click))
if err != nil {
return "", err
go func() {
if len(s.Data.Click) > 0 {
for _, click := range s.Data.Click {
_ = chromedp.Run(s.ctx, chromedp.Click(click))
}
}
}
}()
}

var i = 0
for s.playUrl == "" {
i++
if i > 300 {
if i > config.Config.XtTime*5 {
s.needListen = false
fmt.Println("监听超时")
break
}
time.Sleep(time.Millisecond * 500)
time.Sleep(time.Millisecond * 200)
}
if len(s.playUrl) != 0 {
return s.playUrl, nil
Expand All @@ -93,34 +86,39 @@ func (s *Model) listenForNetworkEvent() {
chromedp.ListenTarget(s.ctx, func(ev interface{}) {
if s.needListen {
switch ev := ev.(type) {
case *network.EventRequestWillBeSent:
req := ev.Request
//log.Println("req url", req.URL)
for _, suf := range s.Data.White {
if strings.Contains(req.URL, suf) {
if len(s.Data.Black) > 0 {
for _, black := range s.Data.Black {
if len(black) != 0 && strings.Contains(req.URL, black) == false {
s.playUrl = req.URL
s.needListen = false
}
}
} else {
s.playUrl = req.URL
s.needListen = false
}
}
}
case *network.EventResponseReceived:
resp := ev.Response
fmt.Println(resp.Headers["content-type"], resp.URL)
if len(resp.Headers) > 0 {
if len(s.Data.ContentType) > 0 {
for _, contentType := range s.Data.ContentType {
if resp.Headers["content-type"] == contentType {
if len(s.Data.White) > 0 {
for _, suf := range s.Data.White {
if strings.Contains(resp.URL, suf) {
if len(s.Data.Black) > 0 {
for _, black := range s.Data.Black {
if len(black) != 0 && strings.Contains(resp.URL, black) == false {
s.playUrl = resp.URL
s.needListen = false
}
}
} else {
s.playUrl = resp.URL
s.needListen = false
}
}
}
} else {
//log.Println("resp url", resp.URL)
for _, suf := range s.Data.White {
if strings.Contains(resp.URL, suf) {
if len(s.Data.Black) > 0 {
for _, black := range s.Data.Black {
if len(black) != 0 && strings.Contains(resp.URL, black) == false {
s.playUrl = resp.URL
s.needListen = false
}
}
} else {
s.playUrl = resp.URL
s.needListen = false
}
}
}
Expand Down

0 comments on commit 68b0dee

Please sign in to comment.