カクヨムのサイトがリニューアルして目次がだいぶ変わったので対応。目次部分を見ていくと、HTMLを見てもすべての話へのリンクがなく一部になっている。その代わりにJSONにサイトのデータが書かれている。
対応前の状態
トップページをキャッシュに保存、そこからタイトルを取得するところで止まる。 Document doc = Jsoup.parse(cacheFile, null); SERIES/TITLE : タイトルがありません
jsoupでjsonデータの取得
Element NEXT_DATA = doc.getElementById("NEXT_DATA");
System.out.println(NEXT_DATA.data());
JAVAのリストを条件でフィルタリング www.techiedelight.com
多次元配列の作成 www.javadrive.jp
JSONオブジェクトの取り出し stackoverflow.com
サイトからJSONを取り出して、JSONをパースしてタイトル著者、イントロ、各話のURLと投稿時間を取得した。だけど今までのHTMLから取得するのとJSONから取得する方法を共存できないので。可能だけどif分がいろんなところに必要になって見づらいことこの上ない。いっそのこと今までのHTMLに変換すればいいのでは。そうすればJSONからHTMLに変換するだけでいい。 JSONからHTMLを作る時にvelocityを使おう。ファイル分割するのがめんどいのでJava複数行代入機能を使ってテンプレートを作成する。
日付の変換 カクヨムはZonedDateTimeだった workteria.forward-soft.co.jp
https://github.com/kyukyunyorituryo/FxlEpub3/blob/main/src/main/resources/package.vm HTMLエスケープは必要かどうか gae-fan.blogspot.com
ブラウザのコンソールからデータ取得メモ。
json=document.getElementById("__NEXT_DATA__").text const obj = JSON.parse(json); const episode=obj.props.pageProps.__APOLLO_STATE__ const key = Object.keys(episode) episodename=key.filter(RegExp.prototype.test.bind(/^Episode:[0-9]+/)) book=[] for (let i = 0; i < episodename.length; i++) { //book[i].id=episode[episodename[i]].id //book[i].title=episode[episodename[i]].title //book[i].date=episode[episodename[i]].publishedAt book.push({ id: episode[episodename[i]].id, title: episode[episodename[i]].title, date: episode[episodename[i]].publishedAt }) } cd=location.pathname.replace(/\/+$/, "").split('/').pop(); title=episode["Work:" + cd].title introduction=episode["Work:" + cd].introduction author=episode[episode["Work:" + cd].author.__ref].activityName