add yy-live support

pull/51/head
肥羊 3 years ago
parent 60616b5c22
commit 8a5f1dfcaa
  1. 81
      Golang/liveurls/yy.go
  2. 5
      Golang/main.go

@ -0,0 +1,81 @@
// Package liveurls
// @Time:2023/06/03 05:40
// @File:yy.go
// @SoftWare:Goland
// @Author:feiyang
// @Contact:TG@feiyangdigital
package liveurls
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"regexp"
"strconv"
"time"
)
type Yy struct {
Rid string
Quality string
}
type StreamLineAddr struct {
CdnInfo struct {
Url string `json:"url"`
} `json:"cdn_info"`
}
type Result struct {
AvpInfoRes struct {
StreamLineAddr map[string]StreamLineAddr `json:"stream_line_addr"`
} `json:"avp_info_res"`
}
func (y *Yy) GetLiveUrl() any {
firstrid := y.Rid
quality := y.Quality
var rid string
checkUrl := "https://wap.yy.com/mobileweb/" + firstrid
client := &http.Client{}
req, _ := http.NewRequest("GET", checkUrl, nil)
req.Header.Set("Referer", "https://wap.yy.com")
req.Header.Set("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")
res, _ := client.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
re := regexp.MustCompile(`md5Hash[\s\S]*?sid.*'(.*)'.*?getQuery`)
realdata := re.FindStringSubmatch(string(body))
if len(realdata) > 0 {
rid = realdata[1]
} else {
return nil
}
millis_13 := time.Now().UnixNano() / int64(time.Millisecond)
millis_10 := time.Now().Unix()
data := fmt.Sprintf(`{"head":{"seq":%d,"appidstr":"0","bidstr":"121","cidstr":"%s","sidstr":"%s","uid64":0,"client_type":108,"client_ver":"5.11.0-alpha.4","stream_sys_ver":1,"app":"yylive_web","playersdk_ver":"5.11.0-alpha.4","thundersdk_ver":"0","streamsdk_ver":"5.11.0-alpha.4"},"client_attribute":{"client":"web","model":"","cpu":"","graphics_card":"","os":"chrome","osversion":"106.0.0.0","vsdk_version":"","app_identify":"","app_version":"","business":"","width":"1536","height":"864","scale":"","client_type":8,"h265":0},"avp_parameter":{"version":1,"client_type":8,"service_type":0,"imsi":0,"send_time":%d,"line_seq":-1,"gear":%s,"ssl":1,"stream_format":0}}`, millis_13, rid, rid, millis_10, quality)
url := "https://stream-manager.yy.com/v3/channel/streams?uid=0&cid=" + rid + "&sid=" + rid + "&appid=0&sequence=" + strconv.FormatInt(millis_13, 10) + "&encode=json"
req, _ = http.NewRequest("POST", url, bytes.NewBuffer([]byte(data)))
req.Header.Set("Content-Type", "text/plain;charset=UTF-8")
req.Header.Set("Referer", "https://www.yy.com/")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42")
res, _ = client.Do(req)
defer res.Body.Close()
body, _ = io.ReadAll(res.Body)
var result Result
json.Unmarshal(body, &result)
if len(result.AvpInfoRes.StreamLineAddr) > 0 {
var arr []string
for k := range result.AvpInfoRes.StreamLineAddr {
arr = append(arr, k)
}
return result.AvpInfoRes.StreamLineAddr[arr[0]].CdnInfo.Url
} else {
return nil
}
}

@ -141,6 +141,11 @@ func setupRouter(adurl string) *gin.Engine {
ytbObj.Rid = rid
ytbObj.Quality = c.DefaultQuery("quality", "1080")
c.Redirect(http.StatusMovedPermanently, duanyan(adurl, ytbObj.GetLiveUrl()))
case "yy":
yyObj := &liveurls.Yy{}
yyObj.Rid = rid
yyObj.Quality = c.DefaultQuery("quality", "4")
c.Redirect(http.StatusMovedPermanently, duanyan(adurl, yyObj.GetLiveUrl()))
}
})
return r

Loading…
Cancel
Save