「公開フォロー」を「非公開フォロー」に自動変更する機能

フォローの「公開」設定を「非公開」に変更する機能は、「Follow Feed Checker」が目的とした本来の機能ではありません。 しかし、簡単な補助ツールを独立して多数作ると、常駐スクリプトの管理上で扱い難くなります。 同じ「フォロー管理」ページ上で動作しフォロー設定に関わるので、この機能を「Follow Feed Checker」に組み込む事は合理的と判断しました。

 

 

 

 機能の仕様

「フォローの公開設定」の変更は「フォロー管理」画面で指定します。「フォロー管理」画面へは、「Follow Feed Checker」で「ホーム」から移動する場合と、「ブログ管理」の「設定・管理」メニューから開く場合とで、開き方が違います。 しかし、どの場合もこの機能は同じ動作になります。

 

● これは「公開フォロー」を「非公開フォロー」へ変更する機能で、「非公開フォロー」を「公開フォロー」にする事は出来ません。

 

❶「フォロー管理」の画面を開くと、下図の様に「公開フォロー」のブログだけが、「状態」の列がボタンデザインで表示されます。 この緑のボタンが表示されていれば、「公開」→「非公開」の機能が使える事を示しています。

 

 

❷ 緑ボタンをクリックすると、一瞬でフォローの「削除」が行われ、別タブに以下の「フォロー登録」画面が開き、更に 2sec程度の後に「非公開フォロー」が自動的に押されます。

 

 

また、同時にデスクトップの左上に小型のサブウインドウがポップアップし、処理対象のブログを表示します。 自動処理がストップした場合は、サブウインドウで手動でフォローの再登録が出来ます。(自動処理が正常に終了すれば、サブウインドウは不要になります)

 

 

❸ 最後に、以下のフォローの確定画面が表示されて自動処理が終わります。

 

 

● 最初の「フォロー管理」のタブに戻ると、緑ボタンを押したブログは「削除」されて一覧から消失しています。 しかし、実際は ❷の段階で「非公開フォロー」済みです。「フォロー管理」の先頭ページをリロードして表示すると、新しく登録行が出来ています。

 

● この「公開」→「非公開」の機能を使うと、「フォロー管理」のリスト上の場所が、一番先頭に変ります。(リストは登録順に表示されるためです)

 

 

スクリプト処理が途中でストップする可能性 

色々テストをしてみると、フォロー対象のブログがどの様な設定でも、「非公開フォロー」は制約なしに常に可能でした。「フォロー拒否」「フォロー選択」「画像認証」などは、全て「公開フォロー」の場合にのみ問題になる項目です。

 

 

従って、「公開フォロー」→「非公開フォロー」の変更をする場合、対象ブログのフォローの設定は、自動処理がストップする原因にはなりません。

 

処理をストップする原因で予想されるのは、ユーザーの通信環境やアメーバサイトの状況によって、処理タイミングがずれる事です。 コード制作時に、タイミングの設定が不適当な場合に、処理が途中停止する事が多くありました。 たいていはストップした画面が残り、手作業で中断後の処理を実行できますが。

 

一番避けたいのは、処理が中断し、処理をしていたブログが判らなくなる事です。 全ての環境で安定に動作するかは不明なので、安全のためにサブウインドウを開く様にしています。 正常に処理が終われば、サブウインドウは閉じてください。

 

 

 

「Follow Feed Checker」ver. 0.6 

「Follow Feed Checker」は、「ホーム」の「フォローフィード」と「フォロー管理」ページを直結して、「フォロー」管理の手間を激減するツールです。 このツールの説明は、以下のリンク先を参照ください。

 

  フォローフィードの彼方に 

 

「Follow Feed Checker」を導入する手順は以下です。

 

❶「Tampermonkey」を導入します

使用しているブラウザに拡張機能「Tampermonkey」を導入します。 以下のページに簡単な導入の説明をしていますので参照ください。

 

   ⭕「Tampermonkey」の導入時の設定とテスト

 

●「Follow Feed Checker」ver. 0.6は、Chrome / Firefox / 新Edge のそれぞれのブラウザに対応した「Tampermonkey」で動作を確認しています。

 

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

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

 

 

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

 

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

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

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

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

● 旧バージョンはOFFにするか登録削除をして、新旧の同時ONは避けてください。
 
●「公開フォロー」を「非公開」に変更する機能は、「https://blog.ameba.jp/」のURLで「ポップアップ」を許可にしないと動作しません。 他の機能は「許可」でなくても動作します。

 

 

〔 Follow Feed Checker 〕ver. 0.6 

 

// ==UserScript==
// @name         Follow Feed Checker
// @namespace    http://tampermonkey.net/
// @version      0.6
// @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){ ; }}}}

} // 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');
        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.padding='4px 10px';
                status_span[k].style.border='1px solid #ccc';
                status_span[k].style.borderRadius='5px';
                status_span[k].style.background='#cbfecd';
                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 blog_url='https://ameblo.jp/' + id + '/';
                    window.open( blog_url, null, 'top=50, left=0, width=600, height=400');
                }, 100);
                setTimeout(()=>{
                    let follow_url='https://blog.ameba.jp/reader.do?bnm=' + id + '&status=close';
                    window.open( follow_url, '_blank');
                }, 500); }}}

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


if(document.querySelector('#header.rd-header')){ // フォロー登録画面で有効
    let target4=document.querySelector('body'); // 監視 target
    let monitor4=new MutationObserver(status_do);
    monitor4.observe(target4, {childList: true, subtree: true}); // 監視開始

    function status_do(){
        let win_url=window.location.search.substring(1,window.location.search.length);
        if(win_url.indexOf('status=close')!=-1){
            setTimeout(()=>{
                document.querySelector('#secInValidateNumber_01').checked=true;
            }, 20);
            setTimeout(()=>{
                document.querySelector('.rd-btnSubmit').click();
            }, 2000); }}}

 

 

 

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

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

 

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