普通ではないアメーバの「ブログ内検索」

アメーバブログページ(自分のブログ・他ユーザーのブログ)の検索窓は、開いているブログの全ページを検索範囲とした「ブログ内検索」の検索窓です。 これはとても大事な機能で、検索対象を現在開いているブログに絞った検索です。

 

しかし、ブログページから検索を1回行うと、次の検索はアメーバブログ全体を検索範囲とした検索になってしまいます。 この仕様は、「ブログ内検索」をとても使い難いものとしていて、「絞り込み検索」「検索語の変更」などの普通の検索操作が出来ません。「Ameba Search Repeat」は、この検索の仕様を正常化します。

 

このツールを有効にすると、「ブログ内検索」の画面で何度でも検索を繰り返す事が出来ます。 それは、本来の検索機能です。 検索を終了する場合は「イジェクトボタン」を押し、ブログトップに戻ります。 また、アメーバアイコンやパンクズリストから、外に出たり、アメブロ全体の検索を行う事も可能です。

 

 

イジェクトアイコンの説明を表示 

今回の更新 ver. 1.7 はマイナー更新です。「イジェクトアイコン」「マークのリセットボタン」の説明をホバー表示する様にしました。

 

 

 

既読を示す「マーク」について 

このスクリプトツールは、「Stylus」による「アメーバ検索画面」のアレンジを前提にしています。 スタイル名は「Ameblo Management」「Ameblo Neo Search」ですが、これらのアレンジは、デフォルト画面の無駄を省くだけでなく、検索ヒットに明瞭な「アンダーライン」を表示し、スクリプトと協力して検索から表示したページの「既読マーク」を表示します。

 

 

「マーク」には、次の2つの機能があります。

 

◎ リスト上の記事を開く操作で自動的に「マーク」の色が「グリーン」になり、普通は「既読マーク」として使います。

◎「マーク」自体をクリックすると、色は下の様に循環します。 特別な記事をメモするため「オレンジ」にする等、使い方は自由です。

 

また、いずれの状態でも、再びリストをクリックして記事を開くと「グリーン」になります。

 

 

この「マーク」はブラウザの閲覧履歴を利用せず、ローカルストレージに小型のデータベースを作って、記事リストのクリック履歴やマークの状態を保存しています。 従って、検索リストのページ変更や検索語変更をしても残り、ブログ内検索を閉じたりPCをシャットダウンしても保持されます。 ブログ内検索の「Reset」スイッチを押すことで、初めてマークが消えます。 これはブラウザの閲覧履歴に影響がなく、安心してリセットができます。

 

(注)ブラウザ側でアメブロのページ情報の削除をすると、ローカルストレージに保持していたマークの情報は削除され、リセットをした状態に戻ります。

 

 

 

「Ameba Search Repeat」について

●「ブログ内検索」は、ブログページの検索窓から検索を始める必要があります。 ホームの検索窓から始めると、アメブロ全ブログを対象とした検索になります。

 

●「Ameba Search Repeat」は、Ameba検索画面の「Stylus」によるアレンジが必要です。 拡張機能「Stylus」を導入した上で、以下のリンク先で2個のアレンジスタイルを入手してください。

 

  (1)Ameblo Management 

  (2)Ameblo Neo Search 

 

スタイルの適用スピードが高速で、Ameba検索の全ページで最適なアレンジになるので、この環境構築がお勧めです。「Stylus」はインストール順の後方がCSS優先になるので、必ず(1) → (2)の順にインストールしてください。

 

●「Stylus」が使えない Edgeの場合や、「Stylus」を使いたくない場合には、「Ameba Search Repeat / with CSS」を利用出来ます。 ページデザインの適応タイミングが少し遅れますが、「ブログ内検索」に関する機能は同等です。

 

 

 

「Ameba Search Repeat」ver. 1.7

「Ameba Search Repeat」を利用するには、以下のコードを「Tampermonkey」にコピー&ペーストして登録してください。 このスクリプトは、Chrome版 / Firefox版の「Tampermonkey」で動作を確認しています。

 

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

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

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

 

 

〔 Ameba Search Repeat 〕ver. 1.7

 

// ==UserScript==
// @name         Ameba Search Repeat
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  ブログ内検索の再検索を実行可能にする
// @author       Ameba Blog User
// @match        https://search.ameba.jp/search/entry/*
// @match        https://search.ameba.jp/talent/entry*
// @match        https://search.ameba.jp/general/entry*
// @run-at        document-start
// @grant         none
// ==/UserScript==


addEventListener('DOMContentLoaded', function(){

    in_view(); // ページにCSSを適用

    let target=document.querySelector('body'); // 監視 target
    let monitor=new MutationObserver(search_next);
    monitor.observe(target, {childList: true}); // 検索待受け開始

    search_next();

    function search_next(){ // 検索結果ページごとにURLは更新される

        let blogDB={}; // 閲覧記事のID/チェックフラグの記録配列
        let entry_id_DB; // ID検索用の配列

        let read_json=localStorage.getItem('ASR_DB_back'); // ローカルストレージ 保存名
        blogDB=JSON.parse(read_json);
        if(blogDB==null){
            blogDB=[['ASR00000000', '0']]; }
        if(get_userid(0) !=null){
            blogDB[0]=['ASR00000000', get_userid(0) ]; } // スクリプト起動時に開いたユーザーIDを記録
        let write_json=JSON.stringify(blogDB);
        localStorage.setItem('ASR_DB_back', write_json); // ローカルストレージ 保存


        reg_set();

        function reg_set(){
            let k;
            entry_id_DB=[]; // リセット
            for(k=0; k<blogDB.length; k++){
                entry_id_DB[k]=blogDB[k][0]; }} // ID検索用の配列を作成


        list_set();

        function list_set(){
            let entrylist=[];
            let entrylink=[];
            let entryhref=[];
            let history=[];

            entrylist=document.querySelectorAll('.PcEntryListItem');
            for(let k=0; k<entrylist.length; k++){
                entrylink[k]=entrylist[k].querySelector('.PcEntryListItem >a');
                entryhref[k]=entrylink[k].getAttribute('href').slice(-16, -5);
                //     entrylink[k].setAttribute('target', '_blank'); // リストのクリックを別タブで開く設定
                mark(k);
                list_listen(k);
                hmark_listen(k); }


            function mark(k){
                history[k]=document.createElement('p');
                history[k].innerText='\u00A0';
                history[k].setAttribute('class', 'history');
                history[k].setAttribute('style', 'position: absolute; left: 10px; ' +
                                        'width: 14px; height: 14px; border-radius: 4px; background: #fff');
                if(entrylink[k].querySelector('.history')){
                    entrylink[k].querySelector('.history').remove(); }
                entrylink[k].appendChild(history[k]);

                let list_size=entrylink[k].getBoundingClientRect().height;
                let img_size=entrylist[k].querySelector('.UserThumbnail').getBoundingClientRect().height;
                let top=(list_size + img_size)/2 - 6;
                history[k].style.top=top + 'px'; // サムネイルとリストの上下間にマークを配置

                let index=entry_id_DB.indexOf(entryhref[k]);
                if(index !=-1){
                    if(blogDB[index][1]==1){
                        history[k].style.background='#009688'; } // フラグ1ならグリーン
                    else if(blogDB[index][1]==2){
                        history[k].style.background='#ff8800'; } // フラグ2ならオレンジ
                    else if(blogDB[index][1]==0){
                        history[k].style.background='#fff'; }}} // フラグ0なら白

            function list_listen(k){
                entrylink[k].addEventListener('click', function(){
                    all_click(); }, false);
                entrylink[k].addEventListener('contextmenu', function(){
                    all_click(); }, false);

                function all_click(){
                    let index=entry_id_DB.indexOf(entryhref[k]);
                    if(index==-1){
                        blogDB.push([entryhref[k], 1]); // 閲覧履歴に記事ID/フラグ1を追加
                        history[k].style.background='#009688'; } // グリーン
                    else{
                        blogDB[index]=[entryhref[k], 1]; // この記事IDの履歴をフラグ1に更新
                        history[k].style.background='#009688'; } // グリーン
                    let write_json=JSON.stringify(blogDB);
                    localStorage.setItem('ASR_DB_back', write_json); // ストレージ保存
                    reg_set(); }}

            function hmark_listen(k){
                history[k].addEventListener('click', function(event){
                    event.preventDefault();
                    event.stopImmediatePropagation();
                    let index=entry_id_DB.indexOf(entryhref[k]);
                    if(index==-1){
                        blogDB.push([entryhref[k], 1]); // 閲覧履歴に記事ID/フラグ1を追加
                        history[k].style.background='#009688'; } // グリーン
                    else{
                        if(blogDB[index][1]==1){
                            blogDB[index]=[entryhref[k], 2]; // この記事IDの履歴をフラグ2に更新
                            history[k].style.background='#ff8800'; } // オレンジ(Noteフラグ)
                        else if(blogDB[index][1]==2){
                            blogDB[index]=[entryhref[k], 0]; // この記事IDの履歴をフラグ0に更新
                            history[k].style.background='#fff'; } // 白(履歴のフラグをリセット)
                        else if(blogDB[index][1]==0){
                            blogDB[index]=[entryhref[k], 1]; // この記事IDの履歴をフラグ1に更新
                            history[k].style.background='#009688'; }} // グリーン
                    let write_json=JSON.stringify(blogDB);
                    localStorage.setItem('ASR_DB_back', write_json); // ストレージ保存
                    reg_set();
                }, false); }}


        reset_sw();

        function reset_sw(){
            let box=document.querySelector('.PcResultPagination');
            if(box){
                let sw=document.createElement('p');
                sw.innerText='Reset';
                sw.setAttribute('id', 'history_reset');
                if(!box.querySelector('#history_reset')){
                    box.appendChild(sw); }
                let tooltip=document.createElement('p');
                tooltip.innerText='開いた記事のマークをリセット';
                tooltip.setAttribute('id', 'sw_tooltip2');
                if(!box.querySelector('#sw_tooltip2')){
                    box.appendChild(tooltip); }

                sw.addEventListener('click', function(){
                    let conf_str='🟩 リストの閲覧履歴マークをリセットします';
                    let ok=confirm(conf_str);
                    if(ok){
                        blogDB=[['ASR00000000', blogDB[0][1]]];
                        let write_json=JSON.stringify(blogDB);
                        localStorage.setItem('ASR_DB_back', write_json); // ストレージ保存
                        reg_set();
                        list_set(); }}, false); }}

        back_sw();

        function back_sw(){
            let box=document.querySelector('.PcNavigationSearch');
            if(box){
                let sw=document.createElement('p');
                sw.innerText='⏏';
                sw.setAttribute('id', 'back_blog');
                if(!box.querySelector('#back_blog')){
                    box.appendChild(sw); }
                let tooltip=document.createElement('p');
                tooltip.innerText='ブログTOPへ';
                tooltip.setAttribute('id', 'sw_tooltip');
                if(!box.querySelector('#sw_tooltip')){
                    box.appendChild(tooltip); }

                sw.addEventListener('click', function(){
                    location.href='https://ameblo.jp/' + blogDB[0][1]; }, false); }}


        let user_id=get_userid(1);

        if(user_id){
            let search_box_react=document.querySelector('#react-autowhatever-1');
            if(search_box_react){
                search_box_react.remove(); }
            let search_button=document.querySelector('.PcSearchForm_Button');

            search_button.addEventListener('click', function(e){
                let input_box=document.querySelector('.PcSuggestForm_Input').value
                if(input_box!=''){
                    location.href='https://search.ameba.jp/search/entry/' + input_box + user_id; }
                e.preventDefault();
                e.stopPropagation(); }, false); }


        function get_userid(n){
            let this_url=location.href;
            let index_after=this_url.indexOf('.html?aid=');
            let caption=document.querySelector('.PcEntryList_Caption');
            let blogfilter=document.querySelector('.PcBlogEntryFilter');
            let breadcrumb=document.querySelector('.PcBreadcrumbsList');
            let listlink=document.querySelectorAll('.PcEntryListItem_Link');

            if(index_after==-1){ // ブログ内検索から出た時 何もしない
                if(caption){
                    caption.textContent='ブログ記事';
                    caption.style.color='#298538';
                    caption.style.background='transparent'; }
                if(blogfilter){
                    blogfilter.style.display='flex'; }
                if(breadcrumb){
                    breadcrumb.style.marginLeft='0'; }
                if(listlink){
                    for(let k=0; k<listlink.length; k++){
                        listlink[k].style.height='auto'; }}}
            else{
                if(caption){
                    caption.textContent='ブログ内検索';
                    caption.style.color='#fff';
                    caption.style.background='#2196f3'; }
                blogfilter.style.display='none';
                breadcrumb.style.marginLeft='-100px';
                if(listlink){
                    for(let k=0; k<listlink.length; k++){
                        listlink[k].style.height='75px'; }}
                let user_id_a=this_url.slice(index_after);
                let index_before=user_id_a.indexOf('&p=');
                let user_id;
                if(index_before==-1){
                    user_id=user_id_a; }
                else{
                    user_id=user_id_a.substring(0, index_before); }
                if(n==1){
                    return user_id; }
                else if(n==0){
                    user_id=user_id.replace('.html?aid=', '');
                    return user_id; }}}
    } // search_next


    function in_view(){
        let css = "";
        css += [
            ".AmebaLogo { width: 100px; }",
            ".PcNavigationSearch_Logo > img { width: 36px; }",
            ".PcSearchForm_Button { width: 80px; }",
            "#back_blog { font-size: 24px; padding: 4px; margin-left: 20px; cursor: pointer;",
            " border: 1px solid #fff; border-radius: 6px; color: #fff; background: #2196f3; }",
            "#sw_tooltip { position: relative; left: -165px; white-space: nowrap; ",
            "font-size: 14px; padding: 4px 10px 0; border: 1px solid #ccc; background: #fff;",
            " box-shadow: 4px 4px 6px rgba(0, 0, 0, 0.5); display: none; }",
            "#back_blog:hover + #sw_tooltip { display: block; }",
            ".PcEntryList_Caption { padding: 5px 10px 2px !important; ",
            "margin: 0 10px 6px 0 !important; }",
            ".PcResultPagination, .PcEntryListItem_Link { position: relative; }",
            "#history_reset { position: absolute; left: 0; padding: 2px 6px 0; cursor: pointer;",
            " color: #fff; border: 1px solid #fff; border-radius: 4px; background: #009688; }",
            "#sw_tooltip2 { position: absolute; top: -3px; left: 70px; font-size: 14px; ",
            "padding: 5px 10px 2px; border: 1px solid #ccc; background: #fff; ",
            "box-shadow: 4px 4px 6px rgba(0, 0, 0, 0.5); display: none; }",
            "#history_reset:hover + #sw_tooltip2 { display: block; }"
        ].join(" ");

        let style0= document.createElement("style");
        style0.type="text/css";
        style0.setAttribute("class", "sty0");
        style0.appendChild(document.createTextNode(css));
        let header=document.getElementsByTagName("head");
        if(header[0].querySelector('.sty0')){
            header[0].querySelector('.sty0').remove(); }
        header[0].appendChild(style0); }

})

 

 

 

「Ameba Search Repeat」最新版について 

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

 

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