limura / NovelSpeaker

text speech app for text novel site.
https://limura.github.io/NovelSpeaker/
MIT License
28 stars 6 forks source link

Chapter Error #104

Closed MurtadhaQahtan closed 3 years ago

MurtadhaQahtan commented 6 years ago

sometimes when attempting to download a new chapter. a problem happens, like in the photo below. img_1416

and the only solution is to delete the whole novel and redownload it

limura commented 6 years ago

問題を起こしている小説は以下のもので合っていますか? https://ncode.syosetu.com/n1996ed/

また、スクリーンショットから判断すると「なろう検索」タブからのダウンロードかと思われます。 それであれば、恐らくは Detail ボタンを押して出てきた詳細画面にて、Download ボタンを押すことで壊れているページを再度ダウンロードしようと試みそうに思いますが、それは試しましたでしょうか?

MurtadhaQahtan commented 6 years ago

yes, that one is correct also I tried "detail" and "download" but it didn't work

limura commented 6 years ago

なるほど。

とりあえず気になる点がいくつかあったので後日対応します。

それとは別に、その失敗しているテキストを確認したいのですが、まだ残っているでしょうか。

limura commented 6 years ago

あぁ、やはり同一IPからの多重ダウンロードにひっかかっているわけですね。

それはそれとして、そのテキストは本当に「エラー」から始まっていますか? スクリーンショットでは「<?xml...」というものから始まっているように見えているのですが。

MurtadhaQahtan commented 6 years ago

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

エラー
  • ログイン
  • 小説情報
  • 感想
  • レビュー
  • 縦書きPDF
挿絵表示切替ボタン
▼配色







▼メニューバー
×閉じる

エラー

エラーが発生しました。
接続規制:同一IPからの連続したアクセスを検知しサーバが一時的に接続を遮断しました。20秒程度待った上で再度、アクセスしてください。
エラーの原因がわからない場合は
ヘルプ 各種マニュアルをご確認ください。
↑ページトップへ
MurtadhaQahtan commented 6 years ago

No, it appears different when I posted it here

MurtadhaQahtan commented 6 years ago

no, it appears different when I put it here

img_1417

this is the original

limura commented 6 years ago

markdown の Syntax highlighting を使ってください。 https://guides.github.com/features/mastering-markdown/

「```」だけの行で目的のテキストを挟みます。

 <?xml...>
MurtadhaQahtan commented 6 years ago

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

<title>エラー</title>

<meta http-equiv="Content-Script-Type" content="text/javascript" />

<meta http-equiv="Content-Style-Type" content="text/css" />

<meta name="format-detection" content="telephone=no" />

<link rel="shortcut icon" href="https://static.syosetu.com/view/images/narou.ico" />

<link rel="icon" href="https://static.syosetu.com/view/images/narou.ico" />

<link rel="alternate" href="http://nk.syosetu.com/0/" media="handheld" />

<link rel="stylesheet" type="text/css" href="https://static.syosetu.com/view/css/lib/jquery.hina.css?oyb9lo" media="screen,print" />

<link rel="stylesheet" type="text/css" href="https://static.syosetu.com/novelview/css/novel_view.css?pcaz2v" media="screen,print" />

<script type="text/javascript"><!--

var domain = 'syosetu.com';

function wOpen(URL,NAME,OPTION){WO1 = window.open(URL,NAME,OPTION);WO1.window.focus();}

//--></script>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script type="text/javascript" src="https://static.syosetu.com/view/js/lib/jquery.hina.js?oyez8w"></script>

<script type="text/javascript" src="https://static.syosetu.com/view/js/global.js?oyez8w"></script>

<script type="text/javascript" src="https://static.syosetu.com/novelview/js/novelview.js?p4feug"></script>

<!-- testutttt -->

<script type="text/javascript">

var microadCompass = microadCompass || {};

microadCompass.queue = microadCompass.queue || [];

</script>

<script type="text/javascript" charset="UTF-8" src="//j.microad.net/js/compass.js" onload="new microadCompass.AdInitializer().initialize();" async></script>

<!--

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

 xmlns:dc="http://purl.org/dc/elements/1.1/"

 xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">

<rdf:Description

rdf:about="https://ncode.syosetu.com/0/

dc:identifier="https://ncode.syosetu.com/0/"

dc:title=""

trackback:ping="https://trackback.syosetu.com/send/novel/ncode//" />

</rdf:RDF>

-->

<script type="text/javascript" class="microad_blade_track">

<!--

var microad_blade_jp = microad_blade_jp || { 'params' : new Array(), 'complete_map' : new Object() };

(function() {

var param = {'co_account_id' : '13952', 'group_id' : '', 'country_id' : '1', 'ver' : '2.1.0'};

microad_blade_jp.params.push(param);

var src = (location.protocol == 'https:')

? 'https://d-cache.microad.jp/js/blade_track_jp.js' : 'http://d-cache.microad.jp/js/blade_track_jp.js';

var bs = document.createElement('script');

bs.type = 'text/javascript'; bs.async = true;

bs.charset = 'utf-8'; bs.src = src;

var s = document.getElementsByTagName('script')[0];

s.parentNode.insertBefore(bs, s);

})();

-->

</script>

</head>

<body onload="initRollovers();">

<a id="pageBottom" href="#footer">↓</a><div id="novel_header">

<ul id="head_nav">

<li id="login">

<a href="https://ssl.syosetu.com/login/input/"><span class="attention">ログイン</span></a>

</li>

<li><a href="https://ncode.syosetu.com/novelview/infotop/ncode/0/">小説情報</a></li>

<li><a href="https://novelcom.syosetu.com/impression/list/ncode//">感想</a></li>

<li><a href="https://novelcom.syosetu.com/novelreview/list/ncode//">レビュー</a></li>

<li><a href="https://pdfnovels.net/0/" class="menu" target="_blank">縦書きPDF</a></li>

<li>

<a

href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fncode.syosetu.com%2F0%2F&hashtags=narou%2Cnarou0">

<img src="https://static.syosetu.com/novelview/img/Twitter_logo_blue.png?nrkioy" class="menu" style="margin-left:7px; margin-right:7px;" height="20px" />

</a>

<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

</li></ul>

<div id="novelnavi_right">

<div class="toggle" id="menu_on">表示調整</div>

<div class="toggle_menuclose" id="menu_off">閉じる</div>

<div class="novelview_navi">

<img src="https://static.syosetu.com/novelview/img/novelview_on.gif?n7nper" width="100" height="20" style="cursor:pointer;" onclick="sasieclick(true);" id="sasieflag" alt="挿絵表示切替ボタン" />

<script type="text/javascript"><!--

sasieinit();

//--></script>

<div class="color">

▼配色<br />

<label><input type="radio" value="0" name="colorset" />指定なし(作者設定優先)</label><br />

<label><input type="radio" value="1" name="colorset" />標準設定</label><br />

<label><input type="radio" value="2" name="colorset" />ブラックモード</label><br />

<label><input type="radio" value="3" name="colorset" />ブラックモード2</label><br />

<label><input type="radio" value="4" name="colorset" />通常[1]</label><br />

<label><input type="radio" value="5" name="colorset" />通常[2]</label><br />

<label><input type="radio" value="6" name="colorset" />シンプル</label><br />

<label><input type="radio" value="7" name="colorset" />おすすめ設定</label>

</div>

▼メニューバー<br />

<label><input type="checkbox" name="fix_menu_bar" />追従</label>

<span id="menu_off_2">×閉じる</span>

</div><!--novelview_navi-->

</div><!-- novelnavi_right -->

</div><!--novel_header-->

<div id="container">

<div id="contents_main">

<h1>エラー</h1>

<div class="description">

<span class="attention">エラーが発生しました。</span>

<div class="nothing">接続規制:同一IPからの連続したアクセスを検知しサーバが一時的に接続を遮断しました。20秒程度待った上で再度、アクセスしてください。</div>

エラーの原因がわからない場合は<br />

<strong><a href="https://syosetu.com/help/top/" class="help">ヘルプ</a></strong>

<strong><a href="https://syosetu.com/man/touroku/" class="man">各種マニュアル</a></strong>をご確認ください。

</div>

</div><!--contents_main-->

<div class="koukoku_728">

<!--/* VASCO Javascript Tag v */-->

 <script type='text/javascript'><!--//<![CDATA[

    document.MAX_ct0 ='INSERT_CLICKURL_HERE';

 if (location.protocol=='https:') {

 } else {

    var m3_u = 'http://vsc.send.microad.jp/delivery/ajs.php';

    var m3_r = Math.floor(Math.random()*99999999999);

    if (!document.MAX_used) document.MAX_used = ',';

    document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);

    document.write ("?zoneid=16628");

    document.write ('&snr=1&cb=' + m3_r);

    if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);

    document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));

    document.write ("&loc=" + encodeURIComponent(window.location));

    if (document.referrer) document.write ("&referer=" + encodeURIComponent(document.referrer));

    if (document.context) document.write ("&context=" + encodeURIComponent(document.context));

    if ((typeof(document.MAX_ct0) != 'undefined') && (document.MAX_ct0.substring(0,4) == 'http')) {

        document.write ("&ct0=" + encodeURIComponent(document.MAX_ct0));

    }

    if (document.mmm_fo) document.write ("&mmm_fo=1");

    document.write ("'><\/scr"+"ipt>");

 }

 //]]>--></script><noscript><a href='http://vsc.send.microad.jp/delivery/ck.php?n=af67063c&cb=INSERT_RANDOM_NUMBER_HERE' target='_blank'><img src='http://vsc.send.microad.jp/delivery/avw.php?zoneid=16628&cb=INSERT_RANDOM_NUMBER_HERE&n=af67063c&ct0=INSERT_CLICKURL_HERE&snr=1' border='0' alt='' /></a></noscript>

</div><!--koukoku_728-->

<a id="pageTop" href="#main">↑ページトップへ</a>

</div><!--container-->

<!-- フッタここから -->

<div id="footer">

<ul class="undernavi">

<li><a href="https://syosetu.com">小説家になろう</a></li>

</ul>

</div><!--footer-->

<!-- フッタここまで -->

<!-- Google Tag Manager -->

<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-WQ7JDB"

height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>

<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':

new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],

j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=

'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);

})(window,document,'script','dataLayer','GTM-WQ7JDB');</script>

<!-- End Google Tag Manager -->

</body></html>tml>ml>"```
limura commented 6 years ago

なるほど…… わかりました。ありがとうございます。

なお、"HTTP 200 OK" 以外であればエラーとするような変更を加えました。 https://github.com/limura/NovelSpeaker/commit/e82fdc3a8a5a2fe062caed433c4684997e5a868a このエラーを吐いている時に "HTTP 200 OK" 以外を返しているのならエラーでダウンロードが停止すると思います。 まだ試していませんが。

MurtadhaQahtan commented 6 years ago

sorry, I don't understand these things very well. but I hope this problem gets resolved thanks for your great work in advance

limura commented 6 years ago

なお、このエラーメッセージを読む限りにおいては、「小説家になろう」サイトのダウンロード数制限を超えるダウンロードを行っているようです。 正確な値はわかりませんが、同じIPアドレスから10秒間に11回以上のリクエストを行うと、この制限に抵触してしばらくリクエストが全て失敗するという動作をすると記憶しています。

このエラーが出る場合は共有しているIPアドレスを使っているユーザが、小説家になろうのサイトへアクセスしている事が考えられます。 (例えば複数の iOS端末 に NovelSpeaker をインストールして同時にダウンロードしようとするとこの制限に抵触するはずです)

MurtadhaQahtan commented 6 years ago

Ah........ yes, it's exactly as you say. I understand

limura commented 6 years ago

NovelSpeaker は小説家になろうのサイトに対しては10.5秒中に最大10回のダウンロードを試みます。 なので、ダウンロードを試みる端末は一度に一つに絞って運用すればこの問題は概ね回避できると思います。

MurtadhaQahtan commented 6 years ago

So I only need to avoid using two devices at the same time. I understand. Thank you very much

limura commented 6 years ago

貴重な不都合報告ありがとうございました。

それはそれとして、一度ダウンロードされてしまったエラーのHTMLを排除する方法がうまく動いていないのは困り物ですね。 こちらの問題にも対処しようと思いますので、この issue はまだ close しません。

limura commented 6 years ago

確認しました。

一度ダウンロードされたエラーのHTMLを排除する部分は以下の部分です。 https://github.com/limura/NovelSpeaker/blob/e82fdc3a8a5a2fe062caed433c4684997e5a868a/NovelSpeaker/NarouDownloadQueue.m#L414

この部分はHTMLであった場合には該当のページを削除して再度ダウンロードキューに追加するという動作をしています。 先程確認したところ、この部分は正しく動作しているのですが、以下の操作をした場合に一つのページが保存に失敗している事が確認されました。

  1. HTMLがダウンロードされてしまったページを開く
  2. Detail ボタンを押して小説の詳細を開く
  3. Download ボタンを押してその小説のダウンロードを開始する。
    1. でダウンロードが開始されると小説の詳細が閉じられ、小説の内容(HTMLのもの)に戻る

この 4. の時点で開かれているページについては保存しようとするとconflictを起こして保存に失敗しています。原因はまた後で調査しようと思います。

なおこの問題は、1. の時点で開いているページを正常にダウンロードできているページに変更してから 2. 以降の操作をすることで回避できそうです。

limura commented 3 years ago

Version 2.0.0 としてリリースしたのでこのIssueはcloseします。