「差分追加のファイル読込み」を導入
前ページのツール「Similar Filter」は、「Ranking Blocker」とブロックデータを共有しますが、そのためには相互のデータファイル交換が必要です。
従来の「Ranking Blocker」は「差分追加」の「ファイル読込み」の機能がありませんでした。「差分追加」は読込んだファイルのデータの中から、現在に無いデータのみを選別して追加する方式です。「Similar Filter」で指定されたブロックデータを「Ranking Blocker」で利用するには、この機能が必須です。
「Similar Filter」「Ranking Blocker」の両方で「差分追加」の「ファイル読込み」ができる事で、データ共有の環境が完成します。
更新した「ファイル読込み」部のコード
今回の「ver. 1.6」で、更新したコードは以下です。
「Ranking Blocker」 ver. 1.6 189行~
配列「block_id」はフィルターの実体です。 従来は、ファイル保存した「block_id」を直接読込んでいましたが、これでは、それまでの蓄積データが上書き(置換え)られ失われます。 そこで、ファイル読込み時に、仮のデータ配列「data_in」として読込み、太字のコードで、現在の「block_id」に無く「data_in」にだけあるデータ(差分)を、「block_id」に追加する操作をしています。
▪「Similar Filter」と「Ranking Blocker」のデータ共有をカバーするために、今後は「差分追加」がデフォルトの「ファイル読込み」の仕様になります。
▪ 必要は少ないと思いますが、読込んだファイルのデータで現在のデータを上書きしたい場合は、「差分追加」のチェックを外してから「ファイル読込み」を行います。
「Ranking Blocker」の使い方
以下のページに操作マニュアルを纏めています。
「Ranking Blocker」を利用するには
「Ranking Blocker」は Chrome / Edge / Firefox のブラウザ上で動作します。
このツールは、「Ameblo Rankings Viewer Ⅱ」というスタイルでアレンジしたランキングページ上で動作し、このアレンジは必須です。 以下に、ページアレンジとスクリプト導入の環境設定の手順を説明します。
(A) 拡張機能「Stylus」と「Ameblo Rankings Viewer Ⅱ」の入手
A-❶ 拡張機能「Stylus」の導入
「Ameblo Rankings Viewer Ⅱ」のアレンジを実現するには、使用されているブラウザに拡張機能「Stylus」を導入する必要があります。(既にこの拡張機能を導入している場合は、A-❶の手順は不要です)
拡張機能「Stylus」を導入する手順は、以下のリンクを参照ください。 (新EdgeはChrome版が使えます)
A-❷「Ameblo Rankings Viewer Ⅱ」の入手
「Ameblo Rankings ViewerⅡ」は、以下のページから入手できます。
このリンク先は、下の様なページです。
サンプル画像の下の install ボタンを押します。
この操作で「Stylus」のインストール画面が表示されます。 下の画面の左上にある「インストール {S}」のボタンをもう一度押します。
「スタイルがインストールされています」と表示されたら、この画面を閉じます。 以上で「Ameblo Rankings ViewerⅡ」のインストールが完了です。
(B) 拡張機能「Tampermonkey」と「Ranking Blocker」の導入
B-❶ 拡張機能「Tampermonkey」の導入
「Tampermonkey」は、使用しているブラウザに適した版を導入する必要があります。(既にこの拡張機能を導入している場合は、B-❶の手順は不要です)
「Tampermonkey」の導入手順は、以下のページを参照ください。
B-❷「Ranking Blocker」のインストール
●「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
●「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
● 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
●「Ranking Blocker」の旧バージョンがある場合は、削除してください。
〔 Ranking Blocker 〕ver. 1.6
// ==UserScript== // @name Ranking Blocker // @namespace http://tampermonkey.net/ // @version 1.6 // @description 不要なランキングノミネートの非表示 // @author Ameba Blog User // @match https://blogger.ameba.jp/genres/* // @match https://blogger.ameba.jp/hashtags/* // @match https://blogger.ameba.jp/ranking/* // ==/UserScript== let block_id=[]; let read_json=localStorage.getItem('RankingBlock_ID'); // ローカルストレージ保存名 block_id=JSON.parse(read_json); if(block_id==null){ block_id=['tmp1','%Ameba-ID']; } let block_filter=block_id.join('|'); let block_regex=RegExp(block_filter); let edit_mode; // Ranking Blocker の動作モード edit_mode=localStorage.getItem('RankingBlock_mode'); // ローカルストレージ保存名 if(edit_mode!=0 && edit_mode!=1){ edit_mode=0; localStorage.setItem('RankingBlock_mode', 0); } // edit_mode 初期値「0」 let retry=0; let interval=setInterval(wait_target, 100); function wait_target(){ retry++; if(retry>10){ // リトライ制限 10回 1sec clearInterval(interval); } let target=document.querySelector('.-ameblo-cmnhf-logo a'); // 監視 target if(target){ clearInterval(interval); setter(); }} function setter(){ let help_url='https://ameblo.jp/personwritep/entry-12757564496.html'; let help_SVG= '<svg class="help_rb" viewBox="0 0 210 220">'+ '<path d="M89 22C71 25 54 33 41 46C7 81 11 142 50 171C58 177 '+ '68 182 78 185C90 188 103 189 115 187C126 185 137 181 146 175'+ 'C155 169 163 162 169 153C190 123 189 80 166 52C147 30 118 18'+ ' 89 22z" style="fill:#000;"></path>'+ '<path d="M67 77C73 75 78 72 84 70C94 66 114 67 109 83C106 91'+ ' 98 95 93 101C86 109 83 116 83 126L111 126C112 114 122 108 1'+ '29 100C137 90 141 76 135 64C127 45 101 45 84 48C80 49 71 50 '+ '68 54C67 56 67 59 67 61L67 77M85 143L85 166L110 166L110 143L'+ '85 143z" style="fill:#fff;"></path>'+ '</svg>'; let help_rb= '<a href="'+ help_url +'" target="_blank" rel="noopener">'+ help_SVG +'</a>'+ '<style>'+ '.help_rb { position: absolute; right: 12px; top: 3px; '+ 'height: 24px; width: 24px; cursor: pointer; }</style>'; let ambHeader=document.querySelector('#ambHeader'); if(ambHeader && !document.querySelector('.help_rb')){ ambHeader.insertAdjacentHTML('beforeend', help_rb); } let rb_style= '<style class="RB_style">'+ '.-ameblo-cmnhf-logo { width: 66px; padding-left: 7px; cursor: pointer; '+ 'outline: #028d9f solid 1px; outline-offset: -2px; border-radius: 3px; }'+ '.-ameblo-cmnhf-logo a { pointer-events: none; }'+ '.RB_sw { position: absolute; top: 4px; left: -40px; font: bold 10px Meiryo; '+ 'padding: 5px 2px 4px; border: 1px solid #aaa; background: #fff; '+ 'cursor: pointer; display: none; }'+ '.RB_sw.I { top: 0 !important; left: 4px !important; } '+ '.RB_item.I { position: relative; }'+ '.RB_sw.B:hover { color: red; }'+ '.RB_sw.U:hover { color: #26c6da; }'+ '.RB_item:hover .RB_sw, .RB_itemI:hover .RB_sw { display: block; }'+ '</style>'; if(!document.querySelector('.RB_style')){ document.body.insertAdjacentHTML('beforeend', rb_style); } let logo_sw=document.querySelector('.-ameblo-cmnhf-logo'); if(edit_mode==0){ logo_sw.style.outlineColor='#028d9f'; logo_sw.style.background='#fff'; } else{ logo_sw.style.outlineColor='#fff'; logo_sw.style.background='red'; } logo_sw.addEventListener('click', function(event){ event.preventDefault(); if (event.ctrlKey==true){ menu(); } else{ emode_set(); }}, false); hiliter(); } // setter() function menu(){ let ua=0; let agent=window.navigator.userAgent.toLowerCase(); if(agent.indexOf('firefox') > -1){ ua=1; } let inner= '<div id="file_menu">'+ '<input id="button0" type="submit" value="✖ 閉じる">'+ '<input id="button1" type="submit" value="ブロックデータを保存">'+ '<input id="button_add" type="checkbox">'+ '<span id="button_add_label">差分追加</span>'+ '<input id="button2" type="file">'+ '<input id="id_box" type="text">'+ '<input id="button3" type="submit" value="Set">'+ '<style>'+ '#file_menu { position: fixed; top: 0; left: 0; width: 100%; padding: 0 25px; '+ 'box-sizing: border-box; white-space: nowrap; background: #82bddc; }'+ '#file_menu input { font: normal 14px/24px Meiryo; } '+ '#button_add { margin: 0 5px 0 60px; width: 15px; height: 15px; '+ 'vertical-align: -5px; } '+ '#button_add_label { font-size: 15px; vertical-align: -3px; }'; if(ua==0){ inner+= '#button0, #button3 { padding: 2px 6px 0; margin: 9px 0; }'+ '#button1 { padding: 2px 8px 0; margin: 9px 0 9px 40px; }'+ '#button2 { margin: 9px 20px 9px 10px; width: 280px; }'+ '#id_box { height: 20px; width: 200px; padding: 3px 6px 0; }'; } if(ua==1){ inner+= '#button0, #button3 { padding: 0 6px; margin: 9px 0; height: 27px; }'+ '#button1 { padding: 0 8px; margin: 9px 0 9px 40px; height: 27px; }'+ '#button2 { margin: 9px 20px 9px 10px; width: 280px; }'+ '#id_box { height: 21px; width: 200px; padding: 2px 6px 0; }'; } inner+='</style></div>'; if(!document.querySelector('#file_menu')){ document.body.insertAdjacentHTML('beforeend', inner); } let file_menu=document.querySelector('#file_menu'); if(file_menu){ let button0=document.querySelector('#button0'); if(button0){ button0.onclick=function(){ file_menu.remove(); }} let button1=document.querySelector('#button1'); if(button1){ button1.onclick=function(){ let write_json=JSON.stringify(block_id); let blob=new Blob([write_json], {type: 'application/json'}); let a=document.createElement("a"); a.href=URL.createObjectURL(blob); document.body.appendChild(a); a.download='ranking_bl.json'; a.click(); document.body.removeChild(a); URL.revokeObjectURL(a.href); }} let button_add=document.querySelector('#button_add'); button_add.checked=true; let button2=document.querySelector('#button2'); if(button2){ button2.addEventListener("change" , function(){ if(!(button2.value)) return; // ファイルが選択されない場合 let file_list=button2.files; if(!file_list) return; // ファイルリストが選択されない場合 let file=file_list[0]; if(!file) return; // ファイルが無い場合 let file_reader=new FileReader(); file_reader.readAsText(file); file_reader.onload=function(){ if(file_reader.result.slice(0, 7)=='["tmp1"'){ // ranking_bl.jsonの確認 let data_in=JSON.parse(file_reader.result); if(button_add.checked==true){ // 差分追加処理 for(let k=0; k<data_in.length; k++){ if(block_regex.test(data_in[k])==false){ // ID未出なら追加 block_id.push(data_in[k]); }}} else{ block_id=data_in; } // 読込み上書き処理 let write_json=JSON.stringify(block_id); localStorage.setItem('RankingBlock_ID', write_json); // ストレージ保存名 location.reload(); }}; }); } let id_box=document.querySelector('#id_box'); let button3=document.querySelector('#button3'); if(id_box && button3){ let ameba_id=block_id[1]; ameba_id=ameba_id.replace('%', ''); id_box.value=ameba_id; button3.onclick=function(){ block_id[1]='%'+ id_box.value; let write_json=JSON.stringify(block_id); localStorage.setItem('RankingBlock_ID', write_json); // ストレージ保存名 id_box.style.background='#bdfff9'; setTimeout(()=>{ id_box.style.background=''; hiliter(); }, 1000); }} } } // menu() function emode_set(){ let logo_sw=document.querySelector('.-ameblo-cmnhf-logo'); if(edit_mode==0){ edit_mode=1; localStorage.setItem('RankingBlock_mode', 1); logo_sw.style.outlineColor='#fff'; logo_sw.style.background='red'; blocker(); } else if(edit_mode==1){ edit_mode=0; localStorage.setItem('RankingBlock_mode', 0); logo_sw.style.outlineColor='#028d9f'; logo_sw.style.background='#fff'; blocker(); }} let target0=document.querySelector('.l-container'); // 監視 target let monitor0=new MutationObserver(neo_pager); monitor0.observe(target0, {childList: true, subtree: true}); // リストページ更新の監視開始 neo_pager(); function neo_pager(){ if(location.pathname.includes('blogs/ranking') || // 総合ブログ location.pathname.includes('entries/ranking') || // 記事 location.pathname.includes('ranking/monthly') || // 全体(月間) location.pathname.includes('ranking/daily')){ // 全体(デイリー) let pager= '<input id="input_page" type="number" autofocus="" min="0" step="20">'+ '<style>'+ '#input_page { position: absolute; top: 2px; right: 40px; '+ 'font: bold 16px Meiryo; padding: 2px 0 0 12px; width: 70px; height: 19px; }'+ '</style>'; let ambHeader=document.querySelector('#ambHeader'); if(ambHeader && !document.querySelector('#input_page')){ ambHeader.insertAdjacentHTML('beforeend', pager); } let input_page=document.querySelector('#input_page'); let wurl=window.location.search; // クエリー文字列から現在のページを取得 let q=0; if(wurl){ let query=wurl.split('&'); for(let k=0; k<query.length; k++){ if(query[k].includes('rank=')){ // 総合ブログ・全体(月間)・全体(デイリー) q=query[k].replace(/[^0-9]/g, ''); } if(query[k].includes('offset=')){ // 記事 q=query[k].replace(/[^0-9]/g, ''); }}} input_page.value=q; document.onkeydown=function(event){ if(event.keyCode==38){ // 「⇧」キーを取得 event.preventDefault(); input_page.stepUp(1); } if(event.keyCode==40){ // 「⇩」キーを取得 event.preventDefault(); input_page.stepDown(1); }} if(location.pathname.includes('blogs/ranking') || // 総合ブログ location.pathname.includes('ranking/monthly') || // 全体(月間) location.pathname.includes('ranking/daily')){ // 全体(デイリー) document.addEventListener('keydown', function(event){ if(event.keyCode==13){ event.preventDefault(); let jump_url=window.location.href.split('?')[0]+ '?rank='+input_page.value+'&amebaId='+input_page.value; window.location.href=jump_url; }}); } if(location.pathname.includes('entries/ranking')){ // 記事 document.addEventListener('keydown', function(event){ if(event.keyCode==13){ event.preventDefault(); let jump_url=window.location.href.split('?')[0]+ '?offset='+input_page.value+'&amebaId=0&entryId=0'; window.location.href=jump_url; }}); } } // 総合ブログ・記事・全体(月間)・全体(デイリー)の場合 else{ // ハッシュタグ・新着の場合 let input_page=document.querySelector('#input_page'); if(input_page){ input_page.remove(); }} let gootag=document.querySelectorAll('#ambFooter ~ script'); // 不良要素削除 for(let k=0; k<gootag.length; k++){ if(gootag[k].textContent.includes('google_tag_manager')){ gootag[k].remove(); }} let gooimg=document.querySelectorAll('#ambFooter ~ img[src*="ln.ameba.jp/v2/ra"]'); for(let k=0; k<gooimg.length; k++){ gooimg[k].remove(); } } // neo_pager() let target1=document.querySelector('.l-container'); // 監視 target let monitor1=new MutationObserver(blocker); monitor1.observe(target1, {childList: true, subtree: true}); // リストページ更新監視開始 blocker(); function blocker(){ let k; let user_href=[]; let user_a=[]; let user_aH=[]; let user_id=[]; if(location.pathname.includes('genres/') || // 総合ブログ・記事・新着記事 location.pathname.includes('hashtags/')){ // ハッシュタグ let g_nav=document.querySelectorAll('.c-genreGlobalNav__item'); if(g_nav.length>0){ if(g_nav[1].classList.contains('c-genreGlobalNav__item--active')==true){ let rank_itemA=document.querySelectorAll('.p-rankingAllText__item'); for(k=0; k<rank_itemA.length; k++){ user_a[k]=rank_itemA[k].querySelector('.p-rankingAllText__user a'); user_href[k]=user_a[k].getAttribute('href'); block_item(rank_itemA[k], user_href[k]); check_item(rank_itemA[k], user_href[k]); } let rank_itemAi=document.querySelectorAll('.p-rankingAllImage__item'); for(k=0; k<rank_itemAi.length; k++){ user_a[k]=rank_itemAi[k].querySelector('.p-rankingAllImage__user a'); user_href[k]=user_a[k].getAttribute('href'); block_item(rank_itemAi[k], user_href[k]); check_item(rank_itemAi[k], user_href[k]); }} // 総合ブログ if(g_nav[2].classList.contains('c-genreGlobalNav__item--active')==true){ let rank_itemT=document.querySelectorAll('.p-rankingTodayText__item'); for(k=0; k<rank_itemT.length; k++){ user_a[k]=rank_itemT[k].querySelector('.p-rankingTodayText__user a'); user_href[k]=user_a[k].getAttribute('href'); block_item(rank_itemT[k], user_href[k]); check_item(rank_itemT[k], user_href[k]); } let rank_itemTi=document.querySelectorAll('.p-rankingTodayImage__item'); for(k=0; k<rank_itemTi.length; k++){ user_a[k]=rank_itemTi[k].querySelector('.p-rankingTodayImage__blogName a'); user_href[k]=user_a[k].getAttribute('href'); block_item_i(rank_itemTi[k], user_href[k]); check_item_i(rank_itemTi[k], user_href[k]); }} // 記事 if(g_nav[3].classList.contains('c-genreGlobalNav__item--active')==true){ let rank_itemH=document.querySelectorAll('.p-hashtagEntryRanking__item'); for(k=0; k<rank_itemH.length; k++){ user_a[k]=rank_itemH[k].querySelector('.p-hashtagEntryRanking__user a'); user_aH[k]= // URL取得先 rank_itemH[k].querySelector('.p-hashtagEntryRanking__blogName>a'); user_href[k]=user_aH[k].getAttribute('href'); block_item(rank_itemH[k], user_href[k]); check_item(rank_itemH[k], user_href[k]); }} // ハッシュタグ if(g_nav[4].classList.contains('c-genreGlobalNav__item--active')==true){ let rank_itemR=document.querySelectorAll('.p-recentEntryText__item'); for(k=0; k<rank_itemR.length; k++){ user_a[k]=rank_itemR[k].querySelector('.p-recentEntryText__user a'); user_href[k]=user_a[k].getAttribute('href'); block_item(rank_itemR[k], user_href[k]); check_item(rank_itemR[k], user_href[k]); } let rank_itemRi=document.querySelectorAll('.p-recentEntryImage__item'); for(k=0; k<rank_itemRi.length; k++){ user_a[k]=rank_itemRi[k].querySelector('.p-recentEntryImage__title a'); user_href[k]=user_a[k].getAttribute('href').split('/entry-')[0]; block_item(rank_itemRi[k], user_href[k]); check_item_i(rank_itemRi[k], user_href[k]); }} // 新着記事 }} // 総合ブログ・記事・ハッシュタグ・新着記事 if(location.pathname.includes('hashtags/')){ // ハッシュタグ タグリンクで開いた特例 let g_nav=document.querySelector('.c-genreGlobalNav__item'); if(!g_nav){ // ランキング選択が無い特例 let rank_itemH=document.querySelectorAll('.p-hashtagEntryRanking__item'); for(k=0; k<rank_itemH.length; k++){ user_a[k]=rank_itemH[k].querySelector('.p-hashtagEntryRanking__user a'); user_aH[k]= // URL取得先 rank_itemH[k].querySelector('.p-hashtagEntryRanking__blogName>a'); user_href[k]=user_aH[k].getAttribute('href'); block_item(rank_itemH[k], user_href[k]); check_item(rank_itemH[k], user_href[k]); } }} // ハッシュタグ タグリンクで開いた特例 if(location.pathname.includes('ranking/monthly') || // 全体(月間) location.pathname.includes('ranking/daily')){ // 全体(デイリー) let rank_itemA=document.querySelectorAll('.p-rankingAllText__item'); for(k=0; k<rank_itemA.length; k++){ user_a[k]=rank_itemA[k].querySelector('.p-rankingAllText__user a'); user_href[k]=user_a[k].getAttribute('href'); block_item(rank_itemA[k], user_href[k]); check_item(rank_itemA[k], user_href[k]); } } // 全体(月間・デイリー) function block_item(item, user_href){ if(block_regex.test(user_href)==true){ if(edit_mode==0){ item.style.visibility='hidden'; } if(edit_mode==1){ item.style.visibility='visible'; item.style.background='#a9c1cf'; }}} function block_item_i(item, user_href){ if(block_regex.test(user_href)==true){ if(edit_mode==0){ item.style.visibility='hidden'; } if(edit_mode==1){ item.style.visibility='visible'; item.style.background='red'; }}} function check_item(item, user_href){ item.classList.add('RB_item'); let sw; if(block_regex.test(user_href)==false){ sw='<div class="RB_sw B">Block</div>'; } else{ sw='<div class="RB_sw U">Unset</div>'; } if(!item.querySelector('.RB_sw')){ item.insertAdjacentHTML('beforeend', sw); } let RB_sw=item.querySelector('.RB_sw'); RB_sw.onclick=function(event){ event.preventDefault(); local_backup(user_href); }} function check_item_i(item, user_href){ item.classList.add('RB_item', 'I'); let sw; if(block_regex.test(user_href)==false){ sw='<div class="RB_sw I B">Block</div>'; } else{ sw='<div class="RB_sw I U">Unset</div>'; } if(!item.querySelector('.RB_sw')){ item.insertAdjacentHTML('beforeend', sw); } let RB_sw=item.querySelector('.RB_sw'); RB_sw.onclick=function(event){ event.preventDefault(); local_backup(user_href); }} function local_backup(user_href){ if(block_regex.test(user_href)!=true){ let ok=confirm(" ⛔ ブロックリストに登録しますか?"); if(ok){ let user_id=user_href.replace('https://ameblo.jp/', ''); user_id=user_id.replace(/\//g, ''); block_id.push(user_id); let write_json=JSON.stringify(block_id); localStorage.setItem('RankingBlock_ID', write_json); // ストレージ保存名 location.reload(); }} if(block_regex.test(user_href)==true){ let ok=confirm(" 🟢 ブロックリストから外し表示させますか?"); if(ok){ let user_id=user_href.replace('https://ameblo.jp/', ''); user_id=user_id.replace(/\//g, ''); block_id=block_id.filter( function(item){ return item !==user_id; }); let write_json=JSON.stringify(block_id); localStorage.setItem('RankingBlock_ID', write_json); // ストレージ保存名 location.reload(); }}} } // blocker function hiliter(){ let ameba_id=block_id[1]; // block_id=['tmp1', '%Ameba-ID', 'xxxxxx', ] ameba_id=ameba_id.replace('%', ''); let am_style= '<style class="AM_style">'+ '.p-rankingAllText__title a[href*="'+ ameba_id +'"], '+ '.p-rankingTodayText__blogName a[href*="'+ ameba_id +'"], '+ '.p-hashtagEntryRanking__blogName > a[href*="'+ ameba_id +'"], '+ '.p-recentEntryText__blogName a[href*="'+ ameba_id +'"], '+ '.p-rankingAllImage__title a[href*="'+ ameba_id +'"], '+ '.p-rankingTodayImage__title a[href*="'+ ameba_id +'"], '+ '.p-recentEntryImage__title a[href*="'+ ameba_id +'"] { '+ 'color: #fff !important; background: red; }'+ '</style>'; if(document.querySelector('.AM_style')){ document.querySelector('.AM_style').remove(); } document.body.insertAdjacentHTML('beforeend', am_style); } // hiliter()
「Ranking Blocker」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「Ranking Blocker」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。