Niconico Seiga, コメント改善(Greasemonkey用)

ニコニコ静画のコメントを全て表示し邪魔な広告を消します

< Feedback on Niconico Seiga, コメント改善(Greasemonkey用)

Soru/yorum

§
Gönderildi: 30.05.2021
Düzenlendi: 30.05.2021

以下の方法でGreasemonkeyでも動くはずです

環境
Firefox 87.0 (64bit)
Greasemonkey 4.11

説明
自分の環境のGreasemonkeyだとセキュリティ上の理由でwindow.koにアクセスできないみたいなので、windowの代わりにunsafeWindowを使っています(TampermonkeyでもunsafeWindowが使えるのかは、んまあそう、よくわかんなかったです…)。
unsafeWindowよりwindowのほうが好ましいので、もしwindow.koの部分が普通に動く環境ならこの部分は変更の必要はないと思います。

あとjQueryが動かなかったのですが@requireに追加したら動きました。

ko.contextFor($("#ko_comment")[0])がundefinedを返す問題は、原因がよくわからなかったんですがsetTimeoutを挟んだらなんか動きました(ガバガバ)
TempermonkeyよりGreasemonkeyのほうがスクリプトが実行されるタイミングが早いとか?(迷推理)

コード


// ==UserScript==
// @name        Niconico Seiga, コメント改善
// @description ニコニコ静画のコメントを全て表示し邪魔な広告を消します
// @namespace   https://greasyfork.org/ja/users/662133
// @include     https://seiga.nicovideo.jp/seiga/*
// @version     1.0.2
// @grant       none
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js
// ==/UserScript==

// Greasemonkey用
// vm取得の前に待機する時間(ミリ秒)
// setTimeoutを使わないとvmの取得のタイミングが早すぎるせい(?)か「unsafeWindow.ko.contextFor(...) is undefined」で動かない(がなぜか待機時間が0でも動く)
// もし動かなければここの値を増やしてみてください
var get_vm_wait = 0;

(function () {
    var $ = window.jQuery;
    $('#ko_comment #comment_list').css({'max-height':'500px','overflow-y':'auto','padding-top':'3px','padding-right':'11px','margin-bottom':'20px'});
    $('#ko_comment .comment_list_item li.text').css({'margin-top':'10px'});
    $('#ko_comment .comment_list_item li.date').css({'position':'static','top':'0px','left':'32px'});
    $('#ko_comment .comment_list_item li.id').css({'position':'static','top':'0px','left':'112px'});
    $('#ko_comment .comment_list_item li.count_new').css({'position':'static','top':'0px','left':'4px','Opacity':'0.8'});
    $('#ko_comment .res').css({'position':'relative','left':'-15px','margin-top':'0px','padding-top':'0px','background-color':'#fff','z-index':'1001','box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px','-webkit-box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px','-moz-box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px'});
    $('#ko_comment.illust_comment').css({'padding-right':' 1px'});
    $('div.comment_post_button').css({'margin-right':'15px'});
    $('input#comment_post_input.content').css({'width':'261px'});
    $('div.comment_text.message_target').css({'width':'296px','margin-left':'15px'});
    $('div.illust_main.cfix div.illust_side div#ads_pc_seiga_illust_watch_east').css({'display':'none'});
      
    setTimeout( function () {
        var vm = unsafeWindow.ko.contextFor($("#ko_comment")[0]).$rawData;
        
        if (vm.commentShowCount() < vm.commentCount()) {
            vm.reload();
        }
    }, get_vm_wait);
})();

(function () {
    var target = document.getElementById('comment_list');

    function example() {
        var obj = document.getElementById('comment_list');
        obj.scrollTop = obj.scrollHeight;
    }

    var mo = new MutationObserver(example);
    mo.observe(target, {childList: true});

})();

コード(差分)


--- nsci.js     2021-05-30 15:16:54.974061915 +0900
+++ nsci_aarang.js      2021-05-30 15:20:07.601066038 +0900
@@ -5,7 +5,16 @@
 // @include     https://seiga.nicovideo.jp/seiga/*
 // @version     1.0.2
 // @grant       none
+// @require http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
+// @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js
 // ==/UserScript==
+
+// Greasemonkey用
+// vm取得の前に待機する時間(ミリ秒)
+// setTimeoutを使わないとvmの取得のタイミングが早すぎるせい(?)か「unsafeWindow.ko.contextFor(...) is undefined」で動かない(がなぜか待機時間が0でも動く)
+// もし動かなければここの値を増やしてみてください
+var get_vm_wait = 0;
+
 (function () {
     var $ = window.jQuery;
     $('#ko_comment #comment_list').css({'max-height':'500px','overflow-y':'auto','padding-top':'3px','padding-right':'11px','margin-bottom':'20px'});
@@ -19,13 +28,14 @@
     $('input#comment_post_input.content').css({'width':'261px'});
     $('div.comment_text.message_target').css({'width':'296px','margin-left':'15px'});
     $('div.illust_main.cfix div.illust_side div#ads_pc_seiga_illust_watch_east').css({'display':'none'});
-    
-    var vm = window.ko.contextFor($("#ko_comment")[0]).$rawData;
-    
-    if (vm.commentShowCount() < vm.commentCount()) {
-        vm.reload();
-    }
-    
+      
+    setTimeout( function () {
+        var vm = unsafeWindow.ko.contextFor($("#ko_comment")[0]).$rawData;
+        
+        if (vm.commentShowCount() < vm.commentCount()) {
+            vm.reload();
+        }
+    }, get_vm_wait);
 })();
 
 (function () {
§
Gönderildi: 30.05.2021
Düzenlendi: 30.05.2021

追記
TampermonkeyだとunsafeWindowが使えないみたいなので、これでTampermonkeyでも動くと思います。
自分の環境に入れたTampermonkey 4.13.6136では動作確認しました。


        var vm = unsafeWindow.ko.contextFor($("#ko_comment")[0]).$rawData;


        var w = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
        var vm = w.ko.contextFor($("#ko_comment")[0]).$rawData;

に変更

sentoSahip
§
Gönderildi: 30.05.2021

フィードバックありがとうございます。
Firefox 88.0.1 (64bit),Greasemonkey ver.4.11での動作を確認しました。
ただ自分の環境のTempermonkey ver.4.11.6120では動作しませんでした。

私の元のスクリプトでも、ニコニコ静画は『https://seiga.nicovideo.jp/js/common.min.js』にjQueryとKnockoutがあるみたいですが@requireでこれを追加したりするとTempermonkeyでも動かなくなることから@require辺りの挙動が違うのではないかとも自分は考えているのですがさっぱりで…

ちなみに頂いたスクリプトの@requireを『https://seiga.nicovideo.jp/js/common.min.js』に変更しても動作したので指定ミスではないと思うのですが…

§
Gönderildi: 30.05.2021
追記
TampermonkeyだとunsafeWindowが使えないみたいなので、これでTampermonkeyでも動くと思います。
自分の環境に入れたTampermonkey 4.13.6136では動作確認しました。

        var vm = unsafeWindow.ko.contextFor($("#ko_comment")[0]).$rawData;

        var w = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
        var vm = w.ko.contextFor($("#ko_comment")[0]).$rawData;
に変更

これでもダメでした?unsafeWindow is undefined以外のエラーかな…

sentoSahip
§
Gönderildi: 30.05.2021

追記の通りにしたところTempermonkey ver.4.11.6120でも動作を確認いたしました。
ありがとうございました。至急差し替えようと思います。

§
Gönderildi: 30.05.2021

やったぜ。

§
Gönderildi: 30.05.2021
Düzenlendi: 30.05.2021

ラグの不具合なんですが、基本的に前バージョン(1.0.2)と同じ動作で、動かない場合(各種の値がundefinedを返した場合)だけ自分のコード(1.0.3)が動くように修正しました。
たぶんこれで多少は改善されるんじゃないかと思います(前述の環境における両アドオンで動作確認しました)。
毎度すいませんね


// ==UserScript==
// @name        Niconico Seiga, コメント改善
// @description ニコニコ静画のコメントを全て表示し邪魔な広告を消します
// @namespace   https://greasyfork.org/ja/users/662133
// @include     https://seiga.nicovideo.jp/seiga/*
// @version     1.0.3
// @grant       none
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js
// ==/UserScript==

// Greasemonkey用
// vm取得の前に待機する時間(ミリ秒)
// setTimeoutを使わないとvmの取得のタイミングが早すぎるせい(?)か「unsafeWindow.ko.contextFor(...) is undefined」で動かない(がなぜか待機時間が0でも動く)
// もし動かなければここの値を増やしてみてください
var get_vm_wait = 0;

(function () {
    var $ = window.jQuery;
    $('#ko_comment #comment_list').css({'max-height':'500px','overflow-y':'auto','padding-top':'3px','padding-right':'11px','margin-bottom':'20px'});
    $('#ko_comment .comment_list_item li.text').css({'margin-top':'10px'});
    $('#ko_comment .comment_list_item li.date').css({'position':'static','top':'0px','left':'32px'});
    $('#ko_comment .comment_list_item li.id').css({'position':'static','top':'0px','left':'112px'});
    $('#ko_comment .comment_list_item li.count_new').css({'position':'static','top':'0px','left':'4px','Opacity':'0.8'});
    $('#ko_comment .res').css({'position':'relative','left':'-15px','margin-top':'0px','padding-top':'0px','background-color':'#fff','z-index':'1001','box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px','-webkit-box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px','-moz-box-shadow':'rgb(255, 255, 255) 0px -10px 10px 10px'});
    $('#ko_comment.illust_comment').css({'padding-right':' 1px'});
    $('div.comment_post_button').css({'margin-right':'15px'});
    $('input#comment_post_input.content').css({'width':'261px'});
    $('div.comment_text.message_target').css({'width':'296px','margin-left':'15px'});
    $('div.illust_main.cfix div.illust_side div#ads_pc_seiga_illust_watch_east').css({'display':'none'});

    var window_ko = window.ko;
    if (typeof window_ko === 'undefined') {
        window_ko = unsafeWindow.ko;
    }
  
    function reloadVm(context_for_ko_comment) {
        var vm = context_for_ko_comment.$rawData;
        
        if (vm.commentShowCount() < vm.commentCount()) {
            vm.reload();
        }
    }

    var context_for_ko_comment = window_ko.contextFor($("#ko_comment")[0]);
    if (typeof context_for_ko_comment === 'undefined') {
        setTimeout( function () {
            reloadVm( window_ko.contextFor($("#ko_comment")[0]) );
        }, get_vm_wait );
    }
    else {
        reloadVm(context_for_ko_comment);
    }
  
})();

(function () {
    var target = document.getElementById('comment_list');

    function example() {
        var obj = document.getElementById('comment_list');
        obj.scrollTop = obj.scrollHeight;
    }

    var mo = new MutationObserver(example);
    mo.observe(target, {childList: true});

})();

差分


--- nsci.js     2021-05-30 18:22:14.366360724 +0900
+++ nsci_aarang.js      2021-05-30 18:25:34.749858496 +0900
@@ -29,14 +29,29 @@ var get_vm_wait = 0;
     $('div.comment_text.message_target').css({'width':'296px','margin-left':'15px'});
     $('div.illust_main.cfix div.illust_side div#ads_pc_seiga_illust_watch_east').css({'display':'none'});
 
-    setTimeout( function () {
-        var w = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
-        var vm = w.ko.contextFor($("#ko_comment")[0]).$rawData;
-
+    var window_ko = window.ko;
+    if (typeof window_ko === 'undefined') {
+        window_ko = unsafeWindow.ko;
+    }
+  
+    function reloadVm(context_for_ko_comment) {
+        var vm = context_for_ko_comment.$rawData;
+        
         if (vm.commentShowCount() < vm.commentCount()) {
             vm.reload();
         }
-    }, get_vm_wait);
+    }
+
+    var context_for_ko_comment = window_ko.contextFor($("#ko_comment")[0]);
+    if (typeof context_for_ko_comment === 'undefined') {
+        setTimeout( function () {
+            reloadVm( window_ko.contextFor($("#ko_comment")[0]) );
+        }, get_vm_wait );
+    }
+    else {
+        reloadVm(context_for_ko_comment);
+    }
+  
 })();
 
 (function () {
sentoSahip
§
Gönderildi: 30.05.2021
Düzenlendi: 30.05.2021

本来は私が考えて対応しなければいけないのにとんでもないです。
何度も本当にありがとうございます。
結論を先に申し上げますと新しく頂いたスクリプトでも問題は解決しませんでした。

何度か検証したところ正確に言うならラグの不具合というよりコメントした時にそれが自分の画面上で反映されないバグっぽいです。
自分でコメント後スーパーリロードをするとそのコメが反映されてないのはTempermonkeyもGreasemonkeyも共通な感じで、
実際に内部的に反映されるまでは1分ぐらい?の時間がかかることからラグ自体はニコニコ静画の仕様みたいです。

新しく頂いたスクリプトとver.1.0.3で試しに@requireの部分を消してみるとTempermonkeyで問題がなくなくなりました。
つまり@requireでjqueryを追加した場合の挙動にTempermonkeyとGreasemonkeyで違いがあって、そこに問題がある可能性が高いです。

追記
ver.1.0.3のTempermonkeyバグのデメリットはコメント時自分がちゃんとコメントできたかどうか不安になるだけで実際には問題ありません。

§
Gönderildi: 30.05.2021

あーrequireの部分が原因ですか。
そうすると最初に@require ...jquery...するかどうかをTampermonkeyかGreasemonkeyかで分岐できれば理想的なんですが
やはりTampermonkey用とGreasemonkey用でスクリプト分けたほうが良いのかも?

§
Gönderildi: 30.05.2021

ちなみに自分も前の環境(Vivaldiブラウザ)ではTampermonkeyでこのスクリプト使ってたんですが、その時も自分のコメントが数分たたないと表示されない症状があったのでたぶんTampermonkeyでも環境によってはこの症状になるっぽいです。
ニコニコ側がやってる連投対策の一つかと思ってたんですが、このスクリプトが原因だったのは気付かなかった

sentoSahip
§
Gönderildi: 30.05.2021

うーん…余計に意味がわからない…

環境によってこの症状になる場合他の環境では問題ない可能性もありますね…
以前のでも症状があったりなかったりするのなら無理に分ける必要もないのかな…?
分けてもやっぱり症状あるって人もいそうですし。

情報ありがとうございました。

Cevap paylaş

Yanıt göndermek için oturum açın.