PCのブラウザでアルファポリス小説を読む人向けのキーボードでページめくりできるスクリプト

PXXN3

文字の大きさ
1 / 1

PCのブラウザで小説を読む人向けのキーボードでページめくりできるスクリプト

しおりを挟む
アルファポリスで小説を読むとき、前の話や次の話を見るには画面の先頭や末尾までスクロールしてクリックする必要があります。

これをいつでもワンキーでできるようにする魔法をこれから紹介します。

① Google Chrome や Firefox などのブラウザをお使いの方は、まず最初にスクリプト実行できる拡張機能を選んで有効にしてください。
JavaScript を inject 実行できる拡張機能ならなんでもよいです。
Chrome では Script Injector や Script Runner Pro など、Firefox なら run-a-script や Injector などといったものが無数にあります。
使いやすく信頼できるものを選んでください。

② 次に以下のスクリプトをコピペして必要なサイトで自動で読み込むように設定してください。

ページめくりスクリプト
///////////////////////////////////////////////////ここから
(() => {
  "use strict";
  const list = [
    { url: 'kakuyomu.jp/works/',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'query',
      link: 'link[rel="prev"]',
    },
    { url: 'kakuyomu.jp/works/',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'query',
      link: 'link[rel="prev"]',
    },
    { url: 'kakuyomu.jp/works/',
      code: 'ArrowRight',
      modifiers: '',
      type: 'query',
      link: 'link[rel="next"]',
    },
    { url: 'kakuyomu.jp/works/',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'query',
      link: 'link[rel="next"]',
    },
    { url: 'kakuyomu.jp/works/',
      code: 'Enter',
      modifiers: '',
      type: 'a',
      link: '続きから読む',
    },
    { url: 'kakuyomu.jp/works/',
      code: 'NumpadEnter',
      modifiers: '',
      type: 'a',
      link: '続きから読む',
    },
    { url: 'https://kakuyomu.jp/my/antenna/works',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'a',
      link: '前へ',
    },
    { url: 'https://kakuyomu.jp/my/antenna/works',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'a',
      link: '前へ',
    },
    { url: 'https://kakuyomu.jp/my/antenna/works',
      code: 'ArrowRight',
      modifiers: '',
      type: 'a',
      link: '次へ',
    },
    { url: 'https://kakuyomu.jp/my/antenna/works',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'a',
      link: '次へ',
    },
    { url: 'kakuyomu.jp/',
      code: 'BracketLeft',
      modifiers: '',
      type: 'url',
      link: 'https://kakuyomu.jp/my',
    },
    { url: 'kakuyomu.jp/',
      code: 'Numpad3',
      modifiers: '',
      type: 'url',
      link: 'https://kakuyomu.jp/my',
    },
    { url: 'kakuyomu.jp/',
      code: 'BracketRight',
      modifiers: '',
      type: 'url',
      link: 'https://kakuyomu.jp/my/antenna/works',
    },
    { url: 'kakuyomu.jp/',
      code: 'Numpad2',
      modifiers: '',
      type: 'url',
      link: 'https://kakuyomu.jp/my/antenna/works',
    },
    { url: 'syosetu.com/',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'query',
      link: 'a.c-pager__item--before',
    },
    { url: 'syosetu.com/',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'query',
      link: 'a.c-pager__item--before',
    },
    { url: 'syosetu.com/',
      code: 'ArrowRight',
      modifiers: '',
      type: 'query',
      link: 'a.c-pager__item--next',
    },
    { url: 'syosetu.com/',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'query',
      link: 'a.c-pager__item--next',
    },
    { url: 'syosetu.com/favnovelmain',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'query',
      link: 'a.c-up-pager__item[title*="前"]',
    },
    { url: 'syosetu.com/favnovelmain',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'query',
      link: 'a.c-up-pager__item[title*="前"]',
    },
    { url: 'syosetu.com/favnovelmain',
      code: 'ArrowRight',
      modifiers: '',
      type: 'query',
      link: 'a.c-up-pager__item[title*="次"]',
    },
    { url: 'syosetu.com/favnovelmain',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'query',
      link: 'a.c-up-pager__item[title*="次"]',
    },
    { url: 'syosetu.com/impression/',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'query',
      link: 'a[title="前のページ"]',
    },
    { url: 'syosetu.com/impression/',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'query',
      link: 'a[title="前のページ"]',
    },
    { url: 'syosetu.com/impression/',
      code: 'ArrowRight',
      modifiers: '',
      type: 'query',
      link: 'a[title="次のページ"]',
    },
    { url: 'syosetu.com/impression/',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'query',
      link: 'a[title="次のページ"]',
    },
    { url: 'syosetu.com/impression/',
      code: 'ArrowLeft',
      modifiers: '+',
      type: 'dec',
      re: '\/no\/(\\d+)\/.*',
      str: '/no/$$/',
    },
    { url: 'syosetu.com/impression/',
      code: 'NumpadSubtract',
      modifiers: '+',
      type: 'dec',
      re: '\/no\/(\\d+)\/.*',
      str: '/no/$$/',
    },
    { url: 'syosetu.com/impression/',
      code: 'ArrowRight',
      modifiers: '+',
      type: 'inc',
      re: '\/no\/(\\d+)\/.*',
      str: '/no/$$/',
    },
    { url: 'syosetu.com/impression/',
      code: 'NumpadAdd',
      modifiers: '+',
      type: 'inc',
      re: '\/no\/(\\d+)\/.*',
      str: '/no/$$/',
    },
    { url: 'syosetu.com/',
      code: 'Enter',
      modifiers: '',
      type: 'query',
      link: 'div.p-novel__bookmarker-no > a',
    },
    { url: 'syosetu.com/',
      code: 'NumpadEnter',
      modifiers: '',
      type: 'query',
      link: 'div.p-novel__bookmarker-no > a',
    },
    { url: 'syosetu.com/',
      code: 'Enter',
      modifiers: '',
      type: 'queryclick',
      link: 'input[name*="siori_url"]',
    },
    { url: 'syosetu.com/',
      code: 'NumpadEnter',
      modifiers: '',
      type: 'queryclick',
      link: 'input[name*="siori_url"]',
    },
    { url: 'syosetu.com/',
      code: 'BracketLeft',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/user/top/',
    },
    { url: 'syosetu.com/',
      code: 'Numpad3',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/user/top/',
    },
    { url: 'syosetu.com/',
      code: 'BracketLeft',
      modifiers: '+',
      type: 'url',
      link: 'https://syosetu.com/xuser/top/',
    },
    { url: 'syosetu.com/',
      code: 'Numpad6',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/xuser/top/',
    },
    { url: 'syosetu.com/',
      code: 'BracketRight',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/favnovelmain/list/',
    },
    { url: 'syosetu.com/',
      code: 'Numpad2',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/favnovelmain/list/',
    },
    { url: 'syosetu.com/',
      code: 'BracketRight',
      modifiers: '+',
      type: 'url',
      link: 'https://syosetu.com/favnovelmain18/list/',
    },
    { url: 'syosetu.com/',
      code: 'Numpad5',
      modifiers: '',
      type: 'url',
      link: 'https://syosetu.com/favnovelmain18/list/',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'ArrowLeft',
      modifiers: '',
      type: 'a',
      link: '前の話',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'NumpadSubtract',
      modifiers: '',
      type: 'a',
      link: '前の話',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'ArrowRight',
      modifiers: '',
      type: 'a',
      link: '次の話',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'NumpadAdd',
      modifiers: '',
      type: 'a',
      link: '次の話',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'Enter',
      modifiers: '',
      type: 'a',
      link: '続きから読む',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'NumpadEnter',
      modifiers: '',
      type: 'a',
      link: '続きから読む',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'Enter',
      modifiers: '',
      type: 'queryclick',
      link: 'span.bookmark.enabled',
    },
    { url: 'www.alphapolis.co.jp/novel/',
      code: 'NumpadEnter',
      modifiers: '',
      type: 'queryclick',
      link: 'span.bookmark.enabled',
    },
    { url: 'www.alphapolis.co.jp/',
      code: 'BracketLeft',
      modifiers: '',
      type: 'url',
      link: 'https://www.alphapolis.co.jp/mypage/content',
    },
    { url: 'www.alphapolis.co.jp/',
      code: 'Numpad3',
      modifiers: '',
      type: 'url',
      link: 'https://www.alphapolis.co.jp/mypage/content',
    },
    { url: 'www.alphapolis.co.jp/',
      code: 'BracketRight',
      modifiers: '',
      type: 'url',
      link: 'https://www.alphapolis.co.jp/mypage/favorite',
    },
    { url: 'www.alphapolis.co.jp/',
      code: 'Numpad2',
      modifiers: '',
      type: 'url',
      link: 'https://www.alphapolis.co.jp/mypage/favorite',
    },
  ];
  const excludeList = [
    ['kakuyomu.jp/my/works/', 'new'],
    ['kakuyomu.jp/my/works/', 'edit'],
    ['kakuyomu.jp/my/works/', 'episodes'],
    ['syosetu.com/user', 'input'],
    ['www.alphapolis.co.jp/mypage/novel/save'],
    ['x.com'],
  ];
  function eKeyHandler(e) {
    switch (e.target.tagName.toLowerCase()) {
    case 'input':
    case 'textarea':
    case 'select':
      // disable while input
      return;
    }
    let url = location.href;
    for (let i=excludeList.length-1; i>=0; i--) {
      let l = excludeList[i];
      let r = true;
      for (let j=l.length-1; j>=0; j--) {
        if (!url.includes(l[j])) { r = false; break; }
      }
      if (r) return;
    }
    if (e.code == 'Escape') {
      let msg = document.getElementById('_msgFrame');
      if (msg != null) {
        document.body.removeChild(msg);
      }
      return;
    }
    let found = false;
    for (let i=list.length-1; i>=0; i--) {
      let l = list[i];
      if (url.includes(l.url)
       && l.code == e.code
       && l.modifiers.includes('+') == e.shiftKey
       && l.modifiers.includes('^') == e.ctrlKey
       && l.modifiers.includes('!') == e.altKey
       && l.modifiers.includes('#') == e.metaKey) {
        switch (l.type) {
        case 'a': // search <a> with content matched in innerHTML and jump
          {
            let els = document.getElementsByTagName('a');
            for (let j=els.length-1; j>=0; j--) {
              if (els[j].innerHTML.includes(l.link)) {
                location.href = els[j].href;
                return;
              }
            }
          }
          break;
        case 'aclick': // search <a> with content matched in innerHTML and click
          {
            let els = document.getElementsByTagName('a');
            for (let j=els.length-1; j>=0; j--) {
              if (els[j].innerHTML.includes(l.link)) {
                els[j].click();
                return;
              }
            }
          }
          break;
        case 'query': // search by query and jump
          {
            let el = document.querySelector(l.link);
            if (el) {
              location.href = el.href;
              return;
            }
          }
          break;
        case 'queryclick': // search by query and click
          {
            let el = document.querySelector(l.link);
            if (el) {
              el.click();
              return;
            }
          }
          break;
        case 'url': // jump to url
          location.href = l.link;
          return;
        case 'inc': // increase number
          location.href = url.replace(new RegExp(l.re), (match, p1) => l.str.replace('$$', Number(p1) + 1));
          return;
        case 'dec': // decrease number
          location.href = url.replace(new RegExp(l.re), (match, p1) => l.str.replace('$$', Number(p1) - 1));
          return;
        }
        found = true;
      }
    }
    if (found) {
      let msg = document.getElementById('_msgFrame');
      if (msg == null) {
        let tmp = document.createElement('div');
        tmp.id = '_msgFrame';
        tmp.style.display = 'flex';
        tmp.style.justifyContent = 'center';
        tmp.style.alignItems = 'center';
        tmp.style.position = 'fixed';
        tmp.style.top = '60px';
        tmp.style.right = '60px';
        tmp.style.width = '400px';
        tmp.style.height = '100px';
        tmp.style.pointerEvents = 'none';
        tmp.style.backgroundColor = '#fffa';
        tmp.style.color = 'red';
        tmp.style.fontSize = '72px';
        tmp.innerText = 'Not Found';
        document.body.appendChild(tmp);
      }
    }
  }
  document.addEventListener("keydown", eKeyHandler, false);
})();
///////////////////////////////////////////////////ここまで

操作方法
・カーソルキー左、またはテンキーのマイナス⇒前の話を表示
・カーソルキー右、またはテンキーのプラス⇒次の話を表示
・表紙でEnterキー、またはテンキーのEnterキー⇒現在読んでいるページを表示
・各話でEnterキー、またはテンキーのEnterキー⇒しおりを挟む
・@キー、またはテンキーの3⇒小説・漫画の投稿を表示
・[キー、またはテンキーの2⇒お気に入りを表示
・操作が失敗したとき「Not Found」と表示する
・Escキーで「Not Found」を消す

カクヨム、なろう(感想欄含む)、アルファポリスに対応しています。
JavaScript がわかる人はキーをカスタマイズするなどして自分の使いやすいように改造してください。

ご質問があればお気軽にどうぞ。
しおりを挟む
感想 0

この作品の感想を投稿する

あなたにおすすめの小説

アルファポリスとカクヨムってどっちが稼げるの?

無責任
エッセイ・ノンフィクション
基本的にはアルファポリスとカクヨムで執筆活動をしています。 どっちが稼げるのだろう? いろんな方の想いがあるのかと・・・。 2021年4月からカクヨムで、2021年5月からアルファポリスで執筆を開始しました。 あくまで、僕の場合ですが、実データを元に・・・。

投稿インセンティブで月額23万円を稼いだ方法。

克全
エッセイ・ノンフィクション
「カクヨム」にも投稿しています。

とある男の包〇治療体験記

moz34
エッセイ・ノンフィクション
手術の体験記

24hポイントが0だった作品を削除し再投稿したらHOTランキング3位以内に入った話

アミ100
エッセイ・ノンフィクション
私の作品「乙女ゲームのヒロインに転生、科学を駆使して剣と魔法の世界を生きる」がHOTランキング入り(最高で2位)しました、ありがとうございますm(_ _)m この作品は2年ほど前に投稿したものを1度削除し、色々投稿の仕方を見直して再投稿したものです。 そこで、前回と投稿の仕方をどう変えたらどの程度変わったのかを記録しておこうと思います。 「投稿時、作品内容以外でどこに気を配るべきなのか」の参考になればと思いますm(_ _)m

アルファポリスの禁止事項追加の件

黒いテレキャス
エッセイ・ノンフィクション
アルファポリスガイドライン禁止事項が追加されるんでガクブル

カクヨムでアカウント抹消されました。

たかつき
エッセイ・ノンフィクション
カクヨムでアカウント抹消された話。

アルファポリスであなたの良作を1000人に読んでもらうための25の技

MJ
エッセイ・ノンフィクション
アルファポリスは書いた小説を簡単に投稿でき、世間に公開できる素晴らしいサイトです。しかしながら、アルファポリスに小説を公開すれば必ずしも沢山の人に読んでいただけるとは限りません。 私はアルファポリスで公開されている小説を読んでいて気づいたのが、面白いのに埋もれている小説が沢山あるということです。 すごく丁寧に真面目にいい文章で、面白い作品を書かれているのに評価が低くて心折れてしまっている方が沢山いらっしゃいます。 そんな方に言いたいです。 アルファポリスで評価低いからと言って心折れちゃいけません。 あなたが良い作品をちゃんと書き続けていればきっとこの世界を潤す良いものが出来上がるでしょう。 アルファポリスは本とは違う媒体ですから、みんなに読んでもらうためには普通の本とは違った戦略があります。 書いたまま放ったらかしではいけません。 自分が良いものを書いている自信のある方はぜひここに書いてあることを試してみてください。

野球部の女の子

S.H.L
青春
中学に入り野球部に入ることを決意した美咲、それと同時に坊主になった。

処理中です...