parent
71c5ebe11d
commit
b776cb2514
@ -0,0 +1,118 @@ |
||||
// Package liveurls
|
||||
// @Time:2023/02/10 01:03
|
||||
// @File:bilibili.go
|
||||
// @SoftWare:Goland
|
||||
// @Author:feiyang
|
||||
// @Contact:TG@feiyangdigital
|
||||
|
||||
package liveurls |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"fmt" |
||||
"github.com/tidwall/gjson" |
||||
"io" |
||||
"net/http" |
||||
) |
||||
|
||||
type BiliBili struct { |
||||
Rid string |
||||
Line string |
||||
Quality string |
||||
Platform string |
||||
} |
||||
|
||||
func (b *BiliBili) GetRealRoomID() any { |
||||
var firstmap = make(map[string]any) |
||||
var realroomid string |
||||
apiurl := "https://api.live.bilibili.com/room/v1/Room/room_init?id=" + b.Rid |
||||
client := &http.Client{} |
||||
r, _ := http.NewRequest("GET", apiurl, nil) |
||||
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) |
||||
json.Unmarshal(body, &firstmap) |
||||
if firstmap["msg"] == "直播间不存在" { |
||||
return nil |
||||
} |
||||
if newmap, ok := firstmap["data"].(map[string]any); ok { |
||||
if newmap["live_status"] != float64(1) { |
||||
return nil |
||||
} else { |
||||
if flt, ok := newmap["room_id"].(float64); ok { |
||||
realroomid = fmt.Sprintf("%v", int(flt)) |
||||
} |
||||
} |
||||
|
||||
} |
||||
return realroomid |
||||
} |
||||
|
||||
func (b *BiliBili) GetPlayUrl() any { |
||||
var roomid string |
||||
var realurl string |
||||
if str, ok := b.GetRealRoomID().(string); ok { |
||||
roomid = str |
||||
} else { |
||||
return nil |
||||
} |
||||
client := &http.Client{} |
||||
params := map[string]string{ |
||||
"room_id": roomid, |
||||
"protocol": "0,1", |
||||
"format": "0,1,2", |
||||
"codec": "0,1", |
||||
"qn": b.Quality, |
||||
"platform": b.Platform, |
||||
"ptype": "8", |
||||
} |
||||
r, _ := http.NewRequest("GET", "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo", 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) |
||||
var json = string(body) |
||||
value := gjson.Get(json, "data.playurl_info.playurl.stream") |
||||
value.ForEach(func(key, value gjson.Result) bool { |
||||
newvalue := gjson.Get(value.String(), "format.0.format_name") |
||||
if newvalue.String() == "ts" { |
||||
nnvalue := gjson.Get(value.String(), "format.#") |
||||
valuelast := fmt.Sprintf("%v", nnvalue.Int()-1) |
||||
base_url := gjson.Get(value.String(), "format."+valuelast+".codec.0.base_url") |
||||
url_info := gjson.Get(value.String(), "format."+valuelast+".codec.0.url_info") |
||||
url_info.ForEach(func(key, value gjson.Result) bool { |
||||
keyval := fmt.Sprintf("%v", key) |
||||
switch b.Line { |
||||
case "first": |
||||
if keyval == "0" { |
||||
host := gjson.Get(value.String(), "host") |
||||
extra := gjson.Get(value.String(), "extra") |
||||
realurl = fmt.Sprintf("%v%v%v", host, base_url, extra) |
||||
} |
||||
|
||||
case "second": |
||||
if keyval == "1" { |
||||
host := gjson.Get(value.String(), "host") |
||||
extra := gjson.Get(value.String(), "extra") |
||||
realurl = fmt.Sprintf("%v%v%v", host, base_url, extra) |
||||
} |
||||
case "third": |
||||
if keyval == "2" { |
||||
host := gjson.Get(value.String(), "host") |
||||
extra := gjson.Get(value.String(), "extra") |
||||
realurl = fmt.Sprintf("%v%v%v", host, base_url, extra) |
||||
} |
||||
} |
||||
|
||||
return true |
||||
}) |
||||
} |
||||
return true |
||||
}) |
||||
return realurl |
||||
} |
||||
Loading…
Reference in new issue