From 604a0a1e1aac749657af2c45817ad4145679613f Mon Sep 17 00:00:00 2001 From: Irie Aoi Date: Tue, 26 Jan 2021 02:41:57 +0900 Subject: [PATCH 1/3] fix and improve narou resolver --- app/MetadataResolver/NarouResolver.php | 51 ++- .../MetadataResolver/NarouResolverTest.php | 35 ++ tests/fixture/Narou/novel.html | 402 ++++++++++++++++++ 3 files changed, 475 insertions(+), 13 deletions(-) create mode 100644 tests/Unit/MetadataResolver/NarouResolverTest.php create mode 100644 tests/fixture/Narou/novel.html diff --git a/app/MetadataResolver/NarouResolver.php b/app/MetadataResolver/NarouResolver.php index 1ee5eb00..b5e22127 100644 --- a/app/MetadataResolver/NarouResolver.php +++ b/app/MetadataResolver/NarouResolver.php @@ -4,6 +4,7 @@ use GuzzleHttp\Client; use GuzzleHttp\Cookie\CookieJar; +use Symfony\Component\DomCrawler\Crawler; class NarouResolver implements Resolver { @@ -26,30 +27,54 @@ public function resolve(string $url): Metadata { $cookieJar = CookieJar::fromArray(['over18' => 'yes'], '.syosetu.com'); - $res = $this->client->get($url, ['cookies' => $cookieJar]); - $metadata = $this->ogpResolver->parse($res->getBody()); - $metadata->description = ''; + preg_match('~\.syosetu\.com/(?Pn\d+[a-z]+)~', $url, $matches); + $ncode = $matches['ncode']; + + $res = $this->client->get("https://novel18.syosetu.com/novelview/infotop/ncode/$ncode/", ['cookies' => $cookieJar]); + $html = $res->getBody()->getContents(); + + // 一見旧式のDOMDocumentを使っているように見えるがこれは罠で、なろうのHTMLはDOMCrawlerだとパースに失敗する $dom = new \DOMDocument(); - @$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win')); + @$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win')); $xpath = new \DOMXPath($dom); + $metadata = $this->ogpResolver->parse($html); $description = []; + // タイトル + $titleNodeList = $xpath->query('//h1/a'); + if ($titleNodeList->length !== 0) { + $metadata->title = $titleNodeList->item(0)->textContent; + } + + // タグ + $keywordNodeList = $xpath->query('//th[contains(text(), "キーワード")]/following-sibling::td[1]'); + if ($keywordNodeList->length !== 0) { + $keyword = trim($keywordNodeList->item(0)->textContent); + $metadata->tags = explode(' ', $keyword); + } + // 作者名 - $writerNodes = $xpath->query('//*[contains(@class, "novel_writername")]'); - if ($writerNodes->length !== 0 && !empty($writerNodes->item(0)->textContent)) { - $description[] = trim($writerNodes->item(0)->textContent); + $authorNodeList = $xpath->query('//a[contains(@href,"mypage.syosetu.com")]'); + if ($authorNodeList->length !== 0) { + $description[] = '作者: ' . trim($authorNodeList->item(0)->textContent); } - // あらすじ - $exNodes = $xpath->query('//*[@id="novel_ex"]'); - if ($exNodes->length !== 0 && !empty($exNodes->item(0)->textContent)) { - $summary = trim($exNodes->item(0)->textContent); - $description[] = mb_strimwidth($summary, 0, 101, '…'); // 100 + '…'(1) + // あらすじがあれば先頭150文字を取得する + $exNodeList = $xpath->query('//td[@class="ex"]'); + if ($exNodeList->length !== 0) { + $summary = trim($exNodeList->item(0)->textContent); + // 長過ぎたら150文字に切って「……」をつける + if (mb_strlen($summary) >= 148) { + $description[] = mb_substr($summary, 0, 150) . '……'; + } else { + $description[] = $summary; + } } - $metadata->description = implode(' / ', $description); + // 作者名とあらすじをくっつける + $metadata->description = implode("\n", $description); return $metadata; } diff --git a/tests/Unit/MetadataResolver/NarouResolverTest.php b/tests/Unit/MetadataResolver/NarouResolverTest.php new file mode 100644 index 00000000..86f45335 --- /dev/null +++ b/tests/Unit/MetadataResolver/NarouResolverTest.php @@ -0,0 +1,35 @@ +shouldUseMock()) { + sleep(1); + } + } + + public function testNovel() + { + $responseText = $this->fetchSnapshot(__DIR__ . '/../../fixture/Narou/novel.html'); + + $this->createResolver(NarouResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://novel18.syosetu.com/n2978fx/'); + $this->assertEquals('ぱんつ売りの少女', $metadata->title); + $this->assertEquals("作者: 飴宮 地下\n冴えない男「ハルノ・ヒトキ」が仕事からの帰宅途中で美少女に声を掛けられる。\n驚いた事に少女の目的は自分の下着を売る事だった。\nお金に困っていた少女は徐々にヒトキに下着を売っていたが段々とその内容がエスカレートして行き……。", $metadata->description); + $this->assertEquals(['ギャグ', '男主人公', '現代', '下着', '匂いフェチ', 'ブルセラ'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://novel18.syosetu.com/novelview/infotop/ncode/n2978fx/', (string) $this->handler->getLastRequest()->getUri()); + } + } +} diff --git a/tests/fixture/Narou/novel.html b/tests/fixture/Narou/novel.html new file mode 100644 index 00000000..bf15b91f --- /dev/null +++ b/tests/fixture/Narou/novel.html @@ -0,0 +1,402 @@ + + + + + + +ぱんつ売りの少女[小説情報] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
    +
  • +ログイン +
  • +
  • 小説情報
  • +
  • 感想
  • +
  • レビュー
  • +
  • 縦書きPDF
  • + +
  • ブックマークに追加
  • + + + +
  • + + + + + +
+
+ +
+ + + +
ブックマーク登録する場合はログインしてください。
+ + +
+ +

N2978FX

+

ぱんつ売りの少女

+ + +
+
+ +
+R18 +連載中全13部分 +1部分目を読む + +|最新部分を読む +
+ + + + + + + + + + + + + + + + + + +
あらすじ冴えない男「ハルノ・ヒトキ」が仕事からの帰宅途中で美少女に声を掛けられる。
+驚いた事に少女の目的は自分の下着を売る事だった。
+お金に困っていた少女は徐々にヒトキに下着を売っていたが段々とその内容がエスカレートして行き……。
作者名飴宮 地下 +
キーワード + +ギャグ 男主人公 現代 下着 匂いフェチ ブルセラ +
掲載サイトノクターンノベルズ(男性向け)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
掲載日2019年 12月09日 00時17分
最新部分掲載日2019年 12月19日 00時03分
感想 +10件 + +
※ログイン必須 +
レビュー +0件 +
ブックマーク登録250件
総合評価641pt
評価ポイント +141pt + + +
誤字報告受付 +受け付けています
※ログイン必須
開示設定開示されています
文字数63,365文字
+ +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ + + + + + +
+ +
+ +
+ + +
+ + + + + +
+ + + + +
+N2978FX| +小説情報| +連載(全13部分) +| +ノクターンノベルズ(男性向け) +
+
冴えない男「ハルノ・ヒトキ」が仕事からの帰宅途中で美少女に声を掛けられる。 +驚いた事に少女の目的は自分の下着を売る事だった。 +お金に困っていた少女は徐々にヒトキに下着を売っていたが段々とその内容がエスカレートして行き……//
+ + +
+N2976FX| +小説情報| +連載(全8部分) +| +ノクターンノベルズ(男性向け) +
+
ある日、世界を創造した男に人生を強制終了された男が別の世界に転生させられた。 +男は特別な力を与えられた訳では無いが、家柄だけは良い所に生まれ落ちる。 +転生した男は自らの才能と鍛錬により人々から羨望の眼差しを受けるながら成//
+ + +
+N2460DF| +小説情報| +連載(全19部分) +| +ノクターンノベルズ(男性向け) +
+
 醜悪な容姿のハルノ・ヒトキは、日々嘲りの対象になっていた。 +ある日、誤解によるトラブルで停学処分を喰らったヒトキが、一週間ぶりに家の外に出ると世界は変わっていた。 +知らないうちにヒトキは前と異なる世界に居た。 +ある一点//
+ + +
+N4715CE| +小説情報| +完結済(全31部分) +| +ノクターンノベルズ(男性向け) +
+
 高校生の「ヒトキ」は、同級生の美少女「美紅」と、その姉の「絵梨」の姉妹だけの悪い遊び「罰ゲーム」を偶然目撃してしまう。 +その時から姉妹に魅了され、姉妹しか参加していない部活に入ってしまう。普段は清楚に見える姉妹がヒトキ//
+ + +
+N0356CX| +小説情報| +連載(全8部分) +| +ノクターンノベルズ(男性向け) +
+
 恋人も友人もいない孤独な人生を事故により終わらせたハルノ・ヒトキは創造神と出会う。 +その孤独な人生は、ステータスの調整を適当に設定したのが原因だったと創造神に告白されたヒトキは涙する。 +ヒトキの涙に罪悪感を覚えた創造神//
+ +
+ + + + +
+

トラックバック []

+ +[ 全作品のトラックバック一覧はこちら ] + + + + + + + + + +
◆この小説のトラックバックURL
◆この小説のURL
   (リンク自由)
+
+ +
++注意+
+特に記載なき場合、掲載されている小説はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
+特に記載なき場合、掲載されている小説の著作権は作者にあります(一部作品除く)。
+作者以外の方による小説の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。
+

+この小説はリンクフリーです。ご自由にリンク(紹介)してください。
+小説の読了時間は毎分500文字を読むと想定した場合の時間です。目安にして下さい。 +
+ + + + + +
+ + +
+
+ +
+ +
+ + +
+ +↑ページトップへ + +
+ + + + + + + + + + + + + + \ No newline at end of file From a124059fedb0a34df459a13226cfca93b392dc12 Mon Sep 17 00:00:00 2001 From: Irie Aoi Date: Tue, 26 Jan 2021 02:55:14 +0900 Subject: [PATCH 2/3] remove unused import --- app/MetadataResolver/NarouResolver.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/MetadataResolver/NarouResolver.php b/app/MetadataResolver/NarouResolver.php index b5e22127..6206b836 100644 --- a/app/MetadataResolver/NarouResolver.php +++ b/app/MetadataResolver/NarouResolver.php @@ -4,7 +4,6 @@ use GuzzleHttp\Client; use GuzzleHttp\Cookie\CookieJar; -use Symfony\Component\DomCrawler\Crawler; class NarouResolver implements Resolver { From 360e1079bdca020ddca38f0e16cfe1db6c093ec1 Mon Sep 17 00:00:00 2001 From: Irie Aoi Date: Sat, 13 Feb 2021 14:46:10 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E5=B0=8F=E8=AA=AC=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=AB=E5=AF=BE=E5=BF=9C=20?= =?UTF-8?q?=E9=95=B7=E3=81=84=E8=AA=AC=E6=98=8E=E6=96=87=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetadataResolver/MetadataResolver.php | 2 +- app/MetadataResolver/NarouResolver.php | 2 +- .../MetadataResolver/NarouResolverTest.php | 30 ++ .../fixture/Narou/novel_longdescription.html | 394 ++++++++++++++++++ 4 files changed, 426 insertions(+), 2 deletions(-) create mode 100644 tests/fixture/Narou/novel_longdescription.html diff --git a/app/MetadataResolver/MetadataResolver.php b/app/MetadataResolver/MetadataResolver.php index 7e2f1ef5..e46a8fea 100644 --- a/app/MetadataResolver/MetadataResolver.php +++ b/app/MetadataResolver/MetadataResolver.php @@ -26,7 +26,7 @@ class MetadataResolver implements Resolver '~dmm\.co\.jp/~' => FanzaResolver::class, '~www\.patreon\.com/~' => PatreonResolver::class, '~www\.deviantart\.com/.*/art/.*~' => DeviantArtResolver::class, - '~\.syosetu\.com/n\d+[a-z]+~' => NarouResolver::class, + '~\.syosetu\.com/(novelview/infotop/ncode/)?n\d+[a-z]+~' => NarouResolver::class, '~ci-en\.(jp|net|dlsite\.com)/creator/\d+/article/\d+~' => CienResolver::class, '~www\.plurk\.com\/p\/.*~' => PlurkResolver::class, '~store\.steampowered\.com/app/\d+~' => SteamResolver::class, diff --git a/app/MetadataResolver/NarouResolver.php b/app/MetadataResolver/NarouResolver.php index 6206b836..dd4fe6e0 100644 --- a/app/MetadataResolver/NarouResolver.php +++ b/app/MetadataResolver/NarouResolver.php @@ -27,7 +27,7 @@ public function resolve(string $url): Metadata $cookieJar = CookieJar::fromArray(['over18' => 'yes'], '.syosetu.com'); - preg_match('~\.syosetu\.com/(?Pn\d+[a-z]+)~', $url, $matches); + preg_match('~\.syosetu\.com/(novelview/infotop/ncode/)?(?Pn\d+[a-z]+)~', $url, $matches); $ncode = $matches['ncode']; $res = $this->client->get("https://novel18.syosetu.com/novelview/infotop/ncode/$ncode/", ['cookies' => $cookieJar]); diff --git a/tests/Unit/MetadataResolver/NarouResolverTest.php b/tests/Unit/MetadataResolver/NarouResolverTest.php index 86f45335..13319a18 100644 --- a/tests/Unit/MetadataResolver/NarouResolverTest.php +++ b/tests/Unit/MetadataResolver/NarouResolverTest.php @@ -32,4 +32,34 @@ public function testNovel() $this->assertSame('https://novel18.syosetu.com/novelview/infotop/ncode/n2978fx/', (string) $this->handler->getLastRequest()->getUri()); } } + + public function testNovelViewURL() + { + $responseText = $this->fetchSnapshot(__DIR__ . '/../../fixture/Narou/novel.html'); + + $this->createResolver(NarouResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://novel18.syosetu.com/novelview/infotop/ncode/n2978fx/'); + $this->assertEquals('ぱんつ売りの少女', $metadata->title); + $this->assertEquals("作者: 飴宮 地下\n冴えない男「ハルノ・ヒトキ」が仕事からの帰宅途中で美少女に声を掛けられる。\n驚いた事に少女の目的は自分の下着を売る事だった。\nお金に困っていた少女は徐々にヒトキに下着を売っていたが段々とその内容がエスカレートして行き……。", $metadata->description); + $this->assertEquals(['ギャグ', '男主人公', '現代', '下着', '匂いフェチ', 'ブルセラ'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://novel18.syosetu.com/novelview/infotop/ncode/n2978fx/', (string) $this->handler->getLastRequest()->getUri()); + } + } + + public function testLongDescriptionNovel() + { + $responseText = $this->fetchSnapshot(__DIR__ . '/../../fixture/Narou/novel_longdescription.html'); + + $this->createResolver(NarouResolver::class, $responseText); + + $metadata = $this->resolver->resolve('https://novel18.syosetu.com/n0477gn/'); + $this->assertEquals('俺のことが好き過ぎる双子の天才妹が、「妹と結婚して子作りすること」を合法化して二人がかりで精液を搾りとってくる話', $metadata->title); + $this->assertEquals("作者: 伍式\n巨大財閥の跡取りである高校生「菊川笙(きくかわしょう)」。その双子の妹、貧乳美尻丁寧語の「菊川琴(こと)」と巨乳巨尻甘えん坊の「菊川鈴(すず)」。\n巨大財閥を実質的に動かしている天才双子妹は、しかし兄を盲愛して兄の精液で孕みたいと固く決意しているダブルブラコン妹だった。\nある時妹たち二人と一緒に高級……", $metadata->description); + $this->assertEquals(['ほのぼの', '男主人公', '妹', 'いちゃらぶ', '近親相姦', 'オナニー', '見せつけ', '尻合わせ', '孕ませっくす', '自慰', '尻ズリ', '兄妹', '双子', 'だいしゅきホールド', '膝立ちバック'], $metadata->tags); + if ($this->shouldUseMock()) { + $this->assertSame('https://novel18.syosetu.com/novelview/infotop/ncode/n0477gn/', (string) $this->handler->getLastRequest()->getUri()); + } + } } diff --git a/tests/fixture/Narou/novel_longdescription.html b/tests/fixture/Narou/novel_longdescription.html new file mode 100644 index 00000000..405a0e62 --- /dev/null +++ b/tests/fixture/Narou/novel_longdescription.html @@ -0,0 +1,394 @@ + + + + + + +俺のことが好き過ぎる双子の天才妹が、「妹と結婚して子作りすること」を合法化して二人がかりで精液を搾りとってくる話[小説情報] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
    +
  • +ログイン +
  • +
  • 小説情報
  • +
  • 感想
  • +
  • レビュー
  • +
  • 縦書きPDF
  • + +
  • ブックマークに追加
  • + + + +
  • + + + + + +
+
+ +
+ + + +
ブックマーク登録する場合はログインしてください。
+ + +
+ +

N0477GN

+

俺のことが好き過ぎる双子の天才妹が、「妹と結婚して子作りすること」を合法化して二人がかりで精液を搾りとってくる話

+ + +
+
+ +
+R18 +短編 +
+ + + + + + + + + + + + + + + + + + +
あらすじ巨大財閥の跡取りである高校生「菊川笙(きくかわしょう)」。その双子の妹、貧乳美尻丁寧語の「菊川琴(こと)」と巨乳巨尻甘えん坊の「菊川鈴(すず)」。
+巨大財閥を実質的に動かしている天才双子妹は、しかし兄を盲愛して兄の精液で孕みたいと固く決意しているダブルブラコン妹だった。
+ある時妹たち二人と一緒に高級ホテルに宿泊することになった笙は、そこで「近親婚合法化」のニュースを見せられる…。
+
+タイトル通り、兄大好きの双子の妹が、徹底的にお兄ちゃんといちゃらぶ孕みセックスをする話です。
+
+※喘ぎ声にハートマークが頻繁につきます
作者名伍式 +
キーワード + +ほのぼの 男主人公 妹 いちゃらぶ 近親相姦 オナニー 見せつけ 尻合わせ 孕ませっくす 自慰 尻ズリ 兄妹 双子 だいしゅきホールド 膝立ちバック +
掲載サイトノクターンノベルズ(男性向け)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
掲載日2020年 09月22日 07時46分
最終更新日 +2020年 09月23日 19時01分 +
感想 +9件 + +
レビュー +0件 +
ブックマーク登録1,471件
総合評価5,812pt
評価ポイント +2,870pt + + +
誤字報告受付 +受け付けています
※ログイン必須
開示設定開示されています
文字数21,598文字
+ +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ + + + + + +
+ +
+ +
+ + +
+ + + + + +
+ + + + +
+N6468GS| +小説情報| +連載(全7部分) +| +ノクターンノベルズ(男性向け) +
+
遺伝子操作によって、特定の遺伝子パターンを含んだ精液を膣内射精されることで淫紋が発動する体質の女性たち。かつては隷属の為の淫術の産物だった彼女たちは、永い時を経て、射精相手が特定の血筋の人間であることを証明する「身分証明//
+ + +
+N4501FZ| +小説情報| +連載(全65部分) +| +ノクターンノベルズ(男性向け) +
+
ある時、ごく普通の高校生である長津田恭一は、妹の知佳に自慰の瞬間を見られてしまう。人生終わった…と思っていたのに、その時以降、何故か知佳はことあるごとに恭一にえっちなアプローチをしかけてきて、恭一の性欲を煽ろうとしてくる//
+ + +
+N8135GR| +小説情報| +短編| +ノクターンノベルズ(男性向け) +
+
「セックスしないと出られない部屋」を居住用に改装した物件に、ボクっ娘同級生である宮ノ前真琴(みやのまえまこと)と二人で入居した庚申塚洋一(こうしんづかよういち)。恋人同士ではない二人は、単なるルームメイトという関係のまま//
+ + +
+N0411GR| +小説情報| +短編| +ノクターンノベルズ(男性向け) +
+
二人組の女性冒険者、シアラとアリス。二人はダンジョンを探索する中、深層で奇妙な部屋に突き当たる。その部屋から出る為の開錠条件は、「角オナでお互いに視姦し合いながら二人で同時イキすること」だった。紆余曲折の末角オナを始める//
+ + +
+N8304GG| +小説情報| +連載(全39部分) +| +ノクターンノベルズ(男性向け) +
+
高校二年生の少女、妙典樹(みょうでんいつき)は、あるお屋敷の広間で目覚める。そこで説明される「自慰バレゲーム」のルールと、見せつけられる脱落者の「罰ゲーム」。 + +オナニーしたい、身体は発情している、時間制限すらある。けれ//
+ +
+ + + + +
+

トラックバック []

+ +[ 全作品のトラックバック一覧はこちら ] + + + + + + + + + +
◆この小説のトラックバックURL
◆この小説のURL
   (リンク自由)
+
+ +
++注意+
+特に記載なき場合、掲載されている小説はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
+特に記載なき場合、掲載されている小説の著作権は作者にあります(一部作品除く)。
+作者以外の方による小説の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。
+

+この小説はリンクフリーです。ご自由にリンク(紹介)してください。
+小説の読了時間は毎分500文字を読むと想定した場合の時間です。目安にして下さい。 +
+ + + + + +
+ + +
+
+ +
+ +
+ + +
+ +↑ページトップへ + +
+ + + + + + + + + + + + + + \ No newline at end of file