最近用上了原作广树,由飞蚊话大佬修改的b站追番插件BiliBangumi,但是使用下来出现了一些问题。

Notice: Undefined index: pn in C:\xampp\htdocs\usr\plugins\BiliBangumi\Action.php on line 337
    
Notice: Undefined property: stdClass::$title in C:\xampp\htdocs\usr\plugins\BiliBangumi\Action.php on line 217

虽然追番列表的显示完全没有问题,进度也是完全正确,但是页面上明晃晃的两个不对劲的undefined还是令人不爽,跑去大佬的博客留了言,可能比较忙没有得到回复。那么,试着自己着手一下看能不能搞定这个问题吧~

文章较长,若只想查看解决方法,请点击

完整文件:https://github.com/DandyChan/Typecho_Plugin_BiliBangumi

为什么会出现undefined?

第一反应就是,会不会是接口返回的数据名称变了?于是打开Action.php,找到了对应的请求:

//获取追番json
    private function GetCollection($pn) {
        return BangumiAPI::curl_get_https(
                'https://api.bilibili.com/x/space/bangumi/follow/list?
type=1&follow_status=0&pn='.$pn.'&ps='.$this->blocks.'&vmid='.$this->userID);
    }

看得出,typefollow_status应该是固定参数。根据上下文,vmid就是b站的UID,pnps就不知道是啥了。干脆不要这两个参数只带UID上浏览器直接请求。

欸!自己的追番确实都能获得了,获得的数据里也出现了pnps这两个值。写进请求中测试了两次后发现原来如此:

"pn": 1, // 页码
"ps": 15, // 每页项数
"total": 17 // 共有追番

也就在此时在GitHub上发现了哔哩哔哩-API收集整理,详细说明了追番接口的各种参数的内容。

此处引用哔哩哔哩-API收集整理对该api的详细介绍。

查询用户追番(追剧)明细

http://api.bilibili.com/x/space/bangumi/follow/list

请求方式:GET

认证方式:Cookie(SESSDATA)

如设置隐私查看自己的需要认证

url参数:

参数名类型内容必要性备注
vmidnum目标用户UID必要
pnnum页码非必要默认为1
psnum每页项数非必要默认为15
typenum查询类型必要1:追番 2:追剧

这下,可以着手修改追番插件了!

裂开......仔细观察发现,之所以出现undefined,是因为有一部番剧工作细胞 第二季并未开始放送,所以数据里是这样的:

"new_ep": {
          "index_show": "即将开播"
}

而其他放送完或放送中的数据是这样的:

"new_ep": {
          "id": 23333,
          "index_show": "全1话",
          "cover":"http://xxx.jpg",
          "title": "全片",
          "pub_time": "2020-10-01 11:00:00",
          "duration": 233333333
}

也难怪titleundefined啊......

这下就简单了,加个判断就好了。

if (empty($value->new_ep->title)) {
        $lastep = $value->new_ep->index_show;
}else{
        $lastep = $value->new_ep->title;
}

刷新页面,title undefined的问题解决。接下来就是pn undefined了。

通过bilibangumi请求发现,并没有pn这个参数,添加参数后则该notice消失。于是从BiliBangumi_Action类入手:

 if($_GET['pn']=='')
      $pn = 1;
 else
      $pn = $_GET['pn'];

改为

if(empty($_GET['pn'])){ // 既然没有参数那就直接empty()
      $pn = 1;
}else{
      $pn = $_GET['pn'];
}

至此,pn undefined也已解决。主要就是两处的判断出现了问题。