「Search Yahoo Img」の使用方法
「Search Yahoo Img」は、ブログ記事の中に埋め込まれた、現在問題になっている「Yahoo由来」の画像を自動検索するスクリプトツールです。 このツールによる検索結果のデータを利用する「Edit Yahoo Img」は後日公開します。 肝心のスキャン作業を行う「Search Yahoo Img」を、とり急ぎ公開する次第です。
❶ スキャン作業の準備
「Search Yahoo Img」は、自動的にブログページを開き、旧いページから新しいページに向かって、1記事ずつ記事内の画像を調べます。 スキャン作業はPCの通信を占拠するので、他の作業は基本的にできなくなります。 また、スキャン作業を中断なく進めるため、以下の準備をしてください。
◎ ブラウザにインストールしているADブロック、その他の拡張機能は、スキャン作業の間は、できる限り停止します。 PCのセキュリティアプリは通常でOKです。
◎ ブラウザの負担を減らすため、ブラウザ画面はスキャン作業のみのウインドウに限り、ウインドウの高さはブログページの上部を表示する範囲に狭めるのが理想です。 下部を表示すると、作業の邪魔になるスクリプトが動作する可能性が増えます。
◎ ツールはページ内の「iframe」の表示を削除しスキャンを効率化します。 埋め込み動画・ツイッター・ADなどが表示されなくても正常です。
◎ 通信状態が悪く、ページを開くのがもたつく様な状態が程度を超えると、スキャンが中断して停止します。 スキャンデータはページ毎に記録されるので、停止したページでブラウザの「 」ボタンでリロードすれば、問題なくスキャンを再開できます。
◎ PCの性能によりますが、他のウインドウでの作業をしない方がベターです。 他のPCでの作業は可能ですが、スキャンが停止しないか時々様子を見てください。
◎ 特に大量の記事のスキャンが必要な場合は、通信環境の良い深夜に動作させるとベストです。 1記事に4sec程度の時間を要します。 1000件記事が 70分 として必要時間が予想できます。 スキャンする範囲は、引っ越し以前の記事だけです。
◎ PCの「電源の設定」で「スリープ」を設定していると、そこでスキャン動作が停止します。 スキャン作業の前に「スリーブ無し」に設定します。 画面の表示は必要ないので、「ディスプレイの自動OFF」は通常で構いません。
◎ スキャンの中断・停止を知らせるアラーム音の機能がありますが、ブラウザは「自動の音響」を抑止する設定になっています。 音を鳴らしたい場合は、Chromeでは以下の設定をします。
「プライバシーとセキュリティ」→「サイトの設定」→「音声」→「音声の再生を許可するサイト」→「追加」→で「ameblo.jp」を追加します。
◎ もしスキャンをさせたまま放置した場合、通常に処理が進むとブログの最新記事でスキャンが停止します。
❷ スキャンの開始
「Search Yahoo Img」は「Tampermonkey」という拡張機能上で動作をします。 「Tampermonkey」のダッシュボード(管理画面)に「Search Yahoo Img」を「ON/OFF」するスイッチがあります。
「Search Yahoo Img」はブログページの表示を変更するので、「スキャン作業」の間だけツールを「ON」にします。「ON」の間は、通常のブログ閲覧ができません。
「スキャン作業」は中断ができます。 通常のブログ閲覧などが必要になった場合、スキャンを中断して、中断した記事の日付を控えて通常の作業に移り、後で(あるいは後日に)中断したページからスキャンを再開できます。
▪ スキャンの中断・再開によって、スキャン範囲が重複するのは構いませんが、スキャンをしなかった範囲が出来ると、その範囲に見落しが生じる可能性があります。
〔 注意次項 〕 アメンバー記事のスキャンについて
引っ越した記事を「アメンバー記事」に設定している場合、それらの記事をスキャン範囲に入れるには、「ログイン」してからスキャンを開始する必要があります。
◎「Search Yahoo Img」は、ログイン/ログアウトに関わらずスキャンを実行しますが、ログイン状態では「アメンバー記事」の記事内をスキャンします。
▪ ただし「アメンバー記事」はドメインが異なり、スキャンデータは別扱いで保存されます。 スキャンデータの結果の閲覧利用は、アメンバー記事を開いて行います。
▪ スキャンの「該当」「調査数」の値は、通常記事と別に集計されます。
◎ ログアウトの状態でスキャンすると「アメンバー記事」を調査せずに、スキャンが進行します。 アメンバー記事のスキャンが不要な場合は、ログアウトでスキャンしても構いません。
▪「アメンバー記事」だけを選んでスキャンする機能はないので、もし調査をするなら、ログインして通常記事と一緒にスキャンを行ってください。
〔 注意次項 〕 複数ブログのスキャンについて
Yahooから引っ越したブログは通常 1個と推測しますが、もし引っ越したブログが複数あり、それらを「Search Yahoo Img」でスキャンする場合は、要注意です。
スキャンデータはドメインごとにローカルストレージに纏められます。 引っ越した複数のブログを続けてスキャンすると、ドメインが全て「ameba.jp」なので、複数のブログの調査データが混ってしまいます。
これを分ける方法がなく、後の修復援助ツール「Edit Yahoo Img」で、ページ移動時に「ありえない記事」への移動となり、作業が正常にできなくなります。
簡単に言うと、ひとつのブログのスキャン後は、「Edit Yahoo Img」を使って処理を終えるまで、他のブログをスキャンできないという事です。「Edit Yahoo Img」にはスキャンデータを削除する機能があり、処理後にデータをリセットすれば、別ブログをスキャンできます。
また、ローカルストレージのデータを削除前にテキスト保存したり、再びストレージに戻す事は DevToolを使えば可能です。 その必要がある場合はコメントください。
「Search Yahoo Img」の起動
あらかじめ、スキャンを開始する場所(通常 Yahooブログでの最初の記事)を開いておきます。 別タブで「Tampermonkey」のダッシュボード(管理画面)を表示し、「Search Yahoo Img」を「ON」にします。
▪「ON」にした後はダッシュボード(管理画面)のタブは閉じても構いません。 後で「Search Yahoo Img」を「OFF」にするには、再びダッシュボードを開きます。
▪「Tampermonkey」で他のツールを利用している方は、ブログページで動作するツールは全て「OFF」にして、「Search Yahoo Img」のみを「ON」にする様にしてください。 他のツールによってスキャンが中断するのを避けるためです。
◎ ブログの画面に戻り、ブラウザの「 」ボタンを押します。 スクリプトツールはリロードして初めて起動します。
◎「アメーバヘッダー」に「Search Yahoo Img」のパネルが表示されます。
◎ パネルはスキャン動作の進行を表示するもので、スイッチではありません。
▪「該当」は、Yahoo画像を検出した記事数です。
▪「調査数」はスキャンの総回数で、 同記事をスキャンしてもカウントされます。
▪「記事日付」は、現在スキャンのために開いている記事の投稿日付です。
最初の起動時の表示
スキャン動作中の表示
スキャンの 開始・停止・再開
◎ 最初の図の パネルの「青枠」部分が「スキャン停止/再開」のスイッチです。
▪「アメーバヘッダー」の本来の機能はなくなり、「停止/再開」として働きます。
◎ スキャン動作中は「アメーバヘッダー」の色は基本は「白」ですが、「青枠」の範囲をクリックするとスキャンが停止し、下の様に「淡い緑」になります。
◎「アメーバヘッダー」の「淡い緑」部分のクリックで、スキャンが再開します。
▪ 上図の様にスキャンを一旦停止した状態では、ブログページ上の「ページャー」や「ブログトップ」「記事一覧」等のスイッチを操作ができます。 余り勧められませんがツールに逆らってページ移動が出来ます。 この種の移動によって、ツールが停止する場合も、停止しない場合もあります。
スキャンの 異常停止・終了
何等かの外的な問題でスキャン動作が停止した場合は、パネルにエラー表示を出します。 また、エラー表示がないままスクリプトが停止する場合もあります。
▪ブログの最新ページまでスキャンが到達した場合も、同じ表示が出ます。
◎ 不本意な停止の場合、「青枠」のスイッチ範囲をクリックし、それでもスキャンが再開しないなら、ブラウザの「 」ボタンを押しページリロードで再開を試みます。
▪ ページリロードでもスキャンが再開できない時は、他の問題が考えられます。
「Search Yahoo Img」を一旦「OFF」にして、通常のブログページ表示が出来る状態かどうかを調べてください。
▪ ブラウザの音響抑止の設定を解除している場合は、アラーム音が再生されます。 アラーム音は「アメーバヘッダー」の「青枠」の部分をクリックすると停止します。
▪ Yahooの引っ越し範囲をスキャンするだけで良く、それ以降の期間の記事をスキャンしても、意味がありません。
「Search Yahoo Img」の検索の仕様
●「アメーバ提示の旧画像サーバーURL」と、太字部分が「検索文字列」です。
https://blogs.yahoo.co.jp/IMG/ybi/1/
http://blogs.yahoo.co.jp/IMG/ybi/1/
https://blogs.yahoo.co.jp/IMG/ybi/avatar
http://blogs.yahoo.co.jp/IMG/ybi/avatar
https://blogs.c.yimg.jp/res/blog
http://blogs.c.yimg.jp/res/blog
https://blog-001.west.edge.storage-yahoo.jp/res/blog
http://blog-001.west.edge.storage-yahoo.jp/res/blog
https://ident-001.west.edge.storage-yahoo.jp/res/ident
http://ident-001.west.edge.storage-yahoo.jp/res/ident
アメーバの告示は「以下で始まる画像URL」とされ、画像を包む a要素の「URL」を指す様ですが、中のimg要素の「SRC」の場合も有ると考え、両方を検索します。
検索した結果は、ブラウザが管理するローカルストレージに保存されますが、その容量は軽量で 100kB以下 /1000件 です。 ストレージ容量は一般に5MBとされ、全く問題ない容量です。
「Search Yahoo Img」を使用するには
「Search Yahoo Img」は Chrome/Edge/Firefox の拡張機能「Tampermonkey」上で動作するスクリプトツールです。 上記のブラウザで動作を確認していますが、他のブラウザでの動作は未確認です。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
◎「新規スクリプト」には、最初から「新規のテンプレート」が記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
〔 Search Yahoo Img 〕 ver. 0.2
// ==UserScript== // @name Search Yahoo Img // @namespace https://ameblo.jp/ // @version 0.2 // @description Yahoo由来の画像検索 // @author Ameblo User // @match https://ameblo.jp/* // @match https://secret.ameba.jp/* // @grant none // ==/UserScript== let datetime=' '; let test_arr=[0, 0]; let pose=0; // 動作停止フラグ let tp=0; // senser用 停止フラグ let target=document.querySelector('head'); // 監視 target let monitor=new MutationObserver(escape_if); monitor.observe(target, { childList: true }); // 監視開始 do_task(); function escape_if(){ do_task(); let iframe_=document.querySelectorAll('iframe'); for(let k=0; k<iframe_.length; k++){ iframe_[k].remove(); }} function do_task(){ let page=location.pathname; test_arr.push(page); test_arr.shift(); if(test_arr[0]!=test_arr[1]){ check_img(); }} function check_img(){ let pageDB; // 主データ配列 [entry-ID, 対象数, 処理フラグ, 投稿日付] let idDB=[]; // 記事idの配列 let read_json=localStorage.getItem('CKIMG_DB'); // ローカルストレージ 保存名 pageDB=JSON.parse(read_json); if(pageDB==null){ pageDB=[['', 0, 0, 0, 1]]; } for(let k=0; k<pageDB.length; k++){ idDB.push(pageDB[k][0]); } // 記事id検索用の配列を作る let write_json=JSON.stringify(pageDB); localStorage.setItem('CKIMG_DB', write_json); // ローカルストレージ 保存 pose=pageDB[0][4]; stop_disp(); pageDB[0][1]+=1; // 検査数を更新 tp=1; // senser用 フラグ senser(); envi(); setTimeout(()=>{ let entry_id; // 現在のページID let entryWrapper=document.querySelector('.js-entryWrapper'); if(entryWrapper){ entry_id=entryWrapper.getAttribute('data-unique-entry-id'); } let d_time; // 8桁化した投稿日時 let time=document.querySelector('time'); if(time){ d_time=time.getAttribute('datetime').replace(/-/g, ''); } let entryBody=document.querySelector('#entryBody'); if(!entryBody){ entryBody=document.querySelector('.skin-entryBody'); } // アメンバー記事の場合 let imgs=entryBody.querySelectorAll('img'); let links=entryBody.querySelectorAll('a'); let count_i=0; for(let k=0; k<imgs.length; k++){ if(search_img(imgs[k])==1){ count_i+=1; }} let count_a=0; for(let k=0; k<links.length; k++){ if(search_a(links[k])==1){ count_a+=1; }} if(count_i + count_a>0){ set_db(entry_id, count_i + count_a, d_time); } // ヒットデータを配列に追加 }, 3000); // 🔴 本文ロードの待機時間 setTimeout(()=>{ write_json=JSON.stringify(pageDB); localStorage.setItem('CKIMG_DB', write_json); // ローカルストレージ 保存 go_next(); }, 4000); // 🔴 1画面の作業終了時間 stop(); function search_img(target_img){ let pattern=[ 'yahoo.co.jp/IMG/ybi', 'c.yimg.jp/res/blog', 'west.edge.storage-yahoo.jp'].join('|'); let url_regex=RegExp(pattern); let img_src=target_img.getAttribute('src'); if(url_regex.test(img_src)==true){ return 1; }} function search_a(target_link){ let pattern=[ 'yahoo.co.jp/IMG/ybi', 'c.yimg.jp/res/blog', 'west.edge.storage-yahoo.jp'].join('|'); let url_regex=RegExp(pattern); let link_href=target_link.getAttribute('href'); if(url_regex.test(link_href)==true){ return 1; }} function set_db(id, n, date){ let tmp_id=id; if(String(tmp_id).length==11){ // 11桁以外は登録しない if(!idDB.includes(id)){ if(date.length==8){ // 8桁以外は登録しない let entry_date=parseInt(date, 10); pageDB.push([id, n, 0, entry_date]); } else{ pose=2; alerm(1); }}} // time 取得できなければ停止 else{ pose=2; alerm(2); } // entry-id 取得できなければ停止 envi_add(); } // 更新を表示 function time_call(){ // 投稿日付の取得 let time=document.querySelector('time'); if(!time){ datetime=' '; } else{ datetime=time.getAttribute('datetime'); }} function envi(){ let css='#ambHeader > div:nth-child(2) { display: none !important; } '+ '#disp_yimg { position: fixed; top: 1px; left: 340px; z-index: 4000; '+ 'padding: 8px 0 6px 40px; font: 16px Meiryo; color: #000; width: 430px; '+ 'outline: 1px solid #000; background: #f0f8ff; '; let style=document.createElement('style'); style.setAttribute('id', 'style_yimg'); style.insertAdjacentHTML('afterbegin', css); if(!document.querySelector('#style_yimg')){ document.body.appendChild(style); } // CSSのセット time_call(); let insert_div; insert_div=document.createElement('div'); insert_div.setAttribute('id', 'disp_yimg'); insert_div.textContent='該当:'+ (pageDB.length-1) + ' 調査数:'+ pageDB[0][1] +' 記事日付:'+ datetime; if(document.querySelector('#disp_yimg')){ document.querySelector('#disp_yimg').remove(); } document.body.appendChild(insert_div); } // 表示パネルのセット function envi_add(){ time_call(); let panel=document.querySelector('#disp_yimg'); if(panel){ panel.textContent='該当:'+ (pageDB.length-1) + ' 調査数:'+ pageDB[0][1] +' 記事日付:'+ datetime; }} function go_next(){ let preview=document.querySelector('.pagingPrev'); if(!preview){ preview=document.querySelector('.skin-pagingPrev'); } if(preview && pose==0){ tp=0; // senser用のフラグ preview.click(); }} function stop(){ let ambHeader=document.querySelector('#ambHeader'); ambHeader.onclick=function(event){ event.preventDefault(); if(event.ctrlKey==false){ if(pose==0 || pose==2){ pose=1; pageDB[0][4]=1; write_json=JSON.stringify(pageDB); localStorage.setItem('CKIMG_DB', write_json); // ローカルストレージ 保存 stop_disp(); } else{ pageDB[0][4]=0; write_json=JSON.stringify(pageDB); localStorage.setItem('CKIMG_DB', write_json); // ローカルストレージ 保存 location.reload(); }}}} } // check_img() function stop_disp(){ let ambHeader=document.querySelector('#ambHeader'); if(pose>0){ ambHeader.style.background='#cce4ec'; } else{ ambHeader.style.background='#fff'; }} function senser(){ setTimeout(()=>{ if(tp==0){ pose=2; alerm(0); } }, 6000); } // 🔴 6sec後 停止していたら tp==0 function alerm(n){ setInterval( beep, 1000); stop_disp(); let disp_yimg=document.querySelector('#disp_yimg'); if(disp_yimg){ let alert_text if(n==0){ alert_text='<br><br>🔴 連続スキャンが停止しました 処理遅延または終了'; } if(n==1){ alert_text='<br><br>🔴 連続スキャンが中断しました ✖ 投稿日時'; } if(n==2){ alert_text='<br><br>🔴 連続スキャンが中断しました ✖ 記事ID'; } disp_yimg.insertAdjacentHTML('beforeend', alert_text); } function beep(){ let base64='UklGRvEGAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0Yc0GAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgH96eH2ImpqMemVodYCSmI+Gb1xlcIegn5OBZVtoc5CjnZF7X19tfJqlnI1zW2JtgqCjl4VpWmZxjaWhlH5gW2l3l6adj3VbX2yAoKWaiWxYY2+JpaOXgWNaaHSTp6CSel1canqcppyMcFlhbIKjpJmGaFhlcI2moZV+YFtpdpennpB1Wl9rfp+lm4ptWGNuh6Sil4JkWWdzkqefknpdXWp6nKacjXBZYW2Do6OYhWdZZnGOpqGUfl9baXeYpp2PdFpgbH+gpZqIa1hkb4mlopaAYlpodJSnn5F4XF5rfJ2mm4tuWWNuhaSjl4NlWWdykKegk3tdXGp5m6acjXFZYW2Co6SZhWdYZnGOp6GUfV5baniZp5yOcllgbYGipJmGaFhlcIymoZR+YFtpdpennY91W19sf6ClmohrWWRviKWiloFjWmh0k6afkXlcXWt7nKabi3BZYm6Do6SYhGdYZnGOpqCUfV9baneYp52PdVpgbH+gpZqIbFhkb4ilopaBY1loc5Knn5J6XV1repymnIxxWWJtgqOkmIVoWWZxjaahlH5gW2p2l6adj3VbX2x+oKWaiWxYZG+IpaKWgWNZaHOTp5+ReVxda3ucppuLb1liboOjpJiEZ1lmcY6moJN9X1tqd5innY50WmBtgKGlmYhqWGVwiaailYBiWmh0lKeekHhcXmt8naWbim5ZY26EpKOXg2ZZZ3KQp6CTfF5caniappyNc1phbYCipJmHaVhlcIqloZWAYlppdZWmnpB3XF5sfJ6lm4puWWNuhaSjl4NlWWdykKafknteXGp5mqacjXJZYW2CoqSYhWdYZnGNp6CUfV9baniZp52Oc1pgbYChpJmHaVllcYuloJR/YVtqdpamnY92XGBtf5+kmYhsWmVwiaSglIBjXGp1k6Wcj3ddYG19naOZiW5cZnSTqJJ7anN9gnt1gImQhHt0foWFhYCDhIJ8e3yAhIKBgIB/f36AgIGAf35+gICAgICCgYB/gICBgICAgIGAgICAgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf4CAgYGAgICAgICAgYCAgICAgICAgICAgH9/gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgH97d3qBkpmPgm5oc3uIlJCIfWVmcH2VnpWJdGFocYKbnZSFbWBsdYygnJF/ZGBseJSimo12X2Nuf5yimIhtW2Vwh6KglIFkW2l1k6aekXldXmt8nKabi3BaY26EoqOYhWdZZnGOpqCUfV9baXeYpp2PdVtgbICgpJqIa1hkb4mlopaAYlpodJOmn5F5XF5qe52mnIxwWWJtg6OjmIRnWWZxjqahlH1fW2l3maedjnRaYGx/oKWaiGtYZG6IpaKWgWNaaHSTpp+SeV1danqcppyMcFlibYOjpJiFZ1lmcY6moZR+X1tpdpinno91Wl9sf6ClmolrWGRviKWiloFjWWh0lKefkXlcXWt7naacjHBZYm2Do6OYhWdZZnGOpqCTfV9baneYpp2OdFpgbH+gpZqIa1hkb4mlopaBY1podJOnn5F5XF1re52mnItwWWJug6OjmIVmWWZxj6ahlH1fW2yDpp+BbXB7goBye4aRi392eYOEhoCChIR/enx/g4OCgIB/f31+gIGBgH9+gICAgICCgoCAgICAgICAgIGAgH+AgIGAgICAgH9/gICAgICAgH9/gICBgYCAf3+AgICAgICAgICAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCAgICAgICBgYCAf4CAgICAgICAf3+AgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAA=='; let sound=new Audio("data:audio/wav; base64," + base64); if(pose==2){ sound.play(); }}} // 通信環境でどうしてもスキャンが進行しない場合、以下の❶❷を変更します // ❶ 96行 🔴 本文ロードの待機時間 を「4000」に変更 // ❷ 102行 🔴 1画面の作業終了時間 を「5000」に変更 /* 紛失画像のURL/SRC https://blogs.yahoo.co.jp/IMG/ybi/1/ http://blogs.yahoo.co.jp/IMG/ybi/1/ https://blogs.yahoo.co.jp/IMG/ybi/avatar http://blogs.yahoo.co.jp/IMG/ybi/avatar https://blogs.c.yimg.jp/res/blog http://blogs.c.yimg.jp/res/blog https://blog-001.west.edge.storage-yahoo.jp/res/blog http://blog-001.west.edge.storage-yahoo.jp/res/blog https://ident-001.west.edge.storage-yahoo.jp/res/ident http://ident-001.west.edge.storage-yahoo.jp/res/ident */
〔追記〕 2021.10.22
ツール起動時・スキャン実行中・スキャン停止時・エラー及び終了の停止時のヘッダー部の配色を ver. 0.1から改めて統一しました。 これは、操作を判り易くするための変更で、基本機能は ver. 0.1と変わりません。 上記コードは、変更済です。