Pixivの検索結果でブックマーク数でのフィルタや特定のユーザーを非表示にする機能を作ってみた

↑検索結果をブックマーク数100以上でフィルタした例

Pixivの検索はプレミアムだと人気順という形でソートが可能だが、それだけのためにお金を払うのも嫌なので、せめてブックマーク数が多いものだけを表示とか、興味のないユーザーの投稿を非表示にするようにしてみた。

まず前準備で環境を整える。

ブックマーク数フィルタと特定のユーザーを非表示にするスクリプトを追加

$(function() {
  var blockUserId = [123456,7891011], //非表示にしたいユーザーIDを記載
      favLe = 100; //ブックマーク数が指定以上の投稿のみが表示
      autoLoading = true, //自動ページ読み込みをするかどうか(true | false)
      loadingFlag = false;

  var isSort = function() {
    $('.JoCpVnw').each(function() {
      if(favLe) {
        var favCnt = Number($(this).find('.bookmark-count').text());
        if(favCnt < favLe) {
          $(this).hide();
        }
      }
      if(blockUserId) {
        for(let i in blockUserId) {
          var uid = $(this).find('.ui-profile-popup').attr('data-user_id');
          if(uid == blockUserId[i]) {
            $(this).hide();
          }
        }
      }
    });
    $('.x7wiBV0').find('div[class^="sc-"]').hide();
    $('.x7wiBV0').find('._premium-lead-popular-d-body').hide();
  };
  
  var isNextPageLoad = function() {
    if(autoLoading) {
      if(!loadingFlag) {
        var sclPos = $(window).scrollTop() + 1500;
        var trgEle = $('.pager-container').offset().top;

        if(sclPos > trgEle) {
          loadingFlag = true;
          var nextPage = '/search.php' + $('span.next a').attr('href');
          $('span.next').remove();

          $.ajax({
            type: 'GET',
            url: nextPage,
            dataType: 'html'
          }).done(function(data) {
            var nextLink = $(data).find('span.next');
            
            $('body').prepend('<iframe src="https://www.pixiv.net'+nextPage+'" class="ido" style="width:100%;height:300px;overflow:auto;position:absolute;top:0;z-index:-99999;opacity:0;"></iframe>');
            $('.ido').on('load', function() {
              var frameData = $('body,html', $(this).contents());
              $('body').append('<div class="page_loading" style="width:100%;padding:5px;background:#000;color:#fff;text-align:center;position:fixed;bottom:0;">次のページを読込中</div>');
              frameData.animate({scrollTop: frameData.height()}, 2000, 'swing',function() {
                var isFrameLoading = setInterval(function() {
                  var loadCheck = 0;
                  frameData.find('._1hsIS11').each(function() {
                    var attr = $(this).attr('style');
                    if(typeof attr == 'undefined' && attr == false) {
                      loadCheck++;
                    }
                  });
                  if(frameData.find('._1hsIS11.lazyloaded').length == 0 && loadCheck == 0) {
                    clearInterval(isFrameLoading);
                    var cntsItems = frameData.find('.JoCpVnw');
                    $('.x7wiBV0').append(cntsItems);

                    if(nextLink.length > 0) {
                      $('.pager-container').append(nextLink);
                      $('.ido').remove();
                      $('.page_loading').remove();
                      loadingFlag = false;
                    }
                    isSort();
                  }
                }, 500);
              });
            });
          }).fail(function () {
            console.log('Failed to get page.');
          });
        }
      }
    }
  };
  
  $(window).on('load', function() {
    if($('#js-react-search-mid').size() > 0) {
      isSort();
    }
  });

  $(window).on('scroll', function() {
    if($('#js-react-search-mid').size() > 0) {
      isNextPageLoad();
    }
  });
});

赤文字の部分を変更する。
「blockUserId = [123456,7891011]」に非表示にしたいユーザーのIDを記載。複数ある場合は「,」カンマで区切る。
「favLe = 100」に数値を指定。ブックマーク数が指定以上の投稿のみが表示される。

システム上での絞り込みではないので、そのページのみで適用される。 自動ページングの拡張機能があるともっと捗るよ。




2019/08/12 追伸:
拡張機能の自動ページングが動かないので、自動ページング機能追加。ただFirefoxが不安定。
あとPixiv側のサムネ遅延読み込み処理の対策で、サムネ一覧を一度裏で展開して持ってくるというめんどくさい処理を入れる羽目になったんだけど、回線が弱いとサムネが正常に読み込まれないこともある。そもそも動かない場合は他の拡張機能とバッティングしている可能性あり。