「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と変わりません。 上記コードは、変更済です。







