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

1674790864421.png

Bỏ 2 cái context dưới dùng code nào thím nhỉ?
Addon em đang dùng: TWP - Translate web pages
 
View attachment 1629327
Bỏ 2 cái context dưới dùng code nào thím nhỉ?
Addon em đang dùng: TWP - Translate web pages

Cái Send to Device thì dùng: #context-sendlinktodevice
https://github.com/stonecrusher/simpleMenuWizard/blob/master/simpleMenuWizard/link-context.css

Còn riêng cái Accessibility thì tắt trong about:config tìm accessibility.force_disabled -> 1

Hình như cả hai đều tắt trong about:config được, bởi của mình làm gì có cả hai dù không dùng css, cơ mà chả nhớ là tắt cái gì nữa.
 
Bản 32 kể từ 107 bị cắt rồi do phía Mozilla thay đổi code kiểu gì compile (biên dịch sang exe) xong không chạy được, muốn có 32bit chỉ có dùng bản cũ 106 như mình.
Còn addon kiểu J2Team thì hiện tại Firefox không có do Facebook thay đổi kiểm tra seen trong websocket, phải lọc websocket mới chặn được, cách tốt nhất là gửi phản hồi cho phía J2Team để họ port qua Firefox.

Ngoài ra có thể cài nó cho Firefox được, thread này mình có chỉ cách cài extension của Chrome cho Firefox, còn đây là bài viết cho thấy J2Team có thể chạy trên Firefox được: https://m.facebook.com/groups/j2team.community/permalink/658289087836548/

HD: https://voz.vn/t/tong-hop-nhung-addon-chat-cho-firefox-pc-mobile.682181/post-22285202
Cái exten này chắc lâu ko update nên giờ ko work với FF. Add như các bước nhưng khi sử dụng thì ko work. Có exten nào hide facebook status online tạm thời mà ko cần dùng chức năng turn off status của fb ko thím nhề?
 
Cái exten này chắc lâu ko update nên giờ ko work với FF. Add như các bước nhưng khi sử dụng thì ko work. Có exten nào hide facebook status online tạm thời mà ko cần dùng chức năng turn off status của fb ko thím nhề?

Bạn có thể thử ép Firefox chạy SocialTools của Chrome, addon này cũng có tính năng chặn seen: https://chrome.google.com/webstore/detail/social-tools/llbdoljkknpjgfcnbnoiehjcgancpjmd?hl=vi

Tuy nhiên có một điều nhận ra là cả hai addon J2Team và SocialTools đều do người Việt viết, và người phương Tây hay người Mỹ nói chung không mặn mà với Facebook và đó chính là vấn đề, chỉ người Việt Nam và vài nước châu Á quan tâm mà người Việt thì sức có hạn nên không thể bao cả Firefox lẫn Chrome được (mặc dù rất dễ do API tương đồng với tỉ lệ 1:0.99). Vậy nên nếu cả cái trên cũng không chạy thì cách duy nhất là bạn cố gắng liên hệ phía Việt Nam để họ viết thêm bản cho Firefox, hai là phải tự sửa tay lấy (100% sẽ thành công, quan trọng là tìm ra cái nhọt ở đâu để mà bóp thôi, API tương đồng thì cái gì chạy trên Chrome được chắc chắn chạy trên Firefox, chỉ là chắc mấy ông lỏi thêm code kiểu gì để ép Firefox không nhận thôi).

Thêm thông tin là tính năng seen của Facebook hoạt động dựa trên Websocket, mà Firefox cũng hộ trợ đọc và sửa websocket như Chrome thôi: https://hacks.mozilla.org/2019/10/firefoxs-new-websocket-inspector/

Ngoài ra những phần mềm local proxy mà hỗ trợ MITM Websocket cũng có thể lọc và chặn seen được, cơ mà hiện tại rất hiếm phần mềm proxy miễn phí nào hỗ trợ ngoài BurpSuite (có thể lọc Websocket và thay đổi theo thời gian thực), bạn có thể tải thử rồi lắp vào trình duyệt để hiểu giao thức Websocket hoạt động như thế nào, nó cũng đơn giản thôi là tạo một gói tin HTTPS với header Upgrade: websocket, rồi cứ thế dùng gói tin này để gửi các gói tin socket như khi chơi game online để trò chuyện với máy chủ. Và các addon như J2Team hay SocialTools lọc các gói tin socket trên và chặn các gói tin có nội dung seen, và đó là tất cả bí mật đằng sau việc chặn seen từ Facebook.

Addon này cũng hỗ trợ hiển thị Websocket, cơ mà không rõ có cho thay đổi không, thay đổi được nghĩa là chặn seen được. https://addons.mozilla.org/en-US/firefox/addon/websocketsniff-fork/
 
Last edited:
Có thím nào hóng hớt uBlock gỡ bộ lọc Adguard Tracking Protection k vậy?

https://github.com/gorhill/uBlock/commit/98c0bd840678d322475f114f5c212c4ce63a6f05

Chắc ông nào seeder AdGuard kinh quá nên bị chém rồi đây, mà đùa chứ chắc lỗi thì gỡ tạm ra thôi, và cái filter chặn tracker kiểu này EasyList làm tốt lắm rồi.

Chắc hóng là hóng ManifestV3 sắp tới ấy, bởi vì ManifestV3 ép phải đóng gói bộ lọc 2-3MB vào trong addon luôn nên khả năng lớn sau này một cái uBlock/Adguard sẽ sinh ra:
  • uBlock/Adguard Vietnam
  • uBlock/Adguard Tàu Khựa
  • uBlock/Adguard Mẽo
  • uBlock/Adguard Nga Ngố
  • uBlock/Adguard Thái Lọ
  • ...

Mới ôm hết quảng cáo được, chứ 30k rule làm sao mà đủ để chặn một lúc nhiều quốc gia được. :D
Tự nhiên một cái giản đơn bị làm cho phức tạp là thế đó, chưa có cái ngu nào hơn cái ngu này, sau này kho addon thành kho rác luôn vì một đống addon cùng chức năng phải up lên nhiều lần cho nhiều nước do giới hạn 30k và không cho cập nhập online.
 
Vậy hở, của mình ngon lành cành đào mà, xem video: https://gfycat.com/WideeyedAgileAmericancrocodile
Xem playlist: https://gfycat.com/NaturalSimplisticEarwig

Tính năng xem cả playlist hay xem cả một kênh (cứ thể refresh bằng Ctrl+R không bao giờ phải mở kênh Youtube cập nhập video nữa mà MPV bao tất) là tính năng khiến MPV >>>>>>> Trình duyệt

Bạn thử kiểm tra lại thiết lập addon, giống thế này là ok:
của em xem video thì ngon mà mở playlist thì lại chỉ có mỗi tiếng, phải đóng Firefox đi thì mới tắt được. Em thêm bừa dòng này vào file mpv.conf, thế mà lại fix được
iS0nMFG.png

keep-open=always
 
của em xem video thì ngon mà mở playlist thì lại chỉ có mỗi tiếng, phải đóng Firefox đi thì mới tắt được. Em thêm bừa dòng này vào file mpv.conf, thế mà lại fix được
iS0nMFG.png

Dùng cái này ngon hơn nè https://voz.vn/t/tong-hop-nhung-addon-chat-cho-firefox-pc-mobile.682181/post-22552061, sau một thời gian test mình thấy cái External Application bá cháy này là ngon nhất trong tất cả các addon xổ ra ứng dụng ngoài từ Firefox, làm được rất nhiều trò như xổ video ra xem thì đơn giản rồi, xổ ảnh ra để mở trong trình xem ảnh/sửa ảnh, xổ file vào trình tải ứng dụng như cURL/Aria2c, xổ file vào Sandbox mở không quan tâm virus hay gì (tương tự xổ sang trình tải), ngoài ra mỗi ứng dụng là một icon/contextmenu, nên khi sử dụng rất tiện, lại còn nhẹ nữa cài vào như không cài gì cả.

Để sau Tết mình cập nhập lại thay thế tất cả mấy cái Open in MPV thành cái này.
 
Last edited:
Chắc ông nào seeder AdGuard kinh quá nên bị chém rồi đây, mà đùa chứ chắc lỗi thì gỡ tạm ra thôi, và cái filter chặn tracker kiểu này EasyList làm tốt lắm rồi.

Chắc hóng là hóng ManifestV3 sắp tới ấy, bởi vì ManifestV3 ép phải đóng gói bộ lọc 2-3MB vào trong addon luôn nên khả năng lớn sau này một cái uBlock/Adguard sẽ sinh ra:
  • uBlock/Adguard Vietnam
  • uBlock/Adguard Tàu Khựa
  • uBlock/Adguard Mẽo
  • uBlock/Adguard Nga Ngố
  • uBlock/Adguard Thái Lọ
  • ...

Mới ôm hết quảng cáo được, chứ 30k rule làm sao mà đủ để chặn một lúc nhiều quốc gia được. :D
Tự nhiên một cái giản đơn bị làm cho phức tạp là thế đó, chưa có cái ngu nào hơn cái ngu này, sau này kho addon thành kho rác luôn vì một đống addon cùng chức năng phải up lên nhiều lần cho nhiều nước do giới hạn 30k và không cho cập nhập online.
Đọc thì “có vẻ” như xung đột giữa việc cập nhật bộ lọc, đến CTO của Adguard vào xin lỗi dev uBlock là thấy căng rồi!

uBlock phát hành cái Lite công nhận xài chán hơn nhiều, phải đợi dev chạy update bộ lọc rồi đóng gói lại phát hành lên store. Còn Adguard được qc là đã tìm ra cách để sống chung với mv3
 
Đọc thì “có vẻ” như xung đột giữa việc cập nhật bộ lọc, đến CTO của Adguard vào xin lỗi dev uBlock là thấy căng rồi!

uBlock phát hành cái Lite công nhận xài chán hơn nhiều, phải đợi dev chạy update bộ lọc rồi đóng gói lại phát hành lên store. Còn Adguard được qc là đã tìm ra cách để sống chung với mv3
https://github.com/stephenhawk8054/PrivacyExtended nếu thím vẫn muốn dùng thì Adguard Tracking thì dùng cái này (của @eipi10)
 
Dùng cái này ngon hơn nè https://voz.vn/t/tong-hop-nhung-addon-chat-cho-firefox-pc-mobile.682181/post-22552061, sau một thời gian test mình thấy cái External Application bá cháy này là ngon nhất trong tất cả các addon xổ ra ứng dụng ngoài từ Firefox, làm được rất nhiều trò như xổ video ra xem thì đơn giản rồi, xổ ảnh ra để mở trong trình xem ảnh/sửa ảnh, xổ file vào trình tải ứng dụng như cURL/Aria2c, xổ file vào Sandbox mở không quan tâm virus hay gì (tương tự xổ sang trình tải), ngoài ra mỗi ứng dụng là một icon/contextmenu, nên khi sử dụng rất tiện, lại còn nhẹ nữa cài vào như không cài gì cả.

Để sau Tết mình cập nhập lại thay thế tất cả mấy cái Open in MPV thành cái này.
Giờ em mới đọc được cái còm này
KURdQ8l.png
bác xài Send to MPV thấy có vấn đề gì không ợ

Fence nào dùng MPV để xem youtube và video thì để ý cái memory leak của thằng này. Bọn dev không fix memory leak nên xài lâu là bị tràn bộ nhớ treo máy mất dữ liệu chưa kịp lưu. Nên các fence cẩn thận.
 
1674882040874.png 1674882079796.png
Nhiều ext em dùng thử rồi xoá đi nhưng để lại file cài/folder dữ liệu trong profile. Vậy dọn như nào thím nhỉ? Vì toàn ký hiệu không rõ tên ext nên em sợ xoá nhầm.
 
Giờ em mới đọc được cái còm này
KURdQ8l.png
bác xài Send to MPV thấy có vấn đề gì không ợ

Sand to MPV thi thoảng bắt nhầm link quảng cáo với không cho chọn video nào muốn mở ra, bị tù.

Còn MPV mình dùng ngàn đời nay rồi và nó là thằng nhẹ nhất trong tất cả các trình xem phim, chưa thấy memory leak bao giờ cả chắc nhiều khi do driver card màn hình gây ra, với người mới thì nên cài uosc này vào vì nó khiến MPV cảm giác như một trình xem video đầy đủ hơn. https://github.com/tomasklaen/uosc

195072935-44d591d9-00bb-4a55-8795-9cf81f65d397.png


Mình cũng định tạo thread về MPV nhưng mà nhiều thread quá không có thời gian trả lời, thôi thì có gì dùng thread này rồi dùng chung luôn Firefox với MPV rồi hướng dẫn luôn cho y hệt cách mình dùng MPV là để thay thế hoàn toàn Firefox ở khoản xem phim online.
 
Giới thiệu addon Load Background Tab Lazily này cho nhưng ai có thói quen vừa xấu lại vừa tốt, đó là mở tab hàng loạt rồi để đó đọc sau như mình, cái xấu là thói quen này khiến Firefox dùng nhiều tài nguyên mà có thể đến lúc cần sẽ không có đủ, ngoài ra các trang web dù không xem nhưng họ vẫn chạy ngầm để lấy thông tin người dùng hay chạy quảng cáo, chạy slideshow rất nặng, và cái tốt là mở nhiều tìm tòi được nhiều, rất tốt cho việc tham khảo và so sánh các nội dung muốn tìm hiểu (ví dụ khi tìm hiểu về đề tài nào đó như chặn quảng cáo thì thường sẽ mở từ Stackoverflow tới Github rồi Reddit để tham khảo, đến khi quay lại nhìn thì thấy cả nùi tab rồi, như ở thời điểm hiện tại ở bài viết này, Firefox của mình hiện đang mở 3994 tab: ): https://addons.mozilla.org/en-US/firefox/addon/load-background-tabs-lazily/

Addon này rất đơn giản chỉ cài vào là xong luôn, khi mở tab mới mà không xem ngay thì tab đó sẽ được unload thay vì load ngầm, tiết kiệm tài nguyên CPU và RAM, rất phù hợp khi xài cùng Auto Tab Discard kèm thói quen mở nhiều tab.
 
Last edited:
Thím cho mình xin lại script pull to refresh cho firefox android với

Có 2 phiên bản, lite (https://voz.vn/t/cach-ep-firefox-luu-cache-tren-ram-ma-khong-can-ramdisk.664955/page-2#post-21558048) và full:

Lite:
Code:
// ==UserScript==
// @name         Swipe to Refresh Lite
// @namespace    https://example.com/
// @version      1.0.0
// @author       NoName
// @include      *
// @noframes
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const img = document.createElement('img');
    img.src =  `data:image/svg+xml;base64,PHN2ZwogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgd2lkdGg9IjIzMDguNTcxNSIKICAgIGhlaWdodD0iMjI1MS40Mjg1IgogICAgdmlld0JveD0iMCAwIDIzMDguNTcxNSAyMjUxLjQyODUiPgogICAgPGcKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzQuMjg1NjQ1LDEyNjEuOTI1NikiPgogICAgICAgIDxlbGxpcHNlCiAgICAgICAgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIKICAgICAgICBjeD0iMTIyOC41NzE0IgogICAgICAgIGN5PSItMTM2LjIxMTQxIgogICAgICAgIHJ4PSIxMTU0LjI4NTgiCiAgICAgICAgcnk9IjExMjUuNzE0MiIgLz4KICAgICAgICA8cGF0aAogICAgICAgIGQ9Im0gMTk5NC40Mjg1LDE4LjA3NDMxNSBxIDAsNSAtMSw3IC02NCwyNjcuOTk5OTk1IC0yNjcuOTk5OSw0MzQuNDk5OTk1IC0yMDQsMTY2LjUgLTQ3OCwxNjYuNSAtMTQ2LDAgLTI4Mi41LC01NSAtMTM2LjUsLTU1IC0yNDMuNSwtMTU3IGwgLTEyOSwxMjkgcSAtMTksMTkgLTQ1LDE5IC0yNiwwIC00NSwtMTkgLTE5LC0xOSAtMTksLTQ1IGwgMCwtNDQ3Ljk5OTk5NSBxIDAsLTI2IDE5LC00NS4wMDAwMDAyIDE5LC0xOC45OTk5OTk4IDQ1LC0xOC45OTk5OTk4IGwgNDQ4LDAgcSAyNiwwIDQ1LDE4Ljk5OTk5OTggMTksMTkuMDAwMDAwMiAxOSw0NS4wMDAwMDAyIDAsMjYgLTE5LDQ1IGwgLTEzNywxMzYuOTk5OTk1IHEgNzEsNjYgMTYxLDEwMiA5MCwzNiAxODcsMzYgMTM0LDAgMjUwLC02NSAxMTYsLTY1IDE4NiwtMTc5IDExLC0xNyA1MywtMTE2Ljk5OTk5NTIgOCwtMjIuOTk5OTk5OCAzMCwtMjIuOTk5OTk5OCBsIDE5MS45OTk5LDAgcSAxMywwIDIyLjUsOS40OTk5OTk4IDkuNSw5LjUgOS41LDIyLjUwMDAwMDIgeiBtIDI1LC04MDAuMDAwMDM1IDAsNDQ4IHEgMCwyNiAtMTksNDUgLTE5LDE5IC00NSwxOSBsIC00NDcuOTk5OSwwIHEgLTI2LDAgLTQ1LC0xOSAtMTksLTE5IC0xOSwtNDUgMCwtMjYgMTksLTQ1IGwgMTM4LC0xMzggcSAtMTQ4LC0xMzcgLTM0OSwtMTM3IC0xMzQsMCAtMjUwLDY1IC0xMTYsNjUgLTE4NiwxNzkgLTExLDE3IC01MywxMTcgLTgsMjMgLTMwLDIzIGwgLTE5OSwwIHEgLTEzLDAgLTIyLjUsLTkuNSAtOS41LC05LjUgLTkuNSwtMjIuNSBsIDAsLTcgcSA2NSwtMjY4IDI3MCwtNDM0LjUgMjA1LC0xNjYuNSA0ODAsLTE2Ni41IDE0NiwwIDI4NCw1NS41IDEzOCw1NS41IDI0NSwxNTYuNSBsIDEyOS45OTk5LC0xMjkgcSAxOSwtMTkgNDUsLTE5IDI2LDAgNDUsMTkgMTksMTkgMTksNDUgeiIKICAgICAgICBpZD0icGF0aDMzMzgiIC8+CiAgICA8L2c+CiAgICA8L3N2Zz4=`;
    img.style='width: 48px; height: 48px; z-index: 999; position: fixed; left: calc(50% - 24px); top: -48px; border: 0';
    document.body.appendChild(img);

    let startY, lastY, topOfPage;

    window.addEventListener('touchstart', function(e)
    {
        if(e.changedTouches.length === 1)
        {
            startY = lastY = e.changedTouches[0].pageY;
            topOfPage = window.scrollY === 0;
        }
    });

    window.addEventListener('touchmove', function(e)
    {
        if(e.changedTouches.length === 1 && topOfPage && e.changedTouches[0].pageY > lastY)
        {
            lastY = e.changedTouches[0].pageY;
            const pageY = -48 + (lastY - startY);

            if(pageY <= 128)
            {
                img.style.top = `${pageY}px`;
            }
        }
    });

    window.addEventListener('touchend', function(e)
    {
        if(topOfPage && e.changedTouches.length === 1 && e.changedTouches[0].pageY - startY >= 128)
        {
            location.reload();
        }

        else
        {
            img.style.top = '-48px';
        }
    });
})();

Full:
Code:
// ==UserScript==
// @name         Swipe to Refresh Full
// @namespace    https://example.com/
// @version      1.0.0
// @author       NoName
// @include      *
// @noframes
// @grant        none
// ==/UserScript==
(function(){
'use strict';
var _shared = {
  pullStartY: null,
  pullMoveY: null,
  handlers: [],
  styleEl: null,
  events: null,
  dist: 0,
  state: 'pending',
  timeout: null,
  distResisted: 0,
  supportsPassive: false,
  supportsPointerEvents: typeof window !== 'undefined' && !!window.PointerEvent
};

try {
  window.addEventListener('test', null, {
    get passive() {
      // eslint-disable-line getter-return
      _shared.supportsPassive = true;
    }

  });
} catch (e) {// do nothing
}

function setupDOM(handler) {
  if (!handler.ptrElement) {
    var ptr = document.createElement('div');

    if (handler.mainElement !== document.body) {
      handler.mainElement.parentNode.insertBefore(ptr, handler.mainElement);
    } else {
      document.body.insertBefore(ptr, document.body.firstChild);
    }

    ptr.classList.add(((handler.classPrefix) + "ptr"));
    ptr.innerHTML = handler.getMarkup().replace(/__PREFIX__/g, handler.classPrefix);
    handler.ptrElement = ptr;

    if (typeof handler.onInit === 'function') {
      handler.onInit(handler);
    } // Add the css styles to the style node, and then
    // insert it into the dom


    if (!_shared.styleEl) {
      _shared.styleEl = document.createElement('style');

      _shared.styleEl.setAttribute('id', 'pull-to-refresh-js-style');

      document.head.appendChild(_shared.styleEl);
    }

    _shared.styleEl.textContent = handler.getStyles().replace(/__PREFIX__/g, handler.classPrefix).replace(/\s+/g, ' ');
  }

  return handler;
}

function onReset(handler) {
  if (!handler.ptrElement) { return; }
  handler.ptrElement.classList.remove(((handler.classPrefix) + "refresh"));
  handler.ptrElement.style[handler.cssProp] = '0px';
  setTimeout(function () {
    // remove previous ptr-element from DOM
    if (handler.ptrElement && handler.ptrElement.parentNode) {
      handler.ptrElement.parentNode.removeChild(handler.ptrElement);
      handler.ptrElement = null;
    } // reset state


    _shared.state = 'pending';
  }, handler.refreshTimeout);
}

function update(handler) {
  var iconEl = handler.ptrElement.querySelector(("." + (handler.classPrefix) + "icon"));
  var textEl = handler.ptrElement.querySelector(("." + (handler.classPrefix) + "text"));

  if (iconEl) {
    if (_shared.state === 'refreshing') {
      iconEl.innerHTML = handler.iconRefreshing;
    } else {
      iconEl.innerHTML = handler.iconArrow;
    }
  }

  if (textEl) {
    if (_shared.state === 'releasing') {
      textEl.innerHTML = handler.instructionsReleaseToRefresh;
    }

    if (_shared.state === 'pulling' || _shared.state === 'pending') {
      textEl.innerHTML = handler.instructionsPullToRefresh;
    }

    if (_shared.state === 'refreshing') {
      textEl.innerHTML = handler.instructionsRefreshing;
    }
  }
}

var _ptr = {
  setupDOM: setupDOM,
  onReset: onReset,
  update: update
};

var _timeout;

var screenY = function screenY(event) {
  if (_shared.pointerEventsEnabled && _shared.supportsPointerEvents) {
    return event.screenY;
  }

  return event.touches[0].screenY;
};

var _setupEvents = (function () {
  var _el;

  function _onTouchStart(e) {
    // here, we must pick a handler first, and then append their html/css on the DOM
    var target = _shared.handlers.filter(function (h) { return h.contains(e.target); })[0];

    _shared.enable = !!target;

    if (target && _shared.state === 'pending') {
      _el = _ptr.setupDOM(target);

      if (target.shouldPullToRefresh()) {
        _shared.pullStartY = screenY(e);
      }

      clearTimeout(_shared.timeout);

      _ptr.update(target);
    }
  }

  function _onTouchMove(e) {
    if (!(_el && _el.ptrElement && _shared.enable)) {
      return;
    }

    if (!_shared.pullStartY) {
      if (_el.shouldPullToRefresh()) {
        _shared.pullStartY = screenY(e);
      }
    } else {
      _shared.pullMoveY = screenY(e);
    }

    if (_shared.state === 'refreshing') {
      if (e.cancelable && _el.shouldPullToRefresh() && _shared.pullStartY < _shared.pullMoveY) {
        e.preventDefault();
      }

      return;
    }

    if (_shared.state === 'pending') {
      _el.ptrElement.classList.add(((_el.classPrefix) + "pull"));

      _shared.state = 'pulling';

      _ptr.update(_el);
    }

    if (_shared.pullStartY && _shared.pullMoveY) {
      _shared.dist = _shared.pullMoveY - _shared.pullStartY;
    }

    _shared.distExtra = _shared.dist - _el.distIgnore;

    if (_shared.distExtra > 0) {
      if (e.cancelable) {
        e.preventDefault();
      }

      _el.ptrElement.style[_el.cssProp] = (_shared.distResisted) + "px";
      _shared.distResisted = _el.resistanceFunction(_shared.distExtra / _el.distThreshold) * Math.min(_el.distMax, _shared.distExtra);

      if (_shared.state === 'pulling' && _shared.distResisted > _el.distThreshold) {
        _el.ptrElement.classList.add(((_el.classPrefix) + "release"));

        _shared.state = 'releasing';

        _ptr.update(_el);
      }

      if (_shared.state === 'releasing' && _shared.distResisted < _el.distThreshold) {
        _el.ptrElement.classList.remove(((_el.classPrefix) + "release"));

        _shared.state = 'pulling';

        _ptr.update(_el);
      }
    }
  }

  function _onTouchEnd() {
    if (!(_el && _el.ptrElement && _shared.enable)) {
      return;
    } // wait 1/2 sec before unmounting...


    clearTimeout(_timeout);
    _timeout = setTimeout(function () {
      if (_el && _el.ptrElement && _shared.state === 'pending') {
        _ptr.onReset(_el);
      }
    }, 500);

    if (_shared.state === 'releasing' && _shared.distResisted > _el.distThreshold) {
      _shared.state = 'refreshing';
      _el.ptrElement.style[_el.cssProp] = (_el.distReload) + "px";

      _el.ptrElement.classList.add(((_el.classPrefix) + "refresh"));

      _shared.timeout = setTimeout(function () {
        var retval = _el.onRefresh(function () { return _ptr.onReset(_el); });

        if (retval && typeof retval.then === 'function') {
          retval.then(function () { return _ptr.onReset(_el); });
        }

        if (!retval && !_el.onRefresh.length) {
          _ptr.onReset(_el);
        }
      }, _el.refreshTimeout);
    } else {
      if (_shared.state === 'refreshing') {
        return;
      }

      _el.ptrElement.style[_el.cssProp] = '0px';
      _shared.state = 'pending';
    }

    _ptr.update(_el);

    _el.ptrElement.classList.remove(((_el.classPrefix) + "release"));

    _el.ptrElement.classList.remove(((_el.classPrefix) + "pull"));

    _shared.pullStartY = _shared.pullMoveY = null;
    _shared.dist = _shared.distResisted = 0;
  }

  function _onScroll() {
    if (_el) {
      _el.mainElement.classList.toggle(((_el.classPrefix) + "top"), _el.shouldPullToRefresh());
    }
  }

  var _passiveSettings = _shared.supportsPassive ? {
    passive: _shared.passive || false
  } : undefined;

  if (_shared.pointerEventsEnabled && _shared.supportsPointerEvents) {
    window.addEventListener('pointerup', _onTouchEnd);
    window.addEventListener('pointerdown', _onTouchStart);
    window.addEventListener('pointermove', _onTouchMove, _passiveSettings);
  } else {
    window.addEventListener('touchend', _onTouchEnd);
    window.addEventListener('touchstart', _onTouchStart);
    window.addEventListener('touchmove', _onTouchMove, _passiveSettings);
  }

  window.addEventListener('scroll', _onScroll);
  return {
    onTouchEnd: _onTouchEnd,
    onTouchStart: _onTouchStart,
    onTouchMove: _onTouchMove,
    onScroll: _onScroll,

    destroy: function destroy() {
      if (_shared.pointerEventsEnabled && _shared.supportsPointerEvents) {
        window.removeEventListener('pointerdown', _onTouchStart);
        window.removeEventListener('pointerup', _onTouchEnd);
        window.removeEventListener('pointermove', _onTouchMove, _passiveSettings);
      } else {
        window.removeEventListener('touchstart', _onTouchStart);
        window.removeEventListener('touchend', _onTouchEnd);
        window.removeEventListener('touchmove', _onTouchMove, _passiveSettings);
      }

      window.removeEventListener('scroll', _onScroll);
    }

  };
});

var _ptrMarkup = "\n<div class=\"__PREFIX__box\">\n  <div class=\"__PREFIX__content\">\n    <div class=\"__PREFIX__icon\"></div>\n    <div class=\"__PREFIX__text\"></div>\n  </div>\n</div>\n";

var _ptrStyles = "\n.__PREFIX__ptr {\n  box-shadow: inset 0 -3px 5px rgba(0, 0, 0, 0.12);\n  pointer-events: none;\n  font-size: 0.85em;\n  font-weight: bold;\n  top: 0;\n  height: 0;\n  transition: height 0.3s, min-height 0.3s;\n  text-align: center;\n  width: 100%;\n  overflow: hidden;\n  display: flex;\n  align-items: flex-end;\n  align-content: stretch;\n}\n\n.__PREFIX__box {\n  padding: 10px;\n  flex-basis: 100%;\n}\n\n.__PREFIX__pull {\n  transition: none;\n}\n\n.__PREFIX__text {\n  margin-top: .33em;\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.__PREFIX__icon {\n  color: rgba(0, 0, 0, 0.3);\n  transition: transform .3s;\n}\n\n/*\nWhen at the top of the page, disable vertical overscroll so passive touch\nlisteners can take over.\n*/\n.__PREFIX__top {\n  touch-action: pan-x pan-down pinch-zoom;\n}\n\n.__PREFIX__release .__PREFIX__icon {\n  transform: rotate(180deg);\n}\n";

var _defaults = {
  distThreshold: 60,
  distMax: 80,
  distReload: 50,
  distIgnore: 0,
  mainElement: 'body',
  triggerElement: 'body',
  ptrElement: '.ptr',
  classPrefix: 'ptr--',
  cssProp: 'min-height',
  iconArrow: '&#8675;',
  iconRefreshing: '&hellip;',
  instructionsPullToRefresh: 'Pull down to refresh',
  instructionsReleaseToRefresh: 'Release to refresh',
  instructionsRefreshing: 'Refreshing',
  refreshTimeout: 500,
  getMarkup: function () { return _ptrMarkup; },
  getStyles: function () { return _ptrStyles; },
  onInit: function () {},
  onRefresh: function () { return location.reload(); },
  resistanceFunction: function (t) { return Math.min(1, t / 2.5); },
  shouldPullToRefresh: function () { return !window.scrollY; }
};

var _methods = ['mainElement', 'ptrElement', 'triggerElement'];
var _setupHandler = (function (options) {
  var _handler = {}; // merge options with defaults

  Object.keys(_defaults).forEach(function (key) {
    _handler[key] = options[key] || _defaults[key];
  }); // normalize timeout value, even if it is zero

  _handler.refreshTimeout = typeof options.refreshTimeout === 'number' ? options.refreshTimeout : _defaults.refreshTimeout; // normalize elements

  _methods.forEach(function (method) {
    if (typeof _handler[method] === 'string') {
      _handler[method] = document.querySelector(_handler[method]);
    }
  }); // attach events lazily


  if (!_shared.events) {
    _shared.events = _setupEvents();
  }

  _handler.contains = function (target) {
    return _handler.triggerElement.contains(target);
  };

  _handler.destroy = function () {
    // stop pending any pending callbacks
    clearTimeout(_shared.timeout); // remove handler from shared state

    var offset = _shared.handlers.indexOf(_handler);

    _shared.handlers.splice(offset, 1);
  };

  return _handler;
});

var index = {
  setPassiveMode: function setPassiveMode(isPassive) {
    _shared.passive = isPassive;
  },

  setPointerEventsMode: function setPointerEventsMode(isEnabled) {
    _shared.pointerEventsEnabled = isEnabled;
  },

  destroyAll: function destroyAll() {
    if (_shared.events) {
      _shared.events.destroy();

      _shared.events = null;
    }

    _shared.handlers.forEach(function (h) {
      h.destroy();
    });
  },

  init: function init(options) {
    if ( options === void 0 ) options = {};

    var handler = _setupHandler(options);

    _shared.handlers.push(handler);

    return handler;
  },

  // export utils for testing
  _: {
    setupHandler: _setupHandler,
    setupEvents: _setupEvents,
    setupDOM: _ptr.setupDOM,
    onReset: _ptr.onReset,
    update: _ptr.update
  }
};

module.exports = index;
})();
 
Khả năng cao do máy thật của bạn từng cài phần mềm này và đã hết hạn, bị đánh dấu một khóa registry là đã hết hạn, nhìn chung cái Sandbox luôn lấy Registry ở thời điểm hiện tại ra để sử dụng chứ không phải là tạo mới từ đầu, mục đích là để ứng dụng trong Sandbox tương thích với cách dịch vụ của Windows tốt hơn (vì phần mềm cũng đối chiếu vào Registry của Windows để biết Windows có khả năng đến mức nào như kiểm tra xem Windows có Visual C++ Runtime, .NET Runtime hay không, khác với máy ảo thì những thứ trên phải tự cài để có khóa registry cho phần mềm kiểm tra). Có thể thử một trong các cách sau:
  • Tự xóa Registry của phần mềm đó ra khỏi máy bằng cách dùng snapshot của cái máy ảo mà bạn đang dùng để trial reset, cài phần mềm SysTracer vào rồi mở lên scan và không tắt đi, cài phần mềm kế toán kia vào, rồi lại dùng SysTracer scan tiếp, so sánh giữa hai bản ghi thứ nhất và thứ hai để biết được phần mềm kế toán dùng khóa registry/file gì để lưu hạn sử dụng rồi xóa trong máy thật đi hoặc có thể xóa trong Sandbox bằng cách tạo file reg xóa hàng loạt.
  • Nâng cao chế độ cách ly của Sandboxie xem có cách ly được registry máy thật với Sandbox không (không nên làm vì giảm tính tương thích khi chạy ứng dụng trong Sandbox)
  • Cấm phần mềm trên truy cập registry (có thể khiến crash) https://github.com/sandboxie-plus/Sandboxie/issues/717
Soft này mỗi lần cài lại nhập email vào họ sẽ gửi key trial dùng thử. Mà em cài lại win trên máy, cài lại vẫn bị gửi key cũ (đã hết hạn). Vậy key họ generate theo cách nào thím nhỉ?
 
Soft này mỗi lần cài lại nhập email vào họ sẽ gửi key trial dùng thử. Mà em cài lại win trên máy, cài lại vẫn bị gửi key cũ (đã hết hạn). Vậy key họ generate theo cách nào thím nhỉ?

Tùy cơ chế, đầu tiên mình cần biết họ có bắt điền email không, nếu có thì suy ra đơn giản là họ tạo key dựa trên email.
Còn không thì không có cách nào khác để tạo key mà không chặt nhầm người dùng cả ngoài hardware ID, ngoài ra thời nay nếu thích cứ lấy tài khoản Microsoft để kiểm tra key cũng được, vì giờ nhiều người bị bắt đăng nhập dùng Windows 10 qua email của Microsoft.

Tham khảo: https://stackoverflow.com/questions/24022130/generate-activation-key-from-hardware-id

fingerPrint = GetHash("CPU >> " + cpuId() + "\nBIOS >> " +
biosId() + "\nBASE >> " + baseId()
//+"\nDISK >> "+ diskId() + "\nVIDEO >> " +
videoId() +"\nMAC >> "+ macId()

Đó chính là code người ta dùng để lấy hardware ID, nếu bạn có cách đổi hardware ID thì có thể qua, nhưng mà khả năng hỏng Win nếu không chọn mặt gửi vàng.

https://github.com/topics/hwid-changer
 
Back
Top