kyukyunyorituryo / AozoraEpub3

青空文庫テキスト→ePub3変換
http://www18.atwiki.jp/hmdev/
Other
142 stars 14 forks source link

ノベルアップ+でのページャー対応 #27

Open H41Ri0 opened 2 months ago

H41Ri0 commented 2 months ago

ノベルアップ+もページ対応型になっていました。 web/novelup.plus/extract.txt

ページャーの上限

PAGER_MAX 100

ページャーリンクのクラスネーム

NEXT_PAGE .js-gtag を追加してもエラーが発生しました。 取得を行おうとした作品は【web版】Lv2からチートだった元勇者候補のまったり異世界ライフです。 以下エラー内容になります。

https://novelup.plus/story/796116755 を読み込みます
URL修正
https://novelup.plus/story/796116755 : List Loaded.
ページャー最大値は100
https://novelup.plushttps://novelup.plus/story/796116755?p=2java.net.UnknownHostException: novelup.plushttps
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
        at java.base/java.net.Socket.connect(Socket.java:751)
        at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304)
        at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:531)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:636)
        at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
        at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:377)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1237)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1123)
        at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1675)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1599)
        at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:223)
        at com.github.hmdev.web.WebAozoraConverter.cacheFile(WebAozoraConverter.java:1341)
        at com.github.hmdev.web.WebAozoraConverter.convertToAozoraText(WebAozoraConverter.java:329)
        at AozoraEpub3Applet.convertWeb(AozoraEpub3Applet.java:3920)
        at AozoraEpub3Applet$ConvertWorker.doInBackground(AozoraEpub3Applet.java:4078)
        at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:305)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:342)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
一覧ページの取得に失敗しました。
https://novelup.plus/story/796116755 は変換できませんでした

素人なのでざっとしか追えませんでしたがダウンロード部分でエラーが発生しているようです。

kyukyunyorituryo commented 2 months ago

NEXT_PAGEで指定するクラスは次のページだけのリンクなので、ノベルアップ+の場合は次のページへのリンクのクラスが決まっていなので使えそうにはない。  ノベルアップ+に対応したページャーの取得方法を考える必要がありそう。

H41Ri0 commented 2 months ago

extract.txtに次のページに値するURLを正規表現で書いて\?\=(?!0|1)\dそれ参照してページ取得するのはどうなのでしょうか。 現状だとなろうもノベルアップ+も次のページはxxxx?=2やxxxx?=3なので有効そうだとは思うのですが、次のページのURLをハッシュ化とかされたら詰みますかね?

kyukyunyorituryo commented 2 months ago

現行と改善案のアルゴリズムを比較

  1. ページャーがある場合にページャーを見に行く
  2. 次のページのリンクへ飛ぶ
  3. 次のページが見つからなかったら終了
  4. URLリストを作成取得して、INDEXを結合

改善案

  1. ページャーがある場合にページャーを見に行く
  2. ラストページの番号を取得
  3. URLパターンからラストページまでのURLを生成
  4. URLリストを作成取得して、INDEXを結合
H41Ri0 commented 2 months ago

勉強になります。あくまで自分の理解用に書いたのですが以下のようなアルゴリズムで合ってます?

1.ページャーと次のページが定義されている時ページャーを見に行く 2.ページャーURL(xxxxx?p=n)をページ読み込みエラーが出るまで取得し格納しておく 3.2で取得したURLリストをダウンロード部分に投げる 4.3で取得した内容をINDEXに追加 5.ページャーURLが終わるまで3-4を繰り返し 6.取得終了したINDEXを任意形式で出力

kyukyunyorituryo commented 2 months ago

ページャー機能を作ったときのメモ書き https://kyukyunyorituryo.github.io/i/narou100/

Chrome デベロッパー ツールでDOMの取得を試したりなど。

kyukyunyorituryo commented 2 months ago

「ノベルアップ+でのページャー対応」の仮対応をしてみた。 なろうの方はまだやっていないので動かない。

https://github.com/kyukyunyorituryo/AozoraEpub3/commit/4295351d7f551ce408534c63e82e737eace2ad1d

H41Ri0 commented 2 months ago

素早い対応有難うございます。 ページャー対応ノベルアップ+は確認できましたがページ対応まで進んでいない作品(100話以降まで続いていない作品)ではエラーが発生しました。確認作品:オットー・フォン・ハイデッカーはゲーム脳∵悪魔の軍団 extract.txtはgitから落とした状態のままです。 エラー内容は以下になります。

https://novelup.plus/story/406531126 を読み込みます
URL修正
https://novelup.plus/story/406531126 : List Loaded.
ページャーがありません
java.lang.NullPointerException: Cannot invoke "org.jsoup.select.Elements.attr(String)" because "last_page" is null
        at com.github.hmdev.web.WebAozoraConverter.convertToAozoraText(WebAozoraConverter.java:308)
        at AozoraEpub3Applet.convertWeb(AozoraEpub3Applet.java:3908)
        at AozoraEpub3Applet$ConvertWorker.doInBackground(AozoraEpub3Applet.java:4066)
        at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:305)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:342)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
エラーが発生しました : Cannot invoke "org.jsoup.select.Elements.attr(String)" because "last_page" is null

エラー見るに100話超えてないのでlast_pageがHTML上に存在しておらず取得できないエラーですかね?多分

kyukyunyorituryo commented 2 months ago

last_pageのnull判定の前にlast_pageを使おうとしてnullエラーが出ていた。 https://github.com/kyukyunyorituryo/AozoraEpub3/commit/3fa88842641436fe021da587813275afc9b854ff なろうの方も対応させた。 https://github.com/kyukyunyorituryo/AozoraEpub3/commit/067516e973d44927b519bc594f0706f27bca2839

H41Ri0 commented 2 months ago

素早い対応有難うございます。 101話以上、100話以下のなろうとノベルアップ+の作品の取得成功確認を行いました。 エラーも確認できませんでした。 なろう、ノベルアップ+以外の確認は行ってません。

改めてありがとうございます。