最近Bilibiliでアニメを見ていて、暇つぶしに開発者ツールを開いたところ、近日更新のアニメを取得できるAPIを発見しました。Bilibiliの新番組タイムテーブルページを開くのが面倒くさい[DarkBText]怠け者すぎる[/DarkBText]ので、今後見やすくするために更新中のアニメを直接取得できるページを作りました。
まずこの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返却データからdateはresultの要素の1つなので、APIのresult部分は13個存在することになります。よってresult[]配列の長さを13としてforループで毎日のresult[]内容を取得します。
date('n')関数で現在の月を、date('j')で今日の日付を取得し$nowtimeに格納;$data[result][$d][date]でアニメの更新日を取得し$pub_timeに格納。そして日付の大小を判定します。
なぜdate('m')とdate('d')を使わないのかというと、$pub_timeが出力する1桁の月は0なしなので、date('n')が出力する1桁の月も0なしで形式が統一されるためです。date('j')については、$pub_timeの1桁の日付が0ありとなしか分からないので、ひとまず0なしとして扱います。
そして更新時刻が現在時刻以上の部分、つまり出力したいアニメリストを処理します。APIからseasons[]に欲しいデータが入っていることが分かるので、まずcount($data[result][$d][seasons])でresult[]内にいくつのseasonsがあるか取得;forループで各seasons[]データを取得し、重要なデータを抜き出せば、最終的に以下のプログラムが得られます。
あとはCSSで見た目を整えれば、見映えの良い新番組タイムテーブルの完成です。