搜狐视频解析源码
搜狐视频解析源码
$ids = Sohu::parse($url); if (GlobalBase::is_ipad()) { if($ids["drm"]){ echo json_encode(Sohu::get_vip_video_url($ids)); }else{ echo json_encode(Sohu::get_video_phone_playinfo($ids["vid"])); } }else{ if ($ids['drm']) { echo json_encode(Sohu::get_vip_video_url($ids)); } else { echo json_encode(Sohu::get_tv_data($ids)); } } class Sohu { public static function parse($url) { if (strstr($url,"film.sohu.com")==true) { $content = self::curl($url); preg_match('#data-vid="(.*?)"#',$content,$vid); $vid = $vid[1]; $drm = 1; } elseif (strstr($url,"tv.sohu.com")==true) { $content = self::curl($url); preg_match('#var vid="(.*?)"#',$content,$vids); preg_match('#var playlistId="(.*?)"#',$content,$plids); preg_match('#var videoIsFee = "(.*?)"#',$content,$videoIsFee); preg_match('#var nid = "(.*?)"#',$content,$nids); preg_match('#var tvid = "(.*?)"#',$content,$tvids); $vid = $vids[1]; $pid = $plids[1]; $nid = $nids[1]; $tvid = $tvids[1]; $drm = $videoIsFee[1];//是否付费 } $ids['vid'] = $vid; $ids['tvid'] = !empty($tvid)? $tvid :''; $ids['pid'] = !empty($pid)? $pid :''; $ids['drm'] = !empty($drm)? $drm :''; $ids['poster'] = !empty($poster)? $poster :''; $ids['aid'] = !empty($aid)? $aid :''; $ids['url'] = $url; //print_r($ids);exit; return $ids; } /** * [get_mkey 获取会员视频 mkey] * @param [type] $ids [description] * @return [type] [description] */ public static function get_mkey($ids) { $time = number_format(microtime(true),3,'',''); $vid = $ids["vid"]; $aid = empty($ids["pid"]) ? "123456" : $ids["pid"]; $api = "http://api.store.sohu.com/film/pc/checkpermission?aid={$aid}&vid={$vid}&[email protected]&scuser=1&t={$time}"; $content = self::curl($api,COOKIE_SOHU); $data = json_decode($content,true); if(isset($data["data"]["mkey"])){ return "&mkey=".$data["data"]["mkey"]; }else{ return ""; } } #=============================================================================================================================== #在链接的接口添加&ca=4&prod=h5&uid=15069517297961037536 此数据自己写 fuid:15069517297961037536 1704291352423486 #友情提示:UID参数需上报才能解决不限速播放 /** * [get_sub_video_url 获取分段视频地址,组建列表文件] * @param [type] $vid [description] * @return [type] [description] */ public static function get_sub_video_url($ids) { $vid = $ids["vid"]; $uid = "15332173217091069576"; $mkey = $ids["drm"] ? self::get_mkey($ids) : ""; $url = "http://hot.vrs.sohu.com/vrs_flash.action?vid={$vid}&uid={$uid}".$mkey; $content = self::curl($url); //print_r($content);exit; $body = json_decode($content,true); if($body['status']!=1){ $videoinfo['code'] = 404; $videoinfo['msg'] = $ids['titie'] .'视频正在加载···请稍后···'; $videoinfo['play'] = 'url'; $videoinfo["url"] = '../yun/?url='.$ids['url']; return $videoinfo;exit; } //=============================================================== $video_infos = array(); $videos = array(); $allot = $body['allot'];//视频 host 分服务器 $prot = $body['prot'];//视频分服务器端口 $data = $body['data']; $totalDuration = $data['totalDuration'];//视频文件总时间 $totalBytes = $data['totalBytes'];//视频文件总大小 /* $video_json["poster"] = $data['coverImg'];//封面图片 $preview = "http://".$_SERVER['HTTP_HOST']."/vip/preview.php?url=".$body['pvpic']['big']; $num = $totalDuration/1500; for ($i=0; $i <= $num; $i++) { $p_file[$i] = $preview."&id=".($i+1); } $video_json["preview"] = array("file"=>$p_file,"scale"=>15); //视频预览图 */ $eP = $data['eP']; if(!empty($eP)){ $_tmp['words'] = $_tmp['time'] = ''; foreach ($eP as $key => $value) { $_tmp['time'] .= (int)$value['k'].','; $_tmp['words'] .= $value['v'].','; } $_tmp['words'] = substr($_tmp['words'],0,strlen($_tmp['words'])-1); $_tmp['time'] = substr($_tmp['time'],0,strlen($_tmp['time'])-1); $videoinfo["data"]["prompt"] = $_tmp; } $video_json["poster"] = $data['coverImg'];//封面图片 $su = $data['su']; $ck = $data['ck']; $clipsURL = $data['clipsURL']; $clipsBytes = $data['clipsBytes']; $clipsDuration = $data['clipsDuration']; foreach ($clipsURL as $key => $value) { $url = $value;//$clipsURL[$key]; $url = str_replace("http://data.vod.itc.cn","",$url); $bytes = $clipsBytes[$key]; $duration = $clipsDuration[$key]; $s_su = $su[$key]; $vurl = "http://data.vod.itc.cn/?new={$s_su}&vid={$vid}&plat=17{$mkey}&user=api&uid={$uid}&prod=ad"; //$vur = "https://vipgdbgp.vod.tv.itc.cn/cdnList?new=/103/106/I93AhPtwJQnB9uZXUudHNL.mp4&vid=2600794&uid=15332173217091069576&tvid=1782158&ch=tv&sz=1519_500&md=D4RIFFtgDFWWBmm0lI4lfeaLFSBgehlOcymhng==140&prod=flash&pt=1&uuid=23ec3e46-0bd9-fdd6-d9ee-fff9d3f9ccbf"; $video["file"] = $vurl; //分段视频地址 $video["duration"] = $duration; //分段视频时间 $video["bytesTotal"] = $bytes; //分段视频文件大小 $videos[$key] = $video; } $video_info["video"] = $videos; $video_info["type"] = "mp4"; $video_info["weight"] = 10; $video_info["definition"] = "高清"; $video_infos[count($video_infos)] = $video_info; $videoinfo['code'] = 200; $videoinfo['data']["flashplayer"] = true; $videoinfo['data']["video"] = $video_infos; self::get_report_urls($uid);//向服务器上报 return $videoinfo; } /* 获取VIP视频 */ public static function get_vip_video_url($ids) { $uid = '1529490073633502'; // print_r($ids);exit; $video_infos = array(); $data = array(); $api = 'https://api.tv.sohu.com/v4/video/info/'.$ids['vid'].'.json?site=1&appid=tv&aid=123221&api_key=f351515304020cad28c92f70f002261c&plat=17&sver=1.0&partner=1&uid='.$uid.'&muid='.$uid.'&_c=1&pt=1&qd=680&src=11050001'; $_data = self::curl($api); $_tmp['data'] = json_decode($_data,true); if($_tmp['data']['status']!=200){ return ""; } $ids['poster'] = !empty($_tmp['data']['data']['hor_w16_pic']) ? $_tmp['data']['data']['hor_w16_pic'] : $_tmp['data']['data']['hor_w8_pic'];//封面图片 $ids['title'] = !empty($_tmp['data']['data']['video_name']) ? $_tmp['data']['data']['video_name'] : ''; if(!empty($_tmp['data']['data']['ep'])){ $_tmp['words'] = $_tmp['time'] = ''; foreach ($_tmp['data']['data']['ep'] as $key => $value) { $_tmp['time'] .= (int)$value['k'].','; $_tmp['words'] .= $value['v'].','; } $_tmp['words'] = substr($_tmp['words'],0,strlen($_tmp['words'])-1); $_tmp['time'] = substr($_tmp['time'],0,strlen($_tmp['time'])-1); $videoinfo["prompt"] = $_tmp; $videoinfo["prompt"]['data'] = null; } if ($_tmp['data']['data']['url_nor_mp4']) { $data['0']['type'] = 'sd'; $data['0']['bytes'] = explode(',',$_tmp['data']['data']['clips_bytes_nor']); $data['0']['duration'] = explode(',',$_tmp['data']['data']['clips_duration_nor']); $data['0']['mp4'] = explode(',',$_tmp['data']['data']['url_nor_mp4']); } if ($_tmp['data']['data']['url_high_mp4']) { $data['1']['type'] = 'hd'; $data['1']['bytes'] = explode(',',$_tmp['data']['data']['clips_bytes_high']); $data['1']['duration'] = explode(',',$_tmp['data']['data']['clips_duration_high']); $data['1']['mp4'] = explode(',',$_tmp['data']['data']['url_high_mp4']); } if ($_tmp['data']['data']['url_super_mp4']) { $data['2']['type'] = 'vhd'; $data['2']['bytes'] = explode(',',$_tmp['data']['data']['clips_bytes_super']); $data['2']['duration'] = explode(',',$_tmp['data']['data']['clips_duration_super']); $data['2']['mp4'] = explode(',',$_tmp['data']['data']['url_super_mp4']); } if ($_tmp['data']['data']['url_original_mp4']) { $data['3']['type'] = 'shd'; $data['3']['bytes'] = explode(',',$_tmp['data']['data']['clips_bytes_original']); $data['3']['duration'] = explode(',',$_tmp['data']['data']['clips_duration_original']); $data['3']['mp4'] = explode(',',$_tmp['data']['data']['url_original_mp4']); } $_tmp['duration'] = explode(',', $_tmp['data']['data']['clips_duration_super']); $_tmp['bytes'] = explode(',', $_tmp['data']['data']['clips_bytes_super']); $_tmp['video'] = explode(',', $_tmp['data']['data']['url_super_mp4']); foreach ($data as $key => $value) { // print_r($value);exit; switch ($value['type']) { case "sd": $type = "mp4";$def = "标清"; break; # 640 & 248 case "hd": $type = "mp4";$def = "高清"; break; #1024 & 430 case "shd": $type = "mp4";$def = "原画"; break; #1920 * 808 case "vhd": $type = "mp4";$def = "超清"; break; #1280 * 538 } foreach ($value['mp4'] as $k => $v) { $video["file"] = $value['mp4'][$k].'&uid='.$uid.'&qd=68001&src=11050001&ca=4&cateCode=101&_c=1&appid=tv&oth=&cd=&prod=h5'; //分段视频地址 $video["duration"] = $value['duration'][$k]; //分段视频时间 $video["bytesTotal"] = $value['bytes'][$k]; //分段视频文件大小 $videos[$k] = $video; } $video_info["video"] = $videos; $video_info["type"] = "mp4"; $video_info["weight"] = $value['type'] != 'hd' ? 0:10; $video_info["definition"] = $def; $video_infos[count($video_infos)] = $video_info; if (isset($_REQUEST['pangu']) && $_REQUEST['pangu'] == 'parse') { $videoinfo["flashplayer"] = true; $videoinfo["poster"] = $ids['poster']; $videoinfo["title"] = $ids['title']; $videoinfo["video"] = $video_infos; } else { $videoinfo['code'] = 200; $videoinfo["data"]["flashplayer"] = true; $videoinfo["data"]["poster"] = $ids['poster']; $videoinfo["title"] = $ids['title']; $videoinfo["data"]["video"] = $video_infos; } } $ids['i_url'] = !empty($_tmp['data']['data']['download_url']) ? $_tmp['data']['data']['download_url'].'&vid='.$ids['vid'].'&uid=1704291352423486&plat=17&SOHUSVP=YGJx1z7gDAHdUUPlK2mQOFbvUzK7xZdoqWcqoErv_08&pt=5&prod=h5&pg=1&eye=0&cv=1.0.0&qd=68000&src=11060001&ca=4&cateCode=101&_c=1&appid=tv' : ''; self::get_report_urls($uid);//向服务器上报 if (GlobalBase::is_ipad()) { $url = get_headers($ids["i_url"], TRUE); $i_pid["data"]["url"] = !empty($url['Location']) ? $url['Location'] : null; $i_pid["type"] = "sohu"; $i_pid["play"] = "html5"; $i_pid["code"] = 200; return $i_pid; }else{ return $videoinfo; } //print_r($_tmp['video']);exit; //http://data.vod.itc.cn/?k=tWaizEIOfJWHWJb4l2PA0LWRgTet8TdLbLElyTXXuTdWN4xHqM14r&a=XfGFjpCGqAOL4p3Cj6O3XUaAz95d4EOLsHJlsUIAoD2sWY6sWYbSqM9Auh2gqtkOzKA4R8etqSovNtcb0DWBWS9moeNUetCBW4c4TJoVqTPcWh1sfhAtfOesWZ&vid=2643421&uid=1704291352423486&plat=17&SOHUSVP=YGJx1z7gDAHdUUPlK2mQOFbvUzK7xZdoqWcqoErv_08&pt=5&prod=h5&pg=1&eye=0&cv=1.0.0&qd=68000&src=11060001&ca=4&cateCode=101&_c=1&appid=tv //http://data.vod.itc.cn/?k=tWaizEIXWJcOfJAHehAebDALTpksqBe3hS8NfGb4gK12bFXUyYk&a=XfGFjpCGqAOL4p3Cj6O3XUaAz95d4EOLsHJlsUIAoD2sWY6sWh1SqM9Auh2VbJbtDTKCg4wl0YAdbe6IZqp0aIm8684We9XfVwLgYWS0mEAZD6sfYvXfJNXWYO } public static function get_video_phone_playinfo($vid) { $uid = "1704291352423486"; $time = number_format(microtime(true),3,'',''); $api = "http://m.tv.sohu.com/phone_playinfo?vid={$vid}&site=1&appid=tv&api_key=f351515304020cad28c92f70f002261c&plat=17&sver=1.0&partner=1&uid={$uid}&muid=1508052529396230&_c=1&pt=5&qd=680&src=11060001&ssl=2&_={$time}"; /* https://m.tv.sohu.com/phone_playinfo?vid=4819265&site=1&appid=tv&api_key=f351515304020cad28c92f70f002261c&plat=17&sver=1.0&partner=1&uid=1805111229294297&muid=1529507168363105&_c=1&pt=3&qd=680&src=11060001&ssl=1&_=1529507168644 */ $content = self::curl($api); $content = mb_check_encoding($content,'gbk')?iconv('gbk','utf-8//IGNORE',$content):$content;//将字符串的编码从gbk转到UTF-8 $body = json_decode($content,true); //print_r(json_encode($body));exit; $data = $body['data']; $title = $data['video_name'];//视频标题 $urls = $data['urls'];//视频文件列表 $vurl = get_headers($urls["downloadUrl"][0][0], TRUE); $m3u8s = $urls["m3u8"]; $m3u8 = $m3u8s["sup"][0]; $videoinfo['code'] = 200; $videoinfo["data"]["url"] = $vurl['Location']; $videoinfo["play"] = "html5"; $videoinfo["type"] = 'sohu'; self::get_report_urls($uid);//向服务器上报 return $videoinfo; } public static function get_tv_data($ids) //搜狐TV 接口 { $uid = "02ffff10741010a17686c5e2232479fd2626b6b301207a"; $headers = array( 'model:oppo+R11', 'pgid:x010741502ff0e2b179d2343d0002a0dac44a58b7b6f', 'packageName: com.sohuott.tv.vod', 'version_sdk_int: 19', 'cpu: armeabi-v7a', 'partnerNo: 80151101', 'service_version: 2.5.1', 'ip: 172.17.99.15', 'productId: 11', 'fingerprint: vivo%2Fvivo+v3%2Fx86%3A4.4.2%2FLMY48Z%2F3.8.017.1102%3Auser%2Frelease-keys%2Fqcom%2FG750-T00', 'plat: 15', 'model_id: LMY48Z', 'manufacturer: oppe', 'api_key: 4eda5b5735fb430b2e8dfba6c003941b', 'company: snm', 'gid: 02ffff10741010a17686c5e2232479fd2626b6b301207a', 'pappid: 107415', 'ua: Mozilla/5.0 (Linux; Android 4.4.2; oppo R11 Build/LMY48Z) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36', 'brand: vivo', 'app_id: 22', 'android_system_version: 4.4.2', 'sver: 6.5.2' ); $api = 'http://api.ott.tv.snmsohu.aisee.tv/ott-api-v4/v4/video/videoInfo.json?partner=80151101&aid='.$ids['pid'].'&h265=0&dts=0&tvVerId='.$ids['vid']; //$api = 'http://api.ott.tv.snmsohu.aisee.tv/ott-api-v4/v4/album/videos.json?albumId=9434506&type=0&sortOrder=1&partner=80151101&page=1&pageSize=10'; $ids['ua'] = 'okhttp/3.4.1'; $ids['httpheader'] = $headers; $ids['ip'] = '172.17.99.15'; $data = self::curl($api,$ids); $data = json_decode($data,true); $videolist = $data['data']['playInfo']; $ids['poster'] = !empty($data['data']['videoExtendsPic_640_360']) ? $data['data']['videoExtendsPic_640_360'] : $data['data']['videoExtendsPic_320_180']; //print_r($data);exit; $count = 0; foreach ($videolist as $key => $value) { if ($value['versionId'] == 2 || $value['versionId'] == 31 ) { continue; } $video[0] = $value['vrUrl']; $video[1] = "video/m3u8"; $video[2] = $value['name']; $video[3] = $value['versionId'] == 21 ? 10: 0; $videoinfo1["video"][$count] = $video; $count++; } if (isset($_REQUEST['pangu']) && $_REQUEST['pangu'] == 'parse') { $videoinfo["flashplayer"] = true; $videoinfo["poster"] = $ids['poster']; $videoinfo["title"] = $ids['title']; $videoinfo["video"] = $videoinfo1["video"]; } else { $videoinfo['code'] = 200; $videoinfo["data"]["flashplayer"] = true; $videoinfo["data"]["poster"] = $ids['poster']; $videoinfo["title"] = $ids['title']; $videoinfo["data"]["video"] = $videoinfo1["video"]; } self::get_report_urls($uid);//向服务器上报 return $videoinfo; } public static function get_report_urls($uid){ $time = time(); //$report_urls = "http://mb.hd.sohu.com.cn/mc.gif?uid={$uid}&url=1002&value=&memo=%7B%22status%22%3A%220%22%7D&passport=&mtype=12<ype=0&cv=3.7.0&mos=3&mosv=10.0.15063.674&pro=1&mfo=To+Be+Filled+By+O.E.M.&mfov=To+Be+Filled+By+O.E.M.&webtype=wifi&vid=&time={$time}&type=&channelid=419&sim=0&playlistid=&catecode=&preid=&newuser=0&enterid=0&startid={$time}"; //file_get_contents($report_urls,false,stream_context_create(array('http'=>array('method'=>'GET','timeout'=>3)))); $report_urls = "https://z.m.tv.sohu.com/h5_cc.gif?t={$time}&uid={$uid}&position=ad_request_new&op=click&details=%7B%7D&nid=&url=http%3A%2F%2Ftv.sohu.com%2Fupload%2Fstatic%2Fshare%2Fshare_play.html%23_6457518_0_2_1&refer=&screen=1326x550&os=android&platform=android&passport=&vid=&pid=&channeled=1211010000&MTV_SRC=11050001"; file_get_contents($report_urls,false,stream_context_create(array('http'=>array('method'=>'GET','timeout'=>3)))); //$report_urls = "https://z.m.tv.sohu.com/pv.gif?url=https%253A%252F%252Fm.tv.sohu.com%252F20161027%252Fn471587159.shtml&refer=http%253A%252F%252Ftv.sohu.com%252F20161027%252Fn471587159.shtml&uid=1704291352423486&webtype=2g&screen=1326x550&catecode=101112%3B101124&pid=9174927&vid=3349737&tvid=85617187&site=1&os=android&platform=android&passport=957099461778374656%40sohu.com&t=1517025723446&channeled=1211010000&oth=&cd=&isplay=1&MTV_SRC=11060001&sd="; //$report_urls = "https://z.m.tv.sohu.com/h5_cc.gif?t=1517025729747&uid=1704291352423486&position=play_verify1&op=click&details=%7B%7D&nid=&url=https%253A%252F%252Fm.tv.sohu.com%252F20161027%252Fn471587159.shtml&refer=http%253A%252F%252Ftv.sohu.com%252F20161027%252Fn471587159.shtml&screen=1326x550&os=android&platform=android&passport=957099461778374656%40sohu.com&vid=3349737&pid=9174927&channeled=1211010000&MTV_SRC=11060001"; //$report_urls = "https://z.m.tv.sohu.com/h5_cc.gif?t=1517025798548&uid=1704291352423486&position=play_videopause&op=click&details=%7B%7D&nid=&url=https%253A%252F%252Fm.tv.sohu.com%252F20161027%252Fn471587159.shtml&refer=http%253A%252F%252Ftv.sohu.com%252F20161027%252Fn471587159.shtml&screen=1326x550&os=android&platform=android&passport=957099461778374656%40sohu.com&vid=3349737&pid=9174927&channeled=1211010000&MTV_SRC=11060001"; } public static function curl($url,$ids) { //$data = mb_check_encoding($data,'gbk')?iconv('gbk','utf-8//IGNORE',$data):$data;//将字符串的编码从gbk转到UTF-8 $params["ua"] = !empty($ids['ua']) ? $ids['ua'] : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"; $params["cookie"] = isset($ids['cookie']) ? $ids['cookie'] : COOKIE_SOHU ; if (isset($ids['httpheader'])) { $params["httpheader"] = $ids['httpheader']; } if (isset($ids['ip'])) { $params['ip'] = $ids['ip']; } return GlobalBase::curl($url,$params); } } ?>
Discussion
New Comments
暂无评论。 成为第一个!