diff --git a/Golang/liveurls/douyin.go b/Golang/liveurls/douyin.go index edcc337..d10711c 100644 --- a/Golang/liveurls/douyin.go +++ b/Golang/liveurls/douyin.go @@ -9,7 +9,6 @@ package liveurls import ( "encoding/json" - "fmt" "io" "net/http" "net/url" @@ -17,6 +16,7 @@ import ( ) type Douyin struct { + Quality string Shorturl string Rid string } @@ -45,8 +45,7 @@ func GetRoomId(url string) any { } 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 mediamap map[string]map[string]map[string]map[string]map[string]any var roomid string if str, ok := GetRoomId(d.Shorturl).(string); ok { roomid = str @@ -54,24 +53,72 @@ func (d *Douyin) GetRealurl() any { 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") + params := map[string]string{ + "aid": "6383", + "live_id": "1", + "device_platform": "web", + "language": "zh-CN", + "enter_from": "web_search", + "cookie_enabled": "true", + "screen_width": "1920", + "screen_height": "1080", + "browser_language": "zh-CN", + "browser_name": "Chrome", + "room_id": roomid, + "scene": "pc_stream_4k", + } + + r, _ := http.NewRequest("GET", "https://live.douyin.com/webcast/room/info_by_scene/?", nil) + q := r.URL.Query() + for k, v := range params { + q.Add(k, v) + } + r.URL.RawQuery = q.Encode() 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 + if mediaslice, ok := mediamap["data"]["stream_url"]["live_core_sdk_data"]["pull_data"]["Hls"].([]any); ok { + for _, v := range mediaslice { + if newmediamap, ok := v.(map[string]any); ok { + for k := range newmediamap { + switch d.Quality { + case "uhd": + { + if newmediamap[k] == "uhd" { + realurl = newmediamap["url"] + } + } + case "origin": + { + if newmediamap[k] == "origin" { + realurl = newmediamap["url"] + } + } + case "hd": + { + if newmediamap[k] == "hd" { + realurl = newmediamap["url"] + } + } + case "sd": + { + if newmediamap[k] == "sd" { + realurl = newmediamap["url"] + } + } + case "ld": + { + if newmediamap[k] == "ld" { + realurl = newmediamap["url"] + } + } + } + } } + } } return realurl diff --git a/Golang/main.go b/Golang/main.go index 8b8fde0..ff4c4d1 100644 --- a/Golang/main.go +++ b/Golang/main.go @@ -65,9 +65,11 @@ func setupRouter(adurl string) *gin.Engine { }) r.GET("/douyin", func(c *gin.Context) { - vrurl := c.Query("url") + url := c.Query("url") + quality := c.DefaultQuery("quality", "origin") douyinobj := &liveurls.Douyin{} - douyinobj.Shorturl = vrurl + douyinobj.Shorturl = url + douyinobj.Quality = quality c.Redirect(http.StatusMovedPermanently, duanyan(adurl, douyinobj.GetRealurl())) })