转换为语音并朗读全文 00:00 / 00:00

201403287011823

配合 为wordpress添加一个带缓存功能的视频页 一起使用。

使用前,记得去 http://www.bilibili.tv/account/getapi 申请B站的AppKey,替换掉代码中的M_APPSECRET和M_APPKEY的值,不然无法取得B站视频数据。

麦葱已经对代码加上了注释,各位博友可以根据需要进行修改。

将下面代码另存为mcvapi.php,放在网站根目录,然后通过 http://你的域名/mcvapi.php?url=xxx 取得api数据。

<?php
/*
@name: 视频缓存版api
@author: 麦田一根葱(MaiCong.me)
@update: 2014年3月28日
*/

// 禁用错误报告
error_reporting(0);

//数据缓存路径
define("M_CPATH", "videocache/");

// 数据缓存文件类型
define("M_CMIME", ".json");

// 数据缓存时效(秒)
define("M_CTIME", 1800);

//申请AppKey:http://www.bilibili.tv/account/getapi
define("M_APPSECRET", "abcdefghijklmnopqrstuvwxyz"); /* App-Secret */
define("M_APPKEY", "zyxwvutsrqponm");/* App-Key */

// 创建文件夹并赋权限
if(!is_dir(M_CPATH)) {
mkdir(M_CPATH, 0755) ;
}

// bilibili sign
function get_sign($params, $key) {
$_data = array();
ksort($params);
reset($params);
foreach ($params as $k => $v) {
$_data[] = $k . '=' . rawurlencode($v);
}
$_sign = implode('&', $_data);
return array('sign' => strtolower(md5($_sign . $key)),'params' => $_sign);
}

// 数据缓存
function mcv_save($type, $url, $array) {
$path = M_CPATH."{$type}_{$url}".M_CMIME;
$save = fopen($path,"w");
fwrite($save,serialize($array));
fclose($save);
}

//处理网址
$url = isset($_GET['url']) ? $_GET['url'] : null;
$temp = explode('/', htmlspecialchars($url));
$host = $temp[2];

//允许的网址(目前只支持这两个视频网站)
$urlarr = array("v.youku.com","www.bilibili.tv","bilibili.kankanews.com");

//错误提示信息
$error1 = array ('status'=>'-1','msg'=>'请带上视频地址','help'=>'http://www.yuxiaoxi.com/2014-03-07-wordpress-maicong-video.html#status-1');
$error2 = array ('status'=>'-2','msg'=>'无法解析该视频地址','help'=>'http://www.yuxiaoxi.com/2014-03-07-wordpress-maicong-video.html#status-2');
$error3 = array ('status'=>'-3','msg'=>'视频地址参数不正确','help'=>'http://www.yuxiaoxi.com/2014-03-07-wordpress-maicong-video.html#status-3');
$error4 = array ('status'=>'-4','msg'=>'该视频不存在或者已被删除','help'=>'http://www.yuxiaoxi.com/2014-03-07-wordpress-maicong-video.html#status-4');

//保存记录 {时间@来路@视频地址}
if(isset($_SERVER['HTTP_REFERER'])){
$referer = htmlspecialchars($_SERVER['HTTP_REFERER']);
$time = date("Y-m-d H:i:s", time());
$rcont = "{$time}@{$referer}@$url\r\n";
$rpath = M_CPATH."_usereferer".M_CMIME;
$rsave = fopen($rpath,"a");
fwrite($rsave,$rcont);
fclose($rsave);
}

//处理数据
if($url == null){
$videos = $error1;
}else{
$saveurl = md5($url); /* url md5加密 */
if($host == $urlarr[0]){
$find = preg_match("#http://v\.youku\.com/v_show/id_(?<id>[a-z0-9_=\-]+)#i", $url, $match);
if($find) {
$filelist = file_get_contents("http://v.youku.com/player/getPlayList/VideoIDS/".$match['id']);
$result = json_decode($filelist,true);
$json = $result['data'][0];
if(!empty($json)){
$hour = floor( $json["seconds"]/3600 );
$hour = $hour > 0 ? "{$hour}:" : "";
$time = $hour . gmstrftime('%M:%S', $json["seconds"]);
$offsite = "http://youkuvideos.cdn.duapp.com/loader.swf?VideoIDS=".$match['id'];
$oriurl = "http://player.youku.com/embed/".$match['id'];
$fileinfo = file_get_contents("http://v.youku.com/QVideo/~ajax/getVideoPlayInfo?id=".$json['videoid']."&sid=".$json['show']['showid']."&type=vv");
$info = json_decode($fileinfo, true);
$play = $info['vv'];
$ykvideo = array ('status'=>'1','type'=>'youku','play'=>$play,'title'=>$json['title'],'pic'=>$json['logo'],'time'=>$time,'offsite'=>$offsite,'onsite'=>$url,'oriurl'=>$oriurl); /* 未缓存数据 */
$path = M_CPATH."youku_{$saveurl}".M_CMIME;
if(!file_exists($path)) {
mcv_save("youku", $saveurl, $ykvideo);
$videos = $ykvideo;
}else{
$now=time();
$mtime = filemtime($path);
if($now - $mtime > M_CTIME){
mcv_save("youku", $saveurl, $ykvideo);
$videos = $ykvideo;
}else{
$opt = unserialize(file_get_contents($path));
$videos = array ('status'=>'1','type'=>'youku','play'=>$opt['play'],'title'=>$opt['title'],'pic'=>$opt['pic'],'time'=>$opt['time'],'offsite'=>$opt['offsite'],'onsite'=>$opt['onsite'],'oriurl'=>$opt['oriurl']); /* 已缓存数据 */
}
}
}else{
$videos = $error4;
}
}else{
$videos = $error3;
}
}elseif($host == $urlarr[1] || $host == $urlarr[2]){
$find = preg_match("#http://(www\.bilibili\.tv|bilibili\.kankanews\.com)/video/av(?<av>\d+)#i", $url, $match);
if($find) {
$params = array("type"=>"json","appkey"=>M_APPKEY,"id"=>$match['av']);
$sign = get_sign($params,M_APPSECRET);
$filelist = file_get_contents("http://api.bilibili.tv/view?".$sign['params']."&sign=".$sign['sign']);
$json = json_decode($filelist,true);
if($json['cid']){
$fileint = file_get_contents("http://interface.bilibili.cn/player?id=cid:".$json['cid']."&aid=".$match['av']);
preg_match_all('/<([a-z]+)>(.*?)<(\/[a-z]+)>/', $fileint, $int, PREG_SET_ORDER);
$blvideo = array ('status'=>'1','type'=>'bilibili','play'=>$int[11][2],'title'=>$json['title'],'pic'=>$json['pic'],'time'=>$int[15][2],'offsite'=>$json['offsite'],'onsite'=>$url,'oriurl'=>$int[7][2]); /* 未缓存数据 */
$path = M_CPATH."bilibili_{$saveurl}".M_CMIME;
if(!file_exists($path)) {
mcv_save("bilibili", $saveurl, $blvideo);
$videos = $blvideo;
}else{
$now=time();
$mtime = filemtime($path);
if($now - $mtime > M_CTIME){
mcv_save("bilibili", $saveurl, $blvideo);
$videos = $blvideo;
}else{
$opt = unserialize(file_get_contents($path));
$videos = array ('status'=>'1','type'=>'bilibili','play'=>$opt['play'],'title'=>$opt['title'],'pic'=>$opt['pic'],'time'=>$opt['time'],'offsite'=>$opt['offsite'],'onsite'=>$opt['onsite'],'oriurl'=>$opt['oriurl']); /* 已缓存数据 */
}
}
}else{
$videos = $error4;
}
}else{
$videos = $error3;
}
}else{
$videos = $error2;
}
}

//以json格式输出
header('Content-type:text/json');
echo json_encode($videos);

?>

无论你是否空降,感谢您耐心看到这里,如果你不会另存为或者嫌麻烦,可以直接下载压缩包,解压后将上传里面的mcvapi.php到服务器就行了。

感谢您的支持与信赖。如果可以的话,欢迎点击右侧的小广告,麦葱再次万分感谢!

如果你觉得文章不错,可以给点小小奖励~

微信

微信

支付宝

支付宝

带符号 * 的表示必填项
  1. 未知
    未知

    $urlarr = array("v.youku.com","www.bilibili.tv","bilibili.kankanews.com");
    是什么意思,他们的新浪或者腾讯视频的资源不能获取吗

    回复
  2. A
    A

    bilibili用.com的域名了 如何能添加上..直接使用.com的域名会出现-2的状态=.=

    回复
  3. 衣香丽影
    衣香丽影

    这个太高级了。真的难以置信啊,大神!

    回复
  4. Gimhoy
    Gimhoy

    发现新域名。。

    回复
  5. 孤峰
    孤峰

    实在是高··难度

    回复
  6. 枫叶红秋雨
    枫叶红秋雨

    收藏

    :grin: :grin: 好羞射,文章真的好赞啊,顶博主!
    回复
  7. 烂番茄
    烂番茄

    额滴神啊。这个太高级了、右边拦截是怎么实现的哈- -

    回复
  8. A
    A
    签到成功!签到时间:02:22:18每日打卡,生活更精彩哦~
    回复