PPTV解析源码
<?php
require_once(“../include/global.inc.php");
$host = GlobalBase::is_https().$_SERVER[“HTTP_HOST"];
if(isset($_REQUEST['url’])){
$url = $_REQUEST['url’];
$content = preg_replace(“#(getPlayEncode\(|\);)#",“",file_get_contents($url));
$root = json_decode($content,true)[“childNodes"];
//print_r($content);exit;
$token = PPTVToKey::token();
$videos = array();
foreach ($root as $key => $value) {
$tagName = $value[“tagName"];// “dt"
if($tagName==“channel"){
foreach ($value[“childNodes"] as $_key => $_value) {
if($_value[“tagName"]==“file"){
foreach ($_value[“childNodes"] as $__key => $__value) {
$rid = $__value[“rid"];//视频文件名
$ft = $__value[“ft"];//视频类型
switch ($ft) {
case 0:$def = “流畅"; break;//480X270
case 1:$def = “高清"; break;//720X404
case 2:$def = “超清"; break;//1280X720
case 3:$def = “蓝光"; break;//1920X1080
case 4:$def = “原画"; break;//1920X1080
}
$videos[$ft][“rid"] = str_replace(“.mp4",“",$rid);
$videos[$ft][“def"] = $def;
}
}
}
}else if($tagName==“dt"){
$ft = $value[“ft"];
foreach ($value[“childNodes"] as $_key => $_value) {
$_tagName = $_value[“tagName"];
switch ($_tagName) {
case 'sh’:$sh = $_value[“childNodes"][0];break;
case 'key’:$key = $_value[“childNodes"][0];break;
}
}
$videos[$ft][“sh"] = $sh;
$videos[$ft][“key"] = $key;
}
}
//if(count($videos)==5){//移除原画质
// array_splice($videos,4,1);
//}
array_splice($videos,0,1); //移除流畅
foreach ($videos as $key => $value) {
$xml = curl(“http://drag.synacast.com/".$value[“rid"].“.mp40drag");
preg_match_all('#duration=“(.*?)"#’,$xml,$duration);
preg_match_all('#filesize=“(\d+)"#’,$xml,$filesize);
$videos[$key][“dragdata"][“dur"] = $duration[1];//分段时间
$videos[$key][“dragdata"][“fs"] = $filesize[1];//分段文件大小
}
$data[“data"] = $videos;
$data[“token"] = $token;
echo json_encode($data);
}
if(isset($_REQUEST['data’])&&isset($_REQUEST['vid’])){
$data = json_encode(json_decode(base64_decode($_REQUEST['data’])));
//print_r($_REQUEST['data’]);exit;
file_put_contents(PPTV_TEMP_PATH.$_REQUEST['vid’].“.json",$data);
echo “./video/pptv.php?vid=".$_REQUEST['vid’];
}elseif(isset($_REQUEST['vid’])){
$file = PPTV_TEMP_PATH.$_REQUEST['vid’].“.json";
//print_r($file.’ddddddddddddddddddd’);exit;
$data = file_get_contents($file);
unlink($file);
echo $data;
}
function curl($url)
{
$params[“ua"] = “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36";
return GlobalBase::curl($url,$params);
}
class PPTVToKey
{
public static function string($abyte2) {
$k = “";
for ($i=0; $i < count($abyte2); $i++) $k .= chr($abyte2[$i]);
return trim($k);
}
public static function timeArray() {
$i = 0;
$abyte = array();
$time = $_SERVER['REQUEST_TIME’] + 300;
while ($i < 16) {
$bytes;
$abyte[$i] = 0xf & $time >> 28 – 4 * ($i % 8);
$byte = $abyte[$i];
if ($abyte[$i] > 9) $bytes = 87; else $bytes = 48;
$abyte[$i] = $byte + $bytes;
if ($i > 7 || $abyte[$i] == 0) {
$abyte[$i] = mt_rand(1, 256);
}
$i++;
}
return $abyte;
}
public static function token() {
$keyArray = array();
$tmAray = self::timeArray();
$tmCode = array(113, 113, 113, 113, 113, 119, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0);
$tmAray = self::encrypt_a($tmAray, 16, $tmCode);
$keyArray = self::encrypt_b($tmAray, 16, $keyArray, 33);
return self::string($keyArray);
}
public static function keyCode($tmCode) {
$k = 0;
for ($i=0; $i < 16; $i++) {
$k ^= $tmCode[$i] << 8 * ($i % 4);
}
return $k;
}
public static function b($num) {
$a = 0xffffffff & $num;
$b = sprintf(“%u", $a);
return $b * 1;
}
public static function encrypt_a($tmArray, $i, $tmCode) {
$l = self::keyCode($tmCode);
$l1 = $l << 8 | $l >> 24;
$l2 = $l << 16 | $l >> 16;
$l3 = $l << 24 | $l >> 8;
for ($k = 0; $k + 16 <= $i; $k += 16) {
$l4 = 0;
$l5 = 0;
$l6 = 0;
for ($i1 = 0; $i1 < 4; $i1++) {
$l4 |= (0xff & $tmArray[$k + $i1]) << $i1 * 8;
$l5 |= (0xff & $tmArray[4 + ($k + $i1)]) << $i1 * 8;
}
for ($j1 = 0; $j1 < 32; $j1++) {
$l6 = self::b($l6 – 0x61c88647);
$a1 = self::b($l5 << 4);
$a2 = self::b($l + $a1);
$a3 = self::b($l5 + $l6);
$a4 = self::b($a2 ^ $a3);
$a5 = self::b($l5 >> 5);
$a6 = self::b($l1 + $a5);
$l4 = self::b($l4 + ($a4 ^ $a6));
$b1 = self::b($l4 << 4);
$b2 = self::b($l2 + $b1);
$b3 = self::b($l4 + $l6);
$b4 = self::b($b2 ^ $b3);
$b5 = self::b($l4 >> 5);
$b6 = self::b($l3 + $b5);
$l5 = self::b($l5 + ($b4 ^ $b6));
}
for ($k1 = 0; $k1 < 4; $k1++) {
$tmArray[$k + $k1] = (255 & $l4 >> $k1 * 8);
$tmArray[4 + ($k + $k1)] = (255 & $l5 >> $k1 * 8);
}
}
return $tmArray;
}
public static function encrypt_b($tmAray, $i, $keyArray, $j) {
for ($k = 0; $k < $i; $k++) {
$keyArray[$k * 2] = (0xf & $tmAray[$k]);
$keyArray[1 + $k * 2] = (0xf & $tmAray[$k] >> 4);
}
$l = 0;
while ($l < $i * 2) {
$byte1;
$byte0 = $keyArray[$l];
if ($keyArray[$l] > 9) {
$byte1 = 87;
} else {
$byte1 = 48;
}
$keyArray[$l] = $byte0 + $byte1;
$l++;
}
$keyArray[$i * 2] = 0;
return $keyArray;
}
}
?>