Youku 视频绝对地址获取的方法详解_php技巧
前一阵子为了研究 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
}
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 = ‘http://f.youku.com/player/getFlvPath/sid/‘ . $sid . ‘_'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $file_id;
echo $d_ADDR . ‘?K=' . $key;
//最后把地址输出
请注意,由于Youku 更换算法/格式上面的方法已经不能处理所有情况,我来描述下现在的流程:
1.访问http://v.youku.com/player/getPlayList/VideoIDS/[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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Python のファイル拡張子は、ファイルの形式または種類を示すためにファイル名の末尾に追加される接尾辞です。通常、「.txt」や「.py」など、3 文字または 4 文字とファイル名とピリオドで構成されます。オペレーティング システムとプログラムは、ファイル拡張子を使用して、ファイルの種類と処理方法を決定します。プレーンテキストファイルとして認識されます。 Python のファイル拡張子は、ファイル形式とデータの読み取りおよび書き込みに最適な方法を確立するため、ファイルの読み取りまたは書き込みを行うときに非常に重要です。たとえば、ファイル拡張子「.csv」は CSV ファイルを読み取るときに使用される拡張子であり、ファイルの処理には csv モジュールが使用されます。 Python でファイル拡張子を取得するアルゴリズム Python でファイル名の文字列を操作します。

math.Max 関数を使用して、一連の数値の最大値を取得します。数学やプログラミングでは、一連の数値の最大値を見つけることが必要になることがよくあります。 Go 言語では、数学パッケージの Max 関数を使用してこの関数を実現できます。この記事では、 math.Max 関数を使用して一連の数値の最大値を取得する方法と、対応するコード例を紹介します。まず、数学パッケージをインポートする必要があります。 Go 言語では、以下に示すように、import キーワードを使用してパッケージをインポートできます。

Google Authenticator はユーザー アカウントのセキュリティを保護するために使用されるツールであり、そのキーは動的検証コードを生成するために使用される重要な情報です。 Google Authenticator のキーを忘れて、セキュリティ コードでしか認証できない場合は、この Web サイトの編集者が Google セキュリティ コードの入手先について詳しく説明しますので、お役に立てれば幸いです。詳細を知る ユーザーは以下を読み続けてください。まず電話の設定を開き、設定ページに入ります。ページを下にスクロールして Google を見つけます。 Googleページに移動し、「Googleアカウント」をクリックします。アカウント ページに入り、確認コードの下にある [表示] をクリックします。パスワードを入力するか、指紋を使用して身元を確認します。 Google セキュリティ コードを取得し、そのセキュリティ コードを使用して Google の ID を確認します。

Java で LinkedHashSet から最後の要素を取得するということは、そのコレクション内の最後の要素を取得することを意味します。 Java には LinkedHashSets 内の最後の項目を取得するための組み込みメソッドはありませんが、挿入順序を壊さずにこの最後の要素を効率的に取得するための柔軟性と利便性を提供する効果的な手法がいくつかあります。これは、アプリケーションで効果的に対処できる問題に Java 開発者が取り組む必要があります。 。これらの戦略をソフトウェア プロジェクトに効果的に適用することで、この要件に対する最適なソリューションを実現できます。LinkedHashSetLinkedHashSet は、HashSet と HashSet を組み合わせた Java の効率的なデータ構造です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

国内の携帯電話の一般的な操作は非常に似ていますが、携帯電話のモデルやメーカーが異なると、デュアル SIM のインストール方法が異なる場合があるなど、細部ではまだいくつかの違いがあります。新しい携帯電話 Erzhenwo 12Pro もデュアル SIM デュアル スタンバイをサポートしていますが、この携帯電話にデュアル SIM をインストールするにはどうすればよいですか? Realme 12ProにデュアルSIMをインストールするにはどうすればよいですか?インストールする前に必ず携帯電話の電源を切ってください。ステップ 1: SIM カード トレイを見つける: 電話機の SIM カード トレイを見つける. 通常、Realme 12 Pro では、SIM カード トレイは電話機の側面または上部にあります。ステップ 2: 最初の SIM カードを挿入します. 専用の SIM カード ピンまたは小さな物体を使用して、SIM カード トレイのスロットに挿入し、最初の SIM カードを慎重に挿入します。

[最新の更新プログラムが利用可能になり次第入手する] オプションが見つからない、またはグレー表示されている場合は、開発者チャネルの Windows 11 ビルドを実行している可能性がありますが、これは正常です。その他の場合は、KB5026446 (22621.1778) 更新プログラムのインストール後に問題が発生します。 「最新のアップデートが利用可能になり次第、すぐに入手する」オプションを再び表示するためにできることは次のとおりです。 「最新のアップデートが入手可能になり次第入手する」オプションを元に戻すにはどうすればよいですか?以下の解決策のいずれかを開始する前に、最新の Windows 11 更新プログラムを確認してインストールしてください。 1. ViVeTool を使用して Microsoft Update カタログ ページに移動し、KB5026446 更新プログラムを探します。 PC にアップデートをダウンロードして再インストールします

ファイルのサイズは、ハードドライブなどの特定のストレージデバイス上で特定のファイルが占めるストレージスペースの量です。ファイルのサイズはバイト単位で測定されます。このセクションでは、指定されたファイルのサイズをバイト、キロバイト、メガバイト単位で取得する Java プログラムを実装する方法について説明します。バイトはデジタル情報の最小単位です。 1 バイトは 8 ビットに相当します。 1 キロバイト (KB) = 1,024 バイト、1 メガバイト (MB) = 1,024KB、1 ギガバイト (GB) = 1,024MB、1 テラバイト (TB) = 1,024GB。ファイルのサイズは通常、ファイルの種類とそれに含まれるデータの量によって異なります。テキストドキュメントを例にとると、ファイルサイズはわずか数キロバイトですが、高解像度の画像やビデオファイルは
