Douyu Real URL 获取方法:Go 和 PHP 实现/n/n本文展示了如何使用 Go 和 PHP 代码获取斗鱼直播的真实播放地址。代码使用了正则表达式解析页面内容,并通过 HTTP 请求获取最终的直播地址。/n/n### Go 代码实现/ngo/nfunc (d *Douyu) GetRealUrl() any {/n/tvar jsUtil = &utils.JsUtil{}/n/tdid := '10000000000000000000000000001501'/n/tvar timestamp = time.Now().Unix()/n/tvar realroomid string/n/trid := d.GetRoomId()/n/tif str, ok := rid.(string); ok {/n/t/trealroomid = str/n/t} else {/n/t/treturn nil/n/t}/n/tliveurl := 'https://www.douyu.com/' + realroomid/n/tclient := &http.Client{}/n/tr, _ := http.NewRequest(/'GET/', liveurl, nil)/n/tr.Header.Add(/'user-agent/', /'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36/')/n/tr.Header.Add(/'upgrade-insecure-requests/', /'1/')/n/tresp, _ := client.Do(r)/n/tdefer resp.Body.Close()/n/tbody, _ := io.ReadAll(resp.Body)/n/treg := regexp.MustCompile(`(?i)(vdwdae325w_64we[/s/S]*function ub98484234[/s/S]*?)function`)/n/tres := reg.FindStringSubmatch(string(body))/n/tnreg := regexp.MustCompile(`(?i)eval.*?;}`)/n/tstrfn := nreg.ReplaceAllString(res[1], /'strc;}/')/n/tvar funcContent1 []string/n/tfuncContent1 = append(append(funcContent1, strfn), /'ub98484234/')/n/tresult := jsUtil.JsRun(funcContent1, /'ub98484234/')/n/tnres := fmt.Sprintf(/'%s/', result)/n/tnnreg := regexp.MustCompile(`(?i)v=(/d+)`)/n/tnnres := nnreg.FindStringSubmatch(nres)/n/tunrb := fmt.Sprintf(/'%v%v%v%v/', realroomid, did, timestamp, nnres[1])/n/trb := md5V3(unrb)/n/tnnnreg := regexp.MustCompile(`(?i)return rt;}/);?`)/n/tstrfn2 := nnnreg.ReplaceAllString(nres, /'return rt;}/')/n/tstrfn3 := strings.Replace(strfn2, `(function (`, `function sign(`, -1)/n/tstrfn4 := strings.Replace(strfn3, `CryptoJS.MD5(cb).toString()`, `'`+rb+`'`, -1)/n/tvar funcContent2 []string/n/tfuncContent2 = append(append(funcContent2, strfn4), /'sign/')/n/tresult2 := jsUtil.JsRun(funcContent2, realroomid, did, timestamp)/n/tparam := fmt.Sprintf(/'%s/', result2)/n/trealparam := param + /'&rate=0/'/n/tr1, n4err := http.Post(/'https://www.douyu.com/lapi/live/getH5Play//'+realroomid, /'application/x-www-form-urlencoded/', strings.NewReader(realparam))/n/tif n4err != nil {/n/t/treturn nil/n/t}/n/tdefer r1.Body.Close()/n/tbody1, _ := io.ReadAll(r1.Body)/n/tvar s1 map[string]any/n/tjson.Unmarshal(body1, &s1)/n/tvar flv_url string/n/tvar rtmp_url string/n/tvar rtmp_live string/n/tfor k, v := range s1 {/n/t/tif k == /'error/' {/n/t/t/tif s1[k] != float64(0) {/n/t/t/t/treturn nil/n/t/t/t}/n/t/t}/n/t/tif v, ok := v.(map[string]any); ok {/n/t/t/tfor k, v := range v {/n/t/t/t/tif k == /'rtmp_url/' {/n/t/t/t/t/tif urlstr, ok := v.(string); ok {/n/t/t/t/t/t/trtmp_url = urlstr/n/t/t/t/t/t}/n/t/t/t/t} else if k == /'rtmp_live/' {/n/t/t/t/t/tif urlstr, ok := v.(string); ok {/n/t/t/t/t/t/trtmp_live = urlstr/n/t/t/t/t/t}/n/t/t/t/t}/n/t/t/t}/n/t/t}/n/t}/n/tflv_url = rtmp_url + /'//' + rtmp_live/n/tn4reg := regexp.MustCompile(`(?i)(/d{1,8}[0-9a-zA-Z]+)_?/d{0,4}(.flv|/playlist)`)/n/thouzhui := n4reg.FindStringSubmatch(flv_url)/n/tvar real_url string/n/tswitch d.Stream_type {/n/tcase /'hls/':/n/t/treal_url = strings.Replace(flv_url, houzhui[1]+/'.flv/', houzhui[1]+/'.m3u8/', -1)/n/tcase /'flv/':/n/t/treal_url = flv_url/n/tcase /'xs/':/n/t/treal_url = strings.Replace(flv_url, houzhui[1]+/'.flv/', houzhui[1]+/'.xs/', -1)/n/t}/n/treturn real_url/n}/n/n/n### PHP 代码实现/nphp/npublic function getRealUrl() {/n $jsUtil = new JsUtil();/n $did = '10000000000000000000000000001501';/n $timestamp = time();/n $realroomid = strval($this->getRoomId());/n $liveurl = 'https://www.douyu.com/' . $realroomid;/n $client = new //GuzzleHttp//Client();/n $resp = $client->request('GET', $liveurl, [/n 'headers' => [/n 'user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',/n 'upgrade-insecure-requests' => '1'/n ]/n ]);/n $body = $resp->getBody()->getContents();/n $reg = '/(?i)(vdwdae325w_64we[/s/S]*function ub98484234[/s/S]*?)function/';/n preg_match($reg, $body, $matches);/n $nreg = '/(?i)eval.*?;}/';/n $strfn = preg_replace($nreg, 'strc;}', $matches[1]);/n $funcContent1 = array($strfn, /'ub98484234/');/n $result = $jsUtil->jsRun($funcContent1, /'ub98484234/');/n $nres = strval($result);/n $nnreg = '/(?i)v=(/d+)/';/n preg_match($nnreg, $nres, $nnres);/n $unrb = $realroomid . $did . $timestamp . $nnres[1];/n $rb = md5($unrb);/n $nnnreg = '/(?i)return rt;}/);?/';/n $strfn2 = preg_replace($nnnreg, 'return rt;}', $nres);/n $strfn3 = str_replace('(function (', 'function sign(', $strfn2);/n $strfn4 = str_replace('CryptoJS.MD5(cb).toString()', '/'' . $rb . '/'', $strfn3);/n $funcContent2 = array($strfn4, /'sign/');/n $result2 = $jsUtil->jsRun($funcContent2, $realroomid, $did, $timestamp);/n $param = strval($result2);/n $realparam = $param . /'&rate=0/';/n $r1 = $client->request('POST', /'https://www.douyu.com/lapi/live/getH5Play//' . $realroomid, [/n 'headers' => [/n 'Content-Type' => 'application/x-www-form-urlencoded'/n ],/n 'body' => $realparam/n ]);/n $body1 = $r1->getBody()->getContents();/n $s1 = json_decode($body1, true);/n $flv_url = /'/';/n $rtmp_url = /'/';/n $rtmp_live = /'/';/n foreach ($s1 as $k => $v) {/n if ($k == /'error/') {/n if ($s1[$k] != 0) {/n return null;/n }/n }/n if (is_array($v)) {/n foreach ($v as $k2 => $v2) {/n if ($k2 == /'rtmp_url/') {/n $rtmp_url = $v2;/n } else if ($k2 == /'rtmp_live/') {/n $rtmp_live = $v2;/n }/n }/n }/n }/n $flv_url = $rtmp_url . /'//' . $rtmp_live;/n $n4reg = '/(?i)(/d{1,8}[0-9a-zA-Z]+)_?/d{0,4}(.flv|//playlist)/';/n preg_match($n4reg, $flv_url, $houzhui);/n $real_url = /'/';/n switch ($this->stream_type) {/n case /'hls/':/n $real_url = str_replace($houzhui[1] . /'.flv/', $houzhui[1] . /'.m3u8/', $flv_url);/n break;/n case /'flv/':/n $real_url = $flv_url;/n break;/n case /'xs/':/n $real_url = str_replace($houzhui[1] . /'.flv/', $houzhui[1] . /'.xs/', $flv_url);/n break;/n }/n return $real_url;/n}/n/n/n注意:/n* 以上代码仅供参考,实际使用时可能需要根据斗鱼网站的更新进行调整。/n* 为了避免被网站屏蔽,建议使用合理的爬虫频率和策略。/n* 尊重网站的 robots.txt 协议,不要爬取网站禁止爬取的内容。/n/n代码说明:/n* 代码首先获取斗鱼直播页面的内容,并使用正则表达式解析出用于生成播放地址的 JavaScript 函数代码。/n* 使用 JS 引擎执行 JavaScript 代码,获取最终的播放地址参数。/n* 使用 HTTP 请求获取包含真实播放地址的 JSON 数据。/n* 解析 JSON 数据,获取不同类型的播放地址。/n* 根据用户指定的流类型,返回最终的真实播放地址。/n/n相关技术:/n* HTTP 请求/n* 正则表达式/n* JavaScript 执行/n* JSON 解析/n/n希望本文对您有所帮助。如果您有任何问题或建议,欢迎在评论区留言。/n

Douyu Real URL 获取方法:Go 和 PHP 实现

原文地址: https://www.cveoy.top/t/topic/quLk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录