ページ分割対応作品簡易一覧(PHP)はなろう小説APIを利用して作品のタイトル、作者名、Nコード、作品種別(エピソード数)、文字数、あらすじ、URLを表示するシンプルなPHPスクリプトです。
ソースコード(PHP5.6以降で動作)
<?php
// なろう小説APIサンプルプログラム「ページ分割対応作品簡易一覧(PHP)」
// APIのオプションパラメータを連想配列で指定
$params["out"] = "json";
$params["word"] = "女主人公";
$params["gzip"] = 5;
$params["order"] = "generalfirstup";
// 1ページあたりの表示件数
$lim = 20;
// ページ番号を取得
$p = intval($_GET["p"]);
// もしページ番号が1未満なら1を代入
if($p < 1){
$p = 1;
}
// 位置を決定
$st = ($p - 1) * $lim;
// stは0はじまりではなく1始まりなので1を加算
$st++;
// APIのオプションパラメータにstを追加
$params["st"] = $st;
// APIのオプションパラメータにlimを追加
$params["lim"] = $lim;
// APIのエンドポイント(URL)を指定
$url = "https://api.syosetu.com/novelapi/api/?" . http_build_query($params, null, "&");
// ユーザエージェントが設定されていないクライアントからのアクセスは403エラーを返す
// そのため、未設定の場合はPHPを名乗る
if(empty(ini_get("user_agent"))){
$options["http"]["header"][] = "User-Agent: PHP";
$context = stream_context_create($options);
}else{
$context = null;
}
// APIを利用してデータを取得
$file = file_get_contents($url, false, $context);
// 取得した圧縮データを解凍
$file = gzdecode($file);
// JSON形式のデータをデコード
$listarray = json_decode($file, true);
echo "全抽出作品数:" . number_format($listarray[0]["allcount"]) . "<br />" . PHP_EOL;
echo "ページ番号:" . $p . "<br />" . PHP_EOL;
echo "▼抽出した作品の一覧<br /><br /><br />" . PHP_EOL;
// 全抽出作品数を別の変数に退避し、不要になった要素0を破棄
$allcount = $listarray[0]["allcount"];
unset($listarray[0]);
// 作品毎に表示
foreach($listarray as $key => $value){
// タイトルを表示
echo "<b>" . $value["title"] . "</b><br />" . PHP_EOL;
// 作者を表示
echo "作:" . $value["writer"] . " Nコード:" . $value["ncode"] . "<br />" . PHP_EOL;
// 作品種別と連載の場合は全掲載エピソード数を表示
if($value["novel_type"] == 2){
echo "短編<br />" . PHP_EOL;
}else{
// novel_typeが2以外,つまり1なら連載
if($value["end"] == 1){
echo "連載中(全" . $value["general_all_no"] . "エピソード)<br />" . PHP_EOL;
}else{
echo "完結済(全" . $value["general_all_no"] . "エピソード)<br />" . PHP_EOL;
}
}
// 文字数を表示
echo "文字数:" . $value["length"] . "文字<br /><br />" . PHP_EOL;
// あらすじを表示
echo nl2br($value["story"]) . "<br />" . PHP_EOL;
// 作品のURLを指定
$novelurl = "https://ncode.syosetu.com/" . strtolower($value["ncode"]) . "/";
// 作品のリンクを表示
echo "<a href=\"" . $novelurl . "\">" . $novelurl . "</a>" . PHP_EOL;
echo "<hr />" . PHP_EOL;
}
// 2ページ目以降を表示中の場合は前のページへのリンクを表示
if($p >= 2){
echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?p=" . ($p - 1) . "\">前のページ</a>" . PHP_EOL;
}
echo "<br />" . PHP_EOL;
// 次のページで表示する作品があれば次のページへのリンクを表示
if(($p * $lim) < $allcount){
echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?p=" . ($p + 1) . "\">次のページ</a>" . PHP_EOL;
}
?>
説明
タイトル、あらすじ、キーワード、作者名に「女主人公」が入っている作品を一覧表示するプログラムです。
20作品ずつでページ分割しており、初回掲載順でソートしています。
APIのURLを編集することで、思い通りの作品一覧を作ることができます。
1ページあたりの最大出力数、limは20になっています。lim=50にすると1ページ50件ずつ出力します。
wordを修正する場合はUTF-8でURLエンコードしてください。
詳しくはなろう小説APIの仕様をご覧ください。
改変は営利・非営利問わず自由です。自由にご利用ください。
動作環境注意
- 利用するPHP及びサンプルプログラムは内部文字エンコーディングがUTF-8である前提で記述されています。
正常な結果が得られない場合はPHPの設定をご確認ください。 - file_get_contents関数の引数にURLを渡しています。
php.iniの設定でallow_url_fopenが有効になっていることをご確認ください。
一部レンタルサーバなどではセキュリティ上の理由により無効になっている場合があります。 - gzip圧縮された文字列をデコードするためにgzdecode関数を使用しています。
PHPでzlib拡張モジュールが利用できることをご確認ください。
API取得の仕組み
APIのオプションパラメータで出力形式outをjson形式に指定しています。
また、gzipに5を指定しgzip圧縮ファイルとして受け取ることで、転送量を削減しています。
基本的な流れは下記のとおりです。
file_get_contents関数を使用し、APIのURLをオープンし$file変数に代入します。オプションパラメータでgzipに5が指定されているので、この段階ではgzip圧縮されています。
gzipファイルの解凍にはgzdecode関数を使用し、解凍します。
解凍された文字列は$file変数に上書きされ、json_decode関数で連想配列に変換し、$listarray変数に代入しています。
免責事項
- 個人・法人に限らず自由に使用することができます。
- 自己の責任の上でご利用ください。
- 本プログラムを使用することによって生じるいかなる問題についても、当社はその責務を負いません。
- 本プログラムに関する個別サポートは行っておりません。