「フォローフィード」の総合的な管理ツール

「Follow Feed Checker」は、フォロー対象ブログの管理を大変簡単にします。

 

 

フォロー設定の変更を直接に操作 

「フォローフィード」の記事をクリックすると、フォロー管理画面を開いて、クリックしたブログの登録欄を赤枠で示します。 登録欄では「フォロー」の変更が直接に可能で、対象ブログのページを開いてフォローの変更操作をする必要がありません。

 

下は「Ameblo Management」でアレンジしたホーム画面で、「フォローフィード」が大変に見易いものです。「Checker」はこのアレンジ適用を前提としています。

 

フォローフィードでブログ変更

 

例として、フォローの変更をしたいブログが上図の様にリスト上にあるとします。

「Follow Feed Checker」の起動スイッチは「フォローフィードのタイトル部」です。 タイトル部をクリックすると「Checker」がONになり、下図の様にフィード全体に枠が表示されます。 また、再度タイトル部をクリックすると「Checker」はOFFになり、「フォローフィード」は通常の状態に戻ります。

 

Follow Feed Checkerでフォローフィード管理

 

ツールが起動すると、リスト欄をクリックすると「フォロー管理」ページが開く様になります。 下は、フォローの変更をするブログをクリックしたところです。

 

フォローフィードのブログ変更

 

ブラウザの別タブの画面に、「フォロー管理」ページが開きます。 そして自動的に、先ほどクリックしたブログの登録欄に赤枠を表示します。

 

フォロー管理画面でブログ変更対象を赤枠表示

 

この登録欄のボタンで「フォロー削除」「メール通知」「ブラウザ通知」のフォローに関する変更が、直接に設定できます。

 

 

「公開フォロー」を「非公開フォロー」に変更 

「フォロー管理」ページで、「公開フォロー」のブログを「非公開フォロー」に変更できます。 これは、普通に行うと少し手間な操作を自動化したものです。

 

「フォロー管理」ページの「フォローしたブログ」のタブを開きます。 下図のブルーの説明が表示されていると、この機能が有効です。「Follow Feed Checker」が常駐した状態では、「公開フォロー」の「承認済み」に「青枠」が表示されます。

 

承認済み」は通常は単なる表示ですが、「青枠」が表示されると変換スイッチとして機能します。

 

フォロー管理画面「承認済み」を非公開に変更

 

ボタンをクリックすると、モニター左上隅に小ウインドウが開き、自動的に処理が進行します。 数秒後に小ウインドウが残りますが、これは自動処理が通信環境等でストップした時の担保です。

 

Follow Feed Checker 画面

 

元の「フォロー管理」ページをリロードすると、「非公開フォロー」に変更したブログはリストの1番目に移動しているはずです。 それを確認すれば処理はOKです。 小ウインドウを閉じてください。

 

万が一変更を指定したブログが1番目になければ、上の小ウインドウから、処理対象のブログを開く事が出来るので、「非公開フォロー」を手動で行ってください。 

 

なお、セキュリティ上の判断で、「公開」→「非公開」の動作のみの仕様です。

 

 

フォローフィードの「もっと見る」を自動処理

「フォローフィード」は最初は10件の表示で、フォロー対象が増えるとこれは不便です。 そこで、設定した表示件数を自動的に開く機能を実装しました。 デフォルトは20件に設定していますが、10件単位で好みに動作を変更できます。

 

〔変更例〕「Follow Feed Checker」のコードの30行目付近の「🔴」の行で、「<20」を「<30」に書き換えれば、初期リストが30件になります。 書き換えた後は「Tampermonkey」のメニューで「保存」を押し、変更を固定し反映させます。

 

 

 

「フィードを更新」の自動処理 

今回、「フィード更新」を自動実行する機能を実装しました。

 

「フィード更新」は「ホーム」画面を開いた時に行われ、後はフォローフィードのタイトル部の「   フィードを更新」を押さない限り行われません。 これは、フォローしたブログのタイムリーな更新を見落とす事に繋がります。 それを減らすために、この機能は少し役にたつ可能性があります。

 

ただし、数秒毎に更新ボタンを押すのは、トラフィック上で好ましい事ではないので、デフォルトは10分間隔に設定しています。 この間隔は変更可能です。

 

〔変更部分〕「Follow Feed Checker」のコードの135行目付近の「🔴」の行で、

「600000」(msec)の値を変更します。

 

10分毎はかなり控え目な設定ですが、「ホーム」画面がフォーカスされた場合に、自動更新がスタートし、フォーカスが外れたり、ウインドウが最小化すると自動更新がストップします。「ホーム」画面のウインドウやタブウインドウを表に出したタイミングでも更新が生じ、実際は10分間隔の更新が不要な位と思います。

 

〔注〕

「ホーム」画面内のどこかをクリックしたり、「ホーム」画面のウインドウタイトルバーをクリックすると、フォーカスが「ホーム」画面に当たった状態になります。

 

 

 

「Follow Feed Checker」ver. 0.8 

このツールは Chrome・新Edge / Firefox 版の拡張機能「Tampermonkey」上で動作します。 ツールの導入は以下の手順で行います。

 

❶ 拡張機能「Tampermonkey」の導入

「Tampermonkey」の導入手順は、以下のページを参照ください。

「Tampermonkey」は、使用しているブラウザに適した版を導入する必要があります。 既にこの拡張機能を導入している場合は、❶の手順は不要です。

 

 

❷「Follow Feed Checker」ver. 0.8 のインストール 

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

 

Tampermonkey新規スクリプトテンプレート

 

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

 

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

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

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

 

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

 

● 旧バージョンはOFFにするか登録を削除して、新旧の同時ONは避けてください。

 

 

〔 Follow Feed Checker 〕ver. 0.8 

 

// ==UserScript==
// @name         Follow Feed Checker
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  「フォローフィード」の管理補助ツール
// @author       Ameba Blog User
// @match        https://www.ameba.jp/home
// @match        https://blog.ameba.jp/ucs/blgfavorite/*
// @match        https://blog.ameba.jp/reader.do?bnm*
// @match        https://blog.ameba.jp/readerend.do*
// @grant        none
// ==/UserScript==


if(document.querySelector('#AppShellDesktop')){ // HOMEページで有効
    let mode=0;
    let lock=0;
    let user_id;

    let target0=document.querySelector('.HomeChecklist'); // 監視 target
    let monitor0=new MutationObserver(mode_select);
    monitor0.observe(target0, {childList: true, subtree: true}); // 監視開始

    function mode_select(){
        window.addEventListener('scroll', ()=>{
            let more_button=document.querySelector(
                '.HomeChecklist_Collection + .Collection_ReadMore > button');
            if(more_button){
                let item=document.querySelectorAll('.HomeChecklist_Collection_Item');
                if(item.length<20){ // ホームを開いた時の最初の記事リスト数を指定 🔴
                    more_button.click(); }}});

        let control_a=document.querySelector('.PcModuleHeader_Control a');
        control_a.onclick=function(e){
            lock=1; } //「設定」で mode_selectを抑止

        let control_b=document.querySelector('.PcModuleHeader_Control button');
        control_b.onclick=function(e){
            lock=1;
            setTimeout( function(){
                lock=0; }, 100); } //「フィードを更新」で mode_selectを抑止

        let checklist=document.querySelector('.HomeChecklist');
        let title=document.querySelector('.HomeChecklist .PcModuleHeader');
        let title_label=document.querySelector('.HomeChecklist .PcModuleHeader_Title');
        let title_con=document.querySelectorAll('.PcModuleHeader_Control_Link');

        title.style.cursor='pointer';

        title.onclick=function(){
            if(mode==0 && lock==0){
                mode=1;
                checklist.style.boxShadow='0 0 0 15px #6292ab inset';
                title.style.boxShadow='0 -4px 0 10px #6292ab, 0 0 0 20px #6292ab inset';
                title_label.style.color='#fff';
                title_con[0].style.background='#fff';
                title_con[1].style.background='#fff';
                wide_style();
                checker();}
            else if(mode==1 && lock==0){
                mode=0;
                checklist.style.boxShadow='';
                title.style.boxShadow='';
                title_label.style.color='#298538';
                title_con[0].style.background='';
                title_con[1].style.background='';
                wide_style_off();
                checker(); }}

        let k;
        let r_column=document.querySelector('.PcLayout_RightColumn');
        let c_style=window.getComputedStyle(r_column);
        let c_width=c_style.getPropertyValue('width');
        let c_item=document.querySelectorAll('.HomeChecklist_Collection_Item:nth-child(odd)');
        function wide_style(){
            if(c_width=='740px'){
                checklist.style.padding='20px';
                for(k=0; k<c_item.length; k++){
                    c_item[k].style.marginRight='24px'; }}}

        function wide_style_off(){
            if(c_width=='740px'){
                checklist.style.padding='';
                for(k=0; k<c_item.length; k++){
                    c_item[k].style.marginRight='64px'; }}}}


    let target1=document.querySelector('.HomeChecklist'); // 監視 target
    let monitor1=new MutationObserver(checker);
    monitor1.observe(target1, {childList: true, subtree: true}); // 監視開始

    function checker(){
        let k;
        let user_href;

        let item=document.querySelectorAll('.HomeChecklist_Collection_Item');
        for(k=0; k<item.length; k++){
            select_item(k); }

        function select_item(n){
            if(mode==1){
                item[n].onclick=function(e){
                    e.preventDefault();
                    user_href=item[n].querySelector('.HomeChecklist_Article_Link').getAttribute('href');
                    user_id=user_href.replace('https://ameblo.jp/', '');
                    let index=user_id.indexOf('/entry');
                    user_id=user_id.substring(0, index);
                    item[n].style.outline='2px solid red';
                    setTimeout( conf, 800);

                    function conf(){
                        item[n].style.outline='';
                        let url_str='https://blog.ameba.jp/ucs/blgfavorite/favoritelist.do?' + user_id;
                        window.open( url_str, '_blank'); }}} // ページ移動
            else if(mode==0){
                item[n].onclick=function(e){ ; }}}}


    let repeat=null;
    auto_feed();

    function feed(){
        let control_b=document.querySelector('.PcModuleHeader_Control button');
        if(control_b){
            control_b.click(); }}

    function auto_feed(){
        feed();
        repeat=setTimeout(auto_feed, 600000); } // フィードの自動更新間隔(msec)🔴

    window.addEventListener('focus', function(){
        auto_feed(); });

    window.addEventListener('blur', function(){
        clearTimeout(repeat); });

} // HOMEページで有効


if(document.querySelector('#readerList')){ // フォロー管理ページで有効
    let user_id;
    let win_url;

    let target2=document.querySelector('body'); // 監視 target
    let monitor2=new MutationObserver(table_view);
    monitor2.observe(target2, {childList: true, subtree: true}); // 監視開始

    function table_view(){ // HOMEから遷移して来た最初の管理画面でのみ動作する
        let k;
        let tr_href=[];
        let find=0;

        win_url=window.location.search.substring(1,window.location.search.length);

        if(win_url !='' && win_url.indexOf('pageID') ==-1){ // URLにuser_idが有る場合
            user_id=win_url;
            let write_json=JSON.stringify(user_id);
            localStorage.setItem('followfeedcheck_id', write_json); // ローカルストレージ名

            let table_tr=document.querySelectorAll('.tableList tbody tr');
            for(k=0; k<table_tr.length; k++){
                tr_href[k]=table_tr[k].querySelector('td.title a').getAttribute('href');
                if(tr_href[k].indexOf(user_id) !=-1){
                    find=1;
                    table_tr[k].style.outline='2px solid red';
                    table_tr[k].scrollIntoView({block: 'center'});
                    status();
                    return; }} // 検索処理を終了

            if(find==0){ // user_idが見つからないと2ページへ移動
                let pager=document.querySelector('.pagingArea');
                let end=document.querySelector('.pagingArea .disabled.next');
                if(!end && pager){ // ページング末尾で無ければ2ページへ
                    let url_str='https://blog.ameba.jp/ucs/blgfavorite/favoritelist.do?pageID=2&More';
                    window.open( url_str, '_self'); }}} // URLにuser_idが有る場合
        else{ //  HOMEからの遷移ではなく、単独でフォロー管理を開いた場合
            status(); }}


    let target3=document.querySelector('body'); // 監視 target
    let monitor3=new MutationObserver(table_view_next);
    monitor3.observe(target3, {childList: true, subtree: true}); // 監視開始

    function table_view_next(){ // 管理画面のリスト2ページ目以降から動作する
        let k;
        let tr_href=[];
        let find=0;

        win_url=window.location.search.substring(1,window.location.search.length);
        if(win_url.indexOf('&More') !=-1){ // URLに&Moreが有る場合のみ

            let read_json=localStorage.getItem('followfeedcheck_id'); // &Moreページで再読込み
            if(JSON.parse(read_json)){
                user_id=JSON.parse(read_json); }

            let table_tr=document.querySelectorAll('.tableList tbody tr');
            for(k=0; k<table_tr.length; k++){
                tr_href[k]=table_tr[k].querySelector('td.title a').getAttribute('href');
                if(tr_href[k].indexOf(user_id) !=-1){
                    find=1;
                    table_tr[k].style.outline='2px solid red';
                    table_tr[k].scrollIntoView({block: 'center'});
                    status(); // 非公開への自動変更機能の待機
                    return; }} // 検索処理を終了

            if(find==0){ // user_idが見つからないと次ページへ移動
                let end=document.querySelector('.pagingArea .disabled.next');
                if(!end){ // ページング末尾で無ければ次ページへ
                    let page_n=win_url.replace(/[^0-9]/g, '');
                    page_n=parseInt(page_n, 10) +1;
                    let url_str=['https://blog.ameba.jp/ucs/blgfavorite/favoritelist.do?pageID=',
                                 + page_n + '&More'].join('');
                    window.open( url_str, '_self'); }}}}


    function status(){ //「公開フォロー」を「非公開」に変更
        let k;
        let blog_id=[];
        let status_span=[];
        let del_button=[];
        let blog_name=document.querySelectorAll('input[name="blog_name"]');
        let table_tr=document.querySelectorAll('.tableList tbody tr');

        let info=document.createElement('div');
        info.textContent="「承認済み」ボタンをクリックすると"+
            "「公開フォロー」を「非公開フォロー」に自動的に変更します";
        info.style.margin='6px 0 -12px';
        info.style.padding='2px 6px 1px';
        info.style.color='#fff';
        info.style.background='#2196f3';
        let box=document.querySelector('#ucsMainLeft #notes');
        if(!box.querySelector('div')){
            box.appendChild(info); }

        for(k=0; k<table_tr.length; k++){
            blog_id[k]=blog_name[k].getAttribute('value');
            del_button[k]=table_tr[k].querySelector('.btnDelete');
            status_span[k]=table_tr[k].querySelector('.status span');
            if(status_span[k].classList.contains('open')==true){
                status_span[k].style.borderRadius='3px';
                status_span[k].style.boxShadow='0 0 0 2px #2196f3';
                status_span[k].style.cursor='pointer';
                win_open(status_span[k], blog_id[k], del_button[k]); }}


        function win_open(span, id, del){ // 公開→非公開の自動変更
            span.onclick=function(){
                del.click();
                setTimeout(()=>{ // 対象ブログの削除ボタンを押す
                    let ok=document.querySelector('.minimumApplyButton a:first-child');
                    ok.click();
                }, 20);
                setTimeout(()=>{ // 対象ブログを非公開フォローする
                    let follow_url='https://blog.ameba.jp/reader.do?bnm=' + id + '&status=close';
                    window.open( follow_url, '_blank', 'top=0, left=0, width=480, height=360');
                }, 500); }}} // 処理を待ってから次のステップを実行

} // フォロー管理ページで有効


if(document.querySelector('#header.rd-header')){ // フォロー登録画面で有効
    let css=[
        'body { font-family: Meiryo; background: #cfd8dc; }',
        '#ambHeader { min-width: 400px !important; }',
        '#header.rd-header { display: flex; justify-content: center; width: auto; ',
        'padding: 20px 0 14px !important; }',
        '#contentsArea.rd-contentsArea { width: 400px !important; margin: 0 auto; }',
        '#mainCol.rd-mainCol { padding-top: 40px; }',
        '#contentsArea.rd-contentsArea._end { width: 400px; margin: 0 auto; }',
        '.rd-contentsArea._end #mainCol.rd-mainCol { padding: 20px 0 0; }',
        '.rd-checkList { margin: 15px 0; } .rd-error .error { font-size: 18px; font-weight: bold; }',
        '.rd-selectArea { width: 394px; } .rd-regist { padding: 15px; }',
        '.rd-radioArea { margin: 0; } .rd-radioLabel { font-size: 16px; }',
        '.rd-radioLabel:before { left: -23px; width: 14px; height: 14px; margin-top: -8px; }',
        '.rd-radioLabel:after { left: -24px; width: 14px; height: 14px; margin-top: -9px; ',
        'border: 1px solid #88bae6; }',
        '#ambHeaderRight, #ambFooter { display: none; }',
        '.rd-explanationSmall, .rd-amemberArea, .rd-browserPushArea, .rd-monsterBnr, ',
        '.rd-explanation, .rd-explanationSub, .rd-radioExplanation, .rd-infoMail, ',
        '.rd-followManagementLink { display: none; }' ].join(' ');

    let style=document.createElement('style');
    style.insertAdjacentHTML('afterbegin', css);
    let head=document.getElementsByTagName('head')[0];
    head.appendChild(style);

    let target4=document.querySelector('body'); // 監視 target
    let monitor4=new MutationObserver(ffcheker_do);
    monitor4.observe(target4, {childList: true, subtree: true}); // 監視開始

    function ffcheker_do(){
        let win_url=window.location.search.substring(1,window.location.search.length);
        if(win_url.indexOf('status=close')!=-1){
            if(!document.querySelector('.rd-error._whole .error')){ // 既にフォローしていない事が条件
                setTimeout(()=>{ // 非公開でフォローするにチェックを入れる
                    document.querySelector('#secInValidateNumber_01').checked=true;
                }, 20);
                setTimeout(()=>{ //「フォロー」決定ボタンを押す
                    document.querySelector('.rd-btnSubmit').click();
                }, 40);
                setTimeout(()=>{ // フォロー管理のトップを開く
                    let top_href='https://blog.ameba.jp/ucs/blgfavorite/favoritelist.do';
                    window.opener.location.href=top_href;
                }, 500); }}} // 処理の結果をフォロー管理画面に反映

} // フォロー登録画面で有効


 

 

〔追記〕2020.09.18

コードの240行周辺、「承認済み」のステータスのボタン化表示の部分で、以下のコードを削除しました。 このボタンのデザインを「Ameblo Management」側に統合した結果です。

 

/* padding: 4px 2px 2px 16px; */
/* vertical-align: -3px; */
 /* background-position: 2px -24px; */

 

 

 

「Ameblo Management」のスタイル併用をお勧めします 

「Follow Feed Checker」は、「ホーム」画面のデフォルトデザインの状態でも使えない事はありません。 しかし、デフォルトの「ホーム」画面は、このページの説明画像の様には見易くはありません。

 

特に「フォローフィード」に関しては、「Ameblo Management」のスタイルを適用すると、圧倒的に使い易いと感じるでしょう。

 

▪「フォローフィード」は「ホーム」画面の最上部に配置されます。

▪ デフォルトの2列の千鳥配列は、1列で縦並びのリストになります。

▪「新着 」「未読 」のマークと記事タイトル文字色で、未読 / 既読が明瞭に判断出来ます。 このため、新着マークが消えた後でも、未読が判断できます。 

 

「Ameblo Management」は、「ホーム」画面以外にも、アメブロの多くの画面のデザインをユーザーライクにアレンジします。 このスタイルを利用するには、以下のページの後半の手順を参照ください。

 

 

 

 

「Follow Feed Checker」最新版について 

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

 

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