文章24
标签14
分类5

手把手教你获取 B 站的新番时间表

最近在 B 站看番的时候,闲着无聊打开控制台发现了一个可以获取到最近更新番剧的 API : https://bangumi.bilibili.com/web_api/timeline_global 。因为觉得点进 B 站的新番时间表实在是太麻烦了太懒了,就做了一个可以直接获取最近更新番剧的页面方便以后看。

首先访问 https://bangumi.bilibili.com/web_api/timeline_global 这个 API ,可以看到返回了一大堆的东西

把返回的东西放到 JSON 解析器里面解析一下,就可以很清楚的看到返回的内容了 ↓ ,知道这些信息之后就可以开始用 PHP 写了。

{
"code": 0,
"message": "success",
"result": [{
	"date": "8-14",//更新日期
	"date_ts": 1597334400,
	"day_of_week": 5,//更新是星期几,例如这里是星期五
	"is_today": 0,//是不是今天更新;0-不是今天更新,1-是今天更新
	"seasons": [{
		"cover": "http://i0.hdslb.com/bfs/bangumi/image/7bbe825a8d65056b0918
		724f3f376e2d3f3c0b15.png",//番剧图片
		"delay": 0,
		"ep_id": 334752,
		"favorites": 217346,
		"follow": 0,
		"is_published": 1,
		"pub_index": "第5话",//更新的是第几话
		"pub_time": "01:05",
		"pub_ts": 1597338300,
		"season_id": 33083,
		"season_status": 2,
		"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/aed4f3d2885434b9610
		da34a311203cd30fb2a2d.jpg",
		"title": "富豪刑警 Balance:UNLIMITED(僅限港澳台地區)",//番剧名字
		"url": "https://www.bilibili.com/bangumi/play/ss33083"//番剧 URL
	}, 
.....

首先用 file_get_contents( ) 函数将这个 API 里面的数据都读入 $get 中,然后用 json_decode( ) 函数将 $get 里 JSON 格式的字符串进行编码,把结果存入 $data 中。

$get = file_get_contents("https://bangumi.bilibili.com/web_api/timeline_global");
$data = json_decode($get, true);

然后这里有三个选择
- 如果想得到的番剧列表是今天以及以后的番剧,需要获取今天的日期再用 if 函数来跟番剧更新时间判断,来确定需要输出的番剧。
- 如果想得到的番剧列表是还没有到更新时间的番剧,可以 用 API 里面的 is_published 项来判断,如果 "is_published": 1 就说明已经播出了,"is_published": 0 则是我们想得到的还没有到更新时间的番剧。
- 如果想得到的番剧列表是全部 13 天的番剧,就不需要任何判断直接输出即可。
这里选择第一种情况,其他情况比第一种情况更简单。

接着我们知道这个 API 可以获取到最近 13 天的番剧内容,由 API 返回的数据可以知道 date 是 result 的一个内容,也就是说 API 的 result 部分会有 13 个,所以可以规定 result[ ] 这个的数组的长度为 13,用 for 循环来获取每一天的 result[ ] 内容。

用 date('n') 函数来获得当前的月份 date('j') 来获得现在是几号存入 $nowtime 里;用 $data[result][$d][date] 来获得番剧的更新日期并存入 $pub_time 里。再判断日期的大小。

为什么不用 date('m') 跟 date('d') 呢?是因为 $pub_time 输出的不足两位的月份是不带 0 的,用 date('n') 输出的不足两位的月份也是不带 0 的,两者格式统一,至于 date('j')的话,因为不清楚 $pub_time 不足两位的日期输出带不带 0 ,所以就暂且认为是不带 0 的。

<?php
$get = file_get_contents("https://bangumi.bilibili.com/web_api/timeline_global");
$data = json_decode($get, true);
for ($d = 0;$d <= 13;$d ++){
$nowtime = date('n').'-'.date('j');//获取当前日期
$pub_time = $data[result][$d][date];//获取番剧更新日期
if ($pub_time < $nowtime) {//若更新时间小于当前时间时
   echo "";
}
elseif ($pub_time >= $nowtime) {//若更新时间大于当前时间时
   ....
}}
?>

然后我们需要处理更新时间大于或等于当前时间的部分,也就是我们想要输出的番剧列表。再次由 API 得,seasons[ ]里面是我们想要得到的的数据,我们首先用 count($data[result][$d][seasons]) 来获取 result[ ] 里面有多少个 seasons ;并且用 for 循环来获取每一个 seasons[ ] 的数据,再获取一些重要的数据,就可以得到总的程序:

<?php
$get = file_get_contents("https://bangumi.bilibili.com/web_api/timeline_global");
$data = json_decode($get, true);
for ($d = 0;$d <= 13;$d ++){
$nowtime = date('n').'-'.date('j');//获取当前日期
$pub_time = $data[result][$d][date];//获取番剧更新日期
if ($pub_time < $nowtime) {//若更新时间小于当前时间时
   echo "";
}
elseif ($pub_time >= $nowtime) {//若更新时间大于当前时间时
   for ($i = 0;$i < count($data[result][$d][seasons]);$i ++){
?>
<div class="box">
  <a href="<?php echo $data[result][$d][seasons][$i][url]?>" target="_blank">
    <img src="<?php echo $data[result][$d][seasons][$i][cover]?>">
  </a>
     <a href="<?php echo $data[result][$d][seasons][$i][url]?>" target="_blank"><?php echo $data[result][$d][seasons][$i][title];?></a>
     <p class="date"><?php echo '于 '.$data[result][$d][date].' 更新'?></p>
     <p class="pub_index"><?php echo $data[result][$d][seasons][$i][pub_index]?></p><br><hr>
</div>
<?php }}}?>

再用 CSS 美化一下就得到了一个好看的新番时间表。

    

    已经有 2 个评论啦

    评论已关闭

    1. 纸柠   Windows 10 x64 Edition Microsoft Edge 18.19041 9月1日 回复
      ⣿⣿⣿⣿⣿⣿⢟⣡⣴⣶⣶⣦⣌⡛⠟⣋⣩⣬⣭⣭⡛⢿⣿⣿⣿⣿
      ⣿⣿⣿⣿⠋⢰⣿⣿⠿⣛⣛⣙⣛⠻⢆⢻⣿⠿⠿⠿⣿⡄⠻⣿⣿⣿ 
      ⣿⣿⣿⠃⢠⣿⣿⣶⣿⣿⡿⠿⢟⣛⣒⠐⠲⣶⡶⠿⠶⠶⠦⠄⠙⢿ 
      ⣿⠋⣠⠄⣿⣿⣿⠟⡛⢅⣠⡵⡐⠲⣶⣶⣥⡠⣤⣵⠆⠄⠰⣦⣤⡀ 
      ⠇⣰⣿⣼⣿⣿⣧⣤⡸⢿⣿⡀⠂⠁⣸⣿⣿⣿⣿⣇⠄⠈⢀⣿⣿⠿ 
      ⣰⣿⣿⣿⣿⣿⣿⣿⣷⣤⣈⣙⠶⢾⠭⢉⣁⣴⢯⣭⣵⣶⠾⠓⢀⣴
      ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣉⣤⣴⣾⣿⣿⣦⣄⣤⣤⣄⠄⢿⣿
      ⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠈⢿
      ⣿⣿⣿⣿⣿⣿⡟⣰⣞⣛⡒⢒⠤⠦⢬⣉⣉⣉⣉⣉⣉⣉⡥⠴⠂⢸
      ⠻⣿⣿⣿⣿⣏⠻⢌⣉⣉⣩⣉⡛⣛⠒⠶⠶⠶⠶⠶⠶⠶⠶⠂⣸⣿
      ⣥⣈⠙⡻⠿⠿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⠿⠛⢉⣠⣶⣶⣿⣿
      f17.png 孤寡~
      1. Vinking 终身VIP   Windows 10 x64 Edition Google Chrome 83.0.4103.116 9月1日 回复
        回复 纸柠: 我去,绝了