少し前に、KnLiveCommentary について勉強するために、ビデオ サイトについて一連の調査を行いました。 KnLiveCommentary はテスト用に十分なビデオ ソースを取得できる必要があるため、比較的大規模なビデオ Web サイトである Youku をテスト用に選択しました。
実際、私は Youku の内蔵プレーヤーを研究し、広告を削除するために、絶対アドレスの解決を研究し始めました。その後、ASV6 (ActionScript Viewer 6) を使用して Youku のプレーヤーを「逆コンパイル」し、驚くべき結果を達成しました。
Youkuの動画は暗号化+動的取得方式を採用しており、Webサイトにアクセスすることで動画アドレスを動的に取得し、その結果を復号化するなどの操作が必要となります。
$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/' //ビデオのアドレスベースアドレスを取得します。 information
$_VIDEO_ID = $ _GET['vid']; //GET からビデオ 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']); // 現在のブラウザ ユーザー エージェントをサーバーに渡します
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 文字列シード、encoded_url、key1、key2 から必要な情報を抽出します
class decoder{
var $randomSeed = 0;
var $cg_str="";
function __construct($seed){
$this-> ;ランダムシード = $seed;
}
関数 ran(){
$this->ランダムシード = (($this->ランダムシード * 211)+30031)%65536;
return ($this->ランダムシード / 65536 ) ; // 古いシードに基づいて新しいシードを計算し、シードの比例位置を返します [0,1)
}
function cg_hun(){ // これは「CG ミキシング」と呼ばれるものだと思います。 ASV ソリューションの名前は次のとおりです。 Name
$this->cg_str="";
$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/:._-1234567890'; //デフォルトの文字列 (最大)
$len = strlen($sttext); /その長さを取得します
for($i=0;$i$cuch = (int)($this->ran()*strlen($sttext)); // string シード比例位置 文字添え字
$this->cg_str.=$sttext[$cuch] //文字を読み込む
$sttext = str_replace($sttext[$cuch],”,$sttext); //これを削除reading 出てくる文字(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 pull
}
; function decode_key ($key1,$key2){
$key = hexdec($key1); //どちらのキーも 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);
//Open $s4 = '00';//これは 16 進数の値であることに注意してください。つまり、00 はファイルの最初のセグメントを表します。ビデオ、01 2 番目 0f 15 番目... など $sid = time() '1000' . mt_rand(30,80) ;// ランダムな SID を取得します。それをサーバーに渡します (実際にはチェックされません)
$d_ADDR = 'http://f.youku.com/player/getFlvPath/sid/' . $s4 。 /' . $encoded[1] . $file_id;
echo $d_ADDR . $key;
//最後にアドレスを出力します
Youku がアルゴリズム/形式を変更したため、上記の方法ではすべての状況に対応できなくなったことにご注意ください:
1. http://v.youku.com/player/getPlayList にアクセスしてください。 /VideoIDS /[ID]
2. ファイルを取得し、「streamfileids」:{"flv":"暗号化されたアドレス","mp4":"暗号化されたアドレス","etc.":"暗号化されたアドレス"
3. フォローします。上記暗号化アドレスを解読する方法
4. セグメント数とK
{"mp4":[{"no":"0","size":"18367795","秒":"421", "k": "281ff2875db680bb261c02ce"},{"no":"1","size":"19045091","秒":"421","k":"45398cdd4aa44968261c02ce"},
...
5.合成アドレスですが、各セグメントの K は上記で取得した新しい K を採用します
http://www.bkjia.com/PHPjc/327891.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327891.html技術記事少し前に、KnLiveCommentary について勉強するために、ビデオ サイトについて一連の調査を行いました。 KnLiveCommentary はテスト用に十分なビデオ ソースを取得できる必要があるため、...