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

首页 / 乱写 / 正文
TL;DR

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

首先访问这个 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);

这里选择第一种情况,其他情况比第一种情况更简单。

接着我们知道这个 API 可以获取到最近 13 天的番剧内容,由 API 返回的数据可以知道 dateresult 的一个内容,也就是说 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 的。

$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 美化一下就得到了一个好看的新番时间表。

无标签
评论区
头像

进行人机验证

    头像
    纸柠
    2020年09月01日 22:43
    回复

    ⣿⣿⣿⣿⣿⣿⢟⣡⣴⣶⣶⣦⣌⡛⠟⣋⣩⣬⣭⣭⡛⢿⣿⣿⣿⣿
    ⣿⣿⣿⣿⠋⢰⣿⣿⠿⣛⣛⣙⣛⠻⢆⢻⣿⠿⠿⠿⣿⡄⠻⣿⣿⣿ 
    ⣿⣿⣿⠃⢠⣿⣿⣶⣿⣿⡿⠿⢟⣛⣒⠐⠲⣶⡶⠿⠶⠶⠦⠄⠙⢿ 
    ⣿⠋⣠⠄⣿⣿⣿⠟⡛⢅⣠⡵⡐⠲⣶⣶⣥⡠⣤⣵⠆⠄⠰⣦⣤⡀ 
    ⠇⣰⣿⣼⣿⣿⣧⣤⡸⢿⣿⡀⠂⠁⣸⣿⣿⣿⣿⣇⠄⠈⢀⣿⣿⠿ 
    ⣰⣿⣿⣿⣿⣿⣿⣿⣷⣤⣈⣙⠶⢾⠭⢉⣁⣴⢯⣭⣵⣶⠾⠓⢀⣴
    ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣉⣤⣴⣾⣿⣿⣦⣄⣤⣤⣄⠄⢿⣿
    ⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠈⢿
    ⣿⣿⣿⣿⣿⣿⡟⣰⣞⣛⡒⢒⠤⠦⢬⣉⣉⣉⣉⣉⣉⣉⡥⠴⠂⢸
    ⠻⣿⣿⣿⣿⣏⠻⢌⣉⣉⣩⣉⡛⣛⠒⠶⠶⠶⠶⠶⠶⠶⠶⠂⣸⣿
    ⣥⣈⠙⡻⠿⠿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⠿⠛⢉⣠⣶⣶⣿⣿
    #(doge) 孤寡~

      头像
      Vinking
      2020年09月01日 22:45
      回复

      我去,绝了