Heim Backend-Entwicklung PHP-Tutorial Youku 视频绝对地址获取的方法详解_php技巧

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

May 17, 2016 am 08:58 AM
获取

前一阵子为了研究 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 = ‘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
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie bekomme ich eine Dateierweiterung in Python? Wie bekomme ich eine Dateierweiterung in Python? Sep 08, 2023 pm 01:53 PM

Eine Dateierweiterung in Python ist ein Suffix, das an das Ende eines Dateinamens angehängt wird, um das Format oder den Typ der Datei anzugeben. Es besteht normalerweise aus drei oder vier Zeichen, einem Dateinamen gefolgt von einem Punkt, wie zum Beispiel „.txt“ oder „.py“. Betriebssysteme und Programme verwenden Dateierweiterungen, um zu bestimmen, um welchen Dateityp es sich handelt und wie er verarbeitet werden soll. Wird als reine Textdatei erkannt. Dateierweiterungen in Python sind beim Lesen oder Schreiben von Dateien von entscheidender Bedeutung, da sie das Dateiformat und die beste Möglichkeit zum Lesen und Schreiben von Daten festlegen. Beispielsweise ist die Dateierweiterung „.csv“ die Erweiterung, die beim Lesen von CSV-Dateien verwendet wird, und das CSV-Modul wird zum Verarbeiten der Dateien verwendet. Algorithmus zum Erhalten der Dateierweiterung in Python. Bearbeiten Sie die Dateinamenzeichenfolge in Python.

Verwenden Sie die Funktion math.Max, um den Maximalwert in einer Reihe von Zahlen zu ermitteln Verwenden Sie die Funktion math.Max, um den Maximalwert in einer Reihe von Zahlen zu ermitteln Jul 24, 2023 pm 01:24 PM

Verwenden Sie die Funktion math.Max, um den Maximalwert in einer Zahlenmenge zu ermitteln. In der Mathematik und Programmierung ist es häufig erforderlich, den Maximalwert in einer Zahlenmenge zu ermitteln. In der Go-Sprache können wir die Max-Funktion im Mathematikpaket verwenden, um diese Funktion zu erreichen. In diesem Artikel wird erläutert, wie Sie mit der Funktion math.Max ​​den Maximalwert in einer Reihe von Zahlen ermitteln, und es werden entsprechende Codebeispiele bereitgestellt. Zuerst müssen wir das Mathematikpaket importieren. In der Go-Sprache können Sie das Schlüsselwort import verwenden, um ein Paket zu importieren, wie unten gezeigt: import"mat

Wo Sie den Google-Sicherheitscode erhalten Wo Sie den Google-Sicherheitscode erhalten Mar 30, 2024 am 11:11 AM

Google Authenticator ist ein Tool zum Schutz der Sicherheit von Benutzerkonten. Sein Schlüssel sind wichtige Informationen, die zur Generierung dynamischer Bestätigungscodes verwendet werden. Wenn Sie den Schlüssel von Google Authenticator vergessen haben und ihn nur über den Sicherheitscode überprüfen können, wird Ihnen der Herausgeber dieser Website hoffentlich weiterhelfen Erfahren Sie mehr. Benutzer lesen bitte weiter unten! Öffnen Sie zunächst die Telefoneinstellungen und rufen Sie die Einstellungsseite auf. Scrollen Sie auf der Seite nach unten und suchen Sie nach Google. Gehen Sie zur Google-Seite und klicken Sie auf Google-Konto. Rufen Sie die Kontoseite auf und klicken Sie unter dem Bestätigungscode auf „Anzeigen“. Geben Sie Ihr Passwort ein oder verwenden Sie Ihren Fingerabdruck, um Ihre Identität zu überprüfen. Besorgen Sie sich einen Google-Sicherheitscode und verwenden Sie den Sicherheitscode, um Ihre Google-Identität zu überprüfen.

Wie erhalte ich das letzte Element von LinkedHashSet in Java? Wie erhalte ich das letzte Element von LinkedHashSet in Java? Aug 27, 2023 pm 08:45 PM

Das Abrufen des letzten Elements aus einem LinkedHashSet in Java bedeutet, das letzte Element in seiner Sammlung abzurufen. Obwohl Java über keine integrierte Methode zum Abrufen des letzten Elements in LinkedHashSets verfügt, gibt es mehrere effektive Techniken, die Flexibilität und Komfort bieten, um dieses letzte Element effizient abzurufen, ohne die Einfügereihenfolge zu unterbrechen – ein Muss für Java-Entwickler, die in der Anwendung effektiv behandelt werden . Durch die effektive Anwendung dieser Strategien in ihren Softwareprojekten können sie die beste Lösung für diese Anforderung erreichen. LinkedHashSetLinkedHashSet ist eine effiziente Datenstruktur in Java, die HashSet und kombiniert

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Mar 18, 2024 pm 02:10 PM

Obwohl die allgemeine Funktionsweise heimischer Mobiltelefone sehr ähnlich ist, gibt es in einigen Details dennoch einige Unterschiede. Beispielsweise können verschiedene Mobiltelefonmodelle und Hersteller unterschiedliche Dual-SIM-Installationsmethoden haben. Erzhenwo 12Pro, ein neues Mobiltelefon, unterstützt auch Dual-SIM Dual Standby, aber wie soll Dual-SIM auf diesem Telefon installiert werden? Wie installiere ich Dual-SIM auf Realme 12Pro? Denken Sie daran, Ihr Telefon vor der Installation auszuschalten. Schritt 1: Finden Sie das SIM-Kartenfach: Suchen Sie das SIM-Kartenfach des Telefons. Normalerweise befindet sich das SIM-Kartenfach beim Realme 12 Pro an der Seite oder oben am Telefon. Schritt 2: Führen Sie die erste SIM-Karte mit einem speziellen SIM-Kartenstift oder einem kleinen Gegenstand in den Steckplatz im SIM-Kartenfach ein.

Holen Sie sich jetzt die neuesten Updates: Beheben Sie fehlende neueste Updates Holen Sie sich jetzt die neuesten Updates: Beheben Sie fehlende neueste Updates Nov 08, 2023 pm 02:25 PM

Wenn die Option „Die neuesten Updates abrufen, sobald sie verfügbar sind“ fehlt oder ausgegraut ist, führen Sie möglicherweise eine Developer Channel-Version von Windows 11 aus, und das ist normal. Bei anderen treten nach der Installation des Updates KB5026446 (22621.1778) Probleme auf. Hier erfahren Sie, was Sie tun können, um die Option „Neueste Updates erhalten, sobald sie verfügbar sind“ wiederherzustellen. Wie erhalte ich die Option „Die neuesten Updates erhalten, sobald sie verfügbar sind“ zurück? Bevor Sie mit einer der folgenden Lösungen beginnen, prüfen Sie unbedingt, ob die neuesten Windows 11-Updates verfügbar sind, und installieren Sie diese. 1. Gehen Sie mit ViVeTool zur Microsoft Update-Katalogseite und suchen Sie nach dem Update KB5026446. Laden Sie das Update herunter und installieren Sie es erneut auf Ihrem PC

Java-Programm zum Ermitteln der Größe einer bestimmten Datei in Bytes, Kilobytes und Megabytes Java-Programm zum Ermitteln der Größe einer bestimmten Datei in Bytes, Kilobytes und Megabytes Sep 06, 2023 am 10:13 AM

Die Größe einer Datei ist der Speicherplatz, den eine bestimmte Datei auf einem bestimmten Speichergerät, beispielsweise einer Festplatte, einnimmt. Die Größe einer Datei wird in Bytes gemessen. In diesem Abschnitt besprechen wir, wie man ein Java-Programm implementiert, um die Größe einer bestimmten Datei in Bytes, Kilobytes und Megabytes zu ermitteln. Ein Byte ist die kleinste Einheit digitaler Informationen. Ein Byte entspricht acht Bits. Ein Kilobyte (KB) = 1.024 Byte, ein Megabyte (MB) = 1.024 KB, ein Gigabyte (GB) = 1.024 MB und ein Terabyte (TB) = 1.024 GB. Die Größe einer Datei hängt normalerweise vom Dateityp und der darin enthaltenen Datenmenge ab. Am Beispiel eines Textdokuments kann die Dateigröße nur wenige Kilobyte betragen, während dies bei einer hochauflösenden Bild- oder Videodatei der Fall sein kann

See all articles