honjarake blog

自分用にテキトーにまとめる

自分用 VectorDirectDLのリンクをファイルの直リンクに差し替えるやつ

変更元は
VectorDirectDL
二重にajaxでGETすることになる事と、テストを一個のページでしかしていない事に注意
重大なミス:複数バージョン存在するときの直リンクに不備有り 要修正

// ==UserScript==
// @name        VectorDirectDL
// @description Vectorのページにダウンロードボタンを追加する
// @version     2.0
// @namespace   phodra
// @include     http://www.vector.co.jp/soft/*
// @exsample    http://www.vector.co.jp/soft/dl/win95/util/se169348.html
// @exsample    http://www.vector.co.jp/soft/dl/winnt/util/se100730.html
// @original    https://greasyfork.org/ja/scripts/7501-vectordirectdl
// ==/UserScript==
/* add //↓ファイル直リンクに入れ替え ~ //↑ファイル直リンクに入れ替え */
(function () {
  // リンクを追加する関数
  var AppendLink = function (page)
  {
    var $page = $(page);
    // 挿入箇所
    $inspos = $('h1');
    // ダウンロードボタンと名前を取得
    $btns = $page.find('a.btn.download');
    $names = $page.find('td>strong.fn');
    if ($names.size() == $btns.size())
    {
      for (i = 0; i < $btns.size(); i++)
      {
        // ダウンローページヘのダイレクトリンクを作成
        var $link = $('<a class=\'downloadlink\'/>');
        $link.text($names.eq(i).text());
        $link.attr('href', $btns.eq(i).attr('href'));
        //↓ファイル直リンクに入れ替え
        $.ajax({
          type: 'GET',
          url: $btns.eq(i).attr('href'),
          success: function (data) {
            var $data = $(data);
            $elm = $data.find('#summary a');
            if ($elm.size() > 0)
            {
              //alert($elm[0]);
              $link.attr('href', $elm[0]);
            }
          }
        });
        //↑ファイル直リンクに入れ替え
        // ソフト名の下に挿入
        $inspos.after($link);
        $inspos.after(' ');
      }
    }
  };
  // ダウンロードタブのエレメント
  var $dltab = $('#v_step>.download');
  if ($dltab.size() > 0)
  {
    // ダウンロードタブページを取得
    $.ajax({
      type: 'GET',
      url: $dltab.attr('href'),
      beforeSend: function (xhr) {
        xhr.overrideMimeType('text/html; charset=Shift_JIS');
      },
      success: function (data) {
        AppendLink(data);
      }
    });
  } 
  else
  {
    // すでにダウンロードタブページの場合
    AppendLink(document);
  }
}) ();

自分用 select option を使った検索ボックス他

greasemonkey 自分用ソースコードまとめ2 - honjarake blog

// ==UserScript==
// @name            test item
// @namespace       http://espion.just-size.jp/archives/05/136155838.html
// @description     code test
// @grant           none
// @include         *
// @exclude         https://apis.google.com/*
// ==/UserScript==
window.load = (function () {
  //----------------------------------------
  //console.log('test item 1 start');
  //----------------------------------------
  if (window != parent) {
    //iframeで埋めこまれた場合の処理
    return;
  }
  var ElemDiv = document.createElement('div');
  //var Docbody = document.body;
  var Docbody = document.getElementsByTagName('body') [0];
  var t_code;
  //===============================================
  var m_div = ElemDiv.cloneNode(true);
  m_div.id = 'm_div';
  Docbody.insertBefore(m_div, Docbody.firstChild);
  t_code = '';
  t_code += '<ul>';
  //t_code += '     <li><label id="lbB">youtube:</label><input type="text" id="tbB"></input><input type="button" id ="bB"></input>';
  t_code += '     <li><label id="lbc">google</label><input type="text" id="tbC"></input><input type="button" id ="bC"></input>';
  t_code += '     <li><select id="sel_s"></select><input type="text" id="tb_sels"></input><input type="button" id="b_sels"></input>';
  t_code += '</ul>';
  //----------------------------------------
  m_div.innerHTML += t_code;
  //----------------------------------------
  var m_list = m_div.getElementsByTagName('li');
  //--------------------------------------------------------------
  var styleTag = document.createElement('style');
  styleTag.type = 'text/css';
  //----------------------------------------
  t_code = '';
  t_code += '#m_div{ position: fixed; z-index: 999; top:300px; width:205px; left:-200px; text-align:left; padding:1px; background: #FFF8DC; font-size:10px;}' + '\n';
  t_code += '#m_div:hover{ position: fixed; z-index: 999; top:300px; left:0px; padding:1px; background: #dedeff; }' + '\n';
  t_code += '#m_div input[type="text"]{ width:100px !important; margin:2px 2px 5px 5px; }' + '\n';
  //----------------------------------------
  var t_node = document.createTextNode(t_code);
  styleTag.appendChild(t_node);
  //----------------------------------------
  var headerTag = document.getElementsByTagName('head') [0];
  if (!headerTag) alert('header is nothing');
  headerTag.appendChild(styleTag);
  //----------------------------------------
  //console.log('test item 1 end');
  //----------------------------------------
  /*
  var bB = document.getElementById('bB');
  bB.value = 'repeat';
  bB.onclick = function () {
    var tbB = document.getElementById('tbB');
    var re = /http.*:\/\/www.youtube.*\/watch/;
    var found = location.href.match(re);
    if (found) {
      tbB.value = location.href.replace('youtube', 'youtuberepeat');
      document.location = tbB.value;
    } else {
      tbB.value = 'not youtube video';
    }
  }
  */
  var bc = document.getElementById('bC');
  bc.value = 'search';
  bc.onclick = function () {
    var tbc = document.getElementById('tbC');
    if (tbc.value != '') {
      window.open('https://www.google.co.jp/search?q=site:' + document.location.hostname + ' ' + tbC.value);
    }
  };
  // 汎用focus-blur -------------------------
  function tbonfocus() {
    var b = document.getElementById('m_div');
    b.style.left = 0;
  };
  function tbonblur() {
    var b = document.getElementById('m_div');
    if (b.style.removeProperty) {
      b.style.removeProperty('left');
    }
    if (b.style.removeAttribute) {
      b.style.removeAttribute('left');
    }
  };
  // ----------------------------------------
  var tbc = document.getElementById('tbC');
  tbc.onfocus = tbonfocus;
  tbc.onblur = tbonblur;
  // select
  // <select id="sel_s"></select>
  // <input type="text" id="tb_sels"></input>
  // <input type="button" id="b_sels"></input>
  var url = {
    monst: 'http://モンスターストライク.gamewith.jp/search/results?query=',
    twitter: 'http://t-proj.com/twitter/?q=',
  };
  var sels = document.getElementById('sel_s');
  var elopt = document.createElement('option');
  for (key in url) {
    //alert(key + ' : ' + url[key]);
    var opt = elopt.cloneNode();
    opt.id = 'sel_' + key;
    opt.innerHTML = key;
    opt.setAttribute('value', key);
    sels.appendChild(opt);
  }
  var bsels = document.getElementById('b_sels');
  var tbsel = document.getElementById('tb_sels');
  bsels.value = '探す';
  bsels.onclick = function () {
    var tbsel = document.getElementById('tb_sels');
    if (tbsel.value != '') {
      var strSelect = sels.options[sels.selectedIndex].text;
      //alert(url[strSelect]);
      window.open(url[strSelect] + tbsel.value);
    }
  };
  tbsel.onfocus = tbonfocus;
  tbsel.onblur = tbonblur;
  sels.onfocus = tbonfocus;
  sels.onblur = tbonblur;
  if (document.addEventListener) {
    // キーボードを押したときに実行されるイベント
    document.addEventListener('keydown', function (e) {
      var keyID = (e.keyCode)? e.keyCode: e.charCode;
      if (document.activeElement.id == 'tb_sels') {
        if (keyID == 13) {
          bsels.onclick();
        }
      }
    });
  }
  // ----------------------------------------

}) ();

リンクを(略)別窓で開くやつの自分用修正版

リンクをすっきりした別窓で開くやつ グリモン - honjarake blog

// ==UserScript==
// @name        リンクをすっきりした別窓で開くやつ
// @namespace   http://honjarake.hatenablog.jp/
// @include     http://comic-walker.com/contents/detail/*
// @include     http://seiga.nicovideo.jp/my/manga/favorite
// @include     http://www.alphapolis.co.jp/manga/viewOpening/*
// @include     http://www.mangaz.com/book/*
// @include     http://tonarinoyj.jp/manga/*
// @version     0.0.1
// @grant       none
// ==/UserScript==
$("a[href*='/view'], a[href*='/watch'], a[href*='/navi'], a[href*='viewer']").click(function (e) {
    e.preventDefault();
    window.open($(this).attr('href'), 'comic_viewer', 'fullscreen=1, menubar=no, toolbar=no, scrollbars=yes');
});

自分用 ニコニコ動画 ユーザーIDで動画探すリンク(ニコチャートURL変換)

// ==UserScript==
// @name        nico user video search link
// @namespace   us0305
// @include     http://www.nicovideo.jp/user/*
// @version     0.0.0.1
// @grant       none
// ==/UserScript==
(function () {
  var patURI = 'nicovideo';
  var repURI = 'nicochart';
  var tergetID = 'watchRegisterBtn';
  
  var ElmAnc = document.createElement('a');
  var AddBase = document.getElementById(tergetID);
  if (AddBase) {
    ElmAnc.text = '◆ユーザーIDで動画を検索する(nico chart)';
    ElmAnc.id = 'openNicoChart';
    ElmAnc.href = location.href.replace(patURI, repURI).replace(/\?.*$/,'');
    AddBase.parentNode.insertBefore(ElmAnc, AddBase.nextSibling); 
  }
})();

リンクをすっきりした別窓で開くやつ グリモン

WEBコミック等をよく見るけど
リンクを新しいタブで開く設定になっているときに
ツールバーやアドオンのせいでページの高さが窮屈になることが多いので
新しくツールバー等を取り去ったウィンドウを開くスクリプトを書いてみる
リンクはa(アンカー)タグを使っている場合、限定。

// ==UserScript==
// @name        リンクをすっきりした別窓で開くやつ
// @namespace   http://honjarake.hatenablog.jp/
// @include     !ここに適応するurl!例:http://comic-walker.com/contents/detail/*
// @version     0.0.1
// @grant       none
// ==/UserScript==
$("a[href*='/viewer']").click(function (e) {
    e.preventDefault();
    window.open($(this).attr('href'), 'comic_viewer', 'fullscreen=1, menubar=no, toolbar=no, scrollbars=yes');
});

jqueryなので、簡素な作り

$("a[href*='/viewer']").click

↑aタグのhrefに/viewer(別窓で開くリンクを限定する為のキーワード)を含むリンクをクリックした場合

e.preventDefault();

↑aタグ本来のイベントをキャンセルして

window.open($(this).attr('href'), 'comic_viewer', 'fullscreen=1, menubar=no, toolbar=no, scrollbars=yes');

↑フルスクリーンでメニューバー・ツールバーなしのウィンドウを開く

Javascriptあれこれ - Javascriptでのクラス?

月日が経つのは早い
ここ数ヶ月、たまに自分で書いたスクリプトソースコードを見つつ
これからどうやって書いていこうかなと思って放置していた
いくつか気になる記事があったので、記録しておく

調べていると、prototypeの記述を良く見かける
相変わらず、基本的なことがわかってない状態だけど…

現状、greasemonkey用のコードしか書かないとはいえ
publicで書いていて他のスクリプトの変数・関数名と衝突することがあるのかとか
色々と気になってはいるけど、unsafeWindow等使わなければ、この場合は問題起こらないのかな

データベース設計で言うなら、第一正規化に入ったぐらいどころか
そもそも非正規形状の項目の把握があやふやな段階のなのかもしれない

ニコニコ動画概要から動画リンクだけ抽出して表示するスクリプト

ノートPC買おう…

前回のスクリプトと同時進行で作っていたモノ(暫定

これからの課題

  • windowのresize(拡大縮小を交互に速めに行う)で動画プレイヤーが右にずれていく問題
    • 現時点で、ブラウザの全画面表示、サイズ変更でリセットされるのを確認
      最悪、ツールチップやメッセージでその旨を表示して対応
  • 疑似クラス化
    • 今は困難。一個、一から作って試す必要あり。
  • 次の動画、前の動画の表示が実際のpart数と異なるパターンが存在する
    • 動画が修正版や再アップの場合は正確に取得できない('/watch/sm数字'の数字部分の大小だけで表示する動画を決定している為)
      動画説明の動画すべて載せるように修正した方が早い

以下、ソースコード

続きを読む