kiến thức Tổng hợp những addon chất cho Firefox / Chromium

Nhờ bác biến tấu nó thành scriptlet cho Ublock ạ. Em cảm ơn.
đâu phải cái nào cũng scriptlet đc :amazed:
Code:
// ==UserScript==
// @name        Enable Right Click
// @include     *eastasiaorigin.blogspot.com*
// @grant       unsafeWindow
// @run-at      document-end
// ==/UserScript==
(function () {
  var hook_eventNames = "contextmenu|select|selectstart|copy|cut|dragstart".split("|");
  var unhook_eventNames = "mousedown|mouseup|keydown|keyup".split("|");
  var eventNames = hook_eventNames.concat(unhook_eventNames);
  var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8));
  var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
  var document_addEventListener = document.addEventListener;
  var Event_preventDefault = Event.prototype.preventDefault;
  function addEventListener(type, func, useCapture) {
    var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener;
    if (hook_eventNames.indexOf(type) >= 0) {
      _addEventListener.apply(this, [type, returnTrue, useCapture]);
    } else if (unhook_eventNames.indexOf(type) >= 0) {
      var funcsName = storageName + type + (useCapture ? 't' : 'f');
      if (this[funcsName] === undefined) {
        this[funcsName] = [];
        _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]);
      }
      this[funcsName].push(func);
    } else {
      _addEventListener.apply(this, arguments);
    }
  }
  function clearLoop() {
    var elements = getElements();
    for (var i in elements) {
      for (var j in eventNames) {
        var name = 'on' + eventNames[j];
        if (elements[i][name] != null && elements[i][name] != onxxx) {
          if (unhook_eventNames.indexOf(eventNames[j]) >= 0) {
            elements[i][storageName + name] = elements[i][name];
            elements[i][name] = onxxx;
          } else {
            elements[i][name] = null;
          }
        }
      }
    }
  }
  function returnTrue(e) {
    return true;
  }
  function unhook_t(e) {
    return unhook(e, this, storageName + e.type + 't');
  }
  function unhook_f(e) {
    return unhook(e, this, storageName + e.type + 'f');
  }
  function unhook(e, self, funcsName) {
    var list = self[funcsName];
    for (var i in list) {
      list[i](e);
    }
    e.returnValue = true;
    return true;
  }
  function onxxx(e) {
    var name = storageName + 'on' + e.type;
    this[name](e);
    e.returnValue = true;
    return true;
  }
  function getRandStr(chs, len) {
    var str = '';
    while (len--) {
      str += chs[parseInt(Math.random() * chs.length)];
    }
    return str;
  }
  function getElements() {
    var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
    elements.push(document);
    return elements;
  }
  function addStyle(css) {
    var style = document.createElement('style');
    style.innerHTML = css;
    document.head.appendChild(style);
  }
  function init() {
    setInterval(clearLoop, 30 * 1000);
    setTimeout(clearLoop, 2500);
    window.addEventListener('load', clearLoop, true);
    clearLoop();
    EventTarget.prototype.addEventListener = addEventListener;
    document.addEventListener = addEventListener;
    Event.prototype.preventDefault = function () {
      if (eventNames.indexOf(this.type) < 0) {
        Event_preventDefault.apply(this, arguments);
      }
    };
    Event.prototype.__defineSetter__('returnValue', function () {
      if (this.returnValue != true && eventNames.indexOf(this.type) >= 0) {
        console.log(this);
        this.returnValue = true;
      }
    });
    console.debug('storageName:' + storageName);
    addStyle('html,*,:not(input):not(textarea):not(select), input[type="image"], input[type="file"], input[type="submit"], input[type="button"], input[type="reset"] {-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;}');
  }
  init();
})();
 
Lạ nhỉ, ở cái báo lỗi nó ghi là máy chủ từ Google Drive trả về 403, nghĩa là 403 Forbidden tức là bị chính máy chủ Google Drive chặn.

Ok, mình phần nào đoán ra nguyên nhân rồi, 99% là do thuật toán tải của MDM nó cố gắng tham lam mở thêm luồng lúc mà dung lượng tải về chỉ còn tầm vài MB, mà Google Drive nó cấm chia luồng với dung lượng nhỏ nên nó trả về 403 chặn.

Ví dụ với ảnh của bạn, đầu tiên MDM của bạn kết thúc luồng thứ nhất nhanh hơn 3 luồng còn lại thì MDM sẽ mở luồng tiếp theo để giữ số luồng tải là 4, cơ mà cái luồng tiếp theo bị Google Drive chặn trả về 403 nên ra đỏ lòm:

1682415350443-png.1799777


Giải pháp là sửa thuật toán chia luồng, không mở thêm luồng khi dung lượng còn sót lại ít quá.

Còn bạn nhoxbuon không bị mình đoán là do mạng của bạn ấy quá ổn định, nên không cần mở luồng cuối vài MB khiến Google Drive chặn, mà tất cả 6 luồng của bạn ấy kết thúc cùng một thời điểm => không cần mở thêm luồng nhỏ.

Mình nghĩ là mình có thể sửa, cơ mà sẽ tốn thời gian phết đó.

Nếu có thể, bạn test thử thế này mình xem, nói chung để chắc chắn 100% suy đoán bên trên của mình là chính xác.

Ta sẽ có 2 bài test:
  • Bài test thứ nhất ta tăng giá trị chia luồng của MDM lên, nghĩa là không cho phép MDM chia luồng nhỏ, thật may vãi chưởng tác giả cho phép chỉnh độ lớn của luồng:
  • Vào Settings của MDM vào Network
  • Chỉnh Minimal chunk thành 307200 (mặc định 1024)
  • Xóa sạch ở phần Maximum retries để chuyển thành Unlimited

FyuDUqa.png


Test thử với link trên.

  • Bài test thứ hai nếu test trên vẫn lỗi:
  • Vào Settings vào Network của MDM, chỉnh Threads thành 1

Test thử với link trên
https://v51.x8top.net/tmp082020/cf/larger/2018/12/game-7554-full.zip
lỗi này thì sao bác
4/29/2023, 21:40:16Server error: 503/background/multithreaded-task.js:569:21
1682779292825.png
 
https://v51.x8top.net/tmp082020/cf/larger/2018/12/game-7554-full.zip
lỗi này thì sao bác
4/29/2023, 21:40:16Server error: 503/background/multithreaded-task.js:569:21
View attachment 1807027
Máy chủ cấm tải đa luồng, không thể làm gì khác và 503 ở đây cũng tương đương với 403 vì nó giống kiểu cấm băng thông trong Nginx, quá 1 kết nối tự động đóng kết nối rồi về 503 :D

Continue in Browser thẳng tiến nhé.
 
Máy chủ cấm tải đa luồng, không thể làm gì khác và 503 ở đây cũng tương đương với 403 vì nó giống kiểu cấm băng thông trong Nginx, quá 1 kết nối tự động đóng kết nối rồi về 503 :D

Continue in Browser thẳng tiến nhé.
cái dropbox cũng khốn nạn y như thế, mà không hiểu sao dạo này nhiều chỗ lại thích tống file lên dropbox, tệ hết sức tệ. Tất cả tại Google bỏ cái unlimited
Omd40Mz.png
 
đâu phải cái nào cũng scriptlet đc :amazed:
Code:
// ==UserScript==
// @name        Enable Right Click
// @include     *eastasiaorigin.blogspot.com*
// @grant       unsafeWindow
// @run-at      document-end
// ==/UserScript==
(function () {
  var hook_eventNames = "contextmenu|select|selectstart|copy|cut|dragstart".split("|");
  var unhook_eventNames = "mousedown|mouseup|keydown|keyup".split("|");
  var eventNames = hook_eventNames.concat(unhook_eventNames);
  var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8));
  var EventTarget_addEventListener = EventTarget.prototype.addEventListener;
  var document_addEventListener = document.addEventListener;
  var Event_preventDefault = Event.prototype.preventDefault;
  function addEventListener(type, func, useCapture) {
    var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener;
    if (hook_eventNames.indexOf(type) >= 0) {
      _addEventListener.apply(this, [type, returnTrue, useCapture]);
    } else if (unhook_eventNames.indexOf(type) >= 0) {
      var funcsName = storageName + type + (useCapture ? 't' : 'f');
      if (this[funcsName] === undefined) {
        this[funcsName] = [];
        _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]);
      }
      this[funcsName].push(func);
    } else {
      _addEventListener.apply(this, arguments);
    }
  }
  function clearLoop() {
    var elements = getElements();
    for (var i in elements) {
      for (var j in eventNames) {
        var name = 'on' + eventNames[j];
        if (elements[i][name] != null && elements[i][name] != onxxx) {
          if (unhook_eventNames.indexOf(eventNames[j]) >= 0) {
            elements[i][storageName + name] = elements[i][name];
            elements[i][name] = onxxx;
          } else {
            elements[i][name] = null;
          }
        }
      }
    }
  }
  function returnTrue(e) {
    return true;
  }
  function unhook_t(e) {
    return unhook(e, this, storageName + e.type + 't');
  }
  function unhook_f(e) {
    return unhook(e, this, storageName + e.type + 'f');
  }
  function unhook(e, self, funcsName) {
    var list = self[funcsName];
    for (var i in list) {
      list[i](e);
    }
    e.returnValue = true;
    return true;
  }
  function onxxx(e) {
    var name = storageName + 'on' + e.type;
    this[name](e);
    e.returnValue = true;
    return true;
  }
  function getRandStr(chs, len) {
    var str = '';
    while (len--) {
      str += chs[parseInt(Math.random() * chs.length)];
    }
    return str;
  }
  function getElements() {
    var elements = Array.prototype.slice.call(document.getElementsByTagName('*'));
    elements.push(document);
    return elements;
  }
  function addStyle(css) {
    var style = document.createElement('style');
    style.innerHTML = css;
    document.head.appendChild(style);
  }
  function init() {
    setInterval(clearLoop, 30 * 1000);
    setTimeout(clearLoop, 2500);
    window.addEventListener('load', clearLoop, true);
    clearLoop();
    EventTarget.prototype.addEventListener = addEventListener;
    document.addEventListener = addEventListener;
    Event.prototype.preventDefault = function () {
      if (eventNames.indexOf(this.type) < 0) {
        Event_preventDefault.apply(this, arguments);
      }
    };
    Event.prototype.__defineSetter__('returnValue', function () {
      if (this.returnValue != true && eventNames.indexOf(this.type) >= 0) {
        console.log(this);
        this.returnValue = true;
      }
    });
    console.debug('storageName:' + storageName);
    addStyle('html,*,:not(input):not(textarea):not(select), input[type="image"], input[type="file"], input[type="submit"], input[type="button"], input[type="reset"] {-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important;}');
  }
  init();
})();
Em dạo gần đây lại có hơi hướng minimalism bác ạ, chỉ muốn cài mỗi cái UbO thôi :(
 
Crash nhiều khả năng vì nó là Nightly nên nó chưa ổn định, Firefox mình toàn bật 6 tháng tắt một lần có từng đấy thời gian không bị crash.

Thật ra bạn không cần dùng Nightly để cài FF đâu, dùng Tete009 là ok thôi: http://www1.plala.or.jp/tete009/en-US/software.html#FFDL

Tete này nó hơn Nightly ở chỗ nó dùng bản stable, mà vẫn là Nightly nên cài được FF.

Thử làm một số bước sau:
  • Cài uBlock và Auto Tab Discard ở #1, chặn quảng cáo giúp giảm crash, unload tab giúp giảm crash
  • Avast được tìm ra là khiến Firefox crash liên tục, nên ngoại lệ Firefox nếu dùng Avast, Avira cũng gây lỗi chả kém (link / 2)
Cảm ơn bác, để e thử :sweet_kiss:
 
NextDNS có cái tính năng chặn tên miền mới (NRD) rất hay, tuy nhiên NextDNS thì cũng có giới hạn nếu xài miễn phí, vậy nên mình tìm hiểu xem có giải pháp thay thế nào không và kết quả là hóa ra uBlock cũng làm được tương tự.

Đây là một list chặn NRD rất hay vì đa phần các tên miền mới đều là lừa đảo, virus.. Vậy nên chặn tụi nó đi giúp tránh được rất nhiều tai họa. Và list này là một list dạng tính năng, không khiến trang dùng anti-adblock để phát hiện và quấy rối người dùng như việc thêm một lô một lốc các list phục vụ mục đích chặn quảng cáo.

Vào Settings của uBlock, chọn Custom rồi copy thẳng vào nhé:

Chặn các tên miền mới tạo dưới 32 ngày: https://nocdn.nrd-list.com/1/nrd-list-32-days.txt
Chặn các tên miền mới tạo dưới 7 ngày: https://nocdn.nrd-list.com/1/nrd-list-7-days.txt

1682834413912.png


Nguồn: https://nrd-list.com/downloads/
(List trên hỗ trợ cả DNSCrypt và YogaDNS, nếu các bạn dùng được DNSCrypt thật ra (chuẩn bài, hiệu năng) thì nên thêm vào DNSCrypt, còn YogaDNS thì mình không rõ vì nó phải trả phí mới cho chạy làm dịch vụ Windows)

Cơ mà DNSCrypt thì các bạn hỏi @Bin_kutakoto_99 cho chính xác. Làm sao cho DNSCrypt nó tự động cập nhập list trên mới khó, vậy nên uBlock cũng ngon chán, mình cài vào thấy hiệu năng y xì như trước khi cài dù rằng list này chứa đến 3 triệu filter (tham khảo bài viết Bóc phốt Adguard tốt hơn uBlock sẽ thấy uBlock hiệu năng tốt gấp 3x Adguard {uBlock Origin (top): 4,662.3 ms (3,403.6 ms + 1,258.7 ms), Adguard (bottom): 14,424 ms (11,638.8 ms + 2,785.2 ms)}, mình sẽ có một bài chi tiết về vụ này sau tại vào thread ABPVN thấy mấy đồng chí bốc phét Adguard này Adguard nọ :D).

Chọn cái nào là tùy ý cơ mà chỉ nên chọn 1 trong 2, nói chung cứ 32 ngày mà táng, tên miền tầm 1 năm mới đáng tin, còn nếu nó chặn nhầm mấy trang hay đổi tên miền thì ngoại lệ tay lấy.

Mặc định uBlock cứ 7 tiếng cập nhập filter một lần, thêm vào là xong chả cần làm gì thêm nữa.
 
Last edited:
NextDNS có cái tính năng chặn tên miền mới (NRD) rất hay, tuy nhiên NextDNS thì cũng có giới hạn nếu xài miễn phí, vậy nên mình tìm hiểu xem có giải pháp thay thế nào không và kết quả là hóa ra uBlock cũng làm được tương tự.

Đây là một list chặn NRD rất hay vì đa phần các tên miền mới đều là lừa đảo, virus.. Vậy nên chặn tụi nó đi giúp tránh được rất nhiều tai họa. Và list này là một list dạng tính năng, không khiến trang dùng anti-adblock để phát hiện và quấy rối người dùng như việc thêm một lô một lốc các list phục vụ mục đích chặn quảng cáo.

Vào Settings của uBlock, chọn Custom rồi copy thẳng vào nhé:

Chặn các tên miền mới tạo dưới 32 ngày: https://nocdn.nrd-list.com/1/nrd-list-32-days.txt
Chặn các tên miền mới tạo dưới 7 ngày: https://nocdn.nrd-list.com/1/nrd-list-7-days.txt

View attachment 1807635

Nguồn: https://nrd-list.com/downloads/
(List trên hỗ trợ cả DNSCrypt và YogaDNS, nếu các bạn dùng được DNSCrypt thật ra (chuẩn bài, hiệu năng) thì nên thêm vào DNSCrypt, còn YogaDNS thì mình không rõ vì nó phải trả phí mới cho chạy làm dịch vụ Windows)

Cơ mà DNSCrypt thì các bạn hỏi @Bin_kutakoto_99 cho chính xác.

Chọn cái nào là tùy ý cơ mà chỉ nên chọn 1 trong 2, nói chung cứ 32 ngày mà táng, tên miền tầm 1 năm mới đáng tin, còn nếu nó chặn nhầm mấy trang hay đổi tên miền thì ngoại lệ tay lấy.

Mặc định uBlock cứ 7 tiếng cập nhập filter một lần, thêm vào là xong chả cần làm gì thêm
Em cài thử thì break luôn firefox bác ạ, không vào được 1 web nào luôn, tắt ulock thì lại bình thường, muốn tắt cái list đấy đi thì không được, dashboard trắng xóa. đã test trên profile mới tinh chỉ cài ublock cũng bị
F7TAdqU.png
 
Em cài thử thì break luôn firefox bác ạ, không vào được 1 web nào luôn, tắt ulock thì lại bình thường, muốn tắt cái list đấy đi thì không được, dashboard trắng xóa. đã test trên profile mới tinh chỉ cài ublock cũng bị
F7TAdqU.png
Đợi nó tải xong nhé, mình cũng phải đợi lúc mới hết vì cái list nặng quá, 3 triệu tên miền :D
Cơ mà nó load xong rồi là ngon nuột nà.

Mà có lẽ cứ NextDNS cho lành nhỉ sợ sau này nó auto-update cái đơ Firefox thì toi.

Vãi củ hành:
1682836239372.png
 
Last edited:
Vãi chưởng vừa thử cho nó auto-update cái xong đơ luôn uBlock, tính ra không ổn rồi chắc phải cho bài này vào thùng rác hoặc cảnh báo đỏ lòm trước khi áp dụng thôi :D
 
đúng thế thật bác ạ, cứ 7 tiếng nó chơi 1 lần kiểu này thì chịu
TYV5iID.png
Đành vậy, tiếc là hiện tại uBlock chưa hỗ trợ dùng Websocket/Diff Patch giống Github để cập nhập filter, nói chung là thay vì tải cả file siêu to khổng lồ thì nó chỉ lấy những thay đổi nhỏ rồi thêm vào, như vậy sẽ không bao giờ bị đơ như thế này nữa, uBlock mà làm được vậy nữa là hoàn hảo.

Nếu nói về hiệu năng thì uBlock là số một rồi, ở bài viết "Bóc phốt AdGuard tốt hơn uBlock" có luôn cả benchmark cho thấy uBlock tốn 1/3 thời gian để thực hiện tác vụ lọc so với Adguard, RAM cũng chiếm ít hơn:

CPU usage (see pic):
  • uBlock Origin (top): 4,662.3 ms (3,403.6 ms + 1,258.7 ms)
  • Adguard (bottom): 14,424 ms (11,638.8 ms + 2,785.2 ms)

c



Memory usage after all tabs loaded (see pic, top is after browser launch + garbage collection and before all tabs opened):
  • uBlock Origin (left): 1,254 MB
  • Adguard (right): 1,535 MB

d
 
Nếu nói về hiệu năng thì uBlock là số một rồi, ở bài viết "Bóc phốt AdGuard tốt hơn uBlock" có luôn cả benchmark cho thấy uBlock tốn 1/3 thời gian để thực hiện tác vụ lọc so với Adguard, RAM cũng chiếm ít hơn:
Em cũng là người dùng uBlock như bác, cơ mà bài viết này đã không được cập nhật từ năm 2017 liệu bây giờ có còn đúng chăng? Chẳng nhẽ Adguard không có tiến bộ gì trong một khoảng thời gian dài như vậy?

Raymond Hill edited this page on Aug 5, 2017 · 9 revisions
 
Last edited:
Em cũng là người dùng uBlock như bác, cơ mà bài viết này đã không được cập nhật từ năm 2017 liệu bây giờ có còn đúng chăng? Chẳng nhẽ Adguard không có tiến bộ gì trong một khoảng thời gian dài như vậy?
Tiến bộ hay không mình nghĩ là phải test thôi, hoặc là tạo ra một cái phốt tương tự để tác giả của Adguard hoặc uBlock test lại.

Tiến bộ là có thể, tuy nhiên mình cũng không quan tâm lắm vì cộng đồng một số cá nhân người dùng Adguard làm mình muốn tránh xa nó dù mình chẳng ghét gì nó cả, kiểu nước sông tốt nhất không phạm nước giếng hơn. :D


Nhờ các bác review giúp bộ lọc này ạ:

https://github.com/bongochong/CombinedPrivacyBlockLists/
Cái filter khổng lồ bên trên chắc mình bó tay không thể test vì script cài đặt của nó là file .sh cho Linux, ngoài ra nó ôm đồm nhiều thứ quá mà cộng đồng sử dụng lại nhỏ thì khả năng cao sẽ có vấn đề. Các bạn khác chắc có thể test được.

Theo mình bạn nên sử dụng công thức uBlock mặc định + các filter giúp cải thiện tính năng.
 
@toi la gay :sosad: Bác có để ý là nếu dùng Firefox vào trang này thì sẽ bị khoảng cách giữa các đoạn văn bản sẽ bị đúp không ạ? Ở trên Chrome thì nó hiển thị bình thường. Ví dụ: trên chrome thì khoảng cách giữa các đoạn văn bản là 1px, trên Firefox thì hình như nó là 1.5px hay thậm chí 2px.

https://vfo.vn/r/canon-ra-mat-ong-kinh-rf100-300mm-f-2-8l-is-usm-moi.148248/#post-573494
Cái này đúng là của mình cũng bị, nguyên nhân là do Chrome nó tự động thu hai cái <br><br> cạnh nhau làm một cái <br>, còn Firefox thì hiển thị cả hai, bạn có thể test bằng cách mở devtool của Firefox và Chrome, xóa từng cái <br> một sẽ thấy Chrome xóa hai cái mới thấy khác, Firefox xóa 1 cái là khác luôn rồi, đúng hai sai ở đây mình không rõ lắm:


1682840172709.png
 
Cái này đúng là của mình cũng bị, nguyên nhân là do Chrome nó tự động thu hai cái <br><br> cạnh nhau làm một cái <br>, còn Firefox thì hiển thị cả hai, bạn có thể test bằng cách mở devtool của Firefox và Chrome, xóa từng cái <br> một sẽ thấy Chrome xóa hai cái mới thấy khác, Firefox xóa 1 cái là khác luôn rồi, đúng hai sai ở đây mình không rõ lắm:


View attachment 1807708
Có cách nào để buộc Firefox phải hiển thị giống Chrome không bác?
 
Back
Top