ブログ内検索は大文字・小文字を区別した検索が出来ない 

先日、「DevTools」を「Devtools」と誤って「t」を小文字で書いていたのに気付き、他所でも同じ間違いをしているのではと心配になりました。 そこで、ブログ内検索で「Devtools」を検索すると「DevTools」が大量にヒット。 つまり「大文字・小文字」の区別をしない検索となり、これでは「Devtools」だけを探せません。

 

Google検索も同じ仕様で、一般の検索ではこの方が都合が良いからでしょう。 しかし困りました。 以前に作った全記事の自動処理ツールの「Every Page Worker 💢💢」を使うしかなさそうです。

 

   ブログ全ページの検索・自動処理ツール 

 

このツールは「\u200B」という特殊文字の検索に使ったのですが、「Devtools」に差し換えるだけで「小文字」の場合のみを検索が出来ます。 しかし、それだけでは能がないので、以下の更新をしました。

 

● 検索処理(検索以外の処理でも良い)を 2処理可能として、「記事タイトル」と「記事本文」の検索を可能にする。

 

● 検索ヒットした記事データから、記事を選択して再編集画面に開く機能を追加。

 

 

 

更新したツールのデザイン 

このツールは、「記事の編集・削除」のページで動作します。 ツールをONとすると、ページデザインがツールの目的に合わせて一時的にアレンジされます。 また、記事の公開確認画面の動作が変わるので、ツールを使わない時はOFFが必須です。

 

下は、自動処理をしている状態で、左側は記事の処理ウインドウです。 ツールは、リストの記事を順番に開きながら自動的に処理を実行します。

 

 

「記事の編集・削除」の画面上部のページャーは、自動処理時以外は通常の操作が出来ます。 その下が、このツールのコントロール部です。

 

 

「自動処理を開始」するボタンです。 処理が開始されると、ボタンは「一旦停止」のボタンに変わります。 一旦停止時は、「自動処理の再開」のボタンになります。

 

 

検索ヒットした記事のIDは、ヒットした検索種(Check1 / Check2)とペアでローカルストレージに記録されます。両方の種類にヒットした場合は、同じ記事IDで2個の記録が出来ます。 このローカルストレージの記録をクリアするのが「初期化」で、処理内容を変えたり、処理をやりなおす際に必要です。

 

ローカルストレージの記録はブラウザを閉じても消えませんが、特にデータを残して置きたい場合にファイル化が可能です。 このボタンを押すと、記録データをダウンロードフォルダーにテキストファイルで保存します。

 

ファイル化したデータをツールに呼び戻すボタンです。 それまでのローカストレージの記録内容は、読込んだデータで上書きされます。

 

記録されたデータの総件数です。

 

Check1 の検索にヒットした累積件数です。 自動処理中は、ヒットがある度に値が更新されます。 自動処理の終了後は、この枠はヒット記事の選択枠になります。 枠内の数は「ヒット記事の登録の順番」を意味し、その数で記事を指定します。

 

左の 枠で指定した記事を編集画面に開くボタンです。 編集画面は、処理ウインドウの位置に通常のサイズで開きます。

 

 Check2 の検索にヒットした累積件数で、ヒットした記事を選択にも使います。

 

 左の 枠で指定した記事を編集画面に開くボタンです。

 

 

ツールの扱い方 

●「記事の編集・削除」で開いたページで を押して処理を開始すると、それ以降の時期のページを自動的に開き、処理を続けます。 最終的には最後(最近)のページまで処理をして、自動的に終了します。 スタートより手前の記事は処理をしません。

 

のボタンで「一旦停止」したり、途中でブラウザを閉じたりして、処理を中断できます。 その場合は、ストレージに処理した範囲のデータが残ります。 一定の期間を処理範囲としたり、残った範囲を追加処理して範囲を広げる事も可能です。 データは上書きで追加されるので、同じ範囲を重複処理しても問題はありません。

 

● 処理対象は「最新版エディタ」で開かれる記事のみで、「タグ編集エディタ」で開かれる記事は処理をせずに閉じます。 また、記事の公開設定の「全員に公開」「下書き」「アメンバー限定公開」「未来記事」などには関係なく、全てを処理をします。

 

● 一旦ヒットが記録されると「初期化」をするまで記録が残ります。 記事を書換えてヒットした文字を削除し、それを再び重複処理しても、ヒット記録は消えません。

 

〔追記〕2020.03.31

ver4.3以降、データ記録を「追加上書き」から「更新」する仕様に変更しています。 ヒットした記事からヒット文字を変更すると、重複処理でヒット記録が消えます。 

 

● このツールは編集サブウインドウを開くため、ブラウザのポップアップブロック設定が有効になっていると動作を妨げられます。 ブラウザのブロック解除の設定方法に従い「https://blog.ameba.jp」を ポップアップ許可URLに追加してください。

 

● 環境により差が生じるかも知れませんが、1記事を約7sec程度で処理します。 自動処理動作中は、ブラウザの作業がツールに専有され、他の作業が出来なくなります。

 

〔追記〕2020.03.31

ver4.1以降、1記事が4.4sec程度の処理時間に短縮しています。

 

 

自動処理がストップする場合 

通信環境が大変に悪い場合には、自動処理が途中で停止する事があり得ます。 また、私の環境で多数のテストをすると、1年分(3~400)の記事で1回程度、ストップを経験しました。 特殊文字や絵文字を大量に掲載した記事でストップする傾向がある様ですが、普通の記事で止まる場合もあり詳細は不明です。

 

停止時は処理ウインドウが開いたままとなり、手作業でその記事を「公開」すると、記事の処理が再開する場合があります。 処理ウインドウを閉じ、主ウインドウで「一旦停止」→「自動処理の再スタート」を行うと、停止した記事が処理され、処理が再開する事が多くあります。

 

このツールの処理が頻繁に停止する場合は、PC再の起動で改善する場合があります。

 

 

 

処理コード 

処理部のコードを差し換えて、任意の処理をさせる事が出来ます。 以下は、処理部の雛形のコードです。

 

 

処理コード ❶ 

以下のコードは、「記事本文」(Check1)と「記事タイトル」(Check2)を検索するコードで、これは全コードの400行前後にあります。 検索文字は「JavaScript」としていますが、これを実際には「/検索文字列/」の形に書換えて使用します。

 

function task(){ // taskは自動で開いたページでの作業コード / 作業目的で自製 💢🟥
    Promise.all([
        task_in1(),
        task_in2(), // Check 2 不要な場合はコメントアウト 🟥
        strage_write(),
        snap_disp() ])
        .then(end_target()) }

function task_in1(){
    let iframe_body=iframe_doc.querySelector('.cke_editable');
    let result1=iframe_body.textContent.match(/JavaScript/); // 検索1:結果「flag 1」
    if(result1){
        let index=entry_id_DB.indexOf(entry_id[k].value);
        if(index==-1){ // IDがblogDBに記録されていない場合
            blogDB.push([entry_id[k].value, 1]); } // 記事ID/フラグを追加
        else{ // IDがblogDBに記録されていた場合
            if(blogDB[index][1]!=1){
                blogDB.push([entry_id[k].value, 1]); }}}} // 記事ID/フラグを追加

function task_in2(){
    let title=new_win[k].document.querySelector('.p-title__text').value;
    let result2=title.match(/JavaScript/); // 検索2:結果「flag 2」
    if(result2){
        let index=entry_id_DB.indexOf(entry_id[k].value);
        if(index==-1){ // IDがblogDBに記録されていない場合
            blogDB.push([entry_id[k].value, 2]); } // 記事ID/フラグを記録
        else{ // IDがblogDBに記録されていた場合
            if(blogDB[index][1]!=2){
                blogDB.push([entry_id[k].value, 2]); }}}} // 記事ID/フラグを追加

 

 

処理コード ❷ 

以下は「記事本文」(Check1)のみを検索するコードです。 1処理だけで良い場合は、全コードの400行前後の該当部分を、このコードに置換えます。「JavaScript」を検索文字としていますが、実際は「/検索文字列/」の形に書換えて使用します。

 

function task(){ // taskは自動で開いたページでの作業コード / 作業目的で自製 💢🟥
    Promise.all([
        task_in1(),
        strage_write(),
        snap_disp() ])
        .then(end_target()) }

function task_in1(){
    let iframe_body=iframe_doc.querySelector('.cke_editable');
    let result1=iframe_body.textContent.match(/JavaScript/); // 検索1:結果「flag 1」
    if(result1){
        let index=entry_id_DB.indexOf(entry_id[k].value);
        if(index==-1){ // IDがblogDBに記録されていない場合
            blogDB.push([entry_id[k].value, 1]); } // 記事ID/フラグを追加
        else{ // IDがblogDBに記録されていた場合
            if(blogDB[index][1]!=1){
                blogDB.push([entry_id[k].value, 1]); }}}} // 記事ID/フラグを追加

 

 

 

「Every Page Worker 💢💢」のコード 

このツールは、Chrome / 新Edge / Firefox の「Tampermonkey」上で動作します。

以下のコードを「Tampermonkey」にコピー&ペーストして登録する事で、このツールを利用できます。 

 

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

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

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

 
 

編集画面の変更に対応 〔2020.08.21〕 

アメブロ編集画面の「アメーバ限定公開」のボタン廃止に伴い、更新をしました。

バージョンナンバーは「ver. 4.0」 → 「ver. 4.0 N」に変更しています。

 

 

〔 Every Page Worker 💢💢 〕 ver. 4.0 N

 

// ==UserScript==
// @name         Every Page Worker 💢💢
// @namespace  http://tampermonkey.net/
// @version       4.0 N
// @description  「記事の編集・削除」でブログ全記事を開いて作業する
// @author        Ameba Blog User
// @match        https://blog.ameba.jp/ucs/entry/srventrylist*
// @match        https://blog.ameba.jp/ucs/entry/srventryupdate*
// @run-at        document-start
// @grant         none
// ==/UserScript==


window.addEventListener('DOMContentLoaded', function(){ // CSSデザインを適用するためのスクリプト
    let css=[
        '.include-ex-linkBtn, .save-browserPush, .save-gsc, .save-hashtag-module,',
        '.adcrossBanner{ display: none }',
        'html { overflow-y: overlay !important }',
        '#globalHeader, #ucsHeader, #ucsMainLeft h1, .l-ucs-sidemenu-area, #ucsMainRight,',
        '#entryList dl, #entryList .rightCol input, .actionControl,',
        '#footerAd, #globalFooter, .checkboxAllControl { display: none }',

        '#ucsContent{ width: 720px !important; box-shadow: 0 0 0 100vh #c5d8e1 }',
        '#ucsMain{ background: #fff } #ucsMainLeft { width: 690px !important; float: none }',

        '#entryList li{ height: 24px; padding: 8px 5px 5px !important }',
        '#entryList li:hover{ background-color: #e2eef0 }',
        '#entryList .leftCol, #entryList .titleCol h2{ width: 400px !important; line-height: 24px }',
        '.leftCol a:hover{ text-decoration: none } .leftCol a:visited{ color: #3970b5 }',
        '#entryList .rightCol{ display: flex; width: 260px !important }',

        '#entryList .txtCol .date{ font-size: 13px; color: #000 }',
        '#entryList .txtCol{ white-space: nowrap; font-size: 13px; margin-top: 4px; line-height: 16px }',
        '#entryList .deleteCol { margin: -3px 0 0 20px }',
        '.deleteCol a:nth-child(2), .deleteCol a:nth-child(3), .rightCol input { display: none }',
        '#entryList .btnDefault { height: 25px }',
        '#entryList .btnDefault:hover { box-shadow: inset 0 0 0px 2px #1976d2 }',

        '#entryList ul input[value="1"] + input + li .txtCol span:first-child{ display: inline-block;',
        'margin-top: -2px; padding: 2px 13px 0; color: #fff; background: #2196f3 !important }',
        '#entryList ul input[value="2"] + input + li .txtCol span:first-child{ display: inline-block;',
        'width: 3em; text-indent: -1em; overflow: hidden; margin-top: -2px; padding: 2px 13px 0;',
        'vertical-align: -4px; color: #fff; background: #009688 !important }',

        '#entryMonth { font-size: 14px; overflow: visible; margin-top: 3px }',
        '#entryMonth li, #entryMonth #nowMonthLi { padding: 2px 10px 0 }',
        '#nowMonth { padding: 1px 6px 0; border: none; border-radius: 1px;',
        'box-shadow: 0 0 0 2px #0066cc; color: #000 }',
        '#entryListEdit form { display: flex; flex-direction: column } #entrySort { order: -2 }',
        '.pagingArea { order: -1; padding: 4px; margin-bottom: -33px; background: #ddedf3 }',
        '.pagingArea a { border: 1px solid #888 } .pagingArea .active{ border: 2px solid #0066cc }',
        '.pagingArea a, .pagingArea .active, .pagingArea .disabled { font-size: 14px; line-height: 23px }',

        '#sorting { margin: 38px 0 4px; padding: 4px 0; height: 82px; background: #ddedf3 }',
        '#sorting select, #sorting ul { display: none }',
        '#div0 { color: #333; font-size: 14px; margin: 0 -10px 0 15px; }',
        '#div1 { color: #000; font-size: 14px; margin: 4px 15px; background: #c0dbed; }',
        '#list_snap { padding: 2px 0 0; margin: 7px 20px 7px 0; width: 180px; }',
        '#reset { padding: 2px 0 0; margin-right: 20px; width: 60px; }',
        '#export { padding: 2px 0 0; margin: 7px 10px 7px 0; width: 100px; }',
        '.snap_result { display: inline-block; margin: 6px 4px 4px 12px; }',
        '.num { padding: 2px 2px 0 6px; width: 40px; }',
        '.editor_open { padding: 2px 0 0; margin: 0 20px 0 4px; width: 50px; }',
        'input { font-family: meiryo; font-size: 14px }'].join(' ');

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



window.addEventListener('load', function(){ // このスクリプトは孫ウインドウだけで働く
    let body_id=document.body.getAttribute('id');
    if(body_id=="entryCreate"){ // この項だけ孫ウインドウで働く
        window.document.body.style.background='#c5d8e1';
        window.document.body.style.boxShadow='0 0 0 100vh #c5d8e1';

        select_e(close_w);

        function select_e(close_w){
            let error_report=document.querySelector('h1.p-error__head');
            if(error_report==null){ // 保存エラー無い場合 grayを送信 編集画面を閉じる
                if(window.opener){
                    report('gray');
                    window.opener.close(); }}
            else{ // 保存エラーのある場合は redを送信 編集画面を残す
                if(window.opener){
                    report('red');
                    window.opener.location.reload(); }}
            close_w(); }

        function close_w(){
            window.open('about:blank','_self').close(); } // 孫ウインドウは常に閉じる

        function report(color){
            window.opener.document.querySelector('html').style.color=color; }}
})



window.addEventListener('load', function(){ // このスクリプトは親ウインドウで働くメインスクリプト
    let body_id=document.body.getAttribute('id');
    if(body_id=='entryListEdit'){ // 親ウインドウの条件

        let drive_mode; // ページ更新時の動作モード
        let blogDB={}; //「対象記事のID/チェックフラグ または内容」の記録配列

        let entry_id_DB; // ID検索用の配列
        let pub_1; // flag 1 が記録された記事総数
        let pub_2; // flag 2 が記録された記事総数

        let entry_id;
        let publish_f;
        let entry_target;
        let list_bar;
        let editor_flg;

        let next_target; // ページ内の次の対象記事
        let new_win;
        let link_target;
        let editor_iframe;
        let iframe_doc;

        let ua=0;
        let agent=window.navigator.userAgent.toLowerCase();
        if(agent.indexOf('firefox') > -1){ ua=1; } // Firefoxの場合のフラグ
        if(agent.indexOf('edge') > -1){ ua=2; } // Edgeの場合のフラグ


        let read_json=localStorage.getItem('EPW_DB_back'); // ローカルストレージ 保存名
        blogDB=JSON.parse(read_json);
        if(blogDB==null){
            blogDB=[['e0000000000', 's']]; }
        drive_mode=blogDB[0][1]; // 起動時に動作フラグを取得
        blogDB[0][1]='s'; // リロード時等のためにリセット
        let write_json=JSON.stringify(blogDB);
        localStorage.setItem('EPW_DB_back', write_json); // ローカルストレージ 保存

        reg_set();

        function reg_set(){
            let k;
            entry_id_DB=[]; // リセット
            pub_1=0;
            pub_2=0;

            for(k=0; k<blogDB.length; k++){
                entry_id_DB[k]=blogDB[k][0]; // ID検索用の配列を作成
                if(blogDB[k][1]=='1'){
                    pub_1 +=1; continue; } // flag 1 が記録された記事総数(検索1)
                if(blogDB[k][1]=='2'){
                    pub_2 +=1; continue; }}} // flag 2 が記録された記事総数(検索2)


        entry_id=document.querySelectorAll('input[name="entry_id"]');
        entry_target=document.querySelectorAll('.deleteCol');
        publish_f=document.querySelectorAll('input[name="publish_flg"]');
        list_bar=document.querySelectorAll('#entryList li');


        control_pannel(drive_mode);

        function control_pannel(dm){
            let sty;
            let insert_div0;
            insert_div0=document.createElement('div');
            insert_div0.setAttribute('id', 'div0');
            let box=document.querySelector('#sorting');
            box.appendChild(insert_div0);

            let insert_div1;
            insert_div1=document.createElement('div');
            insert_div1.setAttribute('id', 'div1');
            box.appendChild(insert_div1);

            let button1=document.createElement('input');
            button1.setAttribute('id', 'list_snap');
            button1.setAttribute('type', 'submit');
            insert_div0.appendChild(button1);
            if(dm=='s'){
                button1.setAttribute('value', '全記事へ処理を開始 ▶'); }
            else if(dm=='c'){
                button1.setAttribute('value', ' 処理を一旦停止  ❚❚'); }
            else if(dm=='e'){
                button1.setAttribute('value', '処理が全て終了しました'); }

            button1.addEventListener('click', function(e){
                e.preventDefault();
                start_stop(); }, false);

            function start_stop(){
                if(drive_mode=='s'){ // 最初の起動直後
                    let conf_str=['   🔴 このページ以降の記事に連続した処理を実行します',
                                  '\n\n      停止ボタンのクリックで処理停止/処理再開ができます'].join(' ');
                    let ok=confirm(conf_str);
                    if(ok){
                        drive_mode='c'; // ページ内の連続処理
                        button1.setAttribute('value', ' 処理を一旦停止  ❚❚');
                        next(); }}
                else if(drive_mode=='c'){ // 連続動作状態の場合
                    drive_mode='p'; // クリックされたら「p」停止モード
                    button1.setAttribute('value', ' 処理を再開する  ▶'); }
                else if(drive_mode=='p'){ // 動作停止状態の場合
                    drive_mode='c'; // クリックされたら連続動作を再開
                    button1.setAttribute('value', ' 処理を一旦停止  ❚❚');
                    open_win(next_target); }}

            if(dm=='c'){ // ページを開いた時に「c」は連続動作
                setTimeout(next, 200); } // 「c」連続動作はぺージ遷移時 0.2sec で自動実行 ⭕
            else if(dm=='e'){ // 「e」は終了
                button1.style.pointerEvents='none'; }


            let button2=document.createElement('input');
            button2.setAttribute('id', 'reset');
            button2.setAttribute('type', 'submit');
            button2.setAttribute('value', '初期化');
            insert_div0.appendChild(button2);

            button2.onclick=function(e){
                e.preventDefault();
                blogDB=[['e0000000000', 's']];
                let write_json=JSON.stringify(blogDB);
                localStorage.setItem('EPW_DB_back', write_json); // ローカルストレージ保存
                snap_disp();
                document.querySelector('#reset').value='〔 〕'; }

            let button3=document.createElement('input');
            button3.setAttribute('id', 'export');
            button3.setAttribute('type', 'submit');
            button3.setAttribute('value', 'ファイル保存');
            insert_div0.appendChild(button3);

            button3.onclick=function(e){
                e.preventDefault();
                let write_json=JSON.stringify(blogDB);
                let blob=new Blob([write_json], {type: 'application/json'});
                if(ua==2){
                    window.navigator.msSaveBlob(blob, 'EPW.json'); } // 保存ファイル名
                else{
                    let a_elem=document.createElement('a');
                    a_elem.href=URL.createObjectURL(blob);
                    a_elem.download='EPW.json'; // 保存ファイル名
                    if(ua==1){
                        a_elem.target='_blank';
                        document.body.appendChild(a_elem); }
                    a_elem.click();
                    if(ua==1){
                        document.body.removeChild(a_elem); }
                    URL.revokeObjectURL(a_elem.href); }}

            let button4=document.createElement('input');
            button4.setAttribute('type', 'file');
            button4.setAttribute('style', 'vertical-align: 1px; width: 285px');
            if(ua==2){
                button4.setAttribute('style', 'vertical-align: 0; width: 270px; direction: rtl'); }
            insert_div0.appendChild(button4);

            button4.addEventListener("change", function(){
                if(!(button4.value)) return; // ファイルが選択されない場合
                let file_list=button4.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, 15)=='[["e0000000000"'){ // EPW.jsonの確認
                        let data_in=JSON.parse(file_reader.result);
                        blogDB=data_in; // 読込み上書き処理
                        let write_json=JSON.stringify(blogDB);
                        localStorage.setItem('EPW_DB_back', write_json); // ローカルストレージ 保存
                        button2.setAttribute('value', '初期化'); // 初期化後なら読み込んだ事を示す
                        snap_disp(); }
                    else{
                        alert("   ⛔ 不適合なファイルです  EPW.json ファイルを選択してください");}};});

            let span5=document.createElement('span');
            span5.setAttribute('id', 'snap_result1');
            span5.setAttribute('class', 'snap_result');
            insert_div1.appendChild(span5);

            let button6=document.createElement('input');
            button6.setAttribute('id', 'num_1');
            button6.setAttribute('class', 'num');
            button6.setAttribute('type', 'number');
            button6.setAttribute('min', '0');
            insert_div1.appendChild(button6);

            let button7=document.createElement('input');
            button7.setAttribute('class', 'editor_open');
            button7.setAttribute('type', 'submit');
            button7.setAttribute('value', '編集');
            insert_div1.appendChild(button7);

            button7.onclick=function(e){
                e.preventDefault();
                let k;
                let pub_1_DB=[]; // pub_1 の entry_id の配列
                if(pub_1>0){
                    for(k=0; k<blogDB.length; k++){
                        if(blogDB[k][1]=='1'){
                            pub_1_DB.push(blogDB[k][0]); }}

                    if(button6.value>0){
                        let open_id=pub_1_DB[button6.value -1];
                        let pass=
                            'https://blog.ameba.jp/ucs/entry/srventryupdateinput.do?id='+ open_id;
                        let win_option='top=100, left=100, width=1040, height=900';
                        window.open(pass, button6.value, win_option); }}}

            let span8=document.createElement('span');
            span8.setAttribute('id', 'snap_result2');
            span8.setAttribute('class', 'snap_result');
            insert_div1.appendChild(span8);

            let button9=document.createElement('input');
            button9.setAttribute('id', 'num_2');
            button9.setAttribute('class', 'num');
            button9.setAttribute('type', 'number');
            button9.setAttribute('min', '0');
            insert_div1.appendChild(button9);

            let button10=document.createElement('input');
            button10.setAttribute('class', 'editor_open');
            button10.setAttribute('type', 'submit');
            button10.setAttribute('value', '編集');
            insert_div1.appendChild(button10);

            button10.onclick=function(e){
                e.preventDefault();
                let k;
                let pub_2_DB=[]; // pub_2 の entry_id の配列
                if(pub_2>0){
                    for(k=0; k<blogDB.length; k++){
                        if(blogDB[k][1]=='2'){
                            pub_2_DB.push(blogDB[k][0]); }}

                    if(button9.value>0){
                        let open_id=pub_2_DB[button9.value -1];
                        let pass=
                            'https://blog.ameba.jp/ucs/entry/srventryupdateinput.do?id='+ open_id;
                        let win_option='top=100, left=100, width=1040, height=900';
                        window.open(pass, button9.value, win_option); }}}

            snap_disp();

        } // control_pannel()


        function snap_disp(){
            reg_set();
            let span5=document.querySelector('#snap_result1');
            span5.textContent='記録件数:' + (blogDB.length -1) + '   Check 1:';
            let button6=document.querySelector('#num_1');
            button6.value=pub_1;
            button6.max=pub_1;
            let span8=document.querySelector('#snap_result2');
            span8.textContent='Check 2:';
            let button9=document.querySelector('#num_2');
            button9.value=pub_2;
            button9.max=pub_2; }


        function next(){
            entry_id=document.querySelectorAll('input[name="entry_id"]');
            if(entry_id.length >0){
                open_win(0); } // 投稿記事がある場合 open_win を開始
            else{
                next_call();}} // 投稿記事が無ければ 次ページをcall する


        function open_win(k){
            next_target=k; // 送信完了までは未処理とする

            new_win=Array(entry_target.length);
            link_target=Array(entry_target.length);
            link_target[k]=entry_target[k].getElementsByTagName('a')[0].getAttribute('href');

            if(drive_mode=='c'){
                let win_option='top=100, left=100, width=800, height=300';
                new_win[k]=window.open(link_target[k], k, win_option);

                list_bar[k].style.boxShadow='inset 0 0 0 2px #03a9f4'; // リスト欄に青枠表示
                new_win[k].addEventListener('load', work, false); } // 子ウインドウの処理 🟦


            function work(){
                let editor_flg=new_win[k].document.querySelector('input[name="editor_flg"]');
                if(editor_flg.value=="5"){ // 最新版エディタの文書の場合のみ処理
                    let interval=setInterval(find_iframe, 10); // iframe 読込み待機コード 🟥
                    function find_iframe(){
                        let editor_iframe=new_win[k].document.querySelector('.cke_wysiwyg_frame');
                        if(editor_iframe){
                            let iframe_doc=editor_iframe.contentWindow.document;
                            if(iframe_doc){
                                clearInterval(interval);
                                task();

                                function task(){ // taskは自動で開いたページでの作業コード / 作業目的で自製 💢🟥
                                    Promise.all([
                                        task_in1(),
                                        task_in2(), // Check 2 不要な場合はコメントアウト 🟥
                                        strage_write(),
                                        snap_disp() ])
                                        .then(end_target()) }

                                function task_in1(){
                                    let iframe_body=iframe_doc.querySelector('.cke_editable');
                                    let result1=iframe_body.textContent.match(/Devtools/); // 検索1:結果「flag 1」
                                    if(result1){
                                        let index=entry_id_DB.indexOf(entry_id[k].value);
                                        if(index==-1){ // IDがblogDBに記録されていない場合
                                            blogDB.push([entry_id[k].value, 1]); } // 記事ID/フラグを追加
                                        else{ // IDがblogDBに記録されていた場合
                                            if(blogDB[index][1]!=1){
                                                blogDB.push([entry_id[k].value, 1]); }}}} // 記事ID/フラグを追加

                                function task_in2(){
                                    let title=new_win[k].document.querySelector('.p-title__text').value;
                                    let result2=title.match(/Devtools/); // 検索2:結果「flag 2」
                                    if(result2){
                                        let index=entry_id_DB.indexOf(entry_id[k].value);
                                        if(index==-1){ // IDがblogDBに記録されていない場合
                                            blogDB.push([entry_id[k].value, 2]); } // 記事ID/フラグを記録
                                        else{ // IDがblogDBに記録されていた場合
                                            if(blogDB[index][1]!=2){
                                                blogDB.push([entry_id[k].value, 2]); }}}} // 記事ID/フラグを追加

                                function strage_write(){
                                    let write_json=JSON.stringify(blogDB);
                                    localStorage.setItem('EPW_DB_back', write_json); }// ストレージ保存
                            }}}}
                else{
                    end_target(); }
            } // work()


            function end_target(){ // 終了処理
                let editor_flg=new_win[k].document.querySelector('input[name="editor_flg"]');
                new_win[k].addEventListener('beforeunload', flag_line , false);
                publish_do();

                function flag_line(){
                    let send_color;
                    if(new_win[k]){
                        send_color=new_win[k].document.querySelector('html').style.color; }

                    if(send_color=='gray'){ // 文書保存が正常終了した場合 リスト背景 淡ブルー
                        list_bar[k].style.boxShadow='none';
                        if(editor_flg.value=='5'){
                            list_bar[k].style.background='#caedf2'; }
                        else{
                            list_bar[k].style.background='#eceff1'; }
                        next_do(k); } //⏩
                    else if(send_color=='red'){ // 文書保存が異常終了の場合は編集画面は閉ず リスト背景白 赤枠表示
                        list_bar[k].style.boxShadow='inset 0 0 0 2px red';
                        list_bar[k].style.backgroundColor='#fff';
                        next_do(k); }} //⏩

                function publish_do(){
                    let publish_b0=new_win[k].document.querySelector('button.js-submitButton[publishflg="0"]');
                    let publish_b1=new_win[k].document.querySelector('button.js-submitButton[publishflg="1"]');
                    if(publish_f[k].value==0){ publish_b0.click(); }
                    if(publish_f[k].value==1){ publish_b1.click(); }
                    if(publish_f[k].value==2){ publish_b0.click(); }}

                function next_do(k){
                    next_target=k+1;
                    if(next_target<entry_target.length){ open_win(next_target); }
                    else{ next_call(); } // ページの終りまで終了した状態
                }}} // open_win()


        function next_call(){
            let win_url;
            let current;
            let pageid;
            let next_url;
            let pager;
            let end;

            blogDB[0][1]='c'; // 連続動作フラグを連続にセット
            let write_json=JSON.stringify(blogDB);
            localStorage.setItem('EPW_DB_back', write_json); // ローカルストレージ保存

            win_url=window.location.search.substring(1,window.location.search.length);
            current=win_url.slice(-6);

            if(win_url.indexOf('pageID') ==-1){ // pageIDが無い 月のトップページの場合
                pager=document.querySelector('.pagingArea');
                if(pager){ // ページャーが有りその末尾でなければ同月次ページへ
                    next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?',
                              'pageID=2&entry_ym=' + current].join('');
                    window.open( next_url, '_self'); }
                else{ // ページャーが無ければ次月トップページへ
                    current=make_next(current);
                    if(current!=0){ // 現在を越えないなら次月へ
                        next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?',
                                  'entry_ym=' + current].join('');
                        window.open( next_url, '_self'); }
                    else{ // 現在を越えたら0が戻り停止
                        when_edge(); }}}

            else{ // pageIDを含み 月のトップページでない場合
                end=document.querySelector('.pagingArea .disabled.next');
                if(!end){ // ページャーの末尾でなければ同月次ページへ
                    pageid=parseInt(win_url.slice(7).slice(0, -16), 10) +1;
                    next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?',
                              'pageID=' + pageid + '&entry_ym=' + current].join('');
                    window.open( next_url, '_self'); }
                else{ // ページャーの末尾なら次月トップページへ
                    current=make_next(current);
                    if(current!=0){ // 現在を越えないなら次月へ
                        next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?',
                                  'entry_ym=' + current].join('');
                        window.open( next_url, '_self'); }
                    else{ // 現在を越えたら0が戻り停止
                        when_edge(); }}}

            function make_next(curr){
                let ym;
                let y;
                let m;
                ym=parseInt(curr, 10); // 10進数値化
                y=Math.floor(ym/100); // 年は100で割った商
                m=ym % 100; // 月は100で割った余り
                if(m !=12){
                    ym=100*y + m +1; }
                else{
                    ym=100*y + 101; }

                let now=new Date();
                if(ym > 100*now.getFullYear() + now.getMonth() +1){
                    return 0; } // 現在の月を越える場合は0を返す
                else{
                    return ym; }} // 次年月の数値を返す

            function when_edge(){
                blogDB[0][1]='s'; // 連続動作フラグをリセット
                let write_json=JSON.stringify(blogDB);
                localStorage.setItem('EPW_DB_back', write_json); // ローカルストレージ保存
                document.querySelector('#div0').remove();
                document.querySelector('#div1').remove();
                control_pannel('e'); } // 全作業の終了時の表示をさせる
        } // next_call()

    } // 親ウインドウの条件
})

 

 

 

「Every Page Worker 💢💢」最新版について 

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

 

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