效果

我的哔哩哔哩

更新

  • 20200501 添加了阴影效果,将cover图片的链接改成了文件地址,由php更新json时下载存储。

用法

我的环境是typecho博客程序+handsome主题,其他的没试过。

  1. 在blog根目录建立/code目录,php代码存储为/code/bilibili.php
  2. 修改里面的$UP为你关注的up主id,类似凉风Kaze的主页是https://space.bilibili.com/1411078014110780就是凉风Kaze的id,修改好之后访问一次https://你的域名/code/bilibili.php来更新up主头像,之后修改关注列表会自动更新。
  3. 在typecho新建独立页面,把独立页面代码拷贝进去,发布。
  4. 添加一个crontab定时任务,时间设置为*/30 9-22 * * *,内容是curl https://你的域名/code/bilibili.php?action=update,意思是从早上9点到晚上22点,每半小时运行一次,你也可以把30改成15,就变成15分钟运行一次。

如果你用的是cPanel的站点程序,找到管理面板中的Cron 作业就可以添加定时任务,如果你用的是vps我想不用我教你

微信截图_20200430041701.png

建议再加一条这样的定时任务,10 9 * * *命令:rm /home/web/code/static/cover*来定期清理下载的封面图片。

代码

独立页面代码

!!!
<style>
#iframe{
    width: 100%;
    min-height: 380px;
    height: auto;
}
#post-content{
background-color: #ddd;
}
.wrapper-lg {
    padding: 0px;
}
#bili{
min-height: 4500px;
overflow:hidden;
}
#bili .bili_div{
    position: relative;
    width: 395px;
    height: 170px;
    float: left;
    margin: 20px 0px 0px 5px;
}
#bili .bili_col{
    padding: 5px;
    margin-left: 15px;
    width: 365px;
    height: 100%;
    border-radius: 45px 10px 10px 10px;
    background-color: ghostwhite;
    box-shadow: -12px 12px 8px #919191;
}
#bili .bili_head{
background-size: 100% 100%;
position: absolute;
left: 0px;
top: 0px;
width: 50px;
height: 50px;
border-radius: 50%;
border: 1px solid #eee;
}
#bili .bili_main{
font-size: 12px;
    padding-left: 30px;
}
#bili .bili_name{
height:20px;
padding: 0px 0px 0px 0px;
}
#bili .bili_name a{
font-weight: bold;
color: #000;
}
#bili .bili_time{
line-height:20px;
float: right;
}
#bili .bili_title{
height: 24px;
overflow: hidden;
}
#bili .bili_title a{
text-decoration: none;
color: #f35;
}
#bili .bili_desc{
    margin-left: 6px;
    line-height: 20px;
    width: 159px;
    height: 95px;
    overflow: hidden;
    float: left;
    font-size: 10px;
}
#bili .bili_img{
background-repeat: no-repeat;
    float: left;
    height: 100px;
    width: 160px;
    border-radius: 6px;
}
#bili .bili_bot{
margin-top: 3px;
}
</style>
<script>
//配置存储图片的路径,需要与php文件中的路径同步修改
var STATIC = '/code/static/';
$.ajax({
    dataType: "json",
    url: '/code/bilibili.json',
    beforeSend:function(request) {
        request.setRequestHeader("Cache-control", "max-age: 1000");
    }
})
//获取json
.success(function(bili_obj){
document.getElementById('iframe').src='//player.bilibili.com/player.html?page=1&aid='+bili_obj.list[0].aid;
    bilibili_html(bili_obj);
});
function bilibili_html(obj){
$('#bili').html('');
$.each(obj.list,function(k,i){
    var creat_time = new Date(i.created * 1000).toLocaleString();
    $('#bili').append(
    '<div class="bili_div"><div class="bili_col">'
    +'<div class="bili_head" style="background-image:url(' + STATIC + 'head_' + i.upimg + '.jpg)"></div>'
    +'<div class="bili_main"><div class="bili_name">'
    +'<a href="http://space.bilibili.com/' + i.mid + '" target="_blank">' + i.author + '</a>'
    +'<span class="glyphicon glyphicon-play-circle" onclick="document.getElementById(\'iframe\').src=\'//player.bilibili.com/player.html?page=1&aid=' + i.aid + '\';"></span>'
    +'<span class="bili_time">' + creat_time + '</span></div>'
    +'<div class="bili_title">'
    +'<a title="'+i.title+'" href="http://www.bilibili.com/video/av' + i.aid + '/" target="_blank">' + i.title + '</a></div>'
    +'<div class="bili_bot">'
    +'<div class="bili_img" style="background-image:url(' + STATIC + 'cover_av' + i.aid+ '.jpg)"></div>'
    +'<div class="bili_desc">' + i.desc + '</div></div></div></div></div>'
    );
});
}
</script>
<iframe id="iframe" src="" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
<div id="bili"></div>
!!!

php文件代码

<?php
/*
up主主页
老版本接口
http://space.bilibili.com/ajax/member/getSubmitVideos?order=pubdate&pagesize=10&mid=223146252
新版本接口 ps 页内数量
https://api.bilibili.com/x/space/arc/search?mid=223146252&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp
*/

date_default_timezone_set('Asia/Shanghai');
//页面展示视频数量
define('SHOW_COUNT', 50);
//json文件名,需要跟独立页面中的代码同步
define('JSON_FILE', './bilibili.json');
//图片存放目录,需要跟独立页面中的图片路径同步
define('STATIC_DIR', './static');

//bilibili关注id
$UP = [
//=====资讯=====
//央视新闻
456664753,
//秀才侃娱乐
41288240,
//观察者网
//10330740,

//=====游戏=====
//天天卡牌->逗鱼时刻
[
    //在当前up主的视频中搜索,范围限制在title和介绍
    'keyword'=>'逗鱼时刻',
    'mid'=>10462362,
],
//罗汉解说
51896064,
//哔哩哔哩英雄联盟赛事
50329118,
//靠谱电竞->靠谱盘点
[
    'keyword'=>'靠谱盘点',
    'mid'=>279991456,
],
//CD_PROJEKT_RED
271442527,

//=====杨超越=====
//午夜出动
353407160,
//杨超越视频站
107961740,
//杨超越盖世无敌可爱
4981142,

//=====科普学习=====
//李永乐老师
9458053,
//妈咪说
223146252,
//张召忠
33683045,
//芳斯塔芙
72270557,
//zettaranc
326246517,
//表象的本质
363584502,
//奇闻观察室
454719565,
//罗翔说刑法
517327498,
//硬核的半佛仙人
37663924,
//毕导THU
254463269,

//=====美食=====
//徐大sao
390461123,
//厨师长农国栋
415479453,
//美食作家王刚
290526283,
//华农兄弟
250858633,
//吃货请闭眼
94114029,
//品诺美食开课啦
352637817,

//=====数码=====
//科技美学-大家测
346098914,
//科技美学
3766866,
//钟文泽
25910292,
//远古时代装机猿
35359510,
//极客湾Geekerwan
25876945,

//=====VLOG生活=====
//翔翔大作战
196356191,
//麻雀喳喳野行记
120122306,
//郭杰瑞
176037767,
//机智的党妹
466272,

//=====音乐=====
//bibipiano
419743655,
//郎朗piano
479893558,

//=====搞笑=====
//手工耿
280793434,
//凉风
14110780,
//朱一旦
437316738,
//陈翔六点半
19286458,

//=====影视解说=====
//木鱼水心
927587,
//电影最TOP
17819768,
];

//更新up主头像,每次添加up主后访问bilibili.php更新头像
function updateImg(){
    global $UP;
    //删除static下所有图片
    if (!file_exists(STATIC_DIR)) {
        mkdir(STATIC_DIR);
    }else{
        exec("rm ".STATIC_DIR."/head_*");
    }
    $url = 'https://api.bilibili.com/x/space/acc/info?mid=';
    foreach($UP as $item){
        if(is_numeric($item)){
            //数字配置
            $mid = $item;
        }else if(is_array($item) && isset($item['mid'])){
            //数组配置
            $mid = $item['mid'];
        }else if(is_array($item) && empty($item['mid'])){
            //搜索型配置,指定upId作为头像
            $mid = $item['upimg_id'];
        }
        $url = 'https://api.bilibili.com/x/space/acc/info?mid=' . $mid;
        $jsonObj = json_decode(file_get_contents($url));
        //使用参数设置头像为64*64
        $imgUrl = $jsonObj->data->face . '@64w_64h.webp';
        $path = STATIC_DIR . '/head_'.$mid.'.jpg';
        file_put_contents($path, file_get_contents($imgUrl));
    }
    return true;
}
//定期更新json信息,并更新cover图片
function updateJson(){
    global $UP;
    $upListMd5 = md5(json_encode($UP));
    //判断是否需要更新up头像
    if (file_exists(JSON_FILE)){
        $earlyJson = json_decode(file_get_contents(JSON_FILE),1);
        if (empty($earlyJson['upListMd5']) || (isset($earlyJson['upListMd5']) && $earlyJson['upListMd5'] != $upListMd5)) {
            updateImg();
        }
    }else{
        updateImg();
    }
    //parse配置信息
    $ret = [];
    foreach($UP as $item){
        if(is_numeric($item)){
            $ret = array_merge($ret, up_list(['mid'=>$item]));
        }else if(is_array($item) && isset($item['mid'])){
            $ret = array_merge($ret, up_list($item));
        }else if(is_array($item) && empty($item['mid'])){
            continue;
            //停用非定向搜索
            //$ret = array_merge($ret, search_list($item));
        }
    }
    $retSort = [];
    foreach($ret as $key=>&$item){
        $retSort[$item['created']] = $item;
    }
    krsort($retSort);
    $retSort = array_slice($retSort, 0, SHOW_COUNT);
    
    //判断对应cover图片是否已下载
    foreach ($retSort as $item) {
        $coverImgPath = STATIC_DIR . '/cover_av' . $item['aid'] . '.jpg';
        if (!file_exists($coverImgPath)) {
            file_put_contents($coverImgPath, file_get_contents('https:' . $item['pic'] . '@160w_100h_100Q_1c.webp'));
        }
    }
    
    $ret = json_encode(
        array(
            'up_count' => count($UP),
            'up_list_md5' => $upListMd5,
            'last_time_str' => date('Y-m-d H:i:s'),
            'last_time' => time(),
            'list' => $retSort
    ));
    file_put_contents(JSON_FILE, $ret);
    //echo 'done.';
    return $ret;
}
//暂时不可用
//根据关键字检索视频信息
function search_list($conf){
    //https://api.bilibili.com/x/web-interface/search/type?context=&page=1&order=pubdate&tids_2=&__refresh__=true&search_type=video&tids=0&highlight=1&single_column=0&keyword=%E6%9D%A8%E8%B6%85%E8%B6%8A&duration=2
    $param = [
        'context'=>'',
        'page'=>'1',
        'order'=>'pubdate',
        'tids_2'=>'',
        '__refresh__'=>'true',
        'search_type'=>'video',
        'tids'=>'0',
        'highlight'=>'1',
        'single_column'=>'0',
        'keyword'=>isset($conf['keyword'])?urlencode($conf['keyword']):'', 
        'duration'=>isset($conf['duration'])?$conf['duration']:'0', 
        ];
    $url = 'https://api.bilibili.com/x/web-interface/search/type?';
    foreach($param as $key=>$item2){
        $url .= $key . '=' . $item2 . '&';
    }
    //echo $url;exit;
    $ret = [];
    $arr = json_decode(curl_get($url,['REFERER'=>'https://search.bilibili.com/']));
    foreach($arr->data->result as $item){
        //$item->created = $item->pubdate;
        $ret[$item->pubdate] = json_format($item);
    }
    return $ret;
}
//根据up主id检索视频信息
function up_list($conf){
    $param = [
        'tid'=>'0',
        //最多显示5个
        'ps'=>'5',
        //第一页
        'pn'=>'1',
        //在当前up的投稿中搜索
        'keyword'=>isset($conf['keyword'])?urlencode($conf['keyword']):'', 
        //按照时间排序
        'order'=>'pubdate',
        //up主id
        'mid'=>$conf['mid'],
        ];
    $url = 'https://api.bilibili.com/x/space/arc/search?';
    foreach($param as $key=>$item2){
        $url .= $key . '=' . $item2 . '&';
    }
    $ret = [];
    $arr = json_decode(file_get_contents($url));
    foreach($arr->data->list->vlist as $item){
        $ret[$item->created] = json_format($item);
        $ret[$item->created]['upimg'] = $conf['mid'];
    }
    return $ret;
}
function json_format($json){
    return [
        'bvid'=>$json->bvid,
        'aid'=>$json->aid,
        'pic'=>$json->pic,
        'desc'=>$json->description,
        'title'=>$json->title,
        'author'=>$json->author,
        'mid'=>$json->mid,
        ///up页面时间为length search页面时间为duration
        'length'=>isset($json->length)?$json->length:$json->duration,
        //up页面时间为created search页面时间为pubdate
        'created'=>isset($json->created)?$json->created:$json->pubdate,
        //多人合作视频,mid对应的头像可能未存储
        'upimg'=>isset($json->upimg)?$json->upimg:$json->mid,
    ];
}
function curl_get($url, $conf=[]){
    //初始化
    $ch = curl_init();
    //设置选项,包括URL
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    if(!empty($conf['REFERER'])){
        curl_setopt($ch, CURLOPT_REFERER, $conf['REFERER']);
    }
    //执行并获取HTML文档内容
    $output = curl_exec($ch);
    // file_put_contents('./log.txt',$output);
    //释放curl句柄
    curl_close($ch);
    //打印获得的数据
    return $output;
}

if(isset($_GET['action']) && $_GET['action']=='update'){
    //更新json 并展示
    echo updateJson();
}else{
    //如果直接访问则清空所有up主头像并更新
    updateImg();
    echo "update head images finish.";
}
最后修改:2020 年 05 月 10 日 12 : 56 AM