「カバー画像のロスト」した記事をチェックする

投稿した記事のカバー画像が欠落した状態は避けたいものです。 投稿時はカバー画像を設定したつもりでいて、かなり日が経ってから気が付く場合が多く、日ごろ丁寧に再編集をするユーザーは生じる確率が増えます。「CoverImg Checker」は、これまでの全ブログ記事の「カバー画像のロスト」をチェックできます。

 

◎ 対象は「記事一覧」にカバー画像が表示される「新タイプスキン」に限られます。

 

◎「記事一覧 / 新着リスト」で、20件(1画面)を5sec程度のペースでチェックできるので、1000件の記事なら5分程度しかかかりません。

 

◎ ロストした記事が多数あればペースは遅くなります。 しかし、実際はロストはそう頻繁には生じないので、案外と早く終わると思います。

 

◎ ロストした記事を発見した場合は、その記事行を右クリックして再編集できます。

 

 

ver. 0.5 の改善点 

コード全体を組み直して、操作を判り易くしました。「メニューパーツ類」「デザイン用のstyleタグ」などの高速書込みを導入し、処理画面の表示を改善しました。 また、連続動作の管理にセッションストレージを利用し、スペースキーによる停止/再開の操作性を改善しました。

 

 

 

操作方法 

● チェック操作中は、通常のブログ作業が出来ません。

 

● 拡張機能「Tampermonkey」に登録した「CoverImg Checker」のみを「ON」にします。 登録している他のスクリプトツールを「OFF」とし、他の種類の拡張機能があれば、チェック作業中はそれらも「OFF」にするのがベストです。

 

 

 チェック作業の開始

● ユーザー自身のブログページを開き、「記事一覧」を開きます。

 

 

●「新着」の記事リストを開いた状態で「 」を押してページをリロードします。

 

 

このリロード操作で「CoverImg Checker」が起動して、画面が下の様なコンパクトなリスト表示に変わります。

 

 

リロードした時点から、チェックが始まります。 チェックは「新着」のリストを過去に遡る向きに自動的に進行します。 これは、このツールが記事をチェックする基本的な動作です。

 

 

「カバー画像のロスト」を発見した場合 

下は、カバー画像をロストした記事を発見した状態です。 チェックの進行は、ロストした記事を発見するとストップして、リスト全体に青い枠が表示されます。

 

 カバー画像をロストした記事の処理についての、処理指針を表示します。

 

➔ 赤枠の記事を右クリックして再編集して、カバー画像を修正する

➔ カバー画像を修正しない場合は、ページャーで別ページに移動する

 

(注1)記事の行を右クリックすると「再編集」のボタンが表示されます。 これをクリックすると、その記事を再編集する編集画面が開きます。 その場で記事を編集して、カバー画像の再設定ができます。

 

 カバー画像をロストした記事には、赤枠が表示されます。

 

 

(注2)ロストした記事のあるページから、移動をし難くしています。 赤枠の記事をそのままにして、更に過去の隣のページへ進むには「⇨」キーを押します。 また「⇦」キーを押すと、隣の新しいページに戻れます。

 

▪チェックが「停止中」の場合は、「Space」キーを押すとチェックを再開します。 反対に、チェックが「進行中」に「Space」キーを押すと進行が停止します。

 

▪赤枠のあるページを飛ばして更に進むには、「⇨」キーを 1度押して次のページを開き、隣のページで「Space」を 1度押して、チェック進行を再開します。

 

 

 

操作パネル 

このツールの操作パネルは、記事リストの右横に表示される簡素なデザインです。

 

 

「CoverImg Checker」の進行は、「Space」「⇨」「⇦」のキーでコントロールします。「⇨」「⇦」キーの機能は、記事リスト最下部のページャーをマウスでクリックするのと同じです。 「Space」キーは、自動チェック動作の「停止/再開」のスイッチです。 操作パネル上の ➎ の表示は、これを示しています。

 

 

チェック操作の終了 

「Exit ⏏」を押すと、チェック処理を終了してブログトップへ移動します。

 

「Tampermonkey」で「CoverImg Checker」をOFFにしない限り、ブラウザをリロードしても「自動チェック」の状態から抜けられません。 このスイッチを使うと、簡単にチェック処理を終了する事ができます。

 

「CoverImg Checker」は、チェック作業時のみに「ON」とする「非常駐型」のツールです。 チェック作業を終了したら、「Tampermonkey」の「ダッシュボード」に入って、必ず「CoverImg Checker」を「OFF」にしてください。

 

 

動作タイミング「speed」の設定 

の右端にマウスを乗せてスピナーを操作すると、進行の速度を調節できます。

 

上の表示は、デフォルトの「4sec」の設定ですが、これは、新しい記事リストのページを開いて「4sec後」にカバー画像のチェックを実行する意味です。

 

「カバー画像」の読込みは、リストのページが開いた時より少し遅れるため、余り短い設定にすると、画像を読込む前に次のページに移動して、正常なチェックになりません。 読込みの遅れは、ユーザーの通信環境が影響するので、遅い環境では増やす必要があるかも知れません。 ページを開く度に、カバー画像が全て読み込まれてから次のページに移動する状態に調節します。(遅い方が確実です)

 

▪設定の範囲は「1sec ~ 4sec(デフォルト)~ 9sec」です。

 

 

 

「CoverImg Checker」ver. 0.5 

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

 

❶「Tampermonkey」を導入します

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

 

 

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

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

 

 

 

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

 

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

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

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

 

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

 

 

〔 CoverImg Checker 〕 ver. 0.5

 

// ==UserScript==
// @name         CoverImg Checker
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  「記事一覧」の無効なカバー画像を自動チェックする
// @author       Ameba Blog User
// @match        https://ameblo.jp/*/entrylist*
// @run-at        document-start
// @noframes
// @grant         none
// ==/UserScript==



let retry=0;
let interval=setInterval(wait_target, 1);
function wait_target(){
    retry++;
    if(retry>100){ // リトライ制限 100回 0.1secまで
        clearInterval(interval); }
    let target=document.body; // 監視 target
    if(target){
        clearInterval(interval);
        env_in(); }}


function env_in(){
    let env=
        '<style id="cic_style">'+
        '[data-uranus-layout="archive"] { margin: 0; padding:0 !important; } '+
        '[data-uranus-component="archiveNavTab"] { '+
        'height: 32px; line-height: 32px; } '+
        '[data-uranus-layout="archiveBody"] { '+
        'padding: 15px 30px 60px 30px; height: 820px; } '+
        '[data-uranus-component="archiveList"]>li { '+
        'height: 32px; padding: 4px 8px; background: #fff; } '+
        '[data-uranus-component="entryItemFeedback"], '+
        '[data-uranus-component="entryItemTheme"] { display: none; } '+
        '[data-uranus-component="entryItemImage"], '+
        '[data-uranus-component="imageFrame"] img { background: #eee; '+
        'height: 32px !important; display: initial !important; } '+
        '[data-uranus-component="entryItemTitle"] { overflow: hidden; '+
        'font-size: 16px; color: #000; height: 21px; margin: 0 0 -5px; } '+
        '[data-uranus-component="entryItemMeta"] { '+
        'min-height: unset; height: 20px; } '+
        '[data-uranus-component="entryItemDatetime"] { '+
        'margin-bottom: -2px; } '+
        '[data-uranus-component="archiveFooter"] { '+
        'position: absolute; bottom: 10px; padding: 0; width: 760px; } '+
        '[data-uranus-component="pagination"] { '+
        'margin-top: 10px; padding: 4px; } '+
        '[data-uranus-component="pagination"] li { '+
        'font-size: 16px; line-height: 32px; } '+
        '[data-uranus-component="pagination"] li a { height: 30px; } '+

        'html { overflow: hidden; } '+
        '#main { position: absolute; top: 0; left: calc(50% - 420px); '+
        'width: 840px; height: 925px; font-family: Meiryo; '+
        'background: #d2e0e6; box-shadow: 0 0 0 200vw #d2e0e6; } '+
        '#ambHeader, .skin-bgHeader, .skin-blogHeaderNav, '+
        '#subA, .skin-blogSubB, .skin-blogFooterNav { display: none; } '+
        'div[id^="div-gpt-ad"] { display: none; } '+
        '#app> :not(.skin-page) { display: none; } '+
        '</style>';

    if(!document.querySelector('#cic_style')){
        document.documentElement.insertAdjacentHTML('beforeend', env); }


    let elm=
        '<div id="eaoa_menu">'+
        '<span id="retoucha">再編集</span> '+
        '<style>#eaoa_menu { position: absolute; z-index: 20; '+
        'font: normal 14px Meiryo; color: #333; padding: 3px 10px 1px; '+
        'border: 1px solid #dadce0; background: #fff; cursor: default; '+
        'box-shadow: 4px 4px 2px -2px rgba(0, 0, 0, 0.48); display: none; } '+
        '#eaoa_menu span { padding: 1px 4px 0; } '+
        '#eaoa_menu span:hover { color: #fff; background: #2196f3; }</style>'+
        '</div>'+

        '<div id="cic_menu">'+
        '<input id="end_out" type="submit" value="Exit ⏏">'+
        '<input id="wait_time" type="number" min="1" max="9">'+
        '<span id="sec_a">Speed</span>'+
        '<span id="sec_b">sec</span>'+
        '<span class="key">Space:Stop・Go</span>'+
        '<span class="key"> ⇨:Next Page</span>'+
        '<span class="key"> ⇦:Back Page</span>'+
        '<style>#cic_menu { display: flex; flex-direction: column; '+
        'position: fixed; top: 30px; left: calc(50% + 425px); '+
        'color: #000; background: #fff; width: 140px; font: 16px Meiryo; '+
        'border: 1px solid #2196f3; padding: 4px; } '+
        '#end_out { margin-bottom: 4px; padding: 4px 0 2px; } '+
        '#wait_time { padding: 4px 4px 2px 70px; margin-bottom: 8px; } '+
        '#sec_a { position: absolute; top: 48px; left: 16px; } '+
        '#sec_b { position: absolute; top: 48px; right:32px; } '+
        '.key { padding: 2px 0; text-align: center; }</style>'+
        '</div>';

    if(document.body && !document.querySelector('#cic_menu')){
        document.body.insertAdjacentHTML('beforeend', elm); }

    main();

} // env_in()



function main(){

    let stop_next=sessionStorage.getItem('cic_stop'); // 自動実行の進行フラグ
    if(!stop_next){
        stop_next=0; }
    sessionStorage.setItem('cic_stop', stop_next); // ストレージ記入

    stop_disp();


    let wait_sec;
    let wait_time=document.querySelector('#wait_time');
    if(wait_time){
        wait_sec=sessionStorage.getItem('cic_wait')*1000;
        if(!wait_sec){
            wait_sec=4000; }
        wait_time.value=wait_sec/1000;

        wait_time.onchange=function(){
            sessionStorage.setItem('cic_wait', wait_time.value); }} // ストレージ記入



    document.addEventListener('keydown', function(event){ //「Space」で停止
        event.preventDefault();
        event.stopImmediatePropagation();
        if(event.keyCode==32){
            if(stop_next==0){
                stop_next=1;
                sessionStorage.setItem('cic_stop', stop_next); // ストレージ記入
                stop_disp(); }
            else{
                stop_next=0;
                sessionStorage.setItem('cic_stop', stop_next); // ストレージ記入
                stop_disp();
                location.reload(); }}
        else if(event.keyCode==39){
            next_(); }
        else if(event.keyCode==37){
            pre_(); }
    }, false);



    setTimeout(()=>{

        let retry=0;
        let interval=setInterval(wait_img, 500);
        function wait_img(){
            retry++;
            if(retry>100){ // リトライ制限
                clearInterval(interval); }
            if(img_check()==20 || stop_next==1){
                clearInterval(interval);
                if(img_check()!=20){
                    setTimeout(()=>{
                        alert_it(); }, 200); }
                next_open(); }}

    }, wait_sec); // カバー画像の読込み待ち時間の調節 🔴



    function alert_it(){
        alert(
            "カバー画像の欠落した記事があります ➔ 次の❶❷の処理を選択\n"+
            "❶ 赤枠の記事を右クリックして再編集して、カバー画像を修正する\n"+
            "❷ カバー画像を修正しない場合は、ページャーで別ページに移動する"); }



    function img_check(){
        let check=0;
        let imgFrame=
            document.querySelectorAll('[data-uranus-component="imageFrame"]');
        for(let k=0; k<imgFrame.length; k++){
            let img=imgFrame[k].querySelector('img');
            if(!img){
                check+=1; }
            else{
                let img_width=img.getBoundingClientRect().width;
                if(img_width==100){
                    check+=1; }
                else if(img_width!=0){
                    stop_next=1;
                    sessionStorage.setItem('cic_stop', stop_next); // ストレージ記入
                    stop_disp();
                    let li=img.closest('.skin-borderQuiet');
                    li.style.outline='2px solid red'; }}}
        return check; }



    function next_open(){
        let next_button=document.querySelector('.js-paginationNext');
        if(next_button && next_button.classList.contains('is-disabled')!=true){
            let next_url=next_button.getAttribute('href');
            if(stop_next!=1){
                window.location.href=next_url; }}}


    function next_(){
        let next_button=document.querySelector('.js-paginationNext');
        if(next_button && next_button.classList.contains('is-disabled')!=true){
            let next_url=next_button.getAttribute('href');
            window.location.href=next_url; }}


    function pre_(){
        let pre_button=document.querySelector('.js-paginationPrev');
        if(pre_button && pre_button.classList.contains('is-disabled')!=true){
            let pre_url=pre_button.getAttribute('href');
            window.location.href=pre_url; }}


    let end_out=document.querySelector('#end_out');
    if(end_out){
        end_out.onclick=function(){
            let blog_url=location.href;
            blog_url=blog_url.substring(0, blog_url.indexOf('entrylist'));
            window.location.href=blog_url; }}


    function stop_disp(){
        let base=
            document.querySelector('[data-uranus-layout="archiveBody"]');
        if(base){
            if(stop_next==0){
                base.style.background=''; }
            else{
                base.style.background='#2196f3'; }}}



    let ac_list=document.querySelectorAll('.skin-borderQuiet');
    for(let k=0; k<ac_list.length; k++){
        ac_list[k].setAttribute("onContextmenu", 'return false;'); // コンテキスト抑止
        ac_list[k].addEventListener('contextmenu', function(e){ // 専用メニュー表示
            menu_disp(e, ac_list[k]); }); }

    function menu_disp(event, target){
        document.getElementById('eaoa_menu').style.display="block";
        document.getElementById('eaoa_menu').style.left=event.pageX+"px";
        document.getElementById('eaoa_menu').style.top=event.pageY+"px";
        retouch_item(target); }

    document.addEventListener('click', function(){
        document.getElementById('eaoa_menu').style.display="none"; // 専用メニュー抑止
        let ac_list=document.querySelectorAll('.skin-borderQuiet');
        for(let k=0; k<ac_list.length; k++){
            ac_list[k].setAttribute("onContextmenu", 'return false;'); }}); // コンテキスト抑止

    function retouch_item(target){
        let retouch=document.getElementById('retoucha');
        retouch.onclick=function(){
            let title_link=target.querySelector('h2 a');
            let entry_id_a=title_link.getAttribute('href').split('entry-');
            if(entry_id_a[1]){
                let entry_id=entry_id_a[1].slice(0, 11);
                if(entry_id){
                    let path=
                        'https://blog.ameba.jp/ucs/entry/srventryupdateinput.do?id='+entry_id;
                    window.open(path, "_blank"); }}}}

} // main()


 

 

 

「CoverImg Checker」最新版について 

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

 

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