#author("2024-11-27T10:30:39+09:00","default:yakumo_murakami","yakumo_murakami") #author("2024-11-29T20:24:34+09:00","default:yakumo_murakami","yakumo_murakami") 【[[→Pythonに戻る>今さらPython]]】【 [[これはなに?>#sd85dc89]]】【 [[Download>#z62c071d]]】 2024/11/18朝からのアクセス統計: &counter; ------ #ref(480xc.jpg,left,around); #ref(480x.jpg,left); #clear ---- #contents * これなあに? [#sd85dc89] ひとことでいえば、 ''ネット小説をコンソールで読んだり、ダウンロードして 縦書きepub 文書にするPythonスクリプト'' です。 サイト『小説家になろう』および『カクヨム』を愛用していますが、直接読む以上に読み上げツールで音読する場面が多いのです。 ''特に運転時!!'' 専用ソフトを使う方法もありますが、流しっぱなしに対応しているものは意外に少なく、ダウンロードで epub化した後、読み上げツールに読ませるか、Google Playにアップロードして Androidスマホで読むかの二択となります。 さらに先日、愛用していたAndroid版のepub化ダウンローダが開発終了になってしまったのには困ってしまいまして。 ──ないならば作るだけよ。それが○○○なのでしょう? ……というわけで、以前スクレイピングの勉強で試作した、コンソールなろうビューワの魔改造に踏み切った次第です。 * 更新履歴 [#x89668ec] ** novel.py [#xd1d2dd3] - 2024/11/26 v0.9.5 デフォルトでepub生成しないように。いままでどおり作りたい時は --site --make URL してください。 - 2024/11/21 v0.9.3 cron上で実行すると発生する問題に対応。 - 2024/11/18 v0.9.3 epub生成用の文字列変換テーブルで H と I が入れ替わっていたのに対応。(HENTAIがIENTAHになってしまっていた) - 2024/11/16 v0.9.2 ダウンロード時に最終ページがダブる事がある問題に対応。 - 2024/11/14 v0.9 なろう限定ですが、作者名の自動設定機能の実装をはじめました。 - 2024/11/07 v0.8.11 連続ダウンロードで次ページがなくなった時、キャッシュ読み込みなら最新版を確認しにいくようにした。 - 2024/10/31 v0.8.10 初回起動用の初期化処理を作りました。 - 2024/10/19 v0.8.8 文書処理を生テキストから<p></p>に変更、字下げをCSSでやるにつき、前後処理を対応。 ** novel_core.py [#i62f4f54] - 2024/10/30 v0.3.8 キャッシュの期限を30日にしました。なろう本文の英数字を全角化する試験をはじめました。 - 2024/10/30 v0.3.8 Windows環境で、強制UTF-8にしてない環境での動作が完全に対応外に。git on bashでなくてもいいけど、UTF-8なbash環境が作られている必要があります。 - 2024/10/19 v0.3.6 文章を明示的に<p>タグで囲うようにして、段落字下げ処理をCSSでやるようにした。テキストビューワ用は別処理。 - 2024/10/19 v0.3.6 なろう向けとカクヨム向けを明示的に分割、なろうの前書きと後書きを引用で処理するようにした。 * どんな機能があるの? [#d05b04a2] 以下の3つの機能があります。 - novel URL だけで、コンソールで該当ページを閲覧できます。(ビューワは、環境変数 PAGER で指定してものが使われます) -- 次のページがあったら、終了時にクリップボードに「 novel 次のURL 」がコピーされています。 -- novel だけだと、最後に読んだページを勝手に再読込します。 -- なろうに限り、 novel 小説のURL すると、 novel 小説のURL/1/ として勝手に 1ページ目にいきます。 -- novel --reverse とすると、上の説明とは逆に後ろのページをどんどんたどっていきます。 - novel --site URL で、そのURLを先頭に次のページを探して次々とダウンロードし、タイトルからepubを生成します(pandocが必要) - novel --chain URL で、そのURLを先頭に次のページを探してキャッシュを更新していきます。 - 上記ふたつの機能でキャッシュを共有し、がんがん通信できない環境でみも快適な閲覧を可能にします(--forceで強制ダウンロードもできます) - novel --site でダウンロード中も、 novel URL で別の小説を閲覧できます(キャッシュは共用します) (注意:キャッシュには有効期限があります。--forceで強制更新もできますが、 ''1か月更新していないと次回のアクセス時に自動更新'' します) * どんな環境で作っているの? [#sa7d8322] ** Linux(メイン) [#x2ca61e6] - Linux(Debian 12(bookworm) - vscode - Python3.12.0 ** Windows [#v90f342c] - git on bash for Windows - さくらエディタ ** 動作確認環境 [#cfb1d654] - epub縦書きチェック→Google Play にアップロードして閲覧 - テストに使っている pandoc: 2.17.1.1(Linuxのみ) - アイコン作成等に使っているImageMagik: 8:6.9.11.60+dfsg-1.6+deb12u2(Linuxのみ) * 動作制限について [#r4935b5e] ** 無保証です。 [#a0e65ae5] この手のツールのお約束ですが改めて。 本ツールは全くの無保証であり、本ツール利用により発生する利害その他に一切の保証をいたしません。 また『小説家になろう』『カクヨム』様のご意向により公開停止の可能性もございます。そもそも個人の趣味のツールであり、その際にはご容赦ください。 ** 画像は無視します。 [#sea0d3ab] テキスト要素のみを取り出すものなので。 epubそのものはもちろん対応しているのですが、うちは対応しておりません。 ** レイアウトが崩れます。 [#hfb056a0] もともと縦書き→横書き変換のうえに画像も読まないってことでデザインもへちまもないですけども、以下のような事もします。 *** テキストが以下のように編集されます。 [#he59dad0] 「お待ちください。 我ら四十七名は命など惜しくはありませぬ。 只々、主の無念を晴らす事こそ我らが望み」 ↓ 「お待ちください。我ら四十七名は命など惜しくはありませぬ。只々、主の無念を晴らす事こそ我らが望み」 あと字下げも行いますが、カッコ類から始まる行は字下げしません(問題があれば知らせてください) ** そのほか、今まで観測された不具合 [#i11c44e9] *** なんか前読んだページがエラーになります [#s19dd45f] :キャッシュが古い?|30日の保管期限をつけましたが、--force で強制更新もお試しください。 ''特にその話が以前の最終話だった場合、次話ができている事があります'' *** 突然に表示がおかしくなった。 [#r6e401a9] :サイトのメンテ中の可能性があります。|この場合、キャッシュに保存済みの作品だけ快適に読めます。 :過去の例でいきますと、セキュリティ強化で直接アクセスできなくなったケースもありました。|こういうケースの時はケースバイケースで、スクリプトの思い切った構造変更で、うちではすぐに対応できないケースもありえます。 *** アクセスできるのだが次ページが辿れない、変なごみが入るなど細かい不具合が出る。 [#z3627492] サイト構成が変わった可能性があります。当方も見つけ次第対応いたしますが、サイト構成はサイト『小説家になろう』『カクヨム』様のご意向で変わりますので、対応するまでおかしくなってしまうのはどうしようもありません。 * 必要な環境 [#kd4b0d46] - bash環境。別にLinuxでなくても、なんなら git on bashでもいいです。 -- ただし git on bashを使う場合、PythonはUTF-8で動くよう.bashrcに設定する必要があります。 -- $HOME/bin があり、PATHが貼られていること。 - GNUmake - Python(3.9〜3.10あたりを推奨) - Pandoc(なくてもダウンロードはできます。Markdown形式ですが) - Pythonのモジュールは以下を読み込んでいます。なければpipで追加が必要。 -- from bs4 import BeautifulSoup (スクレイピング) -- import codecs (あまりつかってないが) -- import datetime -- import os -- import re -- import random (迷惑行為防止用。連続ダウンロード時にランダムな時間をわざと遅延させる) -- import textfile -- import time -- import urllib.request -- import mojimoji (epubアイコン作りの補助用) -- import pyperclip (単体閲覧の時、終了と同時に次のページをクリップボードにコピーする) -- import subprocess -- import sys * ダウンロード [#z62c071d] - &ref(novel-0.9.5.tar.xz); ''(now!)'' --site指定のみではpandocを実行しないようにしました。以前と同じ動作をさせるには --site --make URL としてください。 - &ref(novel-0.9.4.tar.xz); cronでの実行に対応。 - &ref(novel-0.9.3.tar.xz); 文字列変換テーブルで H と I が入れ替わっていたのに対応。 - &ref(novel-0.9.2.tar.xz); 連続ダウンロードで作るepubの一部ページがダブっているのに対応。 - &ref(novel_20241111.tar.xz); - &ref(novel_20241107.tar.xz); - &ref(novel_20241031.tar.xz); - &ref(novel_20241030.tar.xz); - &ref(novel_20241021-2.tar.xz); - &ref(novel_20241021_1.tar.xz); - &ref(novel_20241019.tar.xz); - &ref(novel_20241017.tar.xz); - &ref(novel_20241016-2.tar.xz); * インストール [#tdfb0640] ** (新)インストール方法(0.9.2以降) [#v30d6f84] - ダウンロードしたら、tar -Jxvf で展開して、できた novel フォルダに入って make install - alias novel=novel.py ** (旧)インストール方法 [#v30d6f84] - ダウンロードしたら、tar -Jxvf で展開して2つのファイルをパスの通ったところに置きます。 - alias novel=novel.py * 使い方 [#pe0d239c] ** 普通にテキスト表示 [#v753d1f9] novel URL *** ただし、なろうの短編だけは自動判定がうまくないので現状、以下のようにしてください [#m06c334d] novel --short URL ビューワには、環境変数 PAGER で指定したビューワが使われます。なければ less の利用を試みます。 次のページがあると、自動的にクリップボードに novel 次のページのURL がコピーされますので、ペーストして実行すれば次々読めます。 なお、こうすると逆に前話をたどれます。 novel --reverse URL *** クリップボードの制限について [#h7fe45cf] クリップボードは便利ですが、以下の場合にはエラーになってうまくコピーできない事がわかっています。 - Windowsからteratermでどこかのマシンに入って novel実行 -- これはteratermとpyperclipの通信がうまくいかないのだと思います。 -- なお git on bashのコンソールなら [CTRL]+Insertでコピー、[SHIFT]+Insertでペーストです。 -- WSLだと使用コンソールによるでしょう。 - GNOME環境でmlterm等、クリップボードが複数ある環境での動作について -- [CTRL]+Insertでコピー、[SHIFT]+Insertならダメなのに、[CTRL]+[SHIFT]+cなどでうまく動くことがあります。これは、そもそも使っているクリップボードが異なるためと思われます。特にGNOME環境ならGTKを使っているアプリならスムーズにいくでしょう。 -- なお、GNOME環境で一部の文字のレイアウトがおかしい問題は、[[GNOME-terminalで一部のフォントがつぶれる問題]] で対応しています。 ** 連続ダウンロード(epub化) [#td9ae8fc] pandocをインストールしたうえで、以下のようにします。 novel --site --author="著者" 第一話のURL - ダウンロード用ディレクトリを用意して、そこに移動して実行するのがおすすめです。 -- ダウンロード履歴は、各ディレクトリのindex.txt に記載されます。 -- 置き場をきちんと決めておくと、*/index.txt で全ダウンロードにまたがった作品の頭出しや一斉キャッシュ更新祭り等、いろいろと便利なのでおすすめです。 - カクヨムは著者を略すと作者が「名無しさん」になります。 - カクヨムは著者を略すと作者が「名無しさん」になります→0.9.4で仮対応しました。 - なろうは0.9.2版より作者名を自動取得します。 ** キャッシュ作成 [#ad7b9cd6] ダウンロードしないで、新規キャッシュをひたすら作成するモードです。 豊かなネット環境でのんびりバックグラウンドでキャッシュ生成しておいて、あとでサクッと epub 作成したりローカルキャッシュだけで作品を読む等の使い方に適合します。 novel --chain 更新したい最初のURL どんどん次話をたどってキャッシュを更新していきます。最初の頁である必要もありません。 現在、キャッシュの寿命を一ヶ月に設定していますが、自動取得機能などはないので有効利用してみてください。 * モノは揃ってるのに動かない? [#iea6f651] 以下を試してください。それぞれ、固定URL用と連続ダウンロード時の履歴を保管しています。 touch ~/.novelrc touch ~/.novel2rc mkdir ~/.noveldir キャッシュは以下に保存されます。古いのを削除したり適宜どうぞ。 $HOME/.noveldir * nlist.py 支援スクリプトについて [#r1ce915b] ** 用途 [#af067575] $HOME/.novelrcに記録されている過去のアクセスURLとメインタイトルを羅列します。 ** 使い方 [#peb1eba9] パスの通ったところに置いて実行してください。 ** nlist.py download [#d3bb92c4] - &ref(nlist.py); 2024/10/18更新 * 雑記 [#j1e763cf] ** 2024/11/26 novel --site で自動epub変換しなくなった理由につきまして。 [#vcae9186] そもそも自動epoub変換していたのは /usr/bin/pandoc が存在する場合のみですが、機能を分離したのは、たくさんアーカイブを抱えた環境だと --site で何時間も待たされるケースがあると判明したからです。うちの環境では、ほぼまる一日かかりました。 このため、pandocを走らせる処理だけでも分離させる事にしました。これだけでも 50分近く短縮になったので。 なお、ダウンロードしたアーカイブからepubを生成するには、該当ディレクトリに移動して make コマンドを実行します。 もし必要なら支援シェルを掲載しますが、おそらく皆さんこのくらいなら対応されるかなとも思います。 ** 2024/11/16 novel --chain URL の効用につきまして。 [#j4106031] これ、ダウンロードしないでローカルキャッシュだけ連続読み込みするオプションです。具体的には、以下のような用途に使えます。 - あらかじめキャッシュに全部ダウンロードしておきたい。 あとで --site --make して epub生成する時など、いちいち全話おとしていたら四桁クラスとか膨大な時間がかかりますが、寝ている間にでもキャッシュしとけば作成時のオーバーヘッドは事実上、pandocのレスポンス待ちくらいになります。 ** 2024/10/30 古文拡張とかどうなってんでしょ? [#d82f544f] - キャッシュの有効期限を30日にしてみました。 - あと、なろう限定で本文の英数字全角化のテストを開始しました。 なろう限定なのは、縦書きで見栄えがアレなのの対策テストだからです。半角だけ文字が横倒しになるのは縦書き文書作成歴のある方なら「ああ」と思うでしょう。古くはLaTeXの時代からあるものです。 そういえば昔、LaTeXの日本語古文用拡張ありましたね。あれって pandoc ベースの環境では使えるのですかね? ** 2024/10/29 キャッシュの有効期限について [#oeb0676c] 従来は無期限にしてたんですが、利便性を考えると期限を設けた方が良さげですね。 ためしに期限一か月くらいにしてみますか。(古くなると更新メッセージと共にサイトから読み直すようにします。しばしお待ちを) * お問い合わせは、こちらへ。 [#l6145bc2] → https://mooa9.hatenablog.jp/entry/2024/10/17/072714