php教程 php手册 Youku 视频绝对地址获取的方法详解

Youku 视频绝对地址获取的方法详解

Jun 06, 2016 pm 08:29 PM
얻다

本篇文章是对Youku 视频绝对地址获取的方法进行了详细的分析介绍,需要的朋友参考下

前一阵子为了研究 KnLiveCommentary 而进行了一系列的关于视频站点的研究。由于KnLiveCommentary需要能够获取充足的视频源进行测试,所以我们选取了 Youku(优酷)一个比较大的视频网站来进行测试。
其实开始研究解析绝对地址也是为了研究Youku 的自带播放器,顺便去除广告什么的。后来我们就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反编译”了一下,达到了惊人的效果。

Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。

复制代码 代码如下:


$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //获取视频信息的地址 基地址
$_VIDEO_ID = $_GET['vid']; //从GET里面把Video Id提取
if($_VIDEO_ID=='')
$_VIDEO_ID = 'XMjY0ODE1MDA0'; //我比较懒,测试的时 候就固定了一个
$ch = curl_init(); //开启cURL对象
curl_setopt($ch, CURLOPT_URL, $base_url . $_VIDEO_ID); //获取这个视频的信息的地址
curl_setopt($ch, CURLOPT_HEADER, 1); //要 HEADER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://v.youku.com/v_show/id_' . $_VIDEO_ID); //给一个假的"REFERER"
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //把现在的浏览器User Agent传递给服务器
curl_setopt($ch, CURLOPT_NOBODY, 0);
$content = curl_exec($ch); //执行!!!
curl_close($ch); /*下面解析*/
preg_match(‘~”seed”\s*:\s*(\d+)\s*,~iUs',$content,$seed);
preg_match(‘~\{\s*”(flv|mp4)”\s*:\s*”(.*)”\s*\}~iUs',$content,$encoded);
preg_match(‘~”key1″\s*:\s*”(.*)”\s*,~iUs',$content,$key1);
preg_match(‘~”key2″\s*:\s*”(.*)”\s*,~iUs',$content,$key2);
//从返回的JSON串中提取必要信息 seed, encoded_url, key1, key2
class decoder{
var $randomSeed = 0;
var $cg_str=”";
function __construct($seed){
$this->randomSeed = $seed;
}
function ran(){
$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;
return ($this->randomSeed / 65536);// 根据旧的 Seed 计算新的Seed,并且返回一个Seed的比例位置 [0,1)
}
function cg_hun(){ //估计这个叫 “CG混”,香港空间,反正ASV解的函数就是这个名字
$this->cg_str="";
$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890'; //默认字符串(最大)
$len = strlen($sttext); //获取其长度
for($i=0;$i$cuch = (int)($this->ran()*strlen($sttext)); //获取字符串 Seed比例 位置的字符下标
$this->cg_str.=$sttext[$cuch]; //把字母读出来
$sttext = str_replace($sttext[$cuch],”,$sttext); //删掉这个读出来的字母(到 0 就停)
}
}
function decode($string){
$output=”";
$this->cg_hun();
$expl = explode(‘*',$string); //把 1*23*34*45*56* 这个字符串打散
for($i=0;$i$output.=$this->cg_str[(int)$expl[$i]]; //获取数字位代表的 cg_hun 打乱字符串字符,自此解密完成
}
return $output; //OK拉
}
function decode_key($key1,$key2){
$key = hexdec($key1); //两个Key都是HEX
$key = $key ^ -1520786011; //这个原来也是个8 位HEX,后来被我用计算器算了数值,因为这样方便PhP位运算
return $key2 . dechex($key); //合成最终 Key
}
}//解密类,用这个很方便$new = new decoder((int)$seed[1]);
$fileid = $new->decode($encoded[2]);
$key = $new->decode_key($key1[1],$key2[1]);
//把数据喂进去,计算//地址载构成
$s7 = substr($fileid,10,strlen($fileid));
$s5 = substr($fileid,0,8);
$s6 = substr($fileid,6,2);
//拆开$s4 = '00′;//注意这是一个 HEX 值,即00表示视频第一个分段,网站空间,美国服务器,01第二个 0f第十五个…依此类推$sid = time() . mt_rand(10,99) . '1000′ . mt_rand(30,80) . '00′;//获取一个随机的SID,给服务器(其实不会被检查)
$d_ADDR = ‘‘ . $sid . ‘_'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $file_id;
echo $d_ADDR . ‘?K=' . $key;
//最后把地址输出


请注意,由于Youku 更换算法/格式上面的方法已经不能处理所有情况,我来描述下现在的流程:
1.访问[ID]
2.获得文件,同时解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”
3.按照上面的方法破解加密地址
4.获取分段数目和K
{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce“},
……
5.合成地址,不过每个分段的K都采用上面获得的新K
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python에서 파일 확장자를 얻는 방법은 무엇입니까? Python에서 파일 확장자를 얻는 방법은 무엇입니까? Sep 08, 2023 pm 01:53 PM

Python의 파일 확장자는 파일의 형식이나 유형을 나타내기 위해 파일 이름 끝에 추가되는 접미사입니다. 일반적으로 ".txt" 또는 ".py"와 같이 파일 이름 뒤에 마침표가 오는 3~4개의 문자로 구성됩니다. 운영 체제와 프로그램은 파일 확장자를 사용하여 파일 형식과 처리 방법을 결정합니다. 일반 텍스트 파일로 인식됩니다. Python의 파일 확장자는 파일 형식과 데이터를 읽고 쓰는 가장 좋은 방법을 설정하기 때문에 파일을 읽거나 쓸 때 중요합니다. 예를 들어 ".csv" 파일 확장자는 CSV 파일을 읽을 때 사용되는 확장자이고, csv 모듈은 파일을 처리하는 데 사용됩니다. Python에서 파일 확장자를 얻는 알고리즘입니다. Python에서 파일 이름 문자열을 조작합니다.

Google 보안 코드를 받을 수 있는 곳 Google 보안 코드를 받을 수 있는 곳 Mar 30, 2024 am 11:11 AM

Google OTP는 사용자 계정의 보안을 보호하기 위해 사용되는 도구로, 그 핵심은 동적 인증 코드를 생성하는 데 사용되는 중요한 정보입니다. Google OTP의 키를 잊어버렸고 보안 코드를 통해서만 확인할 수 있는 경우, 이 웹사이트의 편집자가 Google 보안 코드를 얻을 수 있는 위치에 대한 자세한 소개를 제공할 것입니다. 더 많은 정보를 알고 계시다면 아래 내용을 계속 읽어주세요! 먼저 전화 설정을 열고 설정 페이지로 들어갑니다. 페이지를 아래로 스크롤하여 Google을 찾으세요. Google 페이지로 이동하여 Google 계정을 클릭하세요. 계정 페이지에 들어가서 인증 코드 아래에 있는 보기를 클릭하세요. 비밀번호를 입력하거나 지문을 사용하여 신원을 확인하세요. Google 보안 코드를 받고 보안 코드를 사용하여 Google 신원을 확인하세요.

math.Max ​​함수를 사용하여 숫자 집합에서 최대값을 구하세요. math.Max ​​함수를 사용하여 숫자 집합에서 최대값을 구하세요. Jul 24, 2023 pm 01:24 PM

숫자 집합에서 최대값을 구하려면 math.Max ​​함수를 사용하세요. 수학과 프로그래밍에서는 숫자 집합에서 최대값을 찾아야 하는 경우가 많습니다. Go 언어에서는 Math 패키지의 Max 함수를 사용하여 이 함수를 구현할 수 있습니다. 이 글에서는 math.Max ​​함수를 사용하여 숫자 집합에서 최대값을 구하는 방법을 소개하고 해당 코드 예제를 제공합니다. 먼저, math 패키지를 가져와야 합니다. Go 언어에서는 아래와 같이 import 키워드를 사용하여 패키지를 가져올 수 있습니다.

Java에서 LinkedHashSet의 마지막 요소를 얻는 방법은 무엇입니까? Java에서 LinkedHashSet의 마지막 요소를 얻는 방법은 무엇입니까? Aug 27, 2023 pm 08:45 PM

Java의 LinkedHashSet에서 마지막 요소를 검색한다는 것은 해당 컬렉션의 마지막 요소를 검색한다는 의미입니다. Java에는 LinkedHashSets의 마지막 항목을 검색하는 데 도움이 되는 내장 메서드가 없지만 삽입 순서를 깨지 않고 이 마지막 요소를 효율적으로 검색할 수 있는 유연성과 편리함을 제공하는 몇 가지 효과적인 기술이 있습니다. 이는 Java 개발자가 애플리케이션에서 효과적으로 해결해야 하는 문제입니다. . 소프트웨어 프로젝트에 이러한 전략을 효과적으로 적용함으로써 이 요구 사항에 대한 최상의 솔루션을 얻을 수 있습니다. LinkedHashSetLinkedHashSet은 HashSet과 HashSet을 결합한 Java의 효율적인 데이터 구조입니다.

주어진 파일의 크기를 바이트, 킬로바이트, 메가바이트 단위로 가져오는 Java 프로그램 주어진 파일의 크기를 바이트, 킬로바이트, 메가바이트 단위로 가져오는 Java 프로그램 Sep 06, 2023 am 10:13 AM

파일 크기는 하드 드라이브와 같은 특정 저장 장치에서 특정 파일이 차지하는 저장 공간의 양입니다. 파일 크기는 바이트 단위로 측정됩니다. 이 섹션에서는 주어진 파일의 크기를 바이트, 킬로바이트, 메가바이트 단위로 가져오는 Java 프로그램을 구현하는 방법에 대해 설명합니다. 바이트는 디지털 정보의 가장 작은 단위입니다. 1바이트는 8비트와 같습니다. 1킬로바이트(KB) = 1,024바이트, 1메가바이트(MB) = 1,024KB, 1기가바이트(GB) = 1,024MB, 1테라바이트(TB) = 1,024GB입니다. 파일 크기는 일반적으로 파일 유형과 포함된 데이터 양에 따라 달라집니다. 텍스트 문서를 예로 들면, 파일 크기는 몇 킬로바이트에 불과한 반면, 고해상도 이미지나 비디오 파일은

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

Realme 12 Pro에 듀얼 SIM을 설치하는 방법은 무엇입니까? Realme 12 Pro에 듀얼 SIM을 설치하는 방법은 무엇입니까? Mar 18, 2024 pm 02:10 PM

국내 휴대폰의 일반적인 작동은 매우 유사하지만 일부 세부 사항에는 여전히 약간의 차이가 있습니다. 예를 들어 휴대폰 모델 및 제조업체에 따라 듀얼 SIM 설치 방법이 다를 수 있습니다. 신형 휴대폰인 Erzhenwo 12Pro도 듀얼심 듀얼 대기를 지원하는데, 이 휴대폰에 듀얼심을 어떻게 설치해야 할까요? Realme 12Pro에 듀얼 SIM을 설치하는 방법은 무엇입니까? 설치하기 전에 휴대폰을 끄는 것을 잊지 마십시오. 1단계: SIM 카드 트레이 찾기: 휴대폰의 SIM 카드 트레이를 찾습니다. 일반적으로 Realme 12 Pro에서는 SIM 카드 트레이가 휴대폰 측면이나 상단에 있습니다. 2단계: 첫 번째 SIM 카드를 삽입합니다. 전용 SIM 카드 핀이나 작은 물체를 사용하여 SIM 카드 트레이의 슬롯에 삽입합니다. 그런 다음 첫 번째 SIM 카드를 조심스럽게 삽입합니다.

지금 최신 업데이트 받기: 누락된 최신 업데이트 수정 지금 최신 업데이트 받기: 누락된 최신 업데이트 수정 Nov 08, 2023 pm 02:25 PM

"최신 업데이트가 출시되는 즉시 받기" 옵션이 없거나 회색으로 표시된 경우 개발자 채널 버전의 Windows 11을 실행 중일 수 있으며 이는 정상적인 현상입니다. 다른 경우에는 KB5026446(22621.1778) 업데이트를 설치한 후 문제가 발생합니다. "최신 업데이트가 제공되는 즉시 최신 업데이트 받기" 옵션을 다시 가져오기 위해 수행할 수 있는 작업은 다음과 같습니다. "최신 업데이트가 제공되는 즉시 받기" 옵션을 다시 얻으려면 어떻게 해야 합니까? 아래 해결 방법을 시작하기 전에 최신 Windows 11 업데이트를 확인하고 설치하세요. 1. ViVeTool을 사용하여 Microsoft 업데이트 카탈로그 페이지로 이동하여 KB5026446 업데이트를 찾습니다. PC에 업데이트를 다운로드하고 다시 설치하세요.

See all articles