「いいね!履歴」のリストで特定ユーザーを探す
「いいね!履歴」上でユーザー検索をする独立した機能を、「Bad Iine Mute」に組込みました。
この機能の使い途は、特定のユーザーによって押された「いいね履歴」を俯瞰することです。 この機能でマークした「いいね!履歴」を眺めていると、『あぁこんなユーザーが「いいね!」を何度も押してくれてたんだ』などと、気付く事があります。 また、今では毎日見に行く様になったユーザーと、交流が始まった頃が一目で判ったりします。 そこに隠れた日記を見つけ、懐かしい気分になる事もあります。
ブロクはコミニュケーションツールだなと、改めて思います。「Bad Iine Mute」は「いいね!」の負の部分に目を向けて来ましたが、「いいね!ユーザー検索」は、その反対の本来の目的に使えます。
「いいね!ユーザー検索」の扱い方
「いいね!ユーザー検索」は、「いいね!履歴」の画面でのみ機能し、検索したユーザーのアイコンに「青い枠」を表示します。「Spaceキー」でリストの自動読込みをさせながら、流入するリスト上に表示される「青い枠」を観測できます。
●「いいね!ユーザー検索」は、リストのヘッダー部を「Ctrl + 左クリック」すると起動し、ヘッダー部が青色になり、「アイコン画像のURL入力枠」が表示されます。
● 検索するユーザーのアイコンのどれか1個を右クリックして、ブラウザのコンテキストメニューから「画像アドレスをコピー」を指定します。 通常は「いいね!履歴」の画面でこのコピー操作をしますが、他の画面でコピーしても構いません。
●「アイコン画像のURL入力枠」にペーストをして「検索ボタン」を押します。 入力枠内を書換える場合は「×」の「クリアボタン」を使うと簡単です。
●「URL」入力枠に入力した値が整形されて、少し短くなります。 これ以降、最初に取得したアイコン画像と同じユーザーアイコンに「青枠」が付きます。「いいね!履歴」ページとダイアログ上で、この「青枠」が表示されます。
◎ この検索→青枠表示を終了するには、リストのヘッダー部をもういちど「左クリック」または「Ctrl + 左クリック」します。 全ての青枠の表示が無くなります。
◎「アイコン画像のURL入力枠」の設定は「検索ボタン」で設定され、「いいね!履歴」の画面を離れるまでメモリ内に残っています。 そのため、一旦「検索機能」をOFFにして再びONにすると、検索が行われて「青枠」が表示されます。
◎ 本来の「迷惑いいね排除機能」とは干渉せず、「排除リスト」が書き換わる心配はありません。
◎ 検索ONの状態は、「いいね!された記事」「いいね!してくれた人」のタブに共通して引き継がれます。
◎ 先に検索を実行してから「Spaceキー」を押すと、自動スクロール状態で検索ヒットした青枠の表示が可能です。
◎ アメブロの全く別の画面で取得した「アイコン画像のURL」で、検索が可能です。 この機能の検索対象は、リスト上の「アイコン画像のURL」の全文字列です。 部分一致で検索するので、「ameba」の検索語で全てのアイコンに青枠が表示されます。
「Ameblo Management」のアレンジをベースにしています
「Bad Iine Mute」「Bad Iine Mute BlogPage」は「Ameblo Management」でアメブロの各画面をアレンジしたデザイン環境を前提にしています。
「Ameblo Management」が無い環境下でも、これらのツールは利用可能ですが、いくぶん見栄えが劣る場合があります。
今回は「Bad Iine Mute」の更新のみですが、混乱を避ける目的で、「Bad Iine Mute BlogPage」のバージョンを統一しました。
ツールを導入するには
「Bad Iine Mute」「Bad Iine Mute BlogPage」は Chrome / 新Edge / Firefox の拡張機能「Tampermonkey」上で動作するスクリプトツールです。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
クリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
〔 Bad Iine Mute 〕ver. 1.4
// ==UserScript== // @name Bad Iine Mute // @namespace http://tampermonkey.net/ // @version 1.4 // @description 「管理画面」から不良な「いいね!」を非表示にする // @author Ameba Blog User // @match https://blog.ameba.jp/ucs/top* // @match https://blog.ameba.jp/ucs/iine/list.html* // @grant none // ==/UserScript== let iine_block_data={}; // 総合ブロックデータ let iine_block_id=[]; let iine_block_img=[]; let block_filter_id; let block_regex_id; let block_filter_img; let block_regex_img; let edit_mode=0; let find_img_src=''; let ua=0; let agent=window.navigator.userAgent.toLowerCase(); if(agent.indexOf('firefox') > -1){ ua=1; } // Firefoxの場合のフラッグ let read_json=localStorage.getItem('iine_id_back'); // ローカルストレージ 保存名 iine_block_data=JSON.parse(read_json); if(iine_block_data==null){ iine_block_data=[['tmp1', 'img1'], ['tmp2', 'img2']]; } reg_set(); function reg_set(){ iine_block_id=[]; iine_block_img=[]; for(let k=0; k<iine_block_data.length; k++){ iine_block_id[k]=iine_block_data[k][0]; iine_block_img[k]=iine_block_data[k][1]; } block_filter_id=iine_block_id.join('|'); block_regex_id=RegExp(block_filter_id); block_filter_img=iine_block_img.join('|'); block_regex_img=RegExp(block_filter_img); } let target0=document.querySelector('#contents'); // 監視 target let monitor0=new MutationObserver(mode_select); monitor0.observe(target0, {childList: true, subtree: true}); // 監視開始 mode_select(); function mode_select(){ if(document.querySelector('#iineEntry')){ // 管理トップ monitor0.disconnect(); let div_iine=document.querySelector('#iine'); div_iine.style.position='relative'; div_iine.style.zIndex='10'; let iine_title=document.querySelector('#iineEntry .ttl'); let iine_th=document.querySelectorAll('#iineEntry th'); title_disp(iine_th[0], iine_th[1]); iine_th[0].textContent='💛 いいね!された記事'; iine_th[0].style.fontWeight='bold'; monitor0.observe(target0, {childList: true, subtree: true}); iine_title.onclick=function(event){ event.preventDefault(); if(event.altKey==true){ //「Altキー + 左クリック」 if(edit_mode==0){ edit_mode=1; file_backup(); } // ファイル保存 管理トップ else{ edit_mode=0; file_backup_end(); }} else{ if(edit_mode==0){ edit_mode=1; } else if(edit_mode==1){ edit_mode=0; file_backup_end(); }} blocker(); title_disp(iine_th[0], iine_th[1]); }} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 let iine_title=document.querySelector('#iineHistoryEntryFrame .ttl'); let iine_th=document.querySelectorAll('#iineHistoryEntryFrame th'); monitor0.disconnect(); open_more(0); end_more(); title_disp(iine_th[0], iine_th[1]); iine_th[0].textContent='💛 いいね!された記事'; monitor0.observe(target0, {childList: true, subtree: true}); iine_title.onclick=function(event){ event.preventDefault(); if(event.altKey==true){ //「Altキー + 左クリック」 if(edit_mode==0){ edit_mode=1; file_backup(); } // ファイル保存 履歴タブ1 else{ edit_mode=0; file_backup_end(); find_user_end(); }} else if(event.ctrlKey==true){ //「Ctrlキー + 左クリック」 if(edit_mode==0){ edit_mode=2; find_user(); } // ユーザー履歴検索 履歴タブ1 else{ edit_mode=0; file_backup_end(); find_user_end(); }} else{ if(edit_mode==0){ edit_mode=1; } else if(edit_mode==1){ edit_mode=0; file_backup_end(); } else if(edit_mode==2){ edit_mode=0; find_user_end(); }} title_disp(iine_th[0], iine_th[1]); blocker(); }} if(document.querySelector('#iineHistoryUserFrame')){ // 履歴 タブ2 let iine_title=document.querySelector('#iineHistoryContent tr:first-child'); let iine_th=document.querySelectorAll('#iineHistoryUserFrame th'); monitor0.disconnect(); open_more(1); end_more(); title_disp(iine_th[0], iine_th[1]); iine_th[0].textContent=' 💛'; monitor0.observe(target0, {childList: true, subtree: true}); iine_title.onclick=function(event){ event.preventDefault(); if(event.ctrlKey==true){ //「Ctrlキー + 左クリック」 if(edit_mode==0 || edit_mode==1){ edit_mode=2; find_user(); } else{ edit_mode=0 find_user_end(); }} else{ if(edit_mode==0){ edit_mode=1; } else{ edit_mode=0; find_user_end(); }} title_disp(iine_th[0], iine_th[1]); blocker(); }} } // mode_select() function title_disp(th0, th1){ if(edit_mode==0){ th0.style.boxShadow='none'; th1.style.boxShadow='none'; th0.style.color='#666'; th1.style.color='#666'; } else if(edit_mode==1){ th0.style.boxShadow='inset 0 0 0 20px red'; th1.style.boxShadow='inset 0 0 0 20px red'; th0.style.color='#fff'; th1.style.color='#fff'; } else if(edit_mode==2){ th0.style.boxShadow='inset 0 0 0 20px #2196f3'; th1.style.boxShadow='inset 0 0 0 20px #2196f3'; th0.style.color='#fff'; th1.style.color='#fff'; }} function open_more(n){ let more=document.querySelector('.moreLinkBottom'); let item; if(n==0){ item=document.querySelectorAll('#iineHistoryEntryFrame tr'); } if(n==1){ item=document.querySelectorAll('#iineHistoryUserFrame tr'); } if(more && item.length<18){ // リストを18行まで自動で開く ⭕ more.click(); }} function end_more(){ let senser=0; let next=0; let interval; let list_frame=document.querySelector('#iineHistoryContent'); if(list_frame){ let css= '#iineHistoryContent table { position: relative; } '+ '#iineHistoryContent tbody { display: block; overflow-y: scroll; '+ 'height: calc( 100vh - 220px); margin-top: 34px; border: 1px solid #ccc; } '+ '.tableList th { width: inherit; font-size: 14px; padding: 8px 4px 6px; '+ 'text-align: center !important; background: #f4f4f4; } '+ '#iineHistoryContent tr:first-child { position: absolute; z-index: 1; '+ 'top: -1px; left: -1px; width: 786px; '+ 'border-left: 1px solid #ccc; border-right: 1px solid #ccc; } '+ '#ucsMain #moreLoading { margin: -3px auto; } '+ '#ucsMain .moreLinkBottom span { '+ 'background-position: 0 4px; font-size: 14px; } '+ '.moreLinkBottom:after { content: "Space: 連続スクロール/停止"; '+ 'position: absolute; border: 1px solid #aaa; padding: 2px 6px 0; '+ 'margin: -3px 20px 0; font-size: 14px; }'; let style_tag=document.createElement("style"); // css設定styleタグ style_tag.setAttribute('id', 'bim'); style_tag.textContent=css; if(!list_frame.querySelector('#bim')){ list_frame.appendChild(style_tag); }} document.addEventListener('keydown', function(event){ event.stopImmediatePropagation(); if(event.keyCode==32){ if(next==0){ next=1; interval=setInterval( function(){ go(); stop(); view_end(); senser+=1; }, 500); } else{ next=0; clearInterval(interval); }} function go(){ let more=document.querySelector('.moreLinkBottom'); if(more && next==1){ more.click(); senser=0; }} function stop(){ if(senser>8){ senser=0; next=0; clearInterval(interval); }}}); function view_end(){ let list_body; if(document.querySelector('#iineHistoryEntryFrame tbody')){ list_body=document.querySelector('#iineHistoryEntryFrame tbody'); } if(document.querySelector('#iineHistoryUserFrame tbody')){ list_body=document.querySelector('#iineHistoryUserFrame tbody'); } let bottom=list_body.scrollHeight - list_body.clientHeight; list_body.scroll(0, bottom); } } //end_more() let target1=document.querySelector('#contents'); // 監視 target let monitor1=new MutationObserver(blocker); monitor1.observe(target1, {childList: true, subtree: true}); // 監視開始 function blocker(){ let k; let user_href=[]; let iineImg=[]; let iine_span=[]; let iine_tr=[]; let Img_src=[]; if(document.querySelector('#iineEntry')){ // 管理トップ let iine_img=document.querySelectorAll('#iineEntry .img'); for(k=0; k<iine_img.length; k++){ iine_img[k].style.padding='2px'; } iineImg=document.querySelectorAll('#iineEntry img'); for(k=0; k<iineImg.length; k++){ // ユーザーアイコンのマスク Img_src[k]=iineImg[k].getAttribute('src'); if(block_regex_img.test(Img_src[k])==true){ if(edit_mode==0){ iineImg[k].style.display='none'; } else{ iineImg[k].style.display='block'; iineImg[k].style.outline='2px solid red'; }} else{ iineImg[k].style.display='block'; iineImg[k].style.outline='none'; }}} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 iine_span=document.querySelectorAll('.userImg span'); iineImg=document.querySelectorAll('.userImg img'); for(k=0; k<iineImg.length; k++){ // ユーザーアイコンのマスク Img_src[k]=iineImg[k].getAttribute('src'); if(block_regex_img.test(Img_src[k])==true){ if(edit_mode==0 || edit_mode==2){ iine_span[k].style.display='none'; } else{ iine_span[k].style.display='inline-block'; iine_span[k].style.outline='2px solid red'; }} else{ iine_span[k].style.display='inline-block'; iine_span[k].style.outline='none'; }} find_user(); blue_user(); } if(document.querySelector('#iineHistoryUserFrame')){ // 履歴 タブ2 iine_tr=document.querySelectorAll('#iineHistoryUserFrame tr'); for(k=1; k<iine_tr.length; k++){ // ユーザーアイコンのマスク if(iine_tr[k].querySelector('.heading a')){ user_href[k]=iine_tr[k].querySelector('.heading a').getAttribute('href'); if(block_regex_id.test(user_href[k])==true){ if(edit_mode==0 || edit_mode==2){ iine_tr[k].style.display='none'; } else{ iine_tr[k].style.display='table-row'; iine_tr[k].style.boxShadow='inset 0 0 0 1px #fff,inset 0 0 0 3px red'; }} else{ iine_tr[k].style.display='table-row'; iine_tr[k].style.boxShadow='none'; }}} find_user(); blue_user(); } } // blocker() let target2=document.querySelector('body'); // 監視 target let monitor2=new MutationObserver(blocker_dia); monitor2.observe(target2, {childList: true, subtree: true}); // 監視開始 function blocker_dia(){ let k; let user_li=[]; let user_href=[]; if(document.querySelector('#iineEntry')){ // 管理トップ smart(0); let header=document.querySelector('#iineEntryFrame .header'); let header_link=document.querySelector('#iineEntryFrame .header a'); let header_count=document.querySelector('#iineEntryFrame .header p span'); let close=document.querySelector('#iineEntryFrame .header .closeBtn'); if(header && edit_mode==0){ header.style.background='#f7f7f7'; header_link.style.color='#06c'; header_link.style.pointerEvents='auto'; header_count.style.color="red"; } if(header && close && edit_mode==1){ header.style.background='red'; header_link.style.color='#fff'; header_link.style.pointerEvents='none'; header_count.style.color="#fff"; header.onclick=function(){ close.click(); }} user_li=document.querySelectorAll('#iineEntoryContents li'); if(user_li.length !=0){ for(k=0; k<user_li.length; k++){ // ダイアログのリストのマスク if(user_li[k].querySelector('a')){ user_href[k]=user_li[k].querySelector('a').getAttribute('href'); if(block_regex_id.test(user_href[k])==true){ if(edit_mode==0){ user_li[k].style.display='none'; user_li[k].style.outline='none'; } else{ user_li[k].style.display='block'; user_li[k].style.outline='2px solid red'; user_li[k].style.outlineOffset='-3px'; }} else{ user_li[k].style.outline='none'; }}}}} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 smart(1); let header=document.querySelector('#iineEntryHeader'); let header_link=document.querySelector('#iineEntryHeader a'); let header_count=document.querySelector('#iineEntryHeader .tx_orageA'); let close=document.querySelector('#iineCloseBtn'); if(header && header_link && edit_mode==0){ header.style.background='#f7f7f7'; header_link.style.color='#06c'; header_link.style.pointerEvents='auto'; header_count.style.color='red'; } else if(header && header_link && edit_mode==2){ header.style.background='#2196f3'; header_link.style.color='#fff'; header_link.style.pointerEvents='auto'; header_count.style.color='#fff'; } else if(header && header_link && close && edit_mode==1){ header.style.background='red'; header_link.style.color='#fff'; header_link.style.pointerEvents='none'; header_count.style.color='#fff'; header.onclick=function(){ close.click(); }} user_li=document.querySelectorAll('#iineEntryContents li'); if(user_li.length !=0){ for(k=0; k<user_li.length; k++){ // ダイアログのリストのマスク if(user_li[k].querySelector('a')){ user_href[k]=user_li[k].querySelector('a').getAttribute('href'); if(block_regex_id.test(user_href[k])==true){ if(edit_mode==0 || edit_mode==2){ user_li[k].style.display='none'; user_li[k].style.boxShadow='none'; } else{ user_li[k].style.display='block'; user_li[k].style.boxShadow='#fff 0 0 0 1px inset, red 0 0 0 3px inset'; }} else{ user_li[k].style.boxShadow='none'; }}}} blue_user_dia(); } } // blocker_dia() function smart(n){ if(n==0){ let headerT=document.querySelector('#iineEntryFrame .header p'); if(headerT){ headerT.style.fontSize='0'; let title=headerT.querySelector('#iineEntryFrame .header p a'); if(title){ title.style.fontSize='14px'; title.style.padding='0 1em 0 .5em'; } let count=headerT.querySelector('#iineEntryFrame .header p span'); if(count){ count.style.fontSize='14px'; count.style.fontWeight='bold'; }}} if(n==1){ let headerT=document.querySelector('#iineEntryHeader p'); if(headerT){ headerT.style.fontSize='0'; let title=headerT.querySelector('#iineEntryHeader .tx_bold'); if(title){ title.style.fontSize='14px'; title.style.padding='0 1em 0 .5em'; } let count=headerT.querySelector('#iineEntryHeader .tx_orageA'); if(count){ count.style.fontSize='14px'; count.style.fontWeight='bold'; }}}} let target3=document.querySelector('body'); // 監視 target let monitor3=new MutationObserver(checker); monitor3.observe(target3, {childList: true, subtree: true, attributes: true}); // 監視開始 function checker(){ let k; let user_li=[]; let iine_tr=[]; let user_href=[]; let user_id=[]; let user_src=[]; if(document.querySelector('#iineEntry')){ // 管理トップ user_li=document.querySelectorAll('#iineEntoryContents li'); if(user_li.length !=0 && edit_mode==1){ for(k=0; k<user_li.length; k++){ let n=k; if(user_li[n].querySelector('a')){ user_href[n]=user_li[n].querySelector('a').getAttribute('href'); user_src[n]=user_li[n].querySelector('img').getAttribute('src'); user_li[n].onclick=function(event){ // リストのクリックで設定 event.preventDefault(); // クリックしてもリンク先に飛ばない local_backup(n); }}} function local_backup(n){ if(block_regex_id.test(user_href[n])!=true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); user_src[n]=user_src[n].replace('https://stat.profile.ameba.jp/profile_images/', ''); iine_block_data.push([user_id[n], user_src[n]]); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } else if(block_regex_id.test(user_href[n])==true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); iine_block_data.splice(iine_block_id.indexOf(user_id[n]), 1); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } reg_set(); blocker_dia(); blocker(); }}} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 user_li=document.querySelectorAll('#iineEntryContents li'); if(user_li.length !=0 && edit_mode==1){ for(k=0; k<user_li.length; k++){ let n=k; if(user_li[n].querySelector('a')){ user_href[n]=user_li[n].querySelector('a').getAttribute('href'); user_src[n]=user_li[n].querySelector('img').getAttribute('src'); user_li[n].onclick=function(event){ // リストのクリックで設定 event.preventDefault(); // クリックしてもリンク先に飛ばない local_backup(n); }}} function local_backup(n){ if(block_regex_id.test(user_href[n])!=true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); user_id[n]=user_id[n].replace(/\//g, ''); user_src[n]=user_src[n].replace('https://stat.profile.ameba.jp/profile_images/', ''); user_src[n]=user_src[n].replace(/\?cpc=100/g, ''); iine_block_data.push([user_id[n], user_src[n]]); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } else if(block_regex_id.test(user_href[n])==true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); user_id[n]=user_id[n].replace(/\//g, ''); iine_block_data.splice(iine_block_id.indexOf(user_id[n]), 1); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } reg_set(); blocker_dia(); blocker(); }}} if(document.querySelector('#iineHistoryUserFrame')){ // 履歴 タブ2 iine_tr=document.querySelectorAll('#iineHistoryUserFrame tr'); for(k=1; k<iine_tr.length; k++){ let n=k; let user_icon_link=iine_tr[n].querySelector('.list_img'); let user_link=iine_tr[n].querySelector('.heading a'); if(user_link && edit_mode==0){ user_icon_link.style.pointerEvents='auto'; user_link.style.pointerEvents='auto'; } if(user_link && edit_mode==1){ user_icon_link.style.pointerEvents='none'; user_link.style.pointerEvents='none'; } iine_tr[n].onclick=function(){ local_backup(n); }} function local_backup(n){ let user_link=iine_tr[n].querySelector('.heading a'); if(user_link && edit_mode==1){ user_href[n]=user_link.getAttribute('href'); user_src[n]=iine_tr[n].querySelector('.list_img img').getAttribute('src'); if(block_regex_id.test(user_href[n])!=true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); user_id[n]=user_id[n].replace(/\//g, ''); user_src[n]=user_src[n].replace('https://stat.profile.ameba.jp/profile_images/', ''); user_src[n]=user_src[n].replace(/\?cpc=100/g, ''); iine_block_data.push([user_id[n], user_src[n]]); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } else if(block_regex_id.test(user_href[n])==true){ user_id[n]=user_href[n].replace('https://ameblo.jp/', ''); user_id[n]=user_id[n].replace(/\//g, ''); iine_block_data.splice(iine_block_id.indexOf(user_id[n]), 1); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } reg_set(); blocker(); }}} } // checker() function file_backup(){ let style_text; if(document.querySelector('#iineEntry')){ // 管理トップ style_text='position: absolute; top: -35px; width: 100%; background: #e2eef0; '+ 'height: 36px; box-sizing: border-box; border: 1px solid #e2e2e2;'; if(ua==1){ style_text='position: absolute; top: -35px; width: 100%; background: #e2eef0;'+ 'height: 36px; box-sizing: border-box; border: 1px solid #e2e2e2;'; }} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 style_text='position: absolute; top: 0; left: 0; width: 100%; background: #e2eef0; '+ 'height: 36px; box-sizing: border-box; border: 1px solid #e2e2e2;'; } let insert_dialog; insert_dialog=document.createElement('div'); insert_dialog.setAttribute('id', 'imute_dia'); insert_dialog.setAttribute('style', style_text); if(document.querySelector('#iineEntry')){ // 管理トップ let imute=document.querySelector('#imute_dia'); if(!imute){ document.querySelector('#iine').appendChild(insert_dialog); }} if(document.querySelector('#iineHistoryEntryFrame')){ // 履歴 タブ1 let imute=document.querySelector('#imute_dia'); if(!imute){ document.querySelector('#iineHistoryEntryFrame').appendChild(insert_dialog); }} let button1=document.createElement('input'); button1.setAttribute('type', 'submit'); button1.setAttribute('value', '排除リストを保存する'); button1.setAttribute('style', 'padding: 2px 8px 0; margin: 4px 30px'); if(ua==1){ button1.setAttribute('style', 'padding: 0 8px; margin: 4px 30px'); } insert_dialog.appendChild(button1); button1.onclick=function(){ let write_json=JSON.stringify(iine_block_data); let blob=new Blob([write_json], {type: 'application/json'}); let a_elem=document.createElement('a'); a_elem.href=URL.createObjectURL(blob); a_elem.download='iine_mute.json'; // 保存ファイル名 if(ua==1){ a_elem.target = '_blank'; document.body.appendChild(a_elem); } a_elem.click(); if(ua==1){ document.body.removeChild(a_elem); } URL.revokeObjectURL(a_elem.href); } let button_add=document.createElement('input'); button_add.setAttribute('type', 'checkbox'); button_add.setAttribute('style', 'margin: 0 5px 0 40px'); insert_dialog.appendChild(button_add); let button_add_label=document.createElement('span'); button_add_label.setAttribute('style', 'background: #e2eef0; vertical-align: -1px'); button_add_label.innerText='差分追加'; insert_dialog.appendChild(button_add_label); let button2=document.createElement('input'); button2.setAttribute('type', 'file'); button2.setAttribute('style', 'margin: 4px 0 0 10px; vertical-align: 1px; width: 320px'); if(ua==1){ button2.setAttribute('style', 'margin: 4px 0 0 10px; width: 320px'); } insert_dialog.appendChild(button2); button_add.checked=true; 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, 15)=='[["tmp1","img1"'){ // iine_mute.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_id.test(data_in[k][0])!=true){ iine_block_data.push([data_in[k][0], data_in[k][1]]); }}} else{ iine_block_data=data_in; } // 読込み上書き処理 let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); // ローカルストレージ 保存名 reg_set(); blocker(); }}; }); let button3=document.createElement('input'); button3.setAttribute('type', 'submit'); button3.setAttribute('value', '✖ 閉じる'); button3.setAttribute('style', 'padding: 2px 6px 0; margin: 4px 0 0 50px'); if(ua==1){ button3.setAttribute('style', 'padding: 0 6px; margin: 4px 0 0 50px'); } insert_dialog.appendChild(button3); button3.onclick=function(){ insert_dialog.remove(); } } // file_backup() function file_backup_end(){ let imute=document.querySelector('#imute_dia'); if(imute){ imute.remove(); }} function find_user(){ let k; let iine_span=[]; let iineImg=[]; let Img_src=[]; let list_frame=document.querySelector('#iineHistoryContent'); if(list_frame && edit_mode==2){ let f_panel=document.createElement('div'); f_panel.setAttribute('id', 'f_panel'); f_panel.innerHTML= '<input id="set_user" type="text" placeholder="検索するアイコン画像のアドレスを入力">'+ '<input id="clear" type="submit" value="✖">'+ '<input id="find_img" type="submit" value="ユーザー検索">'; if(!list_frame.querySelector('#f_panel')){ list_frame.appendChild(f_panel); } let css= '#f_panel { position: absolute; top: -90px; left: 0; width: 100%; display: flex; }'+ '#set_user { width: 100%; padding: 3px 30px 1px 10px; background: #e4f7fa; '+ 'font: 16px Meiryo; border: 1px solid #666; border-radius: 3px; } '+ '#set_user::placeholder { font-size: 15px; color: #666; }'+ '#clear { width: 32px; margin: 1px 12px 0 -28px; font: 16px Meiryo; '+ 'border: none; background: none; }'+ '#clear:hover { text-shadow: 0 0 1px #fff; filter: invert(2); } '+ '#find_img { width: auto; padding: 3px 8px 1px; font: 16px Meiryo; } '+ '.userImg img, .iineProfImg img, .list_img img { outline-offset: -3px; } '+ '.iineProfImg img { height: 38px; width: 38px; object-fit: cover; } '+ '.list_img img { height: 40px; width: 40px; object-fit: cover; }'; let style_tag=document.createElement("style"); // css設定styleタグ style_tag.setAttribute('id', 'bim2'); style_tag.textContent=css; if(!list_frame.querySelector('#bim2')){ list_frame.appendChild(style_tag); } let set_user=document.querySelector('#set_user'); let clear=document.querySelector('#clear'); let find_img=document.querySelector('#find_img'); set_user.value=find_img_src; clear.onclick=function(){ set_user.value=''; find_img_src=''; blue_user(); } find_img.onclick=function(){ if(set_user.value!=''){ let src=set_user.value; src=src.replace(/https:\/\/stat\.profile\.ameba\.jp\/profile_images\//, ''); src=src.replace(/\?.*$/, ''); set_user.value=src; find_img_src=src; blue_user(); }} } } // find_user() function blue_user(){ let k; let iineImg=[]; let Img_src=[]; iineImg=document.querySelectorAll('img'); for(k=0; k<iineImg.length; k++){ // ユーザーアイコンのマスク Img_src[k]=iineImg[k].getAttribute('src'); if(find_img_src!=''){ if(Img_src[k].indexOf(find_img_src)!=-1){ if(edit_mode==2){ iineImg[k].style.outline='3px solid #fff'; iineImg[k].style.boxShadow='0 0 0 4px #2196f3'; } else{ iineImg[k].style.outline='none'; iineImg[k].style.boxShadow='none'; }} else{ iineImg[k].style.outline='none'; iineImg[k].style.boxShadow='none'; }} if(find_img_src==''){ iineImg[k].style.outline='none'; iineImg[k].style.boxShadow='none'; }}} function blue_user_dia(){ let k; let iineImg=[]; let Img_src=[]; if(find_img_src!=''){ iineImg=document.querySelectorAll('.iineProfImg img'); for(k=0; k<iineImg.length; k++){ // ダイアログのアイコンのマーク Img_src[k]=iineImg[k].getAttribute('src'); if(Img_src[k].indexOf(find_img_src)!=-1){ if(edit_mode==2){ iineImg[k].style.outline='3px solid #fff'; iineImg[k].style.boxShadow='0 0 0 4px #2196f3'; } else{ iineImg[k].style.outline='none'; iineImg[k].style.boxShadow='none'; }} else{ iineImg[k].style.outline='none'; iineImg[k].style.boxShadow='none'; }}}} function find_user_end(){ let f_panel=document.querySelector('#f_panel'); if(f_panel){ f_panel.remove(); }}
〔 Bad Iine Mute BlogPage 〕ver. 1.4
// ==UserScript== // @name Bad Iine Mute BlogPage // @namespace http://tampermonkey.net/ // @version 1.4 // @description 「ブログページ」の不良な「いいね!」を非表示にする // @author Ameba Blog User // @match https://ameblo.jp/* // @noframes // @run-at document-body // @grant none // ==/UserScript== let iine_block_data={}; // 総合ブロックデータ let iine_block_id=[]; let iine_block_img=[]; let block_filter_id; let block_regex_id; let block_filter_img; let block_regex_img; let edit_mode=0; let ua=0; let agent=window.navigator.userAgent.toLowerCase(); if(agent.indexOf('firefox') > -1){ ua=1; } // Firefoxの場合のフラッグ let read_json=localStorage.getItem('iine_id_back'); // ローカルストレージ 保存名 iine_block_data=JSON.parse(read_json); if(iine_block_data==null){ iine_block_data=[['tmp1', 'img1'], ['tmp2', 'img2']]; } reg_set(); function reg_set(){ iine_block_id=[]; iine_block_img=[]; for(let k=0; k<iine_block_data.length; k++){ iine_block_id[k]=iine_block_data[k][0]; iine_block_img[k]=iine_block_data[k][1]; } block_filter_id=iine_block_id.join('|'); block_regex_id=RegExp(block_filter_id); block_filter_img=iine_block_img.join('|'); block_regex_img=RegExp(block_filter_img); } let target0=document.querySelector('body'); // 監視 target let monitor0=new MutationObserver(mode_select); monitor0.observe(target0, {childList: true, subtree: true}); // 監視開始 mode_select(); function mode_select(){ if(document.querySelector('#announcer')){ // ブログページ let iine_title=document.querySelector('#iineEntryHeader'); if(iine_title){ title_disp(); smart(); open_more(); // 設定数のリストを自動で開く iine_title.onclick=function(event){ event.preventDefault(); if(event.altKey==true){ // 「Altキー + 左クリック」 if(edit_mode==0){ edit_mode=1; monitor0.disconnect(); file_backup(); monitor0.observe(target0, {childList: true}); } // ファイル保存 ブログページ else{ edit_mode=0; file_backup_end(); }} else{ if(edit_mode==0){ edit_mode=1; } else{ edit_mode=0; file_backup_end(); }} title_disp(); blocker_dia(); }} if(!iine_title){ // いいねダイアログが非表示になった時 edit_mode=0; } }} // mode_select() function title_disp(){ let iine_title=document.querySelector('#iineEntryHeader'); let iine_span=document.querySelectorAll('#iineEntryHeader span'); let iine_p=document.querySelector('#iineEntryHeader p'); if(edit_mode==0){ iine_title.style.boxShadow='none'; iine_span[0].style.color='#333'; iine_span[1].style.color='#999'; iine_span[2].style.color='#fe9019'; iine_p.style.color='#333'; } else{ iine_title.style.boxShadow='inset 0 0 0 30px red'; iine_span[0].style.color='#fff'; iine_span[1].style.color='#fff'; iine_span[2].style.color='#fff'; iine_p.style.color='#fff'; }} function open_more(){ setTimeout(()=>{ let more=document.querySelector('#moreLinkBottom'); // Moreがある場合は全て呼込む let item=document.querySelectorAll('#iineEntryContents li'); if(more && item.length<18){ // リストを最低18行まで自動で開く ⭕ more.click(); }}, 500); } function smart(){ let headerT=document.querySelector('._220hQzlf'); if(headerT){ let styleT=document.createElement('style'); styleT.textContent='._GCr8y7hE::before { content: ""; }'; monitor0.disconnect(); headerT.appendChild(styleT); monitor0.observe(target0, {childList: true}); headerT.style.fontSize='0'; let nice=headerT.querySelector('._GCr8y7hE'); if(nice){ nice.textContent='💛'; nice.style.fontSize='16px'; nice.style.verticalAlign='-1px'; nice.style.paddingRight='6px'; } let title=headerT.querySelector('._3LzOy3KH'); if(title){ title.style.fontSize='14px'; } let count=headerT.querySelector('._2n9nfBIp'); if(count){ count.style.fontSize='14px'; }}} let target1=document.querySelector('body'); // 監視 target let monitor1=new MutationObserver(blocker_dia); monitor1.observe(target1, {childList: true, subtree: true}); // 監視開始 function blocker_dia(){ let k; let user_li=[]; let user_href=[]; if(document.querySelector('#announcer')){ // ブログページ user_li=document.querySelectorAll('#iineEntryContents li'); if(user_li.length !=0){ for(k=0; k<user_li.length; k++){ // ダイアログのリストのマスク if(user_li[k].querySelector('a')){ user_href[k]=user_li[k].querySelector('a').getAttribute('href'); if(block_regex_id.test(user_href[k])==true){ if(edit_mode==0){ user_li[k].style.display='none'; user_li[k].style.boxShadow='none'; } else{ user_li[k].style.display='list-item'; user_li[k].style.boxShadow='#fff 0 0 0 1px inset, red 0 0 0 3px inset'; }} else{ user_li[k].style.display='list-item'; user_li[k].style.boxShadow='none'; }}}}} } // blocker_dia() let target2=document.querySelector('body'); // 監視 target let monitor2=new MutationObserver(checker); monitor2.observe(target2, {childList: true, subtree: true, attributes: true}); // 監視開始 function checker(){ let k; let user_li=[]; let user_href=[]; let user_id=[]; let user_src=[]; if(document.querySelector('#announcer')){ // ブログページ user_li=document.querySelectorAll('#iineEntryContents li'); if(user_li.length !=0){ for(k=0; k<user_li.length; k++){ let n=k; let user_link=user_li[n].querySelector('a'); if(user_link){ if(edit_mode==0){ user_link.style.pointerEvents='auto'; } if(edit_mode==1){ user_link.style.pointerEvents='none'; user_href[n]=user_link.getAttribute('href'); user_src[n]=user_li[n].querySelector('img').getAttribute('src'); user_li[n].onclick=function(event){ // リストのクリックで設定 local_backup(n); }}}} function local_backup(n){ if(edit_mode==1){ if(block_regex_id.test(user_href[n])!=true){ user_id[n]=user_href[n].replace(/\//g, ''); user_src[n]=user_src[n].replace('https://stat.profile.ameba.jp/profile_images/', ''); user_src[n]=user_src[n].replace(/\?cpc=100/g, ''); iine_block_data.push([user_id[n], user_src[n]]); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } else if(block_regex_id.test(user_href[n])==true){ user_id[n]=user_href[n].replace(/\//g, ''); iine_block_data.splice(iine_block_id.indexOf(user_id[n]), 1); let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); } reg_set(); blocker_dia(); }}}} } // checker() function file_backup(){ let style_text='position: absolute; top: -60px; width: 100%; font: 13px Meiryo; '+ 'height: 40px; border-radius: 6px; background: #e2eef0; color: #000;'; let insert_dialog; let frame=document.querySelector('#iineEntryFrame'); if(frame.childElementCount==1){ insert_dialog=document.createElement('div'); insert_dialog.setAttribute('id', 'imute_dia'); insert_dialog.setAttribute('style', style_text); let imute=frame.querySelector('#imute_dia'); if(!imute){ frame.appendChild(insert_dialog); } let button1=document.createElement('input'); button1.setAttribute('type', 'submit'); button1.setAttribute('value', '排除リストを保存する'); button1.setAttribute( 'style', 'padding: 2px 8px 0; margin: 7px 15px 0 20px; font: 13px Meiryo;'); if(ua==1){ button1.setAttribute( 'style', 'padding: 1px 8px 0; margin: 7px 15px 0 20px; font: 13px Meiryo;'); } insert_dialog.appendChild(button1); button1.onclick=function(){ let write_json=JSON.stringify(iine_block_data); let blob=new Blob([write_json], {type: 'application/json'}); let a_elem=document.createElement('a'); a_elem.href=URL.createObjectURL(blob); document.body.appendChild(a_elem); a_elem.download='iine_mute_bp.json'; // 保存ファイル名 a_elem.click(); document.body.removeChild(a_elem); URL.revokeObjectURL(a_elem.href); } let button_add=document.createElement('input'); button_add.setAttribute('type', 'checkbox'); button_add.setAttribute('style', 'margin: 0 5px 0 20px; vertical-align: -3px;'); insert_dialog.appendChild(button_add); let button_add_label=document.createElement('span'); button_add_label.setAttribute('style', 'background: #e2eef0; vertical-align: -1px;'); button_add_label.innerText='差分追加'; insert_dialog.appendChild(button_add_label); let button2=document.createElement('input'); button2.setAttribute('type', 'file'); button2.setAttribute( 'style', 'margin: 0 0 0 10px; width: 260px; vertical-align: 1px; font: 13px Meiryo;'); insert_dialog.appendChild(button2); button_add.checked=true; 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, 15)=='[["tmp1","img1"'){ // iine_mute.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_id.test(data_in[k][0])!=true){ iine_block_data.push([data_in[k][0], data_in[k][1]]); }}} else{ iine_block_data=data_in; } // 読込み上書き処理 let write_json=JSON.stringify(iine_block_data); localStorage.setItem('iine_id_back', write_json); // ローカルストレージ 保存名 for(let k=0; k<iine_block_data.length; k++){ iine_block_id[k]=iine_block_data[k][0]; } block_filter_id=iine_block_id.join('|'); block_regex_id=RegExp(block_filter_id); reg_set(); blocker_dia(); }}; }); let button3=document.createElement('input'); button3.setAttribute('type', 'submit'); button3.setAttribute('value', '\uEA34'); let style_text_x= 'position: absolute; top: -9px; right: -9px; width: 26px; height: 26px; '+ 'color: #fff; font-family: ameba-symbols; text-indent: -2px; line-height: 21px; '+ 'border: 2px solid #fff; border-radius: 50%; background: #999; font-size: 14px;'; if(ua==1){ style_text_x= 'position: absolute; top: -9px; right: -9px; width: 26px; height: 26px; '+ 'color: #fff; font-family: ameba-symbols; text-indent: -3px; line-height: 24px; '+ 'border: 2px solid #fff; border-radius: 50%; background: #999; font-size: 13px;'; } button3.setAttribute('style', style_text_x); insert_dialog.appendChild(button3); button3.onclick=function(){ insert_dialog.remove(); }} } // file_backup() function file_backup_end(){ let frame=document.querySelector('#iineEntryFrame'); if(frame){ let imute=frame.querySelector('#imute_dia'); if(imute){ monitor0.disconnect(); imute.remove(); monitor0.observe(target0, {childList: true}); }}}
「Bad Iine Mute」最新版について
旧いバージョンの「Bad Iine Mute」は、アメーバのページ構成の変更で動作しない場合があります。 また新しいバージョンほど、より改善を重ねているので、もし導入されるなら、最新のバージョンをお勧めします。 最も新しいバージョンへのリンクは、以下のページのリンクリストから探せます。