「 あなたと似た記事を書いているブログ」

記事を投稿した直後に表示される「投稿完了画面」に、「 あなたと似た記事を書いているブログ」が表示されます。 下は「Ameblo Writer」のアレンジを適用した「投稿完了画面」ですが、画面下側の殆ど(赤枠)がそのリストです。

 

 

◎ユーザーが参加しているジャンルの投稿記事を紹介している。

◎リンクはブログトップ(最新)の記事に限るが、同日の投稿とは限らない。

◎同じハッシュタグ、共通の語の使用、などの理由で抽出したものでは無い。

 

以上から、同ジャンルのブログを適当にピックアップしているだけで、恣意的な選択はないと思われます。

 

私は、時々は「ランキングページ」をサーチしますが、「投稿完了画面」の方は投稿の度、記事修正の度に目に入ります。 また、リストは「ランキング」ではなく、掘り起した意外性があるので、新鮮に感じてリンクを開いて見る事があります。 願わくば、別ジャンルの記事も混ざっていると、もっと視野が広がって良い気がしますが。

 

目立たなくて埋もれてしまいがちな、しかし閲覧価値のあるブログを探しているユーザーは多いと思います。「 あなたと似た記事を書いているブログ」は、そういった役に立つ可能性を感じます。

 

 

 

要らない情報はフィルターで排除 

しかしこのリストにも、やはり「見に行って損をした」「見に行かなければ良かった」というブログが、何度か出て来ます。 そこで、「Ranking Blocker」と同等のブロック機能のツール「Similar Filter」を作りました。

 

ユーザーがリストでブロック指定をすれば、自然にブロックフィルターが作られ育つ仕様で、これは「Ranking Blocker」と全く同じです。 また、ランキングページで作られた「Ranking Blocker」のブロックデータを、「Similar Filter」が共用できる様にしました。

 

「Similar Filter」の使い方の詳細は、操作マニュアルを参照ください。

 

 

 

 

基本コードは 「Ranking Blocker」

「Similar Filter」の基本コードは「Ranking Blocker」から流用しています。 両方のブロックデータを同じストレージデータに記録したいのですが、「投稿完了画面」と「ブログランキング」はドメインが異なり、セキュリティ上で出来ません。

 

そこで、ブロックデータを同形式、同名のファイルに保存する事で、互いのブロックデータを共有できる様にしました。

 

下はブロックデータ共有の模式図です。「Ranking Blocker」でこれまで蓄積したブロックデータは「白」、「Similar Filter」で追加指定したブロックデータは「赤」、「Ranking Blocker」での追加指定は「グリーン」です。 ブロックデータが両方のツールで利用される仕組みです。

 

 

この共有は、ブロックデータの「ファイル保存」と「差分追加のファイル読込み」の操作で可能になります。 毎回する必要はありませんが、思い出した時に、以下のファイル交換の操作をしてください。

 

①「Ranking Blocker」でブロックデータを「ファイル保存」

➁「Similar Filter」で「差分追加」で ①のファイルを「ファイル読込み」

➂「Similar Filter」でブロックデータの「ファイル保存」

④「Ranking Blocker」で「差分追加」で ➂のファイルを「ファイル読込み」

 

以上の往復操作をすると、両ツールで最新のブロックデータが共有できます。

 

 

 

「Similar Filter」を利用するには

このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。 以下に、このツールの導入手順を簡単に説明します。

 

❶「Tampermonkey」を導入します

◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。

既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。 

拡張機能の導入については、以下のページに簡単な説明があるので参照ください。

 

 

❷「Tampermonkey」にスクリプトを登録します

◎「Tampermonkey」の「」マークの「新規スクリプト」タブを開きます。

 

 

 

◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。

 

〔コピー方法〕 軽量シンプルなツール「PreBox Button   」を使うと

  コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」

  の操作で、掲載コードのコピーが可能になります。

 

◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。

 

 

〔 Similar Filter 〕 ver. 0.1

 

// ==UserScript==
// @name         Similar Filter
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  不要な「あなたと似た記事を書いているブログ」の非表示
// @author       Ameba Blog User
// @match        https://blog.ameba.jp/ucs/entry/srventryinsertend.do
// @match        https://blog.ameba.jp/ucs/entry/srventryinsertdraft.do
// @match        https://blog.ameba.jp/ucs/entry/srventryupdateend.do
// @match        https://blog.ameba.jp/ucs/entry/srventryupdatedraft.do
// ==/UserScript==



let block_id=[];
let read_json=localStorage.getItem('SimilarBlock_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; // Similar Filter の動作モード
edit_mode=localStorage.getItem('SimilarBlock_mode'); // ローカルストレージ保存名
if(edit_mode!=0 && edit_mode!=1){
    edit_mode=0;
    localStorage.setItem('SimilarBlock_mode', 0); } // edit_mode 初期値「0」


let help_url='https://ameblo.jp/personwritep/entry-12823680965.html';


let retry=0;
let interval=setInterval(wait_target, 100);
function wait_target(){
    retry++;
    if(retry>10){ // リトライ制限 10回 1sec
        clearInterval(interval); }
    let sf_Header=document.querySelector('h2.entryComplete__entriesTitle'); // 監視
    if(sf_Header){
        clearInterval(interval);
        setter(sf_Header); }}


function setter(sf_sw){
    let style=
        '<style class="sf_style">'+
        '.help_sf { position: absolute; right: 6px; top: 13px; } '+
        '.help_sf_svg { height: 24px; width: 24px; cursor: pointer; } '+
        '.entryComplete__entries { position: relative; } '+
        'h2.entryComplete__entriesTitle { position: relative; padding: 11px 16px 6px; '+
        'margin: 20px 5px 5px; cursor: pointer; } '+
        '.entryComplete__entriesItem { position: relative; } '+
        '.RB_sw { position: absolute; top: 2px; left: 2px; font: bold 14px Meiryo; '+
        'padding: 6px 2px 4px; border: 1px solid #aaa; background: #fff; '+
        'cursor: pointer; display: none; }'+
        '.RB_sw.B:hover { color: red; }'+
        '.RB_sw.U:hover { color: #26c6da; }'+
        '.RB_item:hover .RB_sw { display: block; }'+
        '</style>';

    if(!document.querySelector('.sf_style')){
        document.body.insertAdjacentHTML('beforeend', style); }



    let help_SVG=
        '<svg class="help_sf_svg" 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_sf=
        '<a class="help_sf" href="'+ help_url +'" target="_blank" rel="noopener">'+
        help_SVG +'</a>';

    if(!document.querySelector('.help_sf')){
        sf_sw.insertAdjacentHTML('beforeend', help_sf); }

    let help_sw=document.querySelector('.help_sf');
    if(help_sw){
        help_sw.onclick=function(event){
            event.stopImmediatePropagation(); }}



    if(edit_mode==0){
        sf_sw.style.background='#fff'; }
    else{
        sf_sw.style.background='red'; }

    blocker();

    sf_sw.addEventListener('click', function(event){
        event.preventDefault();
        if (event.ctrlKey==true){
            menu(); }
        else{
            emode_set(); }}, false);

} // 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">'+
        '<style>'+
        '#file_menu { position: absolute; top: 0; left: 0; width: calc(100% - 60px); '+
        'padding: 1px 25px 0; margin: 0 5px; background: #7ca5c3; z-index: 1; } '+
        '#file_menu input { font: normal 14px/24px Meiryo; } '+
        '#button_add { margin: 0 5px 0 60px; width: 15px; height: 15px; '+
        'vertical-align: -2px; } '+
        '#button_add_label { font-size: 15px; vertical-align: -1px; }';

    if(ua==0){
        inner+=
            '#button0 { padding: 2px 6px 0; margin: 9px 0; }'+
            '#button1 { padding: 2px 8px 0; margin: 9px 0 9px 60px; }'+
            '#button2 { margin: 9px 20px 9px 10px; width: 280px; }'; }

    if(ua==1){
        inner+=
            '#button0 { padding: 0 6px; margin: 9px 0; height: 27px; }'+
            '#button1 { padding: 0 8px; margin: 9px 0 9px 60px; height: 27px; }'+
            '#button2 { margin: 9px 20px 9px 10px; width: 280px; }'; }

    inner+='</style></div>';

    let entries=document.querySelector('.entryComplete__entries');
    if(entries && !document.querySelector('#file_menu')){
        entries.insertAdjacentHTML('afterbegin', 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'; // 保存ファイル名は「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('SimilarBlock_ID', write_json); // ストレージ保存名
                        location.reload(); }}; }); }}

} // menu()




function emode_set(){
    let sf_sw=document.querySelector('h2.entryComplete__entriesTitle');
    if(edit_mode==0){
        edit_mode=1;
        localStorage.setItem('SimilarBlock_mode', 1);
        sf_sw.style.background='red';
        blocker(); }
    else if(edit_mode==1){
        edit_mode=0;
        localStorage.setItem('SimilarBlock_mode', 0);
        sf_sw.style.background='#fff';
        blocker(); }}




function blocker(){
    let user_href=[];
    let user_a=[];

    let entriesItem=document.querySelectorAll('.entryComplete__entriesItem');
    for(let k=0; k<entriesItem.length; k++){
        user_a[k]=entriesItem[k].querySelector('.entryComplete__entriesBloggerLink');
        user_href[k]=user_a[k].getAttribute('href');
        block_item(entriesItem[k], user_href[k]);
        check_item(entriesItem[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'; }}
        else{
            item.style.visibility='visible';
            item.style.background='#f2f8fc'; }}


    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.querySelector('.RB_sw').remove(); }
        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/', '');
                block_id.push(user_id);
                let write_json=JSON.stringify(block_id);
                localStorage.setItem('SimilarBlock_ID', write_json); }} // ストレージ保存名
        else{
            let ok=confirm(" 🟢  ブロックリストから外し表示させますか?");
            if(ok){
                let user_id=user_href.replace('https://ameblo.jp/', '');
                block_id=block_id.filter( function(item){
                    return item !==user_id; });
                let write_json=JSON.stringify(block_id);
                localStorage.setItem('SimilarBlock_ID', write_json); }} // ストレージ保存名

        block_filter=block_id.join('|');
        block_regex=RegExp(block_filter);
        blocker(); }

} // blocker


 

 

 

「Similar Filter」最新版について 

旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。

 

●「Similar Filter」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。