フィード更新のコードを全面見直し
Ver. 1.0 のフィード更新コードは、ページリロードでリスト位置の再現性が良いのですが、肝心のフィードの自動更新では不安定でした。 これをなんとか改善しようとしている間に、どんどんコードが変わり、結局いちから見直すことになりました。
フィード更新に主眼を置いたコードを先ず組み立て、それをリロード時にも利用する形で、これまでとは逆の組み立て方になりましたが、今回はリスト位置がほぼ安定して、かなり理想に近付いたと思います。
唯一気になる点は、リストの初期10件の状態からスクロールダウンする場合に、新しい 10件が読み込まれる際に、リストの表示位置が少し戻る点です。 これは、スクロールダウンのスピードが早い場合にだけ気になり、実用上は合格点と思います。
ローカルストレージに保存される設定値
Ver. 1.1 では、配列「setting」の以下の値を ローカルストレージに記録します。
setting[0] スクリプト名
setting[1] フィード初期リスト数
setting[2] フィードタイマー更新 ON/OFF
setting[3] タイマー更新の繰返し時間
setting[4] ブラウザフォーカス ON/OFF
setting[5] リスト更新直前の最下のリスト番号
setting[6] リスト更新直前のページスクロール量
今回のバージョンは、リスト更新直前のページのスクロール量をローカルストレージに記録して、リストの自動更新後に正確なリスト表示位置を再現します。
リロード時は、元のリスト位置を再現するのではなく、ページ先頭(リスト先頭)を表示する「リセット」の動作に改めました。
フィードの表示に関わるコードは、Ver. 1.0 から殆どが変更されています。 フィード更新時のリストの正確な再現機能以外にも、次の新たな特徴があります。
◎ フィード更新時、前バージョンは常にリストの指定件数までを開いていました。 今回は、リスト更新直前に開いていたリスト位置までを開き、それ以降は開きません。 この方式は、フィード下部を表示した後のフィード更新で、フィードを開く件数を必要最低限にします。 80件まで開いた後、更新直前は20件目を表示していた場合は、更新時は20件しか開かず無駄な読込みを減らします。
◎ 前バージョンでは「スクロール操作」を検知して「フィードをもっと見る」を押していましたが、「スクロールホイール操作」の検知に改めました。 スクロール位置に反応するコードは、ページ表示やスクリプト全体の動作に負担をかけるので、負担の少ない「ホイール検知」にしました。
◎「ページ最上部に戻る」ボタンを押したり、スクロール位置をページ最上部に戻した状態のフィード更新や、「HOME」画面のリロードは、リスト読込みの件数を最小の 10件(アメブロのデフォルト)に戻します。
◎「フォローフィード」は「ホイール操作」で設定件数まで自動的にリストが取得されますが、「フィード」より下方の表示を見たい場合にこの自動取得が邪魔になる場合は、「スクロールバーの直接操作」「⇩」「Page Down」「Space」等で移動操作をすると自動取得は行われません。
フォローフィードの「自動更新」機能のマニュアル
改善・変更を繰り返したので、ここでもういちど「Follow Feed Checker」の操作方法を纏めておきます。
「Follow Feed Checker」は「自動更新」以外に以下の機能があります。
➀ フォローフィードの記事リストから、フォロー変更・解除をワンタッチで行う
➁ フォロー管理画面で、公開フォローを非公開フォローに変更操作
これら ➀②の内容と操作については、以下のページを参照ください。
以下は、「フォローフィード」の自動更新機能についての説明です。
アメーバロゴのクリックでメニューを表示
「自動更新機能のメニュー」を表示するボタンは「アメーバロゴ」です。
このボタンを左クリックすると、下のメニューが表示されます。
❶「メニュー」を閉じるボタン。
❷「フィードの初期リスト数」
「HOME」を開いた最初は、フィードは「10件」しか表示されませんが、「ホイールスクロール」の操作をすると ❷ で指定した件数までフィードが追加表示されます。
◎ 設定は「10件」以上の件数を「10件」単位で指定できます。
◎「10件」はアメブロの本来の状態です。
◎ 設定した値は記録され、ブラウザを閉じても保持・再現されます。
❸「タイマー更新」
フォローフィードは「 フィードを更新」を押さないと更新されません。 更新をしないと、フォローしたブログの更新に気付かない事があります。 この機能は、それを減らすため、一定の時間ごとに自動で更新をする機能です。
◎ チェックを入れると「タイマー更新」機能がONになります。
◎ チェックを外すとタイマー機能がOFFになり、❹ もグレーアウトします。
◎ リスト下方を参照時の自動更新は、そのリスト位置の表示を再現します。
❹「更新間隔」
「タイマー更新」の間隔をこの枠で設定します。
◎ 最小は「1分」~ 最大「30分」のタイミングを、1分単位で設定します。
◎ 通常の使用では 10分以上が適当と思いますが、これは好みです。
◎「HOME」を開いたまま他のウインドウで作業をしていても、更新されます。
◎ ❺ の機能で更新が行われると、タイマーはその時点からにリセットされます。
◎ ページをリロードすると、タイマーはリロード時点からにリセットされます。
◎「更新間隔」の変更は、メニューを閉じるまで実動作に反映しません。
〔ヒント〕
この枠に数値を直接記入すると「0.1」まで設定できます。 これは、機能のテスト時などに使え、0.2=12sec 等の設定が可能です。
❺「フォーカス検知」
「HOME」を表示しているブラウザウインドウ(タブ)にフォーカスが当たった時に、それを検知してフィードを自動更新する機能です。
◎ チェックをONにすると、「HOME」画面に戻る時に自動更新が動作します。
◎ チェックをOFFにすると、「HOME」画面に戻る時に更新をしなくなります。
◎ この機能による更新後は、❹ の設定の1/2の時間は反応しなくなります。
〔注1〕
「タイマー更新」の間隔を大きく設定した場合や、「タイマー更新」機能をOFFにした場合は、「フォーカス検知」をONにすると有効です。 「フォローフィード」の扱い方はユーザーによって異なるので、ONにするかどうかは適切に判断してください。
〔注2:フォーカスについて〕
フォーカスが当たっていないウインドウの何処かをクリックしたりドラッグすると、そのウインドウにフォーカスが当たります。 また、複数のタブを開いたブラウザウインドウでは、タブをクリックして開いたタブ画面にフォーカスが当たります。 一般に、フォーカスは、ユーザーが操作した対象に移動します。
「Follow Feed Checker」ver. 1.1
このツールは Chrome・新Edge / Firefox 版の拡張機能「Tampermonkey」上で動作します。 ツールの導入は以下の手順で行います。
❶ 拡張機能「Tampermonkey」の導入
「Tampermonkey」の導入手順は、以下のページを参照ください。
「Tampermonkey」は、使用しているブラウザに適した版を導入する必要があります。 既にこの拡張機能を導入している場合は、❶の手順は不要です。
❷「Follow Feed Checker」のインストール
●「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
●「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
● 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
● 旧バージョンはOFFにするか登録を削除して、新旧の同時ONは避けてください。
〔追記〕2020.12.02
ツールの動作を表示する目的で、スイッチの「アメーバロゴ」に枠線を表示しました。 また、操作パネルのデザインをロゴに合せました。 以下の掲載コードは、このデザイン変更済で、バージョンは ver. 11a になります。
〔 Follow Feed Checker 〕ver. 1.1 a
// ==UserScript== // @name Follow Feed Checker // @namespace http://tampermonkey.net/ // @version 1.1a // @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 redo; // インターバル変数 let setting=[]; // 動作設定の記録配列 // setting[0] スクリプト名 // setting[1] フィード初期リスト数 // setting[2] フィードタイマー更新 ON/OFF // setting[3] タイマー更新の繰返し時間 // setting[4] ブラウザフォーカス ON/OFF // setting[5] リスト更新直前の最下のリスト番号 // setting[6] リスト更新直前のページスクロール量 let read_json=localStorage.getItem('followfeed_set'); // ローカルストレージ保存名 setting=JSON.parse(read_json); if(setting==null || setting.length<7){ setting=['FollowFeedSet',20,1,10,0,0,0]; } let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); // ローカルストレージ保存 ff_panel(); ff_setting(); auto_feed(); function auto_feed(){ redo=setInterval(()=>{ feed(setting[2]); }, setting[3]*60000); } // 自動タイマー設定と開始 🔴 let focus_fake=1; // 不感コントロール変数 window.addEventListener('focus', function(){ if(setting[4]==1){ // フォーカスで自動タイマーリセット 🔴 if(focus_fake==1){ focus_fake=0; clearInterval(redo); auto_feed(); setTimeout(()=>{ focus_fake=1; }, setting[3]*30000); }}}); // フォーカス不感時間 🔴 function feed(sw){ let control_b=document.querySelector('.PcModuleHeader_Control button'); if(control_b && sw==1){ last_item(); // 🔵 リストスクロール位置取得 control_b.click(); fix_last(); }} // 指定記事までリストを開く 🔵 function slow_more(){ let more_button= document.querySelector('.HomeChecklist .Collection_ReadMore_Button'); if(more_button){ let rect=more_button.getBoundingClientRect(); let item=document.querySelectorAll('.HomeChecklist_Collection_Item'); if(rect.top<window.innerHeight && item.length<setting[1]){ // 指定記事数まで 🔴 last_item(); more_button.click(); }}} function last_item(){ let item=document.querySelectorAll('.HomeChecklist_Collection_Item'); for(let k=item.length-1; k>=0; k--){ let rect=item[k].getBoundingClientRect(); if(rect.top<window.innerHeight){ setting[5]=k; // 🔵 リストの表示上の末尾を取得 setting[6]=parseInt(window.pageYOffset); break; }} let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); } // ローカルストレージ保存 function fix_last(){ let item=document.querySelectorAll('.HomeChecklist_Collection_Item'); let more_button= document.querySelector('.HomeChecklist .Collection_ReadMore_Button'); if(more_button){ if(item.length<setting[5]){ // 指定記事までリストを開く 🔵 more_button.click(); }} document.documentElement.scrollTop=setting[6]; } function top_env(){ // ページ最上部に 戻るボタン・スクロールバー で戻った場合 if(document.documentElement.scrollTop<100){ setting[5]=8; setting[6]=0; let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); }} // ローカルストレージ保存 function ff_panel(){ let panel=document.createElement('div'); panel.innerHTML= '<input id="ff_close" type="submit" value="✖">'+ '<span> フィードの初期リスト数 </span>'+ '<input id="list_open" type="number" value="20" min="10" step="10"> '+ '<label><input id="ff_timer" type="checkbox"> タイマー更新</label>'+ '<div id="ref_set"><span> 更新間隔 </span>'+ '<input id="ref_setter" type="number" value="10" min="1" max="30" step="1">'+ '<span> 分 </span></div>'+ '<label><input id="ff_focus" type="checkbox"> フォーカス検知</label>'+ '<style>#ff_panel { position: fixed; top: 8px; left: calc(50% - 480px); '+ 'font: bold 16px/24px Meiryo; color: #666; background: #fff; display: none; '+ 'width: auto; height: 30px; padding: 7px 20px 3px; border: 1px solid #20d6c5; '+ 'box-shadow: 4px 6px 8px rgb(0, 0, 0, .1); z-index: 10; } '+ '#ff_close { padding: 3px 2px 1px; } '+ '#list_open, #ref_setter { width: 50px; padding: 4px 2px 1px; text-align: center; } '+ '#ref_set { display: inline-block; } '+ '.PcHeader_Logo_Image { outline: 1px solid #20d6c5; outline-offset: 3px; } '+ '</style>'; panel.setAttribute('id', 'ff_panel'); if(!document.querySelector('#ff_panel')){ document.querySelector('body').appendChild(panel); }} function ff_setting(){ let pc_logo=document.querySelector('h1.PcHeader_Logo'); let ff_panel=document.querySelector('#ff_panel'); if(pc_logo && ff_panel){ pc_logo.onclick=function(event){ event.preventDefault(); ff_panel.style.display='block'; let ff_close=document.querySelector('#ff_close'); ff_close.onclick=function(event){ event.stopImmediatePropagation(); window.location.reload(); } let list_open=document.querySelector('#list_open'); list_open.value=setting[1]; list_open.onchange=function(){ setting[1]=parseFloat(list_open.value); let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); } // ストレージ保存 let ff_timer=document.querySelector('#ff_timer'); let ref_set=document.querySelector('#ref_set'); let ref_setter=document.querySelector('#ref_setter'); if(setting[2]==1){ ff_timer.checked=true; ref_set.style.opacity=1; ref_setter.disabled=false; } else{ ff_timer.checked=false; ref_set.style.opacity=0.5; ref_setter.disabled=true; } ff_timer.onchange=function(){ if(ff_timer.checked){ setting[2]=1; ref_set.style.opacity=1; ref_setter.disabled=false; } else{ setting[2]=0; ref_set.style.opacity=0.5; ref_setter.disabled=true; } let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); } // ストレージ保存 ref_setter=document.querySelector('#ref_setter'); ref_setter.value=setting[3]; ref_setter.onchange=function(){ if(parseFloat(ref_setter.value)>=0.1){ setting[3]=parseFloat(ref_setter.value); } else{ setting[3]=1; } let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); } // ストレージ保存 let ff_focus=document.querySelector('#ff_focus'); if(setting[4]==1){ ff_focus.checked=true; } else{ ff_focus.checked=false; } ff_focus.onchange=function(){ if(ff_focus.checked){ setting[4]=1; } else{ setting[4]=0; } let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); } // ストレージ保存 }}} // ff_setting() let target=document.querySelector('.HomeChecklist'); // 監視 target let monitor=new MutationObserver(main); monitor.observe(target, {childList: true, subtree: true}); // 監視開始 function main(){ fix_last(); // ホームを開いた時の初期リスト表示 🔴 window.addEventListener('wheel', function(){ slow_more(); }); window.addEventListener("scroll", function() { top_env(); }); window.addEventListener("beforeunload", function(){ setting[5]=8; setting[6]=0; let write_json=JSON.stringify(setting); localStorage.setItem('followfeed_set', write_json); }); // ローカルストレージ保存 let more_button= document.querySelector('.HomeChecklist .Collection_ReadMore_Button'); more_button.addEventListener('mousedown', function(event){ last_item(); }); mode_select(); checker(); function mode_select(){ 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'; }}}} 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){ ; }}}} } // main() } // HOMEページで有効 if(document.querySelector('#readerList')){ // フォロー管理ページで有効 let user_id; let win_url; let target=document.querySelector('body'); // 監視 target let monitor=new MutationObserver(table_view); monitor.observe(target, {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 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'); }}} else{ // HOMEからの遷移ではなく、単独でフォロー管理を開いた場合 status(); } } // table_view() 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 target=document.querySelector('body'); // 監視 target let monitor=new MutationObserver(ffcheker_do); monitor.observe(target, {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); }}} // 処理の結果をフォロー管理画面に反映 } // フォロー登録画面で有効
「Ameblo Management」のスタイル併用をお勧めします
「Follow Feed Checker」は、「ホーム」画面のデフォルトデザインの状態でも使えない事はありません。 しかし、デフォルトの「ホーム」画面は、このページの説明画像の様には見易くはありません。
特に「フォローフィード」に関しては、「Ameblo Management」のスタイルを適用すると、圧倒的に使い易いと感じるでしょう。
▪「フォローフィード」は「ホーム」画面の最上部に配置されます。
▪ デフォルトの2列の千鳥配列は、1列で縦並びのリストになります。
▪「新着 ●」「未読 ●」のマークと記事タイトル文字色で、未読 / 既読が明瞭に判断出来ます。 このため、新着マークが消えた後でも、未読が判断できます。
「Ameblo Management」は、「ホーム」画面以外にも、アメブロの多くの画面のデザインをユーザーライクにアレンジします。 このスタイルを利用するには、以下のページの後半の導入手順を参照ください。
「Follow Feed Checker」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「Follow Feed Checker」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。