From a0462ce636601405f2bc7a50783b743d30142007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=A5=E7=BE=8A?= Date: Wed, 6 Sep 2023 17:00:00 +0800 Subject: [PATCH] fix douyin --- Golang/README.md | 9 +--- Golang/liveurls/douyin.go | 110 ++++++++++++-------------------------- Golang/main.go | 8 +-- 3 files changed, 36 insertions(+), 91 deletions(-) diff --git a/Golang/README.md b/Golang/README.md index 2792bf8..e7499ef 100644 --- a/Golang/README.md +++ b/Golang/README.md @@ -34,14 +34,9 @@ http://你的IP:35455/yylunbo.m3u http://你的IP:35455/xxxyqk.m3u?url=http://192.168.10.1:35455 ``` ## **抖音:** -### 1,抖音手机客户端进入直播间后,点击右下角三个点,点击分享,点击复制链接,然后运行并访问: +### 默认最高画质,浏览器打开并复制`(live.douyin.com/)xxxxxx`,只需要复制后面的xxxxx即可(可选flv和hls两种种流媒体传输方式,默认flv): ``` -http://你的IP:35455/douyin?url=https://v.douyin.com/xxxxxx(&quality=xxxx) -``` -其中&quality参数默认origin原画,可以省略,也可以手动指定:uhd、origin、hd、sd、ld -### 2,抖音电脑端需要打开抖音网页版复制`(live.douyin.com/)xxxxxx`,只需要复制后面的xxxxx即可: -``` -http://你的IP:35455/douyin/xxxxx +http://你的IP:35455/douyin/xxxxx(?stream=hls) ``` ## **斗鱼:** ### 1,可选m3u8和flv以及xs三种流媒体传输方式【`(www.douyu.com/)xxxxxx 或 (www.douyu.com/xx/xx?rid=)xxxxxx`,默认flv】: diff --git a/Golang/liveurls/douyin.go b/Golang/liveurls/douyin.go index edcc337..4e9ae0b 100644 --- a/Golang/liveurls/douyin.go +++ b/Golang/liveurls/douyin.go @@ -8,79 +8,22 @@ package liveurls import ( - "encoding/json" "fmt" + "github.com/tidwall/gjson" "io" "net/http" - "net/url" "regexp" + "strconv" ) type Douyin struct { - Shorturl string - Rid string -} - -func GetRoomId(url string) any { - client := &http.Client{ - CheckRedirect: func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse - }, - } - r, _ := http.NewRequest("GET", url, nil) - r.Header.Add("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") - r.Header.Add("authority", "v.douyin.com") - resp, err := client.Do(r) - if err != nil { - return err - } - defer resp.Body.Close() - reurl := resp.Header.Get("Location") - reg := regexp.MustCompile(`\d{19}`) - res := reg.FindAllStringSubmatch(reurl, -1) - if res == nil { - return nil - } - return res[0][0] -} - -func (d *Douyin) GetRealurl() any { - var mediamap map[string]map[string]map[string]map[string]any - var roomstatus map[string]map[string]map[string]int - var roomid string - if str, ok := GetRoomId(d.Shorturl).(string); ok { - roomid = str - } else { - return nil - } - client := &http.Client{} - r, _ := http.NewRequest("GET", "https://webcast.amemv.com/webcast/room/reflow/info/?type_id=0&live_id=1&room_id="+roomid+"&sec_user_id=&app_id=1128", nil) - r.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") - r.Header.Add("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1") - resp, _ := client.Do(r) - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - str, _ := url.QueryUnescape(string(body)) - json.Unmarshal([]byte(str), &mediamap) - json.Unmarshal([]byte(str), &roomstatus) - var realurl any - if mediaslice, ok := mediamap["data"]["room"]["stream_url"]["hls_pull_url_map"].(map[string]any); ok { - for k, v := range mediaslice { - if k == "FULL_HD1" { - realurl = fmt.Sprintf("%v", v) - } - if roomstatus["data"]["room"]["status"] != 2 { - realurl = nil - } - } - } - return realurl + Stream string + Rid string } func (d *Douyin) GetDouYinUrl() any { liveurl := "https://live.douyin.com/" + d.Rid client := &http.Client{} - var mediamap map[string]map[string]any re, _ := http.NewRequest("GET", liveurl, nil) re.Header.Add("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") re.Header.Add("upgrade-insecure-requests", "1") @@ -89,26 +32,39 @@ func (d *Douyin) GetDouYinUrl() any { oreg := regexp.MustCompile(`(?i)__ac_nonce=(.*?);`) ores := oreg.FindStringSubmatch(oresp.Header["Set-Cookie"][0]) r, _ := http.NewRequest("GET", liveurl, nil) - cookie1 := &http.Cookie{Name: "__ac_nonce", Value: ores[1]} - r.AddCookie(cookie1) + cookie := &http.Cookie{Name: "__ac_nonce", Value: ores[1]} + r.AddCookie(cookie) r.Header.Add("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") r.Header.Add("upgrade-insecure-requests", "1") resp, _ := client.Do(r) defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - str, _ := url.QueryUnescape(string(body)) - reg := regexp.MustCompile(`(?i)\"roomid\"\:\"([0-9]+)\"`) - res := reg.FindAllStringSubmatch(str, -1) - if res == nil { - return nil - } - nnreg := regexp.MustCompile(`(?i)\"id_str\":\"` + res[0][1] + `(?i)\"[\s\S]*?\"hls_pull_url\"`) - nnres := nnreg.FindAllStringSubmatch(str, -1) - nnnreg := regexp.MustCompile(`(?i)\"hls_pull_url_map\"[\s\S]*?}`) - nnnres := nnnreg.FindAllStringSubmatch(nnres[0][0], -1) - if nnnres == nil { + reg := regexp.MustCompile(`(?i)ttwid=.*?;`) + res := reg.FindStringSubmatch(fmt.Sprintf("%s", resp.Cookies()))[0] + url := "https://live.douyin.com/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&language=zh-CN&enter_from=web_live&cookie_enabled=true&screen_width=1728&screen_height=1117&browser_language=zh-CN&browser_platform=MacIntel&browser_name=Chrome&browser_version=116.0.0.0&web_rid=" + d.Rid + req, _ := http.NewRequest("GET", url, nil) + req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") + req.Header.Add("Cookie", res) + req.Header.Add("Accept", "*/*") + req.Header.Add("Host", "live.douyin.com") + req.Header.Add("Connection", "keep-alive") + ress, _ := client.Do(req) + defer ress.Body.Close() + body, _ := io.ReadAll(ress.Body) + var json = string(body) + status, _ := strconv.Atoi(fmt.Sprintf("%s", gjson.Get(json, "data.data.0.status"))) + if status != 2 { return nil } - json.Unmarshal([]byte(`{`+nnnres[0][0]+`}`), &mediamap) - return mediamap["hls_pull_url_map"]["FULL_HD1"] + var realurl string + value := gjson.Get(json, "data.data.0.stream_url.live_core_sdk_data.pull_data.stream_data") + value.ForEach(func(key, value gjson.Result) bool { + switch d.Stream { + case "flv": + realurl = fmt.Sprintf("%s", gjson.Get(value.String(), "data.origin.main.flv")) + case "hls": + realurl = fmt.Sprintf("%s", gjson.Get(value.String(), "data.origin.main.hls")) + } + return true + }) + return realurl } diff --git a/Golang/main.go b/Golang/main.go index 3ea6282..87bcc30 100644 --- a/Golang/main.go +++ b/Golang/main.go @@ -64,13 +64,6 @@ func setupRouter(adurl string) *gin.Engine { c.String(http.StatusOK, "请求成功!") }) - r.GET("/douyin", func(c *gin.Context) { - vrurl := c.Query("url") - douyinobj := &liveurls.Douyin{} - douyinobj.Shorturl = vrurl - c.Redirect(http.StatusMovedPermanently, duanyan(adurl, douyinobj.GetRealurl())) - }) - r.GET("/huyayqk.m3u", func(c *gin.Context) { yaobj := &list.HuyaYqk{} res, _ := yaobj.HuYaYqk("https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid=2135") @@ -149,6 +142,7 @@ func setupRouter(adurl string) *gin.Engine { case "douyin": douyinobj := &liveurls.Douyin{} douyinobj.Rid = rid + douyinobj.Stream = c.DefaultQuery("stream", "flv") c.Redirect(http.StatusMovedPermanently, duanyan(adurl, douyinobj.GetDouYinUrl())) case "douyu": douyuobj := &liveurls.Douyu{}