Không có gì hết.
`;
let tableBody = songInfos
diff --git a/scripts/savevideo_me.js b/scripts/savevideo_me.js
index 0d8c0f70..bfbedbd6 100644
--- a/scripts/savevideo_me.js
+++ b/scripts/savevideo_me.js
@@ -14,12 +14,7 @@ export default {
en: "Download videos from Dailymotion, Facebook, Vimeo, Twitter, Instagram / Reels, TikTok, Rumble.com, Streamable.com, Aol Video, Bilibili.com (哔哩哔哩), Bilibili.tv, Coub, DouYin (抖音), Flickr Videos, Focus.de, GMX.net / WEB.DE, ItemFix, Magisto, Reddit, Sapo.pt, T.me (Telegram), Tiscali.it Video, Tudou, Veoh, Vidmax.com, Vine (archive), WorldStarHipHop, Youku",
vi: "Tải videos từ Dailymotion, Facebook, Vimeo, Twitter, Instagram / Reels, TikTok, Rumble.com, Streamable.com, Aol Video, Bilibili.com (哔哩哔哩), Bilibili.tv, Coub, DouYin (抖音), Flickr Videos, Focus.de, GMX.net / WEB.DE, ItemFix, Magisto, Reddit, Sapo.pt, T.me (Telegram), Tiscali.it Video, Tudou, Veoh, Vidmax.com, Vine (archive), WorldStarHipHop, Youku",
},
- blackList: [],
- whiteList: [],
-
- onClickExtension: async function () {
- // https://savevideo.me/en/
-
+
let { closeLoading } = showLoading("Đang get link video...");
try {
let tab = await getCurrentTab();
diff --git a/scripts/scrollByDrag.js b/scripts/scrollByDrag.js
index 54ceeb8b..094ea374 100644
--- a/scripts/scrollByDrag.js
+++ b/scripts/scrollByDrag.js
@@ -8,10 +8,7 @@ export default {
en: "Use this will turn the cursor into a scroller and use it again will return it back to normal.",
vi: "Bấm vào sẽ biến con trỏ thành con lăn và bấm lại nó sẽ đưa con trỏ trở lại bình thường",
},
- blackList: [],
- whiteList: [],
-
- onClick: async function () {
+ onClick: async function () {
let X, Y;
if (document.onmousedown && document.onmouseup && document.onmousemove) {
diff --git a/scripts/showHiddenFields.js b/scripts/showHiddenFields.js
index f7c14237..698c4232 100644
--- a/scripts/showHiddenFields.js
+++ b/scripts/showHiddenFields.js
@@ -8,12 +8,7 @@ export default {
en: "Reveals hidden fields on a webpage. Find things like tokens, etc",
vi: "Web thường ẩn mốt số thành phần như token, id, form, ...",
},
- blackList: [],
- whiteList: [],
-
- onClick: function () {
- // source code from: https://bookmarklet.vercel.app/
-
+
var i,
f,
j,
diff --git a/scripts/showTheAudios.js b/scripts/showTheAudios.js
index 7fc94909..80e3c807 100644
--- a/scripts/showTheAudios.js
+++ b/scripts/showTheAudios.js
@@ -8,11 +8,7 @@ export default {
en: "Will display all audio in website, easy to download/get link.",
vi: "Hiển thị tất cả tag audio/âm thanh trong trang web, giúp dễ dàng tải xuống/lấy link.",
},
- blackList: [],
- whiteList: [],
-
- onClick: function () {
- let audios = Array.from(document.querySelectorAll("audio") || []);
+ let audios = Array.from(document.querySelectorAll("audio") || []);
audios = audios?.filter((_) => !!_.src);
if (!audios?.length) {
diff --git a/scripts/showTheImages.js b/scripts/showTheImages.js
index 4009c354..c974324a 100644
--- a/scripts/showTheImages.js
+++ b/scripts/showTheImages.js
@@ -8,11 +8,7 @@ export default {
en: "Will even show hidden images as well as pulling them out of a slider/rotator.",
vi: "Sẽ thấy đươc ảnh bị ẩn, dễ dàng chuột phải để tải về",
},
- blackList: [],
- whiteList: [],
-
- onClick: function () {
- // source code from https://bookmarklet.vercel.app/
+ // source code from https://bookmarklet.vercel.app/
var iGrabSH = "";
(function () {
diff --git a/scripts/showTheVideos.js b/scripts/showTheVideos.js
index 86deee7a..bb886e3e 100644
--- a/scripts/showTheVideos.js
+++ b/scripts/showTheVideos.js
@@ -9,10 +9,7 @@ export default {
vi: "Tải video dễ dàng hơn",
},
- blackList: [],
- whiteList: [],
-
- onClickExtension: function () {
+ onClickExtension: function () {
let videos = Array.from(document.querySelectorAll("video"));
if (!videos.length) {
diff --git a/scripts/studocu_bypassPreview.js b/scripts/studocu_bypassPreview.js
index 6fa527bb..1471f61c 100644
--- a/scripts/studocu_bypassPreview.js
+++ b/scripts/studocu_bypassPreview.js
@@ -8,10 +8,7 @@ export default {
en: "View VIP document on Studocu.com, bypass preview popup / reveal blurred content.",
vi: "Xem tài liệu VIP trên Studocu.com, loại bỏ popup chặn xem trước, loại bỏ hiệu ứng làm mờ.",
},
- blackList: [],
- whiteList: ["https://www.studocu.com/*/document/*"],
-
- onDocumentIdle: () => {
+ onDocumentIdle: () => {
let style = document.createElement("style");
style.textContent = `
.page-content {
diff --git a/scripts/studyphim_unlimited.js b/scripts/studyphim_unlimited.js
index 8b31ec67..873f29b7 100644
--- a/scripts/studyphim_unlimited.js
+++ b/scripts/studyphim_unlimited.js
@@ -8,10 +8,7 @@ export default {
en: "Watch movies on Studyphim for free without login",
vi: "Xem phim miễn phí trên Studyphim không cần đăng nhập",
},
- blackList: [],
- whiteList: ["https://www.studyphim.vn/*"],
-
- onDocumentStart: () => {
+ onDocumentStart: () => {
// Source: https://github.com/gys-dev/Unlimited-Stdphim
deleteElements(
diff --git a/scripts/tiktok_downloadUserVideos.js b/scripts/tiktok_downloadUserVideos.js
index 94c85470..db60a8a6 100644
--- a/scripts/tiktok_downloadUserVideos.js
+++ b/scripts/tiktok_downloadUserVideos.js
@@ -17,10 +17,7 @@ export default {
en: "Download all videos in tiktok user profile.",
vi: "Tải tất cả video trong trang cá nhân của người dùng tiktok.",
},
- blackList: [],
- whiteList: [],
-
- onClickExtension: async function () {
+ onClickExtension: async function () {
// Source code: https://github.com/karim0sec/tiktokdl
let { closeLoading, setLoadingText } = showLoading();
diff --git a/scripts/viewAllLinks.js b/scripts/viewAllLinks.js
index 18c85723..f7cf6570 100644
--- a/scripts/viewAllLinks.js
+++ b/scripts/viewAllLinks.js
@@ -8,12 +8,7 @@ export default {
en: "Show all links and anchor text of current page.",
vi: "Liệt kê tất cả đường link có trong website",
},
- blackList: [],
- whiteList: [],
-
- onClick: function () {
- function getParameterByName(e, t) {
- e = e.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ e = e.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var n = new RegExp("[\\?&]" + e + "=([^]*)"),
r = n.exec(
t == true ? location.hash.replace("#", "?") : location.search
diff --git a/scripts/viewWebMetaInfo.js b/scripts/viewWebMetaInfo.js
index 799e471f..bc65d602 100644
--- a/scripts/viewWebMetaInfo.js
+++ b/scripts/viewWebMetaInfo.js
@@ -8,9 +8,7 @@ export default {
en: "Instantly shows meta information about the current site in an on-page iFrame.",
vi: "Xem thông tin meta của website trực tiếp trong trang web",
},
- blackList: [],
- whiteList: [],
-
+
onClick: function () {
// source code from: https://bookmarklet.vercel.app/
diff --git a/scripts/whatApp_storySaver.js b/scripts/whatApp_storySaver.js
index 16defd30..7b45ef98 100644
--- a/scripts/whatApp_storySaver.js
+++ b/scripts/whatApp_storySaver.js
@@ -8,8 +8,7 @@ export default {
en: "Download whatapp story that you are watching",
vi: "Tải whatapp story bạn đang xem",
},
- whiteList: [],
-
+
onClickExtension: function () {
// Source code extracted from: https://chrome.google.com/webstore/detail/story-saver/mafcolokinicfdmlidhaebadidhdehpk
diff --git a/scripts/whois.js b/scripts/whois.js
index 550d76eb..64baa815 100644
--- a/scripts/whois.js
+++ b/scripts/whois.js
@@ -8,10 +8,4 @@ export default {
en: "Want to find out who owns a domain? Click on this!",
vi: "Muốn biết ai đang giữ domain này? Click ngay!",
},
- blackList: [],
- whiteList: [],
-
- onClick: function () {
- window.open("http://who.is/whois/" + document.domain);
- },
-};
+
\ No newline at end of file
diff --git a/scripts/youtube_nonstop.js b/scripts/youtube_nonstop.js
index 64ba80f8..bf550260 100644
--- a/scripts/youtube_nonstop.js
+++ b/scripts/youtube_nonstop.js
@@ -8,8 +8,7 @@ export default {
en: 'Kiss the annoying "Video paused. Continue watching?" confirmation goodbye!',
vi: "Phát youtube không còn bị làm phiền bởi popup 'Video đã tạm dừng. Bạn có muốn xem tiếp?' của youtube.",
},
- blackList: [],
- whiteList: ["*://music.youtube.com", "*://www.youtube.com"],
+ whiteList: ["*://music.youtube.com/*", "*://www.youtube.com/*"],
onClick: function () {
// source code from: https://chrome.google.com/webstore/detail/youtube-nonstop/nlkaejimjacpillmajjnopmpbkbnocid
diff --git a/scripts/youtube_popupPlayer.js b/scripts/youtube_popupPlayer.js
index a8095705..6230f4bd 100644
--- a/scripts/youtube_popupPlayer.js
+++ b/scripts/youtube_popupPlayer.js
@@ -8,8 +8,7 @@ export default {
en: "Open current youtube video in new popup player",
vi: "Xem video youtube hiện tại trong cửa sổ popup mới",
},
- blackList: [],
- whiteList: ["*://*.youtube.com/*"],
+ whiteList: ["*://*.youtube.com/*"],
onClick: function () {
const urlObject = new URL(location.href);
diff --git a/scripts/youtube_toggleLight.js b/scripts/youtube_toggleLight.js
index 37deefe8..d4b1307e 100644
--- a/scripts/youtube_toggleLight.js
+++ b/scripts/youtube_toggleLight.js
@@ -8,8 +8,7 @@ export default {
en: "Toggle light on/off to focus to youtube video",
vi: "Tắt/Mở đèn để tập trung xem video youtube",
},
- blackList: [],
- whiteList: ["*://www.youtube.com/*"],
+ whiteList: ["*://www.youtube.com/*"],
onClick: function () {
["#below", "#secondary", "#masthead-container"].forEach((_) => {
diff --git a/scripts/youtube_viewDislikes.js b/scripts/youtube_viewDislikes.js
index 43f4bc2c..d00f26da 100644
--- a/scripts/youtube_viewDislikes.js
+++ b/scripts/youtube_viewDislikes.js
@@ -8,8 +8,7 @@ export default {
en: "Know how many dislike does youtube video have",
vi: "Biết số lượt dislikes (không thích) video youtube",
},
- blackList: [],
- whiteList: ["*://*.youtube.com/*"],
+ whiteList: ["*://*.youtube.com/*"],
onClick: async function () {
// Source code extracted from https://chrome.google.com/webstore/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi
diff --git a/scripts/zingmp3_oldLayout.js b/scripts/zingmp3_oldLayout.js
index 067bda40..0220c909 100644
--- a/scripts/zingmp3_oldLayout.js
+++ b/scripts/zingmp3_oldLayout.js
@@ -8,8 +8,7 @@ export default {
en: "Toggle UI zingmp3 old/new",
vi: "Bật/tắt giao diện zingmp3 mới/cũ",
},
- blackList: [],
- whiteList: ["https://zingmp3.vn/*", "https://mp3.zing.vn/*"],
+ whiteList: ["https://zingmp3.vn/*", "https://mp3.zing.vn/*"],
onDocumentStart : () => {
// prevent auto redirect from https://mp3.zing.vn/ to https://zingmp3.vn/
From 64ea3d30451e8624522d0aec2b4c6a4f668578c2 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Fri, 16 Dec 2022 20:01:18 +0700
Subject: [PATCH 095/164] fix
---
scripts/doutube_getAllVideoInUserProfile.js | 1 -
scripts/insta_getAllImagesInNewFeed.js | 10 +++++++++-
scripts/instantgram.js | 4 +++-
scripts/nhaccuatui_downloader.js | 4 +++-
scripts/savevideo_me.js | 3 +++
scripts/showHiddenFields.js | 3 +++
scripts/showTheAudios.js | 4 +++-
scripts/showTheImages.js | 4 +++-
scripts/viewAllLinks.js | 5 ++++-
scripts/whois.js | 6 +++++-
10 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/scripts/doutube_getAllVideoInUserProfile.js b/scripts/doutube_getAllVideoInUserProfile.js
index f685304c..ee41f13b 100644
--- a/scripts/doutube_getAllVideoInUserProfile.js
+++ b/scripts/doutube_getAllVideoInUserProfile.js
@@ -68,7 +68,6 @@ export default {
closeFullVideo();
await sleep(500);
}
-
console.log(allUrls);
alert("Tìm được " + allUrls.length + " videos. Bấm ok để tải xuống link.");
download(location.pathname + ".txt", allUrls.join("\n"));
diff --git a/scripts/insta_getAllImagesInNewFeed.js b/scripts/insta_getAllImagesInNewFeed.js
index 67f4d704..5667a794 100644
--- a/scripts/insta_getAllImagesInNewFeed.js
+++ b/scripts/insta_getAllImagesInNewFeed.js
@@ -7,7 +7,15 @@ export default {
en: "Get all images in newfeed instagram",
vi: "Tải về tất cả ảnh đang có trên newfeed instagram",
},
-
+ blackList: [],
+ whiteList: ["https://*.instagram.com/*"],
+
+ onClick: async function () {
+ const getAllImgTag = () =>
+ Array.from(document.querySelectorAll("img[sizes*=px]")) || [];
+ const sleep = (milliseconds) =>
+ new Promise((resolve) => setTimeout(resolve, milliseconds));
+
// https://greasyfork.org/en/scripts/14755-instagram-reloaded
function getBestImage(imgEl) {
try {
diff --git a/scripts/instantgram.js b/scripts/instantgram.js
index dcd360d6..75b0943f 100644
--- a/scripts/instantgram.js
+++ b/scripts/instantgram.js
@@ -8,7 +8,9 @@ export default {
en: "Download full-size instagram image/story in 1 click",
vi: "Tải ảnh/story instagram nhanh chóng bằng 1 click",
},
- // Source code from: https://theus.github.io/instantgram/
+
+ onClick: function () {
+ // Source code from: https://theus.github.io/instantgram/
// Minify source code: https://www.toptal.com/developers/javascript-minifier
// prettier-ignore
diff --git a/scripts/nhaccuatui_downloader.js b/scripts/nhaccuatui_downloader.js
index a359bbf5..57907c58 100644
--- a/scripts/nhaccuatui_downloader.js
+++ b/scripts/nhaccuatui_downloader.js
@@ -8,7 +8,9 @@ export default {
en: "Download the song that be playing in Nhaccuatui",
vi: "Tải bài nhạc / lời bài hát đang nghe trên Nhaccuatui",
},
- const renderSongInfo = (songInfos, tableId = "") => {
+
+ onClick: function () {
+ const renderSongInfo = (songInfos, tableId = "") => {
if (!songInfos?.length) return `Không có gì hết.
`;
let tableBody = songInfos
diff --git a/scripts/savevideo_me.js b/scripts/savevideo_me.js
index bfbedbd6..adf6cbd8 100644
--- a/scripts/savevideo_me.js
+++ b/scripts/savevideo_me.js
@@ -15,6 +15,9 @@ export default {
vi: "Tải videos từ Dailymotion, Facebook, Vimeo, Twitter, Instagram / Reels, TikTok, Rumble.com, Streamable.com, Aol Video, Bilibili.com (哔哩哔哩), Bilibili.tv, Coub, DouYin (抖音), Flickr Videos, Focus.de, GMX.net / WEB.DE, ItemFix, Magisto, Reddit, Sapo.pt, T.me (Telegram), Tiscali.it Video, Tudou, Veoh, Vidmax.com, Vine (archive), WorldStarHipHop, Youku",
},
+ onClickExtension: async function () {
+ // https://savevideo.me/en/
+
let { closeLoading } = showLoading("Đang get link video...");
try {
let tab = await getCurrentTab();
diff --git a/scripts/showHiddenFields.js b/scripts/showHiddenFields.js
index 698c4232..41c6e6e8 100644
--- a/scripts/showHiddenFields.js
+++ b/scripts/showHiddenFields.js
@@ -9,6 +9,9 @@ export default {
vi: "Web thường ẩn mốt số thành phần như token, id, form, ...",
},
+ onClick: function () {
+ // source code from: https://bookmarklet.vercel.app/
+
var i,
f,
j,
diff --git a/scripts/showTheAudios.js b/scripts/showTheAudios.js
index 80e3c807..523b0290 100644
--- a/scripts/showTheAudios.js
+++ b/scripts/showTheAudios.js
@@ -8,7 +8,9 @@ export default {
en: "Will display all audio in website, easy to download/get link.",
vi: "Hiển thị tất cả tag audio/âm thanh trong trang web, giúp dễ dàng tải xuống/lấy link.",
},
- let audios = Array.from(document.querySelectorAll("audio") || []);
+
+ onClick: function () {
+ let audios = Array.from(document.querySelectorAll("audio") || []);
audios = audios?.filter((_) => !!_.src);
if (!audios?.length) {
diff --git a/scripts/showTheImages.js b/scripts/showTheImages.js
index c974324a..e6095f45 100644
--- a/scripts/showTheImages.js
+++ b/scripts/showTheImages.js
@@ -8,7 +8,9 @@ export default {
en: "Will even show hidden images as well as pulling them out of a slider/rotator.",
vi: "Sẽ thấy đươc ảnh bị ẩn, dễ dàng chuột phải để tải về",
},
- // source code from https://bookmarklet.vercel.app/
+
+ onClick: function () {
+ // source code from https://bookmarklet.vercel.app/
var iGrabSH = "";
(function () {
diff --git a/scripts/viewAllLinks.js b/scripts/viewAllLinks.js
index f7cf6570..a21817c4 100644
--- a/scripts/viewAllLinks.js
+++ b/scripts/viewAllLinks.js
@@ -8,7 +8,10 @@ export default {
en: "Show all links and anchor text of current page.",
vi: "Liệt kê tất cả đường link có trong website",
},
- e = e.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+
+ onClick: function () {
+ function getParameterByName(e, t) {
+ e = e.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var n = new RegExp("[\\?&]" + e + "=([^]*)"),
r = n.exec(
t == true ? location.hash.replace("#", "?") : location.search
diff --git a/scripts/whois.js b/scripts/whois.js
index 64baa815..0ed81842 100644
--- a/scripts/whois.js
+++ b/scripts/whois.js
@@ -8,4 +8,8 @@ export default {
en: "Want to find out who owns a domain? Click on this!",
vi: "Muốn biết ai đang giữ domain này? Click ngay!",
},
-
\ No newline at end of file
+
+ onClick: function () {
+ window.open("http://who.is/whois/" + document.domain);
+ },
+};
From 8676ab1ca981a99bc3a7701fad06e3a560f42fa9 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 08:13:34 +0700
Subject: [PATCH 096/164] .
---
pages/viewScriptSource/main.js | 8 +-
scripts/content-scripts/document_start.js | 6 +
.../scripts/ufs_global_webpage_context.js | 72 ++++++++
scripts/fb_toggleLight.js | 8 +-
scripts/fb_toggleNewFeed.js | 39 +++--
scripts/helpers/utils.js | 20 ++-
scripts/shopee_totalSpendMoney.js | 18 +-
scripts/showTheVideos.js | 2 +-
scripts/studyphim_unlimited.js | 45 +----
scripts/tiki_totalSpendMoney.js | 165 ++++++++++++------
10 files changed, 250 insertions(+), 133 deletions(-)
create mode 100644 scripts/content-scripts/scripts/ufs_global_webpage_context.js
diff --git a/pages/viewScriptSource/main.js b/pages/viewScriptSource/main.js
index 63ba9469..79735a27 100644
--- a/pages/viewScriptSource/main.js
+++ b/pages/viewScriptSource/main.js
@@ -4,9 +4,13 @@ window.onload = async () => {
let source = await getScriptSource(scriptId);
if (source) {
+ let fileName = scriptId + ".js";
+ let comment = "// " + fileName;
+
document.querySelector("#copy-btn").onclick = () => copy(source);
- document.querySelector("code").innerHTML = escapeHTML(source);
- document.title = scriptId + ".js";
+ document.querySelector("code").innerHTML =
+ comment + "\n\n" + escapeHTML(source);
+ document.title = fileName;
hljs.highlightAll();
hljs.initLineNumbersOnLoad();
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index c2de730e..97fe1e51 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -10,6 +10,12 @@
s.remove();
}
+ injectScript(
+ chrome.runtime.getURL(
+ "/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
+ )
+ );
+
let key = "activeScripts";
let ids = (await chrome.storage.sync.get([key]))?.[key];
let search = new URLSearchParams({
diff --git a/scripts/content-scripts/scripts/ufs_global_webpage_context.js b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
new file mode 100644
index 00000000..f9d7c4cd
--- /dev/null
+++ b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
@@ -0,0 +1,72 @@
+// Tất cả các hàm/biến toàn cục được nhúng vào trang web at document_start
+// Có thể truy cập từ các script chạy trong webpage context (có hàm onClick)
+
+const UsefulScriptGlobalWebpageContext = {
+ deleteElements(selector, willReRun) {
+ UsefulScriptGlobalWebpageContext.onElementsVisible(
+ selector,
+ (nodes) => {
+ [].forEach.call(nodes, function (node) {
+ node.remove();
+ console.log("Useful-scripts: element removed ", node);
+ });
+ },
+ willReRun
+ );
+ },
+
+ waitForElements(selector) {
+ return new Promise((resolve, reject) => {
+ UsefulScriptGlobalWebpageContext.onElementsVisible(
+ selector,
+ resolve,
+ false
+ );
+ });
+ },
+
+ // Idea from https://github.com/gys-dev/Unlimited-Stdphim
+ // https://stackoverflow.com/a/61511955/11898496
+ onElementsVisible: async (selector, callback, willReRun) => {
+ let nodes = document.querySelectorAll(selector);
+ if (nodes?.length) {
+ callback(nodes);
+ if (!willReRun) return;
+ }
+
+ const observer = new MutationObserver((mutations) => {
+ mutations.forEach((mutation) => {
+ if (!mutation.addedNodes) return;
+
+ for (let node of mutation.addedNodes) {
+ if (node.nodeType != 1) continue; // only process Node.ELEMENT_NODE
+
+ let n = node.matches(selector)
+ ? [node]
+ : Array.from(node.querySelectorAll(selector));
+
+ if (n?.length) {
+ callback(n);
+ if (!willReRun) observer.disconnect();
+ }
+ }
+ });
+ });
+
+ observer.observe(document, {
+ childList: true,
+ subtree: true,
+ attributes: false,
+ characterData: false,
+ });
+
+ // return disconnect function
+ return () => observer.disconnect();
+ },
+};
+window.UsefulScriptGlobalWebpageContext = UsefulScriptGlobalWebpageContext;
+
+// ================================= Polyfill =================================
+// Chrome pre-34
+if (!Element.prototype.matches)
+ Element.prototype.matches = Element.prototype.webkitMatchesSelector;
diff --git a/scripts/fb_toggleLight.js b/scripts/fb_toggleLight.js
index 99a71923..63aa5f58 100644
--- a/scripts/fb_toggleLight.js
+++ b/scripts/fb_toggleLight.js
@@ -10,7 +10,11 @@ export default {
},
whiteList: ["https://www.facebook.com/*"],
- onDocumentIdle: () => {
+ onDocumentStart: () => {
+
+ },
+
+ onDocumentEnd: () => {
[
document.querySelectorAll('[role="navigation"]')?.[2],
document.querySelectorAll('[role="complementary"]')?.[0],
@@ -21,7 +25,7 @@ export default {
});
},
- onClickContentScript: function () {
+ onClick: function () {
[
document.querySelectorAll('[role="navigation"]')?.[2],
document.querySelectorAll('[role="complementary"]')?.[0],
diff --git a/scripts/fb_toggleNewFeed.js b/scripts/fb_toggleNewFeed.js
index c6066856..d24a0e62 100644
--- a/scripts/fb_toggleNewFeed.js
+++ b/scripts/fb_toggleNewFeed.js
@@ -10,25 +10,34 @@ export default {
},
whiteList: ["https://www.facebook.com/*"],
- onDocumentIdle: function () {
- [
- ...Array.from(document.querySelectorAll("[role='feed'], [role='main']")),
- document.querySelector("#watch_feed"),
- document.querySelector("#ssrb_stories_start")?.parentElement,
- document.querySelector("#ssrb_feed_start")?.parentElement,
- ].forEach((el) => {
- if (el) {
- el.style.display = "none";
- } else console.log("ERROR: Cannot find element");
- });
+ onDocumentStart: function () {
+ UsefulScriptGlobalWebpageContext.onElementsVisible(
+ "[role='feed'], [role='main']",
+ (nodes) =>
+ Array.from(nodes).forEach((node) => (node.style.display = "none")),
+ true
+ );
},
- onClickContentScript: async function () {
+ // onDocumentEnd: function () {
+ // [
+ // ...Array.from(document.querySelectorAll("[role='feed'], [role='main']")),
+ // document.querySelector("#watch_feed"),
+ // document.querySelector("#ssrb_stories_start")?.parentElement,
+ // document.querySelector("#ssrb_feed_start")?.parentElement,
+ // ].forEach((el) => {
+ // if (el) {
+ // el.style.display = "none";
+ // } else console.log("ERROR: Cannot find element");
+ // });
+ // },
+
+ onClick: async function () {
[
...Array.from(document.querySelectorAll("[role='feed'], [role='main']")),
- document.querySelector("#watch_feed"),
- document.querySelector("#ssrb_stories_start")?.parentElement,
- document.querySelector("#ssrb_feed_start")?.parentElement,
+ // document.querySelector("#watch_feed"),
+ // document.querySelector("#ssrb_stories_start")?.parentElement,
+ // document.querySelector("#ssrb_feed_start")?.parentElement,
].forEach((el) => {
if (el) {
el.style.display = el.style.display === "none" ? "" : "none";
diff --git a/scripts/helpers/utils.js b/scripts/helpers/utils.js
index 8437101d..bc188d2c 100644
--- a/scripts/helpers/utils.js
+++ b/scripts/helpers/utils.js
@@ -153,10 +153,10 @@ export const runScriptFileInCurrentTab = async (scriptFile, args) => {
export function checkBlackWhiteList(script, url) {
if (!url) return false;
- let w = script.whiteList,
- b = script.blackList,
- hasWhiteList = w?.length > 0,
- hasBlackList = b?.length > 0,
+ let w = script.whiteList || [],
+ b = script.blackList || [],
+ hasWhiteList = w.length > 0,
+ hasBlackList = b.length > 0,
inWhiteList = matchPatterns(url, w) ?? true,
inBlackList = matchPatterns(url, b) ?? false;
@@ -289,6 +289,18 @@ export const isEmptyFunction = (func) => {
// #region String Utils
+export function moneyFormat(number, fixed = 0) {
+ if (isNaN(number)) return 0;
+ number = number.toFixed(fixed);
+ let delimeter = ",";
+ number += "";
+ let rgx = /(\d+)(\d{3})/;
+ while (rgx.test(number)) {
+ number = number.replace(rgx, "$1" + delimeter + "$2");
+ }
+ return number;
+}
+
// https://stackoverflow.com/a/9310752
export function escapeRegExp(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
diff --git a/scripts/shopee_totalSpendMoney.js b/scripts/shopee_totalSpendMoney.js
index b1dc455b..c55490f7 100644
--- a/scripts/shopee_totalSpendMoney.js
+++ b/scripts/shopee_totalSpendMoney.js
@@ -1,4 +1,4 @@
-import { showLoading } from "./helpers/utils.js";
+import { moneyFormat, showLoading } from "./helpers/utils.js";
export default {
icon: "https://shopee.vn/favicon.ico",
@@ -20,7 +20,7 @@ export default {
// Image: https://cf.shopee.vn/file/ecd20c9d39e0c865d53e3f47e6e2e3a7
// FB POST: https://www.facebook.com/groups/j2team.community/permalink/1169967376668714/
- let OrderType = {
+ const OrderType = {
completed: 3,
canceled: 4,
ship: 7,
@@ -29,7 +29,7 @@ export default {
// refunded: 12,
};
- let OrderTypeName = {
+ const OrderTypeName = {
[OrderType.completed]: "Hoàn thành",
[OrderType.canceled]: "Đã hủy",
[OrderType.ship]: "Vận chuyển",
@@ -109,18 +109,6 @@ export default {
return shippingSpent;
}
- function moneyFormat(number, fixed = 0) {
- if (isNaN(number)) return 0;
- number = number.toFixed(fixed);
- let delimeter = ",";
- number += "";
- let rgx = /(\d+)(\d{3})/;
- while (rgx.test(number)) {
- number = number.replace(rgx, "$1" + delimeter + "$2");
- }
- return number;
- }
-
let { closeLoading, setLoadingText } = showLoading("Đang chuẩn bị...");
try {
let options = Object.entries(OrderTypeName);
diff --git a/scripts/showTheVideos.js b/scripts/showTheVideos.js
index bb886e3e..1dc68d95 100644
--- a/scripts/showTheVideos.js
+++ b/scripts/showTheVideos.js
@@ -9,7 +9,7 @@ export default {
vi: "Tải video dễ dàng hơn",
},
- onClickExtension: function () {
+ onClick: function () {
let videos = Array.from(document.querySelectorAll("video"));
if (!videos.length) {
diff --git a/scripts/studyphim_unlimited.js b/scripts/studyphim_unlimited.js
index 873f29b7..aca32156 100644
--- a/scripts/studyphim_unlimited.js
+++ b/scripts/studyphim_unlimited.js
@@ -8,46 +8,13 @@ export default {
en: "Watch movies on Studyphim for free without login",
vi: "Xem phim miễn phí trên Studyphim không cần đăng nhập",
},
- onDocumentStart: () => {
- // Source: https://github.com/gys-dev/Unlimited-Stdphim
+ whiteList: ["https://www.studyphim.vn/*"],
- deleteElements(
- ".overlay.playable.hide, .overlay.playable, #topchapter, #wrapper_header"
+ onDocumentStart: () => {
+ // Source: https://github.com/gys-dev/Unlimited-Stdphim
+ UsefulScriptGlobalWebpageContext.deleteElements(
+ ".overlay.playable.hide, .overlay.playable, #topchapter, #wrapper_header",
+ true
);
-
- function deleteElements(selector) {
- // in case the content script was injected after the page is partially loaded
- doDelete(document.querySelectorAll(selector));
-
- var mo = new MutationObserver(process);
- mo.observe(document, { subtree: true, childList: true });
- document.addEventListener("DOMContentLoaded", function () {
- mo.disconnect();
- });
-
- function process(mutations) {
- for (var i = 0; i < mutations.length; i++) {
- var nodes = mutations[i].addedNodes;
- for (var j = 0; j < nodes.length; j++) {
- var n = nodes[j];
- if (n.nodeType != 1)
- // only process Node.ELEMENT_NODE
- continue;
- doDelete(n.matches(selector) ? [n] : n.querySelectorAll(selector));
- }
- }
- }
- function doDelete(nodes) {
- [].forEach.call(nodes, function (node) {
- node.remove();
- console.log("Useful-scripts: studyphim - removed ", node);
- });
- }
- }
-
- // Chrome pre-34
- if (!Element.prototype.matches)
- Element.prototype.matches = Element.prototype.webkitMatchesSelector;
},
};
-
diff --git a/scripts/tiki_totalSpendMoney.js b/scripts/tiki_totalSpendMoney.js
index cba08a93..15571093 100644
--- a/scripts/tiki_totalSpendMoney.js
+++ b/scripts/tiki_totalSpendMoney.js
@@ -1,4 +1,4 @@
-import { showLoading } from "./helpers/utils.js";
+import { moneyFormat, showLoading } from "./helpers/utils.js";
export default {
icon: "https://tiki.vn/favicon.ico",
@@ -11,67 +11,122 @@ export default {
vi: "Xem bạn đã mua hết bao nhiêu tiền trên Tiki",
},
- onClick: async () => {
- // https://tiki.vn/api/v2/orders?page=0&limit=10
+ onClickExtension: async () => {
// https://www.facebook.com/groups/j2team.community/permalink/1169967376668714/
- var totalOrders = 0;
- var totalSpent = 0;
- var pulling = true;
- var page = 1;
-
- function getStatistics() {
- var orders = [];
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- orders = JSON.parse(this.responseText)["data"];
- pulling = orders.length >= 10;
- orders = orders.filter((order) => order["status"] == "hoan_thanh");
- totalOrders += orders.length;
- orders.forEach((order) => {
- let tpa = order["grand_total"];
- totalSpent += tpa;
- });
- page += 1;
- console.log("Đã lấy được: " + totalOrders + " đơn hàng");
- if (pulling) {
- console.log("Đang kéo thêm...");
- getStatistics();
- } else {
- console.log(
- "%cTổng đơn hàng đã giao: " + "%c" + moneyFormat(totalOrders),
- "font-size: 30px;",
- "font-size: 30px; color:red"
- );
- console.log(
- "%cTổng chi tiêu: " + "%c" + moneyFormat(totalSpent) + "đ",
- "font-size: 30px;",
- "font-size: 30px; color:red"
- );
- }
+ const OrderType = {
+ all: "",
+ awaiting_payment: "awaiting_payment",
+ processing: "processing",
+ shipping: "shipping",
+ completed: "completed",
+ canceled: "canceled",
+ };
+
+ const OrderTypeName = {
+ [OrderType.completed]: "Đã giao",
+ [OrderType.canceled]: "Đã hủy",
+ [OrderType.shipping]: "Đang vận chuyển",
+ [OrderType.processing]: "Đang xử lý",
+ [OrderType.awaiting_payment]: "Chờ thanh toán",
+ [OrderType.all]: "Tất cả",
+ };
+
+ // https://tiki.vn/api/v2/orders?page=0&limit=10&status=canceled
+ async function getStatistics(orderType) {
+ let pulling = true;
+ let page = 0;
+ let limit = 10;
+
+ let totalDiscount = 0;
+ let totalShip = 0;
+ let totalSpent = 0;
+ let totalItems = 0;
+ let totalOrders = 0;
+
+ while (pulling) {
+ setLoadingText("Đang tải trang thứ " + (page + 1) + "...");
+ let res = await fetch(
+ `https://tiki.vn/api/v2/orders?page=${page}&limit=${limit}${
+ orderType ? "&status=" + orderType : ""
+ }`
+ );
+ let json = await res.json();
+ if (json?.error) throw Error("Error: " + json.error);
+
+ let orders = json.data;
+ totalOrders += orders.length;
+ for (let i = 0; i < orders.length; i++) {
+ setLoadingText(
+ "Đang tải đơn hàng thứ " + (page * limit + i + 1) + "..."
+ );
+
+ let order = orders[i];
+ let detail = await getOrderDetail(order.id);
+
+ totalSpent += order.grand_total;
+ totalItems += detail.items.reduce((total, cur) => total + cur.qty, 0);
+ totalDiscount += detail.discount_amount;
+ totalShip += detail.shipping_amount;
}
+
+ pulling = orders.length >= limit;
+ page++;
+ }
+
+ return {
+ totalDiscount,
+ totalShip,
+ totalSpent,
+ totalItems,
+ totalOrders,
};
- xhttp.open(
- "GET",
- "https://tiki.vn/api/v2/me/orders?page=" + page + "&limit=10",
- true
- );
- xhttp.send();
}
- function moneyFormat(number, fixed = 0) {
- if (isNaN(number)) return 0;
- number = number.toFixed(fixed);
- let delimeter = ",";
- number += "";
- let rgx = /(\d+)(\d{3})/;
- while (rgx.test(number)) {
- number = number.replace(rgx, "$1" + delimeter + "$2");
- }
- return number;
+ async function getOrderDetail(orderId) {
+ let res = await fetch(
+ `https://tiki.vn/api/v2/me/orders/${orderId}?include=items`
+ );
+ return await res.json();
}
- getStatistics();
+ let { closeLoading, setLoadingText } = showLoading("Đang chuẩn bị...");
+ try {
+ let options = Object.entries(OrderTypeName);
+ let optionsTxt = options
+ .map(([key, value], index) => ` ${index}: ${value}`)
+ .join("\n");
+
+ let choice = prompt(
+ "Chọn loại đơn hàng muốn thống kê:\n" + optionsTxt,
+ 0
+ );
+
+ if (choice == null) return;
+ let orderType = options[Number(choice)][0];
+ let orderTypeName = OrderTypeName[orderType];
+
+ let { totalDiscount, totalShip, totalSpent, totalItems, totalOrders } =
+ await getStatistics(orderType);
+
+ let stats = {
+ "THỐNG KÊ Tiki: Đơn hàng ": orderTypeName,
+ "+ Tổng đơn hàng: ": totalOrders,
+ "+ Tổng sản phẩm: ": totalItems,
+ "+ Tổng chi tiêu: ": moneyFormat(totalSpent),
+ "+ Tổng giảm giá: ": moneyFormat(totalDiscount),
+ "+ Tổng tiền ship: ": moneyFormat(totalShip),
+ };
+ alert(
+ Object.entries(stats)
+ .map(([key, value]) => `${key} ${value}`)
+ .join("\n")
+ );
+ console.table(stats);
+ } catch (e) {
+ alert("ERROR: " + e);
+ } finally {
+ closeLoading();
+ }
},
};
From 7b7d2a8b0f56222c46e7529e585674d98dcab2ba Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 11:01:39 +0700
Subject: [PATCH 097/164] fix
---
popup/helpers/category.js | 7 -
popup/popup.html | 1 -
popup/styles/style.css | 2 +-
popup/tabs.js | 18 +--
scripts/content-scripts/document_start.js | 4 -
.../content-scripts/scripts/mp3.zing.vn.js | 19 ---
.../scripts/ufs_global_webpage_context.js | 142 ++++++++++++++++++
.../scripts/useful-scripts-utils.js | 139 -----------------
scripts/insta_injectDownloadBtn.js | 3 +-
scripts/passwordFieldToggle.js | 2 +-
10 files changed, 155 insertions(+), 182 deletions(-)
delete mode 100644 scripts/content-scripts/scripts/mp3.zing.vn.js
delete mode 100644 scripts/content-scripts/scripts/useful-scripts-utils.js
diff --git a/popup/helpers/category.js b/popup/helpers/category.js
index 36f3f64f..50fe91eb 100644
--- a/popup/helpers/category.js
+++ b/popup/helpers/category.js
@@ -109,13 +109,6 @@ export const CATEGORY = {
vi: `
diff --git a/popup/styles/style.css b/popup/styles/style.css
index a8df5690..9dece50e 100644
--- a/popup/styles/style.css
+++ b/popup/styles/style.css
@@ -324,7 +324,7 @@ a:hover {
visibility: visible;
top: 105%;
opacity: 1;
- transition: all .3s linear .7s;
+ transition: all .3s linear .3s;
}
.tooltip .tooltiptext::after {
diff --git a/popup/tabs.js b/popup/tabs.js
index f95eaaa1..6d3f0b52 100644
--- a/popup/tabs.js
+++ b/popup/tabs.js
@@ -195,10 +195,13 @@ const tabs = [
{
...CATEGORY.automation,
scripts: [
+ s.shortenURL,
+ s.unshorten,
createTitle("--- QRCode ---", "--- QRCode ---"),
s.textToQRCode,
s.webToQRCode,
createTitle("--- Auto ---", "--- Tự động ---"),
+ s.passwordGenerator,
s.getAllEmailsInWeb,
s.screenshotFullPage,
s.jsonformatter,
@@ -215,22 +218,19 @@ const tabs = [
s.transfer_sh,
],
},
- {
- ...CATEGORY.password,
- scripts: [s.passwordGenerator, s.passwordFieldToggle],
- },
{
...CATEGORY.unlock,
scripts: [
+ createTitle("--- Unlock web ---", "--- Mở khoá web ---"),
s.donotBlockMe,
- s.shortenURL,
- s.unshorten,
+ s.envato_bypassPreview,
+ s.studyphim_unlimited,
+ s.studocu_bypassPreview,
+ createTitle("--- Unlock function ---", "--- Mở khoá chức năng ---"),
s.simpleAllowCopy,
s.reEnableContextMenu,
s.showHiddenFields,
- s.studyphim_unlimited,
- s.studocu_bypassPreview,
- s.envato_bypassPreview,
+ s.passwordFieldToggle,
s.viewCookies,
s.removeCookies,
s.viewBrowserInfo,
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 97fe1e51..79258678 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -64,10 +64,6 @@
break;
}
});
-
- // https://stackoverflow.com/a/53033388
- const { getURL, injectScript, injectCss } = await import("./utils.js");
- injectScript(getURL("content-scripts/scripts/useful-scripts-utils.js"));
} catch (e) {
console.log("ERROR: ", e);
}
diff --git a/scripts/content-scripts/scripts/mp3.zing.vn.js b/scripts/content-scripts/scripts/mp3.zing.vn.js
deleted file mode 100644
index 86236727..00000000
--- a/scripts/content-scripts/scripts/mp3.zing.vn.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// prevent auto redirect from https://mp3.zing.vn/ to https://zingmp3.vn/
-window.MP3_MEDIA_USER_UPLOAD = 1;
-
-// mp3 VIP (test)
-window.onload = () => {
- if (window.MP3) {
- window.MP3.ACCOUNT_ID = new Date().getTime();
- window.MP3.ACCOUNT_NAME = "VIP - Useful scripts";
- window.MP3.VIP = 1;
- window.MP3.IS_IP_VN = true;
- }
-
- window.checkLogin = () => true;
-
- if (window.ZVip) {
- window.ZVip.isVip = 1;
- window.ZVip.vip = 1;
- }
-};
diff --git a/scripts/content-scripts/scripts/ufs_global_webpage_context.js b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
index f9d7c4cd..c2f89179 100644
--- a/scripts/content-scripts/scripts/ufs_global_webpage_context.js
+++ b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
@@ -66,7 +66,149 @@ const UsefulScriptGlobalWebpageContext = {
};
window.UsefulScriptGlobalWebpageContext = UsefulScriptGlobalWebpageContext;
+// Chứa các hàm hỗ trợ việc hack web :))
+const UsefulScriptsUtils = {
+ // Có trang web tự động xoá console để ngăn cản người dùng xem kết quả thực thi câu lệnh trong console
+ // Ví dụ: https://beta.nhaccuatui.com/
+ // Hàm này sẽ tắt chức năng tự động clear console đó, giúp hacker dễ hack hơn :)
+ disableAutoConsoleClear() {
+ window.console.clear = () => null;
+ console.log("Auto console.clear DISABLED!");
+ },
+
+ // Hiển thị tất cả các biến toàn cục được tạo ra trong trang web
+ // https://mmazzarolo.com/blog/2022-02-14-find-what-javascript-variables-are-leaking-into-the-global-scope/
+ listGlobalVariables() {
+ let browserGlobals = [];
+ const ignoredGlobals = ["UsefulScriptsUtils"];
+
+ function collectBrowserGlobals() {
+ const iframe = window.document.createElement("iframe");
+ iframe.src = "about:blank";
+ window.document.body.appendChild(iframe);
+ let globals = Object.keys(iframe.contentWindow);
+ window.document.body.removeChild(iframe);
+ return globals;
+ }
+
+ function getRuntimeGlobals() {
+ if (browserGlobals.length === 0) {
+ browserGlobals = collectBrowserGlobals();
+ }
+ const runtimeGlobals = Object.keys(window).filter(
+ (key) => !ignoredGlobals.includes(key) && !browserGlobals.includes(key)
+ );
+ const runtimeGlobalsObj = {};
+ runtimeGlobals.forEach((key, i) => {
+ runtimeGlobalsObj[key] = window[key];
+ });
+ return runtimeGlobalsObj;
+ }
+
+ return getRuntimeGlobals();
+ },
+
+ // https://mmazzarolo.com/blog/2022-07-30-checking-if-a-javascript-native-function-was-monkey-patched/
+ // Kiểm tra xem function nào đó có bị override hay chưa
+ isNativeFunction(f) {
+ return f.toString().toString().includes("[native code]");
+ },
+
+ // https://mmazzarolo.com/blog/2022-06-26-filling-local-storage-programmatically/
+ // Làm đầy localStorage
+ fillLocalStorage() {
+ const key = "__filling_localstorage__";
+ let max = 1;
+ let data = "x";
+ try {
+ while (true) {
+ data = data + data;
+ localStorage.setItem(key, data);
+ max <<= 1;
+ }
+ } catch {}
+ for (let bit = max >> 1; bit > 0; bit >>= 1) {
+ try {
+ localStorage.setItem(key, data.substring(0, max | bit));
+ max |= bit;
+ } catch {
+ console.success("Storage is now completely full 🍟");
+ }
+ }
+ return function cleanup() {
+ localStorage.removeItem(key);
+ console.success("Storage is cleaned");
+ };
+ },
+
+ // https://mmazzarolo.com/blog/2022-02-16-track-down-the-javascript-code-responsible-for-polluting-the-global-scope/
+ globalsDebugger(varName = "") {
+ // https://stackoverflow.com/a/56933091/11898496
+ const urlParams = new URLSearchParams(window.location.search);
+ urlParams.set("globalsToInspect", varName);
+ window.location.search = urlParams.toString();
+ },
+
+ // Tìm chuỗi xung quanh chuỗi bất kỳ
+ // Ví dụ fullString = "abcd1234567890abcd" targetString = "6" bound = 3
+ // => Kết quả around = 3456789
+ getTextAround(fullString, targetString, bound = 10) {
+ let curIndex = 0;
+ let arounds = [];
+ let limit = 100;
+
+ while (limit) {
+ let index = fullString.indexOf(targetString, curIndex);
+ if (index === -1) break;
+
+ let around = fullString.slice(
+ Math.max(index - Math.floor(bound / 2) - 1, 0),
+ Math.min(
+ index + targetString.length + Math.floor(bound / 2),
+ fullString.length
+ )
+ );
+ arounds.push({ index, around });
+ curIndex = index + (targetString.length || 1);
+ limit--;
+ }
+ return arounds;
+ },
+
+ // https://stackoverflow.com/a/40410744/11898496
+ // Giải mã từ dạng 'http\\u00253A\\u00252F\\u00252Fexample.com' về 'http://example.com'
+ decodeEscapedUnicodeString(str) {
+ return decodeURIComponent(
+ JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')
+ );
+ },
+
+ // https://stackoverflow.com/a/8649003
+ searchParamsToObject(search) {
+ // let d = {};
+ // decodeURI(search)
+ // .split("&")
+ // .map((_) => _.split("="))
+ // .forEach((_) => (d[_[0]] = _[1]));
+ // return d;
+
+ search = search || location.search.substring(1);
+ return JSON.parse(
+ '{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}',
+ function (key, value) {
+ return key === "" ? value : decodeURIComponent(value);
+ }
+ );
+ },
+};
+window.UsefulScriptsUtils = UsefulScriptsUtils;
+
// ================================= Polyfill =================================
// Chrome pre-34
if (!Element.prototype.matches)
Element.prototype.matches = Element.prototype.webkitMatchesSelector;
+
+// https://mmazzarolo.com/blog/2022-08-25-simple-colored-logging-for-javascript-clis/
+window.console.success = (...args) => console.log("\x1b[32m✔\x1b[0m", ...args);
+window.console.failure = (...args) =>
+ console.error("\x1b[31mx\x1b[0m", ...args);
diff --git a/scripts/content-scripts/scripts/useful-scripts-utils.js b/scripts/content-scripts/scripts/useful-scripts-utils.js
deleted file mode 100644
index b6dbc60c..00000000
--- a/scripts/content-scripts/scripts/useful-scripts-utils.js
+++ /dev/null
@@ -1,139 +0,0 @@
-// https://mmazzarolo.com/blog/2022-08-25-simple-colored-logging-for-javascript-clis/
-window.console.success = (...args) => console.log("\x1b[32m✔\x1b[0m", ...args);
-window.console.failure = (...args) =>
- console.error("\x1b[31mx\x1b[0m", ...args);
-
-window.UsefulScriptsUtils = {
- // Có trang web tự động xoá console để ngăn cản người dùng xem kết quả thực thi câu lệnh trong console
- // Ví dụ: https://beta.nhaccuatui.com/
- // Hàm này sẽ tắt chức năng tự động clear console đó, giúp hacker dễ hack hơn :)
- disableAutoConsoleClear() {
- window.console.clear = () => null;
- console.log("Auto console.clear DISABLED!");
- },
-
- // Hiển thị tất cả các biến toàn cục được tạo ra trong trang web
- // https://mmazzarolo.com/blog/2022-02-14-find-what-javascript-variables-are-leaking-into-the-global-scope/
- listGlobalVariables() {
- let browserGlobals = [];
- const ignoredGlobals = ["UsefulScriptsUtils"];
-
- function collectBrowserGlobals() {
- const iframe = window.document.createElement("iframe");
- iframe.src = "about:blank";
- window.document.body.appendChild(iframe);
- let globals = Object.keys(iframe.contentWindow);
- window.document.body.removeChild(iframe);
- return globals;
- }
-
- function getRuntimeGlobals() {
- if (browserGlobals.length === 0) {
- browserGlobals = collectBrowserGlobals();
- }
- const runtimeGlobals = Object.keys(window).filter(
- (key) => !ignoredGlobals.includes(key) && !browserGlobals.includes(key)
- );
- const runtimeGlobalsObj = {};
- runtimeGlobals.forEach((key, i) => {
- runtimeGlobalsObj[key] = window[key];
- });
- return runtimeGlobalsObj;
- }
-
- return getRuntimeGlobals();
- },
-
- // https://mmazzarolo.com/blog/2022-07-30-checking-if-a-javascript-native-function-was-monkey-patched/
- // Kiểm tra xem function nào đó có bị override hay chưa
- isNativeFunction(f) {
- return f.toString().toString().includes("[native code]");
- },
-
- // https://mmazzarolo.com/blog/2022-06-26-filling-local-storage-programmatically/
- // Làm đầy localStorage
- fillLocalStorage() {
- const key = "__filling_localstorage__";
- let max = 1;
- let data = "x";
- try {
- while (true) {
- data = data + data;
- localStorage.setItem(key, data);
- max <<= 1;
- }
- } catch {}
- for (let bit = max >> 1; bit > 0; bit >>= 1) {
- try {
- localStorage.setItem(key, data.substring(0, max | bit));
- max |= bit;
- } catch {
- console.success("Storage is now completely full 🍟");
- }
- }
- return function cleanup() {
- localStorage.removeItem(key);
- console.success("Storage is cleaned");
- };
- },
-
- // https://mmazzarolo.com/blog/2022-02-16-track-down-the-javascript-code-responsible-for-polluting-the-global-scope/
- globalsDebugger(varName = "") {
- // https://stackoverflow.com/a/56933091/11898496
- const urlParams = new URLSearchParams(window.location.search);
- urlParams.set("globalsToInspect", varName);
- window.location.search = urlParams.toString();
- },
-
- // Tìm chuỗi xung quanh chuỗi bất kỳ
- // Ví dụ fullString = "abcd1234567890abcd" targetString = "6" bound = 3
- // => Kết quả around = 3456789
- getTextAround(fullString, targetString, bound = 10) {
- let curIndex = 0;
- let arounds = [];
- let limit = 100;
-
- while (limit) {
- let index = fullString.indexOf(targetString, curIndex);
- if (index === -1) break;
-
- let around = fullString.slice(
- Math.max(index - Math.floor(bound / 2) - 1, 0),
- Math.min(
- index + targetString.length + Math.floor(bound / 2),
- fullString.length
- )
- );
- arounds.push({ index, around });
- curIndex = index + (targetString.length || 1);
- limit--;
- }
- return arounds;
- },
-
- // https://stackoverflow.com/a/40410744/11898496
- // Giải mã từ dạng 'http\\u00253A\\u00252F\\u00252Fexample.com' về 'http://example.com'
- decodeEscapedUnicodeString(str) {
- return decodeURIComponent(
- JSON.parse('"' + str.replace(/\"/g, '\\"') + '"')
- );
- },
-
- // https://stackoverflow.com/a/8649003
- searchParamsToObject(search) {
- // let d = {};
- // decodeURI(search)
- // .split("&")
- // .map((_) => _.split("="))
- // .forEach((_) => (d[_[0]] = _[1]));
- // return d;
-
- search = search || location.search.substring(1);
- return JSON.parse(
- '{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}',
- function (key, value) {
- return key === "" ? value : decodeURIComponent(value);
- }
- );
- },
-};
diff --git a/scripts/insta_injectDownloadBtn.js b/scripts/insta_injectDownloadBtn.js
index 3e989b35..dfb44dc0 100644
--- a/scripts/insta_injectDownloadBtn.js
+++ b/scripts/insta_injectDownloadBtn.js
@@ -8,7 +8,8 @@ export default {
en: "Add a download button to all photo/video/post/story on Instagram",
vi: "Thêm nút để tải (ảnh/video/story/post) trên Instagram",
},
-
+ whiteList: ["https://www.instagram.com/*"],
+
onDocumentIdle: () => {
// ==UserScript==
// @name Instagram Download Button
diff --git a/scripts/passwordFieldToggle.js b/scripts/passwordFieldToggle.js
index cfcda7fd..16a19eae 100644
--- a/scripts/passwordFieldToggle.js
+++ b/scripts/passwordFieldToggle.js
@@ -1,5 +1,5 @@
export default {
- icon: `
`,
+ icon: `
`,
name: {
en: "Password field toggle",
vi: "Tắt/mở xem mật khẩu bị ẩn",
From 9f560f422308c983d1cc65a6e46dde836cb1e68e Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 11:46:28 +0700
Subject: [PATCH 098/164] xem tin nhan bi go - wip
---
popup/tabs.js | 1 +
scripts/fb_revealDeletedMessages.js | 382 ++++++++++++++++++++++++++++
scripts/index.js | 2 +
3 files changed, 385 insertions(+)
create mode 100644 scripts/fb_revealDeletedMessages.js
diff --git a/popup/tabs.js b/popup/tabs.js
index 6d3f0b52..3ce52496 100644
--- a/popup/tabs.js
+++ b/popup/tabs.js
@@ -92,6 +92,7 @@ const tabs = [
{
...CATEGORY.facebook,
scripts: [
+ s.fb_revealDeletedMessages,
createTitle("--- UI ---", "--- Giao diện ---"),
s.fb_toggleLight,
s.fb_toggleNewFeed,
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
new file mode 100644
index 00000000..90c967e8
--- /dev/null
+++ b/scripts/fb_revealDeletedMessages.js
@@ -0,0 +1,382 @@
+export default {
+ icon: "https://github.com/HoangTran0410/RevealDeletedFBMessages/raw/master/icons/icon48.png",
+ name: {
+ en: "Facebook - Reveal deleted messages",
+ vi: "Facebook - Xem tin nhắn bị gỡ",
+ },
+ description: {
+ en: "View deleted messages (since function was turned on) on facebook messenger.",
+ vi: "Xem lại những tin nhắn đã bị đối phương xóa (kể từ khi bật chức năng) trong facebook messenger.",
+ },
+ whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
+
+ onDocumentStart: () => {
+ // Lưu tất cả tin nhắn - có thể truy cập được từ console trong web facebook
+ let rvdfm_all_msgs = [];
+ let rvdfm_all_users = [];
+
+ (function () {
+ console.log("Extension RVDFM - Xem Tin Nhắn Bị Gỡ Trên FB đã BẬT");
+
+ rvdfm_all_msgs = JSON.parse(localStorage.rvdfm_all_msgs || "[]");
+ console.log(
+ `RVDFM Đã tải lên ${rvdfm_all_msgs.length} tin nhắn từ LocalStorage.`
+ );
+
+ // Lưu lại vào localStorage mỗi khi tắt tab
+ window.addEventListener("beforeunload", () => {
+ localStorage.rvdfm_all_msgs = JSON.stringify(rvdfm_all_msgs);
+ });
+
+ //#region ============================ Những hàm hỗ trợ ============================
+ // Hàm decode data websocket về tiếng việt, loại bỏ những thằng \\
+ const parse = (str) => {
+ let ret = str;
+ let limit = 10;
+ while (--limit > 0) {
+ try {
+ if (ret[0] === '"') ret = JSON.parse(ret);
+ else ret = JSON.parse(`"${ret}"`);
+ } catch (e) {
+ break;
+ }
+ }
+ return ret;
+ };
+
+ // Hàm xuất ra console, xuất chữ và hình - https://stackoverflow.com/a/26286167
+ const log = {
+ text: (str, color = "white", bg = "transparent") => {
+ console.log(`%c${str}`, `color: ${color}; background: ${bg}`);
+ },
+ };
+ // #endregion
+
+ //#region ========================================= BẮT ĐẦU HACK :)) =========================================
+
+ // Lưu lại webSocket gốc của browser
+ const original_WebSocket = window.WebSocket;
+
+ // Tạo 1 fake webSocket constructor - facebook sẽ gọi hàm này để tạo socket
+ window.WebSocket = function fakeConstructor(dt, config) {
+ const websocket_instant = new original_WebSocket(dt, config);
+
+ // hàm hỗ trợ
+ const isMsgIdStr = (str) => str?.startsWith("mid.$");
+ const isLink = (str) => str?.startsWith("https://");
+
+ // Chèn event on message => để bắt tất cả event được dùng bởi facebook trong webSocket
+ websocket_instant.addEventListener("message", async function (achunk) {
+ // chuyển binary code của websocket về string utf8
+ const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+
+ if (
+ utf8_str[0] === "1" ||
+ utf8_str[0] === "2" ||
+ utf8_str[0] === "3"
+ ) {
+ // Xem trong dữ liệu có id của tin nhắn nào không
+ const have_msg_id = /(?=mid\.\$)(.*?)(?=\\")/.exec(utf8_str);
+
+ // Nếu không có id tin nhắn
+ if (!have_msg_id) {
+ const users_data = [];
+
+ const user_data_zones =
+ /(?=\(LS.sp\(\\"25\\")(.*?)(?=:LS.resolve)/gm.exec(utf8_str);
+
+ if (user_data_zones != null) {
+ user_data_zones.forEach((zone) => {
+ const user_id =
+ /(?<=\?entity_id=)(.*?)(?=\&entity_type)/.exec(zone);
+ const avatars = /(?=https)(.*?)(?=\\",)/g.exec(zone);
+ const small_avatar = parse(avatars[0]);
+ const big_avatar = parse(avatars[1]);
+
+ const user_msg_id = /(?<=, )(.*?)(?=,\[0,1\],)/gm.exec(zone);
+ });
+ }
+
+ for (let i = 0; i < all_strings.length; i++) {
+ const str_i = all_strings[i];
+
+ // Thông tin người dùng
+ if (str_i === "13" && all_strings[i + 1] === "25") {
+ const small_avatar = all_strings[i + 2];
+ const large_avatar = all_strings[i + 4];
+ const user_id = /(?<=\?entity_id=).*?(?=\&entity_type)/.exec(
+ all_strings[i + 3]
+ )[0];
+ const full_user_name = all_strings[i + 6];
+ const short_user_name = all_strings[i + 8];
+ const unknown_id = all_strings[i + 9];
+
+ // Có những event bắt đầu bằng 13 ,25 nhưng không có user name => loại
+ if (full_user_name) {
+ users_data.push({
+ user_id,
+ small_avatar,
+ large_avatar,
+ full_user_name,
+ short_user_name,
+ unknown_id,
+ });
+ }
+ }
+ }
+
+ if (users_data.length) {
+ log.text("Users data: ", "yellow", "black");
+ console.log(users_data);
+ }
+
+ // Lưu vào rvdfm_all_users
+ rvdfm_all_users = rvdfm_all_users.concat(users_data);
+
+ return;
+ }
+
+ // Lấy ra tất cả các thông tin dùng được trong dữ liệu (những chuỗi nằm giữa 2 dấu nháy kép)
+ const all_strings_regex = /(\\\")(.*?)(\\\")(?=[,)])/g;
+ let all_strings = utf8_str.match(all_strings_regex) || [];
+ all_strings = all_strings.map((str) => parse(str));
+
+ // Nếu all_strings có chứa thông tin thì log ra (cho dev dễ debug)
+ if (all_strings.length) {
+ // Lấy ra request id: Đây chỉ là mã định danh cho request, tăng dần đều qua từng request...
+ const request_id = /(?<=\"request_id\":)(.*?)(?=,)/.exec(
+ utf8_str
+ )[0];
+
+ log.text(
+ "RVDFM - VÀO LÚC " + new Date().toLocaleString(),
+ "blue",
+ "#fff9"
+ );
+ console.log("Mọi thông tin: ", {
+ request_id,
+ all: all_strings,
+ utf8_str,
+ });
+ } else {
+ // Không có thông tin gì thì thoát luôn
+ return;
+ }
+
+ // Bắt đầu lấy ra những tin nhắn từ lượng thông tin trên
+ let chat = [];
+ for (let i = 0; i < all_strings.length; i++) {
+ const str_i = all_strings[i];
+
+ // Tin nhắn chữ
+ if (str_i === "insertMessage" && isMsgIdStr(all_strings[i + 2])) {
+ const content = all_strings[i + 1];
+ if (content) {
+ chat.push({
+ type: "Chữ",
+ content: content,
+ id: all_strings[i + 2],
+ });
+ }
+ }
+
+ // Tin nhắn đính kèm: image / gif / video / âm thanh / file
+ if (
+ str_i === "insertBlobAttachment" &&
+ isLink(all_strings[i + 2])
+ ) {
+ const isImg = all_strings[i + 1]?.startsWith("image-");
+ const isGif = all_strings[i + 1]?.startsWith("gif-");
+ const isVideo = all_strings[i + 1]?.startsWith("video-");
+ const isAudio = all_strings[i + 1]?.startsWith("audioclip-");
+
+ const type = isImg
+ ? "Hình ảnh"
+ : isGif
+ ? "GIF"
+ : isVideo
+ ? "Video"
+ : isAudio
+ ? "Âm thanh"
+ : "Đính kèm";
+
+ for (let j = i; j < all_strings.length - 1; j++) {
+ if (isMsgIdStr(all_strings[j])) {
+ chat.push({
+ type: type,
+ content: all_strings[i + 2],
+ id: all_strings[j],
+ });
+ break;
+ }
+ }
+ }
+
+ // Tin nhắn nhãn dán
+ if (
+ str_i === "insertMessage" &&
+ isMsgIdStr(all_strings[i + 1]) &&
+ isLink(all_strings[i + 6])
+ ) {
+ chat.push({
+ type: "Nhãn dán",
+ content: all_strings[i + 6],
+ id: all_strings[i + 1],
+ });
+ }
+
+ // Thả react
+ if (
+ str_i === "upsertReaction" &&
+ isMsgIdStr(all_strings[i + 1])
+ ) {
+ chat.push({
+ type: "Thả react",
+ content: all_strings[i + 2],
+ id: all_strings[i + 1],
+ });
+ }
+
+ // Gỡ react
+ if (
+ str_i === "deleteReaction" &&
+ isMsgIdStr(all_strings[i + 1])
+ ) {
+ const id = all_strings[i + 1];
+ const content =
+ rvdfm_all_msgs.find((c) => c.id === id)?.content || "";
+
+ chat.push({
+ type: "Gỡ react",
+ content: content,
+ id: id,
+ });
+ }
+
+ // Tin nhắn chia sẻ vị trí / vị trí trực tiếp
+ if (
+ str_i === "xma_live_location_sharing" &&
+ isMsgIdStr(all_strings[i - 2]) &&
+ isLink(all_strings[i + 1])
+ ) {
+ const link = all_strings[i + 1];
+
+ chat.push({
+ type: "Chia sẻ",
+ content: link,
+ id: all_strings[i - 2],
+ });
+ }
+
+ // Thông tin user
+ // if (str_i === "533" && isLink(all_strings[i + 1])) {
+ // const avatar = all_strings[i + 1];
+ // const user_name = all_strings[i + 2];
+
+ // chat.push({
+ // type: "Người dùng",
+ // avatar: avatar,
+ // name: user_name,
+ // });
+ // }
+
+ // Tin nhắn đang chờ
+ // if (str_i === "130" && all_strings[i + 3] === "pending") {
+ // chat.push({
+ // type: "Tin nhắn đang chờ",
+ // content: all_strings[i + 1],
+ // avatar: all_strings[i + 2],
+ // });
+ // }
+
+ // Thu hồi tin nhắn
+ if (
+ str_i === "deleteThenInsertMessage" &&
+ isMsgIdStr(all_strings[i + 2])
+ ) {
+ const id = all_strings[i + 2];
+ const msgs =
+ rvdfm_all_msgs.filter(
+ (c) => c.id === id && c.type !== "Thu hồi"
+ ) || [];
+
+ chat.push({
+ type: "Thu hồi",
+ msgs: msgs,
+ id: id,
+ });
+ }
+ }
+
+ // Chèn thời gian hiện tại vào
+ chat = chat.map((_) => ({ ..._, time: Date.now() }));
+
+ console.log("Thông tin lọc được:", chat);
+
+ // Lưu vào rvdfm_all_msgs
+ const old_length = rvdfm_all_msgs.length;
+ for (let c of chat) {
+ let isDuplicated =
+ -1 !==
+ rvdfm_all_msgs.findIndex(
+ (_msg) => JSON.stringify(c) === JSON.stringify(_msg)
+ );
+
+ if (!isDuplicated) {
+ rvdfm_all_msgs = rvdfm_all_msgs.concat(chat);
+
+ // Tin nhắn thu hồi
+ if (c.type === "Thu hồi") {
+ const deleted_msg_type = c.msgs
+ .map((_c) => c.type || "không rõ loại")
+ .join(",");
+
+ log.text(
+ `> Tin nhắn thu hồi: (${deleted_msg_type})`,
+ "black",
+ "#f35369"
+ );
+ console.log(
+ c.msgs || "(RVDFM: không có dữ liệu cho tin nhắn này)"
+ );
+
+ rvdfmSendDeletedMsgToContentJs(c.msgs);
+ }
+
+ // Tin nhắn thả/gỡ react
+ else if (c.type == "Thả react" || c.type === "Gỡ react") {
+ const target_msg = rvdfm_all_msgs.filter(
+ (_msg) => _msg.id === c.id
+ );
+
+ log.text(`> ${c.type}:`, "black", "yellow");
+ console.log(
+ target_msg || "(RVDFM: không có dữ liệu cho tin nhắn này)"
+ );
+ }
+ }
+ }
+
+ // Hiển thị thông tin lưu tin nhắn mới
+ const new_lenght = rvdfm_all_msgs.length;
+ const new_msg_count = new_lenght - old_length;
+ if (new_msg_count) {
+ rvdfmSendSavedCounterToContentJs(new_msg_count, new_lenght);
+ log.text(
+ `> RVDFM Đã lưu ${new_msg_count} tin nhắn mới! (${new_lenght})`,
+ "green"
+ );
+ }
+ }
+ });
+
+ return websocket_instant;
+ };
+
+ // Giữ nguyên prototype chỉ đổi constructor thành fake constructor
+ window.WebSocket.prototype = original_WebSocket.prototype;
+ window.WebSocket.prototype.constructor = window.WebSocket;
+ // #endregion
+ })();
+ },
+};
diff --git a/scripts/index.js b/scripts/index.js
index 7867443e..6479673b 100644
--- a/scripts/index.js
+++ b/scripts/index.js
@@ -157,6 +157,7 @@ import tiki_totalSpendMoney from "./tiki_totalSpendMoney.js";
import fb_invisible_message from "./fb_invisible_message.js";
import insta_injectDownloadBtn from "./insta_injectDownloadBtn.js";
import studocu_bypassPreview from "./studocu_bypassPreview.js";
+import fb_revealDeletedMessages from "./fb_revealDeletedMessages.js";
// inject badges
const allScripts = {
@@ -335,6 +336,7 @@ const allScripts = {
fb_invisible_message: addBadge(fb_invisible_message, BADGES.new),
insta_injectDownloadBtn: addBadge(insta_injectDownloadBtn, BADGES.new),
studocu_bypassPreview: addBadge(studocu_bypassPreview, BADGES.new),
+ fb_revealDeletedMessages: addBadge(fb_revealDeletedMessages, BADGES.hot),
};
// alert(Object.keys(allScripts).length);
From b6c98fd18f2701f7e2c89fa727ac1394c6a380fb Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 12:25:02 +0700
Subject: [PATCH 099/164] update
---
scripts/backup/openfbchat.js | 302 +++++++++++++++++++++++++++++++++++
scripts/fb_toggleLight.js | 6 +-
2 files changed, 303 insertions(+), 5 deletions(-)
create mode 100644 scripts/backup/openfbchat.js
diff --git a/scripts/backup/openfbchat.js b/scripts/backup/openfbchat.js
new file mode 100644
index 00000000..2ef79add
--- /dev/null
+++ b/scripts/backup/openfbchat.js
@@ -0,0 +1,302 @@
+require("MWChatStateActions.bs").openTab(
+ Date.now(),
+ { shouldFocus: true },
+ {
+ _0: {
+ clientThreadKey: void 0,
+ threadKey: require("bs_caml_format").caml_int64_of_string(a),
+ threadType: require("MessagingThreadType.bs").oneToOne,
+ },
+ TAG: 1,
+ }
+);
+
+__d(
+ "PagesCometMessageButton.react",
+ [
+ "fbt",
+ "ix",
+ "CometRelay",
+ "CometTrackingNodeProvider.react",
+ "PagesCometMessageButton_page.graphql",
+ "TetraButton.react",
+ "fbicon",
+ "react",
+ "usePagesCometMessage",
+ ],
+ function (a, b, c, d, e, f, g, h, i) {
+ "use strict";
+ var j,
+ k = d("react");
+ function a(a) {
+ var e = a.disabled;
+ e = e === void 0 ? !1 : e;
+ var f = a.hideLabel;
+ f = f === void 0 ? !0 : f;
+ var g = a.location,
+ l = a.logAction,
+ m = a.messengerLsEntryPoint;
+ a = a.page$key;
+ a = d("CometRelay").useFragment(
+ j !== void 0 ? j : (j = b("PagesCometMessageButton_page.graphql")),
+ a
+ );
+ a = d("usePagesCometMessage").usePagesCometMessage(a, g, m, l);
+ g = a[0];
+ m = a[1];
+ return g
+ ? k.jsx(c("CometTrackingNodeProvider.react"), {
+ trackingNode: 199,
+ children: k.jsx(
+ "div",
+ {
+ className: "x6s0dn4 x78zum5 x1i64zmx",
+ "data-testid": void 0,
+ children: k.jsx(
+ c("TetraButton.react"),
+ {
+ disabled: e,
+ icon: d("fbicon")._(i("505616"), 16),
+ label: h._("__JHASH__4qQOXx0pgR3__JHASH__"),
+ labelIsHidden: f,
+ onPress: m,
+ size: "medium",
+ type: "secondary",
+ },
+ "message"
+ ),
+ },
+ "message"
+ ),
+ })
+ : null;
+ }
+ a.displayName = a.name + " [from " + f.id + "]";
+ g["default"] = a;
+ },
+ 98
+);
+
+__d(
+ "usePagesCometMessage",
+ [
+ "CometRelay",
+ "PagesLogger",
+ "PagesLoggerEventEnum",
+ "PagesPageMessageClickFalcoEvent",
+ "react",
+ "useMWChatOpenTabForPage",
+ "usePagesCometMessage_page.graphql",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h,
+ i = d("react").useCallback;
+ function a(a, e, f, g) {
+ a = d("CometRelay").useFragment(
+ h !== void 0 ? h : (h = b("usePagesCometMessage_page.graphql")),
+ a
+ );
+ var j =
+ (a == null ? void 0 : a.can_viewer_message) === !0 &&
+ (a == null ? void 0 : a.should_hide_page_messaging_entrypoint) === !1,
+ k = c("useMWChatOpenTabForPage")(f),
+ l = a == null ? void 0 : a.id;
+ f = i(
+ function () {
+ l != null &&
+ j === !0 &&
+ (k(l),
+ g && g(e),
+ c("PagesPageMessageClickFalcoEvent").log(function () {
+ return { event_data: {}, event_location: e, page_id: l };
+ }),
+ d("PagesLogger").log(
+ l,
+ c("PagesLoggerEventEnum").CLICK,
+ "page_message",
+ e,
+ ["page_consumer_experience"],
+ {}
+ ));
+ },
+ [j, e, k, l, g]
+ );
+ return [j, f];
+ }
+ g.usePagesCometMessage = a;
+ },
+ 98
+);
+
+__d(
+ "useMWChatOpenTabForPage",
+ ["MWChatOpenTabForPage.bs", "react"],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h = d("react").useMemo;
+ function a(a, b) {
+ var c = {};
+ b != null && (c.preventAutofocus = b.preventAutofocus_DO_NOT_USE);
+ var e = d("MWChatOpenTabForPage.bs").useHook(c.preventAutofocus, a);
+ return h(
+ function () {
+ return function (a, b) {
+ return e(a, (a = b) != null ? a : !1);
+ };
+ },
+ [e]
+ );
+ }
+ g["default"] = a;
+ },
+ 98
+);
+__d(
+ "ProfileCometActionTrigger.react",
+ [
+ "CometRelay",
+ "ProfileCometActionTrigger_action.graphql",
+ "ProfileCometContext",
+ "react",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h,
+ i = d("react"),
+ j = d("react").useContext;
+ function a(a) {
+ var e = a.action,
+ f = a.children,
+ g = a.onClose,
+ k = a.popoverPosition,
+ l = a.pushPage;
+ a = a.source;
+ e = d("CometRelay").useFragment(
+ h !== void 0 ? h : (h = b("ProfileCometActionTrigger_action.graphql")),
+ e
+ );
+ var m = j(c("ProfileCometContext"));
+ m = m.isInViewAs;
+ return m
+ ? f({ disabled: !0 })
+ : i.jsx(d("CometRelay").MatchContainer, {
+ fallback: f({ disabled: !0 }),
+ match: e.client_handler,
+ props: {
+ children: f,
+ onClose: g,
+ popoverPosition: k,
+ pushPage: l,
+ source: a,
+ },
+ });
+ }
+ a.displayName = a.name + " [from " + f.id + "]";
+ g["default"] = a;
+ },
+ 98
+);
+
+__d(
+ "MWChatOpenTabForPage.bs",
+ [
+ "LSThreadAttributionStore.bs",
+ "MWChatInteraction.bs",
+ "MWChatStateActions.bs",
+ "MWChatStateV2.bs",
+ "MessagingThreadType.bs",
+ "bs_caml_format",
+ "bs_curry",
+ "react",
+ "recoverableViolation",
+ "requireDeferred",
+ "useCometFeedNoRoutingNavigationEventLogger",
+ "useMWChatOpenTabTraceProvider",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h = d("react"),
+ i = c("requireDeferred")("MWChatLogOpenChatTab.bs").__setRef(
+ "MWChatOpenTabForPage.bs"
+ );
+ function a(a, b) {
+ var e = a !== void 0 ? a : !1,
+ f = c("useMWChatOpenTabTraceProvider")(),
+ g = c("useCometFeedNoRoutingNavigationEventLogger")(),
+ j = d("MWChatStateV2.bs").useDispatch();
+ return h.useMemo(
+ function () {
+ return function (a, h) {
+ g(Date.now(), "", "messenger");
+ d("LSThreadAttributionStore.bs").setSource(a, b);
+ i.onReady(function (d) {
+ return c("bs_curry")._4(d.logOpenPageTab, void 0, a, b);
+ });
+ return f(
+ function (b) {
+ d("MWChatInteraction.bs").set(a, b);
+ if (h) {
+ c("recoverableViolation")(
+ "Opening secure converstions with pages not supported",
+ "messenger_web_product"
+ );
+ return;
+ } else
+ return c("bs_curry")._1(
+ j,
+ // here
+ d("MWChatStateActions.bs").openTab(
+ Date.now(),
+ { shouldFocus: !e },
+ {
+ _0: {
+ clientThreadKey: void 0,
+ threadKey:
+ c("bs_caml_format").caml_int64_of_string(a),
+ threadType: d("MessagingThreadType.bs").oneToOne,
+ },
+ TAG: 1,
+ }
+ )
+ );
+ },
+ "page",
+ b,
+ a
+ );
+ };
+ },
+ [g, f, e, b]
+ );
+ }
+ g.$MWChatLogOpenChatTab$Deferred = i;
+ g.useHook = a;
+ },
+ 98
+);
+
+__d(
+ "PagesCometMessageButton_page.graphql",
+ [],
+ function (a, b, c, d, e, f) {
+ "use strict";
+ a = {
+ argumentDefinitions: [],
+ kind: "Fragment",
+ metadata: null,
+ name: "PagesCometMessageButton_page",
+ selections: [
+ {
+ args: null,
+ kind: "FragmentSpread",
+ name: "usePagesCometMessage_page",
+ },
+ ],
+ type: "Page",
+ abstractKey: null,
+ };
+ e.exports = a;
+ },
+ null
+);
diff --git a/scripts/fb_toggleLight.js b/scripts/fb_toggleLight.js
index 63aa5f58..c9876f10 100644
--- a/scripts/fb_toggleLight.js
+++ b/scripts/fb_toggleLight.js
@@ -10,11 +10,7 @@ export default {
},
whiteList: ["https://www.facebook.com/*"],
- onDocumentStart: () => {
-
- },
-
- onDocumentEnd: () => {
+ onDocumentIdle: () => {
[
document.querySelectorAll('[role="navigation"]')?.[2],
document.querySelectorAll('[role="complementary"]')?.[0],
From 0df3a82a3c6a5d9297b98e655cc1674d0ff8793c Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 17:48:58 +0700
Subject: [PATCH 100/164] update
---
pages/viewScriptSource/main.js | 22 +-
popup/tabs.js | 10 +
scripts/backup/openfbchat.js | 915 +++++++++++++++++-
.../scripts/ufs_global_webpage_context.js | 105 +-
scripts/fb_invisible_message.js | 8 +-
scripts/fb_revealDeletedMessages.js | 408 +-------
scripts/fb_toggleNewFeed.js | 2 +-
scripts/shopee_totalSpendMoney.js | 2 -
scripts/studyphim_unlimited.js | 2 +-
9 files changed, 1041 insertions(+), 433 deletions(-)
diff --git a/pages/viewScriptSource/main.js b/pages/viewScriptSource/main.js
index 79735a27..4c601939 100644
--- a/pages/viewScriptSource/main.js
+++ b/pages/viewScriptSource/main.js
@@ -1,11 +1,11 @@
window.onload = async () => {
try {
- let scriptId = localStorage.viewScriptSource_sharedData;
- let source = await getScriptSource(scriptId);
+ let id = localStorage.viewScriptSource_sharedData;
+ let source = await getScriptSource(id);
if (source) {
- let fileName = scriptId + ".js";
- let comment = "// " + fileName;
+ let fileName = id + ".js";
+ let comment = "// File: " + fileName;
document.querySelector("#copy-btn").onclick = () => copy(source);
document.querySelector("code").innerHTML =
@@ -26,11 +26,15 @@ function copy(text) {
// https://stackoverflow.com/a/26276924/11898496
async function getScriptSource(scriptId) {
- let fileName = scriptId + ".js";
- let path = "/scripts/" + fileName;
- let res = await fetch(path);
- let source = await res.text();
- return source;
+ try {
+ let fileName = scriptId + ".js";
+ let path = "/scripts/" + fileName;
+ let res = await fetch(path);
+ let source = await res.text();
+ return source;
+ } catch (e) {
+ return "// Không lấy được source code\n// Cannot load source code";
+ }
}
// https://stackoverflow.com/a/6234804/11898496
diff --git a/popup/tabs.js b/popup/tabs.js
index 3ce52496..58a39d7c 100644
--- a/popup/tabs.js
+++ b/popup/tabs.js
@@ -297,6 +297,16 @@ const recommendTab = {
onClick: () =>
window.open("https://github.com/HoangTran0410/FBMediaDownloader"),
},
+ { name: { en: "--- Web ---", vi: "--- Web hay ---" } },
+ {
+ icon: "https://you.com/favicon/apple-touch-icon-72x72.png",
+ name: { en: "You.com", vi: "You.com" },
+ description: {
+ en: "The AI Search Engine You Control",
+ vi: "Trình tìm kiếm sử dụng trí tuệ nhân tạo",
+ },
+ onClick: () => window.open("https://you.com/"),
+ },
{ name: { en: "--- Extensions ---", vi: "--- Extensions hay ---" } },
{
icon: "https://lh3.googleusercontent.com/2GdtpZt9NWFkfrfLZnWL2gM2UdCOsgpQhhdxSx4wPw5Iz10NcT433g3iHyAAZ8J-ZCyz3gwLKR1kJQC0PidRVKKJ1Ws=w128-h128-e365-rj-sc0x00ffffff",
diff --git a/scripts/backup/openfbchat.js b/scripts/backup/openfbchat.js
index 2ef79add..b95a0d16 100644
--- a/scripts/backup/openfbchat.js
+++ b/scripts/backup/openfbchat.js
@@ -1,16 +1,551 @@
-require("MWChatStateActions.bs").openTab(
- Date.now(),
- { shouldFocus: true },
+function getThreadId(id, type) {
+ if (type === "Group")
+ return require("MercuryIDs").getThreadIDFromThreadFBID(id);
+ else if (type === "User" || type === "Page")
+ return require("MercuryIDs").getThreadIDFromUserID(id);
+ else
+ return require("unrecoverableViolation")(
+ "Not supported",
+ "messenger_web_product"
+ );
+}
+function openChat(id, type) {
+ let threadId = getThreadId(id, type);
+ require("MWChatStateActions.bs").openTab(
+ Date.now(),
+ { shouldFocus: true },
+ {
+ _0: {
+ clientThreadKey: void 0,
+ threadKey: "105941170804328u100006100567721", // require("MercuryIDs").getThreadKeyfromThreadIDUserID(threadId,id),
+ threadType: require("MessagingThreadType.bs").oneToOne,
+ },
+ TAG: 1,
+ }
+ );
+}
+
+require("MWChatStateActions.bs").openTabOrFlyout(
+ i,
+ {
+ shouldFocus: !1,
+ },
{
_0: {
clientThreadKey: void 0,
- threadKey: require("bs_caml_format").caml_int64_of_string(a),
- threadType: require("MessagingThreadType.bs").oneToOne,
+ threadKey: g.threadKey,
+ threadType: g.threadType,
},
TAG: 1,
}
);
+__d(
+ "MWChatThreadId.bs",
+ [
+ "MercuryIDs",
+ "MessagingThreadType.bs",
+ "bs_caml",
+ "bs_caml_int64",
+ "bs_caml_obj",
+ "unrecoverableViolation",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ function a(a) {
+ var b = a.NAME;
+ if (b === "Group")
+ return d("MercuryIDs").getThreadIDFromThreadFBID(a.VAL);
+ else if (b === "User" || b === "Page")
+ return d("MercuryIDs").getThreadIDFromUserID(a.VAL);
+ else
+ return c("unrecoverableViolation")(
+ "Not supported",
+ "messenger_web_product"
+ );
+ }
+ function b(a) {
+ return a.VAL;
+ }
+ function e(a) {
+ var b = a.NAME;
+ if (b === "Group") return "g." + a.VAL;
+ else if (b === "Page") return "p." + a.VAL;
+ else if (b === "User") return "u." + a.VAL;
+ else
+ return c("unrecoverableViolation")(
+ "Not supported",
+ "messenger_web_product"
+ );
+ }
+ function f(a) {
+ a = a.split(".");
+ var b = a.length,
+ c;
+ if (b >= 3) c = [void 0, void 0];
+ else
+ switch (b) {
+ case 0:
+ c = [void 0, void 0];
+ break;
+ case 1:
+ b = a[0];
+ c = [b, void 0];
+ break;
+ case 2:
+ b = a[0];
+ a = a[1];
+ c = /^[1-9]\d*$/.test(a) ? [b, a] : [void 0, void 0];
+ break;
+ }
+ b = c[1];
+ a = c[0];
+ if (a === void 0) return;
+ switch (a) {
+ case "g":
+ if (b !== void 0)
+ return {
+ NAME: "Group",
+ VAL: b,
+ };
+ else return;
+ case "p":
+ if (b !== void 0)
+ return {
+ NAME: "Page",
+ VAL: b,
+ };
+ else return;
+ case "u":
+ if (b !== void 0)
+ return {
+ NAME: "User",
+ VAL: b,
+ };
+ else return;
+ default:
+ return;
+ }
+ }
+ function h(a, b, e) {
+ b = c("bs_caml_int64").of_int32(b);
+ if (c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").oneToOne))
+ if (e)
+ return {
+ NAME: "Page",
+ VAL: a,
+ };
+ else
+ return {
+ NAME: "User",
+ VAL: a,
+ };
+ else if (
+ c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").marketplace) ||
+ c("bs_caml").i64_eq(b, d("MessagingThreadType.bs").group)
+ )
+ return {
+ NAME: "Group",
+ VAL: a,
+ };
+ else return;
+ }
+ function i(a) {
+ switch (a.targetType) {
+ case "GROUP":
+ return {
+ NAME: "Group",
+ VAL: a.targetID,
+ };
+ case "PAGE":
+ return {
+ NAME: "Page",
+ VAL: a.targetID,
+ };
+ case "USER":
+ return {
+ NAME: "User",
+ VAL: a.targetID,
+ };
+ default:
+ return c("unrecoverableViolation")(
+ "Invalid id",
+ "messenger web product"
+ );
+ }
+ }
+ var j = {
+ $eq: c("bs_caml_obj").caml_equal,
+ eq: c("bs_caml_obj").caml_equal,
+ };
+ function k(a) {
+ if (typeof a === "object") return a.NAME === "Page";
+ else return !1;
+ }
+ function l(a) {
+ if (typeof a === "object") return a.NAME === "User";
+ else return !1;
+ }
+ function m(a) {
+ if (typeof a === "object") return a.NAME === "UserSecret";
+ else return !1;
+ }
+ function n(a) {
+ a = a !== void 0 ? a : "";
+ a = a.split(":");
+ var b = a.length,
+ c;
+ if (b >= 3) c = [void 0, void 0];
+ else
+ switch (b) {
+ case 0:
+ c = [void 0, void 0];
+ break;
+ case 1:
+ b = a[0];
+ c = [b, void 0];
+ break;
+ case 2:
+ b = a[0];
+ a = a[1];
+ c = [b, a];
+ break;
+ }
+ b = c[1];
+ a = c[0];
+ if (a === void 0) return;
+ switch (a) {
+ case "thread":
+ if (b !== void 0)
+ return {
+ NAME: "Group",
+ VAL: b,
+ };
+ else return;
+ case "user":
+ if (b !== void 0)
+ return {
+ NAME: "User",
+ VAL: b,
+ };
+ else return;
+ default:
+ return;
+ }
+ }
+ g.getMercuryID = a;
+ g.getFBID = b;
+ g.serializeFuture = e;
+ g.deserializeFuture = f;
+ g.deserializeThreadlistIdUseOnlyInJewel = h;
+ g.fromJs = i;
+ g.Operators = j;
+ g.isPage = k;
+ g.isUser = l;
+ g.isSecret = m;
+ g.deserializeFromLegacyThreadId = n;
+ },
+ 98
+);
+
+__d(
+ "MAWThreadId",
+ [
+ "I64",
+ "LSMessagingThreadTypeUtil.bs",
+ "MAWGating",
+ "ODS",
+ "ReQL",
+ "WALogger",
+ "recoverableViolation",
+ "regeneratorRuntime",
+ "unrecoverableViolation",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h = d("I64").of_string("-1000");
+ function a(a, e) {
+ var f;
+ return b("regeneratorRuntime").async(
+ function (g) {
+ while (1)
+ switch ((g.prev = g.next)) {
+ case 0:
+ if (!d("MAWGating").isOccamadillo()) {
+ g.next = 7;
+ break;
+ }
+ g.next = 3;
+ return b("regeneratorRuntime").awrap(
+ d("ReQL").firstAsync(
+ d("ReQL")
+ .fromTableAscending(
+ a.table("mi_act_mapping_table").index("chat_id")
+ )
+ .getKeyRange(d("I64").of_int32(e))
+ )
+ );
+ case 3:
+ f = g.sent;
+ if (!(f !== void 0)) {
+ g.next = 6;
+ break;
+ }
+ return g.abrupt("return", f.serverThreadKey);
+ case 6:
+ throw c("unrecoverableViolation")(
+ "Tried to convert a rowId to thread key but couldn't find a\n corresponding row in the mapping table. This can mean that\n there is a race condition between the time a thread was created\n on the WA backend, and the time it was inserted into the mapping table.\n i.e. this function is called before the fn that inserts the mapping\n into the mapping table",
+ "messenger_web_product"
+ );
+ case 7:
+ return g.abrupt(
+ "return",
+ d("I64").add(
+ d("I64").mul(d("I64").of_int32(e), d("I64").neg_one),
+ h
+ )
+ );
+ case 8:
+ case "end":
+ return g.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ var i = new Set();
+ function e(a, c) {
+ var e;
+ return b("regeneratorRuntime").async(
+ function (f) {
+ while (1)
+ switch ((f.prev = f.next)) {
+ case 0:
+ if (!d("MAWGating").isOccamadillo()) {
+ f.next = 8;
+ break;
+ }
+ f.next = 3;
+ return b("regeneratorRuntime").awrap(
+ d("ReQL").firstAsync(
+ d("ReQL")
+ .fromTableAscending(
+ a.table("mi_act_mapping_table").index("chat_id")
+ )
+ .getKeyRange(d("I64").of_int32(c))
+ )
+ );
+ case 3:
+ e = f.sent;
+ if (!(e !== void 0)) {
+ f.next = 6;
+ break;
+ }
+ return f.abrupt("return", e.serverThreadKey);
+ case 6:
+ i.has(c) ||
+ (d("WALogger").WARN([
+ "[Occamadillo] Thread id: " +
+ c.toString() +
+ " is not yet in miActMapping table.",
+ ]),
+ d("ODS").bumpEntityKey(
+ 5765,
+ "thread_not_in_miActMapping",
+ "[Occamadillo] Thread id: " +
+ c.toString() +
+ " is not yet in miActMapping table."
+ ),
+ i.add(c));
+ return f.abrupt("return");
+ case 8:
+ return f.abrupt(
+ "return",
+ d("I64").add(
+ d("I64").mul(d("I64").of_int32(c), d("I64").neg_one),
+ h
+ )
+ );
+ case 9:
+ case "end":
+ return f.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ function j(a) {
+ if (d("MAWGating").isOccamadillo()) {
+ c("recoverableViolation")(
+ "Checking if a threadKey is a secure thread key in Occamadillo. We should be\n checking the thread's thread type instead",
+ "messenger_web_product"
+ );
+ return !1;
+ }
+ return d("I64").compare(a, h) === -1;
+ }
+ function k(a, c) {
+ var e;
+ return b("regeneratorRuntime").async(
+ function (f) {
+ while (1)
+ switch ((f.prev = f.next)) {
+ case 0:
+ if (!d("MAWGating").isOccamadillo()) {
+ f.next = 5;
+ break;
+ }
+ f.next = 3;
+ return b("regeneratorRuntime").awrap(
+ d("ReQL").firstAsync(
+ d("ReQL")
+ .fromTableAscending(a.table("mi_act_mapping_table"))
+ .getKeyRange(c)
+ )
+ );
+ case 3:
+ e = f.sent;
+ return f.abrupt(
+ "return",
+ e !== void 0 ? d("I64").to_int32(e.clientThreadPk) : void 0
+ );
+ case 5:
+ return f.abrupt(
+ "return",
+ j(c)
+ ? d("I64").to_int32(
+ d("I64").mul(d("I64").sub(c, h), d("I64").neg_one)
+ )
+ : void 0
+ );
+ case 6:
+ case "end":
+ return f.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ function f(a, e) {
+ var f;
+ return b("regeneratorRuntime").async(
+ function (g) {
+ while (1)
+ switch ((g.prev = g.next)) {
+ case 0:
+ !d("MAWGating").isOccamadillo() &&
+ !j(e) &&
+ c("recoverableViolation")(
+ "We are using a thread key which is not a ChatId as a ChatId. This will likely result in a privacy SEV",
+ "messenger_web_product"
+ );
+ g.next = 3;
+ return b("regeneratorRuntime").awrap(k(a, e));
+ case 3:
+ f = g.sent;
+ if (!(f === void 0)) {
+ g.next = 6;
+ break;
+ }
+ return g.abrupt("return", {
+ _0: void 0,
+ TAG: 1,
+ });
+ case 6:
+ return g.abrupt("return", {
+ _0: f,
+ TAG: 0,
+ });
+ case 7:
+ case "end":
+ return g.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ function l(a, c) {
+ var e;
+ return b("regeneratorRuntime").async(
+ function (f) {
+ while (1)
+ switch ((f.prev = f.next)) {
+ case 0:
+ f.next = 2;
+ return b("regeneratorRuntime").awrap(
+ d("ReQL").firstAsync(
+ d("ReQL")
+ .fromTableAscending(a.table("threads"))
+ .getKeyRange(c)
+ )
+ );
+ case 2:
+ e = f.sent;
+ if (!(e === void 0)) {
+ f.next = 5;
+ break;
+ }
+ return f.abrupt("return");
+ case 5:
+ return f.abrupt("return", e.threadType);
+ case 6:
+ case "end":
+ return f.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ function m(a, c) {
+ var e;
+ return b("regeneratorRuntime").async(
+ function (f) {
+ while (1)
+ switch ((f.prev = f.next)) {
+ case 0:
+ if (!d("MAWGating").isOccamadillo()) {
+ f.next = 7;
+ break;
+ }
+ f.next = 3;
+ return b("regeneratorRuntime").awrap(l(a, c));
+ case 3:
+ e = f.sent;
+ if (!(e === void 0)) {
+ f.next = 6;
+ break;
+ }
+ return f.abrupt("return", !1);
+ case 6:
+ return f.abrupt(
+ "return",
+ d("LSMessagingThreadTypeUtil.bs").isSecure(e)
+ );
+ case 7:
+ return f.abrupt("return", d("I64").compare(c, h) === -1);
+ case 8:
+ case "end":
+ return f.stop();
+ }
+ },
+ null,
+ this
+ );
+ }
+ g.toThreadKey_DEPRECATED = a;
+ g.toThreadKeyMaybe = e;
+ g.isThreadId = j;
+ g.ofThreadKey = f;
+ g.isSecureThreadId = m;
+ },
+ 98
+);
+
__d(
"PagesCometMessageButton.react",
[
@@ -300,3 +835,373 @@ __d(
},
null
);
+
+__d(
+ "MWV2OpenTabOrThread.bs",
+ [
+ "CurrentEnvironment",
+ "JSScheduler",
+ "LSMessagingThreadTypeUtil.bs",
+ "LSThreadAttributionStore.bs",
+ "MAWGating",
+ "MWChatInteraction.bs",
+ "MWChatStateActions.bs",
+ "MWChatStateV2.bs",
+ "MWInboxArchivedThreadsRouteBuilder.bs",
+ "MWInboxBusinessSupportThreadsRouteBuilder.bs",
+ "MWInboxMarketplaceThreadsRouteBuilder.bs",
+ "MWInboxMessageRequestsRouteBuilder.bs",
+ "MWInboxRouteBuilder.bs",
+ "XCometGroupDiscussionControllerRouteBuilder",
+ "XCometMessengerControllerRouteBuilder",
+ "bs_belt_Option",
+ "bs_caml_int64",
+ "bs_caml_option",
+ "bs_curry",
+ "bs_int64",
+ "cr:3904",
+ "cr:3905",
+ "gkx",
+ "react",
+ "useCometEntityKey",
+ "useCometFeedNoRoutingNavigationEventLogger",
+ "useCometRouterDispatcher",
+ "useGroupThreadViewParams",
+ "useMWV2ChatOpenTabTraceProvider",
+ "useShouldShowMessagingEntrypointInCometRoot",
+ ],
+ function (a, b, c, d, e, f, g) {
+ "use strict";
+ var h = d("react"),
+ i = h.createContext();
+ function a(a) {
+ var b = a.children;
+ a = a.value;
+ return h.createElement(i.Provider, {
+ children: b,
+ value: a,
+ });
+ }
+ f = {
+ make: a,
+ };
+ var j =
+ b("cr:3904") == null ? void 0 : c("bs_caml_option").some(b("cr:3904")),
+ k =
+ b("cr:3905") == null ? void 0 : c("bs_caml_option").some(b("cr:3905"));
+ function l(a) {
+ var b = d("MWChatStateV2.bs").useDispatch(),
+ e = c("useCometFeedNoRoutingNavigationEventLogger")(),
+ f = c("useMWV2ChatOpenTabTraceProvider")();
+ return h.useCallback(
+ function (a) {
+ return function (g, h) {
+ e(Date.now(), "", "messenger");
+ return f(
+ function (e) {
+ d("MWChatInteraction.bs").set(
+ c("bs_int64").to_string(a.threadKey),
+ e
+ );
+ return c("bs_curry")._1(
+ b,
+ d("MWChatStateActions.bs").openTab(
+ Date.now(),
+ {
+ shouldFocus: !0,
+ },
+ {
+ _0: a,
+ TAG: 1,
+ }
+ )
+ );
+ },
+ c("bs_caml_int64").to_int32(a.threadType),
+ h,
+ c("bs_int64").to_string(a.threadKey)
+ );
+ };
+ },
+ [b, e, f]
+ );
+ }
+ function m(a) {
+ var e = c("useShouldShowMessagingEntrypointInCometRoot")("CHAT"),
+ f = c("useCometRouterDispatcher")(),
+ g = h.useContext(i),
+ m = c("useGroupThreadViewParams")(),
+ n = l(),
+ o = c("bs_belt_Option").getWithDefault(
+ c("bs_belt_Option").map(
+ c("bs_caml_option").nullable_to_opt(c("useCometEntityKey")()),
+ function (a) {
+ return c("bs_caml_option").nullable_to_opt(a.entity_type);
+ }
+ )
+ );
+ return h.useMemo(
+ function () {
+ var a = function (a, e) {
+ var f = c("bs_belt_Option").getWithDefault(g, function (a) {
+ var f = c("bs_int64").to_string(a);
+ if (!(b("cr:3905") == null)) {
+ if (
+ !d("MAWGating").isOccamadillo() &&
+ c("bs_curry")._1(k.isThreadId, a)
+ )
+ if (c("CurrentEnvironment").facebookdotcom)
+ return c(
+ "XCometMessengerControllerRouteBuilder"
+ ).buildURL({});
+ else return "/";
+ if (
+ d("MAWGating").isOccamadillo() &&
+ d("LSMessagingThreadTypeUtil.bs").isSecure(e)
+ )
+ return c("bs_curry")._1(
+ d("MWInboxRouteBuilder.bs").buildE2EEThreadURL,
+ {
+ thread_key: f,
+ }
+ );
+ }
+ if (!(m == null))
+ return c(
+ "XCometGroupDiscussionControllerRouteBuilder"
+ ).buildURL({
+ chats_to_open: [m.threadKey, c("bs_int64").to_string(a)],
+ idorvanity: m.groupId,
+ });
+ if (o === void 0)
+ return c("bs_curry")._1(
+ d("MWInboxRouteBuilder.bs").buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ switch (o) {
+ case "archived":
+ return c("bs_curry")._1(
+ d("MWInboxArchivedThreadsRouteBuilder.bs").buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ case "business_support":
+ return c("bs_curry")._1(
+ d("MWInboxBusinessSupportThreadsRouteBuilder.bs")
+ .buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ case "marketplace":
+ return c("bs_curry")._1(
+ d("MWInboxMarketplaceThreadsRouteBuilder.bs").buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ case "message_requests":
+ return c("bs_curry")._1(
+ d("MWInboxMessageRequestsRouteBuilder.bs").buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ default:
+ return c("bs_curry")._1(
+ d("MWInboxRouteBuilder.bs").buildURL,
+ {
+ thread_key: f,
+ }
+ );
+ }
+ });
+ return c("bs_curry")._1(f, a);
+ },
+ h = function (e) {
+ var g = e.threadKey;
+ !(b("cr:3905") == null) &&
+ !(b("cr:3904") == null) &&
+ !d("MAWGating").isOccamadillo() &&
+ c("bs_curry")._1(k.isThreadId, g) &&
+ c("bs_curry")._1(
+ j.setMostRecentSecureThreadKey,
+ c("bs_int64").to_string(g)
+ );
+ if (!(f == null)) {
+ f.go(a(g, e.threadType));
+ return;
+ }
+ },
+ i = function (a, b) {
+ return d("LSThreadAttributionStore.bs").setSource(
+ c("bs_int64").to_string(a.threadKey),
+ b
+ );
+ };
+ return {
+ getUrlFromThreadKey: a,
+ openInbox: function (a, b) {
+ i(a, b);
+ return h(a);
+ },
+ openTabOrInbox: function (a, b, d) {
+ a = a !== void 0 ? a : !0;
+ i(b, d);
+ if (e) return c("bs_curry")._3(n, b, a, d);
+ else return h(b);
+ },
+ };
+ },
+ [e, f, n]
+ );
+ }
+ function e(a, b) {
+ var e = m(),
+ f = c("useCometRouterDispatcher")();
+ h.useEffect(function () {
+ c("gkx")("6944") &&
+ d("JSScheduler").scheduleSpeculativeCallback(function () {
+ if (!(f == null)) {
+ f.prefetchRouteDefinition(
+ c("bs_curry")._2(e.getUrlFromThreadKey, a, b)
+ );
+ return;
+ }
+ });
+ }, []);
+ }
+ g.$MAWSessionStorage$requireCondXplat = b("cr:3904");
+ g.$MAWThreadId$requireCondXplat = b("cr:3905");
+ g.Provider = f;
+ g.useHook = m;
+ g.usePreloadRoute = e;
+ },
+ 98
+);
+
+__d("ProfileCometHeaderActionBarButton.react", ["CometLightweightGroupsActionSourceContext", "CometProgressRingIndeterminate.react", "CometRelay", "ProfileCometContextualProfileContext", "ProfileCometHeaderActionBarButtonWithoutIsActiveField_action.graphql", "ProfileCometHeaderActionBarButton_action.graphql", "QE2Logger", "TetraButton.react", "TetraIcon.react", "TintableIconSource", "coerceRelayImage", "react", "requireDeferred", "useProfileCometEngagementEventsClickCallback", "useProfileCometEngagementEventsImpression", "useProfileEngagementClickCallback"], (function(a, b, c, d, e, f, g) {
+ "use strict";
+ var h, i, j = d("react");
+ e = d("react");
+ var k = e.useContext
+ , l = e.useEffect
+ , m = c("requireDeferred")("GroupLwgUserEventsFalcoEvent").__setRef("ProfileCometHeaderActionBarButton.react");
+ function a(a, e) {
+ var f = a.action
+ , g = a.actionBarSlot
+ , i = a.labelIsHidden;
+ i = i === void 0 ? !1 : i;
+ var n = a.onPress
+ , o = a.source;
+ o = o === void 0 ? "WWW_COMET_PROFILE" : o;
+ a = babelHelpers.objectWithoutPropertiesLoose(a, ["action", "actionBarSlot", "labelIsHidden", "onPress", "source"]);
+ var p = d("CometRelay").useFragment(h !== void 0 ? h : h = b("ProfileCometHeaderActionBarButton_action.graphql"), f);
+ f = k(c("ProfileCometContextualProfileContext"));
+ var q = f.groupID
+ , r = f.isContextualProfileView;
+ f = f.userID;
+ var s = k(c("CometLightweightGroupsActionSourceContext"))
+ , t = s.lightweightGroupSource;
+ s = (p.profile_action_type || "unknown").toLowerCase();
+ var u = c("useProfileEngagementClickCallback")(r ? {
+ event_metadata: {
+ entry_point: s === "edit_contextual_profile" ? "self-view_edit_profile" : "",
+ groupID: q
+ },
+ item_subtype: s === "edit_contextual_profile" ? "contextual_profile_edit" : null,
+ item_type: s,
+ product_bucket: "contextual_profile",
+ profile_id_dummy: f,
+ surface: "group_contextual_profile"
+ } : {
+ item_type: s,
+ product_bucket: "action_bar",
+ surface: o === "WWW_COMET_FRIENDSHIP_PAGE" ? "friends_page" : "timeline"
+ }, n);
+ r = {
+ event_metadata: {
+ action_bar_slot: g.toString(),
+ is_primary: p.is_active.toString()
+ },
+ feature_item: s,
+ feature_surface: null,
+ profile_feature: "action",
+ profile_section: "action_bar"
+ };
+ var v = c("useProfileCometEngagementEventsClickCallback")(r);
+ f = c("useProfileCometEngagementEventsImpression")(r);
+ o = p.primary_icon;
+ n = p.title.text;
+ l(function() {
+ p.profile_action_type === "PROMOTE" && d("QE2Logger").logExposureForActingAccount("lwi_comet_promote_button_content_univ")
+ }, [p.profile_action_type]);
+ g = "";
+ switch (p.profile_action_type) {
+ case "EDIT_CONTEXTUAL_PROFILE":
+ g = "EditContextualProfileActionBarButton";
+ break;
+ case "FRIEND":
+ g = "add_button";
+ break;
+ case "MANAGE_MEMORIALIZED_ACCOUNT":
+ g = "memorialization_manage_memorialization_button";
+ break;
+ case "JOIN_COMMUNITY":
+ g = "community-profile-connection-button-" + ((r = (s = p.profile_owner) == null ? void 0 : s.subscribe_status) != null ? r : "");
+ break;
+ default:
+ g = n
+ }
+ s = p.is_optimistic_update === !0;
+ r = s ? j.jsx(c("CometProgressRingIndeterminate.react"), {
+ color: a.disabled === !0 ? "disabled" : "dark",
+ size: 16
+ }) : void 0;
+ g = !s && (o == null ? void 0 : o.uri) != null ? new (c("TintableIconSource"))("FB",c("coerceRelayImage")(o),16) : void 0;
+ s = p.is_swapped_icon_alignment === !0;
+ o = g !== void 0 ? j.jsx(c("TetraIcon.react"), {
+ color: p.is_active === !0 ? "white" : "primary",
+ icon: g
+ }) : void 0;
+ return j.jsx("div", {
+ className: "" + (i ? "" : " xh8yej3"),
+ ref: e,
+ children: j.jsx(c("TetraButton.react"), babelHelpers["extends"]({}, a, {
+ addOnPrimary: r,
+ addOnSecondary: s ? o : void 0,
+ icon: s ? void 0 : g,
+ label: n,
+ labelIsHidden: i,
+ onPress: function(a) {
+ u(a),
+ v(),
+ q && t != null && p.profile_action_type === "MESSAGE" && m.onReady(function(a) {
+ a.log(function() {
+ return {
+ entry_point: t,
+ event: "click_send_message",
+ group_id: q,
+ source: t
+ }
+ })
+ })
+ },
+ reduceEmphasis: !1,
+ ref: f,
+ size: "medium",
+ testid: void 0,
+ tooltip: i ? n : null,
+ type: p.is_active === !0 ? "primary" : "secondary"
+ }))
+ })
+ }
+ a.displayName = a.name + " [from " + f.id + "]";
+ i !== void 0 ? i : i = b("ProfileCometHeaderActionBarButtonWithoutIsActiveField_action.graphql");
+ e = j.forwardRef(a);
+ g["default"] = e
+}
+), 98);
\ No newline at end of file
diff --git a/scripts/content-scripts/scripts/ufs_global_webpage_context.js b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
index c2f89179..f5c87a14 100644
--- a/scripts/content-scripts/scripts/ufs_global_webpage_context.js
+++ b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
@@ -2,66 +2,73 @@
// Có thể truy cập từ các script chạy trong webpage context (có hàm onClick)
const UsefulScriptGlobalWebpageContext = {
- deleteElements(selector, willReRun) {
- UsefulScriptGlobalWebpageContext.onElementsVisible(
- selector,
- (nodes) => {
- [].forEach.call(nodes, function (node) {
- node.remove();
- console.log("Useful-scripts: element removed ", node);
- });
- },
- willReRun
- );
- },
-
- waitForElements(selector) {
- return new Promise((resolve, reject) => {
+ DOM: {
+ deleteElements(selector, willReRun) {
UsefulScriptGlobalWebpageContext.onElementsVisible(
selector,
- resolve,
- false
+ (nodes) => {
+ [].forEach.call(nodes, function (node) {
+ node.remove();
+ console.log("Useful-scripts: element removed ", node);
+ });
+ },
+ willReRun
);
- });
- },
-
- // Idea from https://github.com/gys-dev/Unlimited-Stdphim
- // https://stackoverflow.com/a/61511955/11898496
- onElementsVisible: async (selector, callback, willReRun) => {
- let nodes = document.querySelectorAll(selector);
- if (nodes?.length) {
- callback(nodes);
- if (!willReRun) return;
- }
+ },
+
+ waitForElements(selector) {
+ return new Promise((resolve, reject) => {
+ UsefulScriptGlobalWebpageContext.onElementsVisible(
+ selector,
+ resolve,
+ false
+ );
+ });
+ },
+
+ // Idea from https://github.com/gys-dev/Unlimited-Stdphim
+ // https://stackoverflow.com/a/61511955/11898496
+ onElementsVisible: async (selector, callback, willReRun) => {
+ let nodes = document.querySelectorAll(selector);
+ if (nodes?.length) {
+ callback(nodes);
+ if (!willReRun) return;
+ }
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (!mutation.addedNodes) return;
+ const observer = new MutationObserver((mutations) => {
+ mutations.forEach((mutation) => {
+ if (!mutation.addedNodes) return;
- for (let node of mutation.addedNodes) {
- if (node.nodeType != 1) continue; // only process Node.ELEMENT_NODE
+ for (let node of mutation.addedNodes) {
+ if (node.nodeType != 1) continue; // only process Node.ELEMENT_NODE
- let n = node.matches(selector)
- ? [node]
- : Array.from(node.querySelectorAll(selector));
+ let n = node.matches(selector)
+ ? [node]
+ : Array.from(node.querySelectorAll(selector));
- if (n?.length) {
- callback(n);
- if (!willReRun) observer.disconnect();
+ if (n?.length) {
+ callback(n);
+ if (!willReRun) observer.disconnect();
+ }
}
- }
+ });
});
- });
- observer.observe(document, {
- childList: true,
- subtree: true,
- attributes: false,
- characterData: false,
- });
+ observer.observe(document, {
+ childList: true,
+ subtree: true,
+ attributes: false,
+ characterData: false,
+ });
- // return disconnect function
- return () => observer.disconnect();
+ // return disconnect function
+ return () => observer.disconnect();
+ },
+ },
+ Facebook: {
+ decodeArrId(arrId) {
+ return arrId[0] * 4294967296 + arrId[1];
+ },
},
};
window.UsefulScriptGlobalWebpageContext = UsefulScriptGlobalWebpageContext;
diff --git a/scripts/fb_invisible_message.js b/scripts/fb_invisible_message.js
index 6438f81a..cea819f8 100644
--- a/scripts/fb_invisible_message.js
+++ b/scripts/fb_invisible_message.js
@@ -8,7 +8,7 @@ export default {
en: "Add character > before message to send invisible message",
vi: "Thêm ký tự > trước tin nhắn để tạo tin nhắn tàng hình",
},
- whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
+ whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentIdle: () => {
// ==UserScript==
@@ -140,11 +140,11 @@ export default {
requireLazy(
["MWV2ChatText.bs", "MqttProtocolClient"],
(MWV2ChatText, protocolClient) => {
- console.log({ MWV2ChatText, protocolClient });
const MWV2ChatTextMakeOrig = MWV2ChatText.make;
MWV2ChatText.make = function (a) {
let text = a?.message?.text;
- //console.log(a);
+ console.log(a);
+ if (a.message.text.includes("thu hồi")) console.log("here");
if (checkEncode(text))
a.message.text = `[Encrypted]: ${decode(text)}`;
return MWV2ChatTextMakeOrig.apply(this, arguments);
@@ -154,7 +154,6 @@ export default {
const publishOrig = protocolClient.prototype.publish;
protocolClient.prototype.publish = function () {
let b = arguments[1];
- // console.log(arguments);
if (b && b.includes('\\\\\\"text\\\\\\":')) {
(function () {
b = JSON.parse(b);
@@ -164,6 +163,7 @@ export default {
payload.tasks = payload.tasks.map((task) => {
let payload = JSON.parse(task.payload);
+ console.log(payload);
if (!payload || !payload.text) return task;
if (payload.text.length > 1 && payload.text[0] === ">") {
payload.text = encode(payload.text.substr(1));
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index 90c967e8..ff7cb8bd 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -11,372 +11,56 @@ export default {
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentStart: () => {
- // Lưu tất cả tin nhắn - có thể truy cập được từ console trong web facebook
- let rvdfm_all_msgs = [];
- let rvdfm_all_users = [];
-
- (function () {
- console.log("Extension RVDFM - Xem Tin Nhắn Bị Gỡ Trên FB đã BẬT");
-
- rvdfm_all_msgs = JSON.parse(localStorage.rvdfm_all_msgs || "[]");
- console.log(
- `RVDFM Đã tải lên ${rvdfm_all_msgs.length} tin nhắn từ LocalStorage.`
- );
-
- // Lưu lại vào localStorage mỗi khi tắt tab
- window.addEventListener("beforeunload", () => {
- localStorage.rvdfm_all_msgs = JSON.stringify(rvdfm_all_msgs);
+ const WebSocketOrig = window.WebSocket;
+
+ window.WebSocket = function fakeConstructor(dt, config) {
+ const websocket_instant = new WebSocketOrig(dt, config);
+ websocket_instant.addEventListener("message", async function (achunk) {
+ // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+ // Do something here
+ // console.log(utf8_str);
});
+ return websocket_instant;
+ };
- //#region ============================ Những hàm hỗ trợ ============================
- // Hàm decode data websocket về tiếng việt, loại bỏ những thằng \\
- const parse = (str) => {
- let ret = str;
- let limit = 10;
- while (--limit > 0) {
- try {
- if (ret[0] === '"') ret = JSON.parse(ret);
- else ret = JSON.parse(`"${ret}"`);
- } catch (e) {
- break;
- }
- }
- return ret;
- };
-
- // Hàm xuất ra console, xuất chữ và hình - https://stackoverflow.com/a/26286167
- const log = {
- text: (str, color = "white", bg = "transparent") => {
- console.log(`%c${str}`, `color: ${color}; background: ${bg}`);
- },
- };
- // #endregion
-
- //#region ========================================= BẮT ĐẦU HACK :)) =========================================
-
- // Lưu lại webSocket gốc của browser
- const original_WebSocket = window.WebSocket;
-
- // Tạo 1 fake webSocket constructor - facebook sẽ gọi hàm này để tạo socket
- window.WebSocket = function fakeConstructor(dt, config) {
- const websocket_instant = new original_WebSocket(dt, config);
-
- // hàm hỗ trợ
- const isMsgIdStr = (str) => str?.startsWith("mid.$");
- const isLink = (str) => str?.startsWith("https://");
-
- // Chèn event on message => để bắt tất cả event được dùng bởi facebook trong webSocket
- websocket_instant.addEventListener("message", async function (achunk) {
- // chuyển binary code của websocket về string utf8
- const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
-
- if (
- utf8_str[0] === "1" ||
- utf8_str[0] === "2" ||
- utf8_str[0] === "3"
- ) {
- // Xem trong dữ liệu có id của tin nhắn nào không
- const have_msg_id = /(?=mid\.\$)(.*?)(?=\\")/.exec(utf8_str);
-
- // Nếu không có id tin nhắn
- if (!have_msg_id) {
- const users_data = [];
-
- const user_data_zones =
- /(?=\(LS.sp\(\\"25\\")(.*?)(?=:LS.resolve)/gm.exec(utf8_str);
-
- if (user_data_zones != null) {
- user_data_zones.forEach((zone) => {
- const user_id =
- /(?<=\?entity_id=)(.*?)(?=\&entity_type)/.exec(zone);
- const avatars = /(?=https)(.*?)(?=\\",)/g.exec(zone);
- const small_avatar = parse(avatars[0]);
- const big_avatar = parse(avatars[1]);
-
- const user_msg_id = /(?<=, )(.*?)(?=,\[0,1\],)/gm.exec(zone);
- });
- }
-
- for (let i = 0; i < all_strings.length; i++) {
- const str_i = all_strings[i];
-
- // Thông tin người dùng
- if (str_i === "13" && all_strings[i + 1] === "25") {
- const small_avatar = all_strings[i + 2];
- const large_avatar = all_strings[i + 4];
- const user_id = /(?<=\?entity_id=).*?(?=\&entity_type)/.exec(
- all_strings[i + 3]
- )[0];
- const full_user_name = all_strings[i + 6];
- const short_user_name = all_strings[i + 8];
- const unknown_id = all_strings[i + 9];
-
- // Có những event bắt đầu bằng 13 ,25 nhưng không có user name => loại
- if (full_user_name) {
- users_data.push({
- user_id,
- small_avatar,
- large_avatar,
- full_user_name,
- short_user_name,
- unknown_id,
- });
- }
- }
- }
-
- if (users_data.length) {
- log.text("Users data: ", "yellow", "black");
- console.log(users_data);
- }
-
- // Lưu vào rvdfm_all_users
- rvdfm_all_users = rvdfm_all_users.concat(users_data);
-
- return;
- }
-
- // Lấy ra tất cả các thông tin dùng được trong dữ liệu (những chuỗi nằm giữa 2 dấu nháy kép)
- const all_strings_regex = /(\\\")(.*?)(\\\")(?=[,)])/g;
- let all_strings = utf8_str.match(all_strings_regex) || [];
- all_strings = all_strings.map((str) => parse(str));
-
- // Nếu all_strings có chứa thông tin thì log ra (cho dev dễ debug)
- if (all_strings.length) {
- // Lấy ra request id: Đây chỉ là mã định danh cho request, tăng dần đều qua từng request...
- const request_id = /(?<=\"request_id\":)(.*?)(?=,)/.exec(
- utf8_str
- )[0];
-
- log.text(
- "RVDFM - VÀO LÚC " + new Date().toLocaleString(),
- "blue",
- "#fff9"
- );
- console.log("Mọi thông tin: ", {
- request_id,
- all: all_strings,
- utf8_str,
- });
- } else {
- // Không có thông tin gì thì thoát luôn
- return;
- }
-
- // Bắt đầu lấy ra những tin nhắn từ lượng thông tin trên
- let chat = [];
- for (let i = 0; i < all_strings.length; i++) {
- const str_i = all_strings[i];
-
- // Tin nhắn chữ
- if (str_i === "insertMessage" && isMsgIdStr(all_strings[i + 2])) {
- const content = all_strings[i + 1];
- if (content) {
- chat.push({
- type: "Chữ",
- content: content,
- id: all_strings[i + 2],
- });
- }
- }
-
- // Tin nhắn đính kèm: image / gif / video / âm thanh / file
- if (
- str_i === "insertBlobAttachment" &&
- isLink(all_strings[i + 2])
- ) {
- const isImg = all_strings[i + 1]?.startsWith("image-");
- const isGif = all_strings[i + 1]?.startsWith("gif-");
- const isVideo = all_strings[i + 1]?.startsWith("video-");
- const isAudio = all_strings[i + 1]?.startsWith("audioclip-");
-
- const type = isImg
- ? "Hình ảnh"
- : isGif
- ? "GIF"
- : isVideo
- ? "Video"
- : isAudio
- ? "Âm thanh"
- : "Đính kèm";
-
- for (let j = i; j < all_strings.length - 1; j++) {
- if (isMsgIdStr(all_strings[j])) {
- chat.push({
- type: type,
- content: all_strings[i + 2],
- id: all_strings[j],
- });
- break;
- }
- }
- }
-
- // Tin nhắn nhãn dán
- if (
- str_i === "insertMessage" &&
- isMsgIdStr(all_strings[i + 1]) &&
- isLink(all_strings[i + 6])
- ) {
- chat.push({
- type: "Nhãn dán",
- content: all_strings[i + 6],
- id: all_strings[i + 1],
- });
- }
-
- // Thả react
- if (
- str_i === "upsertReaction" &&
- isMsgIdStr(all_strings[i + 1])
- ) {
- chat.push({
- type: "Thả react",
- content: all_strings[i + 2],
- id: all_strings[i + 1],
- });
- }
-
- // Gỡ react
- if (
- str_i === "deleteReaction" &&
- isMsgIdStr(all_strings[i + 1])
- ) {
- const id = all_strings[i + 1];
- const content =
- rvdfm_all_msgs.find((c) => c.id === id)?.content || "";
-
- chat.push({
- type: "Gỡ react",
- content: content,
- id: id,
- });
- }
-
- // Tin nhắn chia sẻ vị trí / vị trí trực tiếp
- if (
- str_i === "xma_live_location_sharing" &&
- isMsgIdStr(all_strings[i - 2]) &&
- isLink(all_strings[i + 1])
- ) {
- const link = all_strings[i + 1];
-
- chat.push({
- type: "Chia sẻ",
- content: link,
- id: all_strings[i - 2],
- });
- }
-
- // Thông tin user
- // if (str_i === "533" && isLink(all_strings[i + 1])) {
- // const avatar = all_strings[i + 1];
- // const user_name = all_strings[i + 2];
-
- // chat.push({
- // type: "Người dùng",
- // avatar: avatar,
- // name: user_name,
- // });
- // }
-
- // Tin nhắn đang chờ
- // if (str_i === "130" && all_strings[i + 3] === "pending") {
- // chat.push({
- // type: "Tin nhắn đang chờ",
- // content: all_strings[i + 1],
- // avatar: all_strings[i + 2],
- // });
- // }
-
- // Thu hồi tin nhắn
- if (
- str_i === "deleteThenInsertMessage" &&
- isMsgIdStr(all_strings[i + 2])
- ) {
- const id = all_strings[i + 2];
- const msgs =
- rvdfm_all_msgs.filter(
- (c) => c.id === id && c.type !== "Thu hồi"
- ) || [];
-
- chat.push({
- type: "Thu hồi",
- msgs: msgs,
- id: id,
- });
- }
- }
-
- // Chèn thời gian hiện tại vào
- chat = chat.map((_) => ({ ..._, time: Date.now() }));
-
- console.log("Thông tin lọc được:", chat);
-
- // Lưu vào rvdfm_all_msgs
- const old_length = rvdfm_all_msgs.length;
- for (let c of chat) {
- let isDuplicated =
- -1 !==
- rvdfm_all_msgs.findIndex(
- (_msg) => JSON.stringify(c) === JSON.stringify(_msg)
- );
-
- if (!isDuplicated) {
- rvdfm_all_msgs = rvdfm_all_msgs.concat(chat);
-
- // Tin nhắn thu hồi
- if (c.type === "Thu hồi") {
- const deleted_msg_type = c.msgs
- .map((_c) => c.type || "không rõ loại")
- .join(",");
-
- log.text(
- `> Tin nhắn thu hồi: (${deleted_msg_type})`,
- "black",
- "#f35369"
- );
- console.log(
- c.msgs || "(RVDFM: không có dữ liệu cho tin nhắn này)"
- );
-
- rvdfmSendDeletedMsgToContentJs(c.msgs);
- }
-
- // Tin nhắn thả/gỡ react
- else if (c.type == "Thả react" || c.type === "Gỡ react") {
- const target_msg = rvdfm_all_msgs.filter(
- (_msg) => _msg.id === c.id
- );
-
- log.text(`> ${c.type}:`, "black", "yellow");
- console.log(
- target_msg || "(RVDFM: không có dữ liệu cho tin nhắn này)"
- );
- }
- }
- }
+ window.WebSocket.prototype = WebSocketOrig.prototype;
+ window.WebSocket.prototype.constructor = window.WebSocket;
+ },
- // Hiển thị thông tin lưu tin nhắn mới
- const new_lenght = rvdfm_all_msgs.length;
- const new_msg_count = new_lenght - old_length;
- if (new_msg_count) {
- rvdfmSendSavedCounterToContentJs(new_msg_count, new_lenght);
- log.text(
- `> RVDFM Đã lưu ${new_msg_count} tin nhắn mới! (${new_lenght})`,
- "green"
- );
- }
+ onDocumentIdle: () => {
+ // MWV2ChatImage.bs
+ requireLazy(["MWV2ChatUnsentMessage.bs"], (MWV2ChatUnsentMessage) => {
+ const MWV2ChatUnsentMessageOrig = MWV2ChatUnsentMessage.make;
+
+ MWV2ChatUnsentMessage.make = function (a) {
+ if (a) {
+ let outgoing = a.outgoing;
+ let {
+ isUnsent,
+ messageId,
+ threadKey,
+ offlineThreadingId,
+ displayedContentTypes,
+ senderId,
+ } = a.message;
+
+ if (isUnsent) {
+ threadKey =
+ UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(threadKey);
+ senderId =
+ UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(senderId);
+
+ a.message.isUnsent = false;
+ a.message.text = "[Hacked]: thu hồi nè";
+
+ console.log(
+ "Tin nhắn thu hồi từ " + senderId + " trong " + threadKey,
+ a
+ );
}
- });
-
- return websocket_instant;
+ }
+ return MWV2ChatUnsentMessageOrig.apply(this, arguments);
};
-
- // Giữ nguyên prototype chỉ đổi constructor thành fake constructor
- window.WebSocket.prototype = original_WebSocket.prototype;
- window.WebSocket.prototype.constructor = window.WebSocket;
- // #endregion
- })();
+ });
},
};
diff --git a/scripts/fb_toggleNewFeed.js b/scripts/fb_toggleNewFeed.js
index d24a0e62..03b652f7 100644
--- a/scripts/fb_toggleNewFeed.js
+++ b/scripts/fb_toggleNewFeed.js
@@ -11,7 +11,7 @@ export default {
whiteList: ["https://www.facebook.com/*"],
onDocumentStart: function () {
- UsefulScriptGlobalWebpageContext.onElementsVisible(
+ UsefulScriptGlobalWebpageContext.DOM.onElementsVisible(
"[role='feed'], [role='main']",
(nodes) =>
Array.from(nodes).forEach((node) => (node.style.display = "none")),
diff --git a/scripts/shopee_totalSpendMoney.js b/scripts/shopee_totalSpendMoney.js
index c55490f7..e4c3cbb0 100644
--- a/scripts/shopee_totalSpendMoney.js
+++ b/scripts/shopee_totalSpendMoney.js
@@ -62,12 +62,10 @@ export default {
setLoadingText("Đang tải đơn hàng thứ " + (offset + i + 1) + "...");
let order = orders[i];
-
order.info_card.order_list_cards.forEach((card) => {
card.items.forEach((item) => {
totalDiscount +=
(item.price_before_discount - item.item_price) / 100000 || 0;
- console.log(totalDiscount);
totalSpent += item.item_price / 100000;
totalItems += item.amount;
});
diff --git a/scripts/studyphim_unlimited.js b/scripts/studyphim_unlimited.js
index aca32156..c572da98 100644
--- a/scripts/studyphim_unlimited.js
+++ b/scripts/studyphim_unlimited.js
@@ -12,7 +12,7 @@ export default {
onDocumentStart: () => {
// Source: https://github.com/gys-dev/Unlimited-Stdphim
- UsefulScriptGlobalWebpageContext.deleteElements(
+ UsefulScriptGlobalWebpageContext.DOM.deleteElements(
".overlay.playable.hide, .overlay.playable, #topchapter, #wrapper_header",
true
);
From 83a9b856a6a35364a7c5396377497f223077cc64 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sat, 17 Dec 2022 20:00:03 +0700
Subject: [PATCH 101/164] wip
---
scripts/fb_revealDeletedMessages.js | 57 +++++++++++++++++++++++------
1 file changed, 45 insertions(+), 12 deletions(-)
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index ff7cb8bd..56b22086 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -11,20 +11,42 @@ export default {
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentStart: () => {
- const WebSocketOrig = window.WebSocket;
+ // const WebSocketOrig = window.WebSocket;
- window.WebSocket = function fakeConstructor(dt, config) {
- const websocket_instant = new WebSocketOrig(dt, config);
- websocket_instant.addEventListener("message", async function (achunk) {
- // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
- // Do something here
- // console.log(utf8_str);
- });
- return websocket_instant;
- };
+ // window.WebSocket = function fakeConstructor(dt, config) {
+ // const websocket_instant = new WebSocketOrig(dt, config);
+ // websocket_instant.addEventListener("message", async function (achunk) {
+ // // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+ // // Do something here
+ // // console.log(utf8_str);
+ // });
+ // return websocket_instant;
+ // };
- window.WebSocket.prototype = WebSocketOrig.prototype;
- window.WebSocket.prototype.constructor = window.WebSocket;
+ // window.WebSocket.prototype = WebSocketOrig.prototype;
+ // window.WebSocket.prototype.constructor = window.WebSocket;
+
+ // window.addEventListener(
+ // "message",
+ // function (t) {
+ // t.source == window && console.log(t);
+ // },
+ // !1
+ // );
+
+ let emptyFunc = void 0;
+ Object.defineProperty(window, "__d", {
+ get: () => emptyFunc,
+ set: (i) => {
+ const c = new Proxy(i, {
+ apply: async function (moduleName, dependencies, args) {
+ console.log(arguments);
+ return moduleName(...args);
+ },
+ });
+ emptyFunc = c;
+ },
+ });
},
onDocumentIdle: () => {
@@ -62,5 +84,16 @@ export default {
return MWV2ChatUnsentMessageOrig.apply(this, arguments);
};
});
+
+ // Test who is typing
+ requireLazy(["LSUpdateTypingIndicator"], (LSUpdateTypingIndicator) => {
+ const LSUpdateTypingIndicatorOrig = LSUpdateTypingIndicator;
+ console.log("abc");
+
+ LSUpdateTypingIndicator = function (...args) {
+ console.log(args);
+ return LSUpdateTypingIndicatorOrig.apply(this, arguments);
+ };
+ });
},
};
From f9d134c2daacde212a0259e216b604d70f9df326 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 02:54:52 +0700
Subject: [PATCH 102/164] fix document start - wip
---
scripts/content-scripts/document_end.js | 38 +++------------
scripts/content-scripts/document_idle.js | 38 +++------------
scripts/content-scripts/document_start.js | 58 ++++++++++++++---------
scripts/content-scripts/run_scripts.js | 58 +++++++++++++++--------
scripts/fb_revealDeletedMessages.js | 52 ++++++++++----------
scripts/helpers/utils.js | 7 ---
scripts/injectScriptToWebsite.js | 7 ++-
7 files changed, 121 insertions(+), 137 deletions(-)
diff --git a/scripts/content-scripts/document_end.js b/scripts/content-scripts/document_end.js
index 68bf90e2..3131f50c 100644
--- a/scripts/content-scripts/document_end.js
+++ b/scripts/content-scripts/document_end.js
@@ -1,36 +1,12 @@
(async () => {
- function injectScript(url) {
- var s = document.createElement("script");
- s.src = url;
- (document.head || document.documentElement).appendChild(s);
- console.log("Useful-scripts injected " + url);
- s.remove();
- }
-
let key = "activeScripts";
let ids = (await chrome.storage.sync.get([key]))?.[key];
- let search = new URLSearchParams({
- ids: ids,
- path: chrome.runtime.getURL("/scripts/"),
- event: "onDocumentEnd",
- }).toString();
-
- injectScript(
- chrome.runtime.getURL("/scripts/content-scripts/run_scripts.js") +
- "?" +
- search
+ window.dispatchEvent(
+ new CustomEvent("ufs-run-page-scripts", {
+ detail: {
+ event: "onDocumentEnd",
+ ids: ids.split(","),
+ },
+ })
);
})();
-
-// (async () => {
-// try {
-// const { MsgType, Events } = await import("../helpers/constants.js");
-// const { sendEventToBackground } = await import("../helpers/utils.js");
-// sendEventToBackground({
-// type: MsgType.runScript,
-// event: Events.onDocumentEnd,
-// });
-// } catch (e) {
-// console.log("ERROR: ", e);
-// }
-// })();
diff --git a/scripts/content-scripts/document_idle.js b/scripts/content-scripts/document_idle.js
index 4d5cc01a..605a8b4f 100644
--- a/scripts/content-scripts/document_idle.js
+++ b/scripts/content-scripts/document_idle.js
@@ -1,36 +1,12 @@
(async () => {
- function injectScript(url) {
- var s = document.createElement("script");
- s.src = url;
- (document.head || document.documentElement).appendChild(s);
- console.log("Useful-scripts injected " + url);
- s.remove();
- }
-
let key = "activeScripts";
let ids = (await chrome.storage.sync.get([key]))?.[key];
- let search = new URLSearchParams({
- ids: ids,
- path: chrome.runtime.getURL("/scripts/"),
- event: "onDocumentIdle",
- }).toString();
-
- injectScript(
- chrome.runtime.getURL("/scripts/content-scripts/run_scripts.js") +
- "?" +
- search
+ window.dispatchEvent(
+ new CustomEvent("ufs-run-page-scripts", {
+ detail: {
+ event: "onDocumentIdle",
+ ids: ids.split(","),
+ },
+ })
);
})();
-
-// (async () => {
-// try {
-// const { MsgType, Events } = await import("../helpers/constants.js");
-// const { sendEventToBackground } = await import("../helpers/utils.js");
-// sendEventToBackground({
-// type: MsgType.runScript,
-// event: Events.onDocumentIdle,
-// });
-// } catch (e) {
-// console.log("ERROR: ", e);
-// }
-// })();
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 79258678..06880c2e 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -1,20 +1,37 @@
// https://stackoverflow.com/a/70949953
// https://stackoverflow.com/a/9517879
+// https://stackoverflow.com/a/2920207/11898496
(async () => {
- function injectScript(url) {
- var s = document.createElement("script");
- s.src = url;
- (document.head || document.documentElement).appendChild(s);
- console.log("Useful-scripts injected " + url);
- s.remove();
+ // https://stackoverflow.com/a/8578840/11898496
+ function injectScript(src) {
+ let s = document.createElement("script");
+ s.type = "text/javascript";
+ s.async = false;
+ s.defer = false;
+ s.addEventListener("load", () => {
+ console.log("Useful-scripts injected " + src);
+ // s.remove();
+ });
+ s.src = src;
+ let head =
+ document.head ||
+ document.getElementsByTagName("head")[0] ||
+ document.documentElement;
+ head.insertBefore(s, head.firstChild);
+ // (document.head || document.documentElement).prepend(s);
}
- injectScript(
- chrome.runtime.getURL(
- "/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
- )
- );
+ console.log(window.__d);
+
+ // function injectScript(url) {
+ // var s = document.createElement("script");
+ // s.src = url;
+ // s.async = !1;
+ // (document.head || document.documentElement).appendChild(s);
+ // console.log("Useful-scripts injected " + url);
+ // s.remove();
+ // }
let key = "activeScripts";
let ids = (await chrome.storage.sync.get([key]))?.[key];
@@ -29,21 +46,18 @@
"?" +
search
);
+
+ injectScript(
+ chrome.runtime.getURL(
+ "/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
+ )
+ );
})();
(async () => {
try {
- const { MsgType, Events, ClickType } = await import(
- "../helpers/constants.js"
- );
- const { sendEventToBackground, isFunction } = await import(
- "../helpers/utils.js"
- );
-
- // sendEventToBackground({
- // type: MsgType.runScript,
- // event: Events.onDocumentStart,
- // });
+ const { MsgType, ClickType } = await import("../helpers/constants.js");
+ const { isFunction } = await import("../helpers/utils.js");
chrome.runtime.onMessage.addListener(async function (
message,
diff --git a/scripts/content-scripts/run_scripts.js b/scripts/content-scripts/run_scripts.js
index 92a1220a..3341b78a 100644
--- a/scripts/content-scripts/run_scripts.js
+++ b/scripts/content-scripts/run_scripts.js
@@ -5,37 +5,55 @@
// Do đó các hàm cần thiết nên ghi hết vào trong file này
// Kể cả việc nó đã được viết ở file khác (utils, helper, ...)
-// Qúa trình maintain sẽ khó hơn 1 chút, nhưng script sẽ chạy chính xác hơn
+// Quá trình maintain sẽ khó hơn 1 chút, nhưng script sẽ chạy chính xác hơn
-(async () => {
+console.log(window.__d);
+
+(() => {
const params = new URLSearchParams(
document.currentScript.src.split("?")?.[1]
);
- let ids = params.get("ids");
let path = params.get("path");
- let event = params.get("event");
- if (ids) {
- let scriptIds = ids.split(",");
+ // run script on receive event
+ window.addEventListener("ufs-run-page-scripts", ({ detail }) => {
+ const { event, ids } = detail;
+ runScripts(ids, event, path);
+ });
- for (let id of scriptIds) {
- // import and run script with event name
- import(`${path}/${id}.js`).then((module) => {
- try {
- let script = module.default;
- if (typeof script[event] === "function" && checkWillRun(script)) {
- console.log("> Useful-script: Run script " + id, script);
- script[event]();
- }
- } catch (e) {
- console.log("ERROR run script " + id, e);
- }
- });
+ // auto run onDocumentStart
+ (() => {
+ let ids = params.get("ids");
+ let event = params.get("event");
+ if (ids) {
+ let scriptIds = ids.split(",");
+ runScripts(scriptIds, event, path);
}
- }
+ })();
})();
+function runScripts(scriptIds, event, path) {
+ for (let id of scriptIds) {
+ // import and run script with event name
+ let scriptPath = `${path}/${id}.js`;
+ import(scriptPath).then(({ default: script }) => {
+ try {
+ if (
+ event in script &&
+ typeof script[event] === "function" &&
+ checkWillRun(script)
+ ) {
+ console.log("> Useful-script: Run script " + id + " " + event);
+ script[event]();
+ }
+ } catch (e) {
+ console.log("ERROR run script " + id + " " + event, e);
+ }
+ });
+ }
+}
+
function checkWillRun(script) {
let url = location.href;
let hasWhiteList = script.whiteList?.length > 0;
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index 56b22086..cc38f707 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -11,20 +11,20 @@ export default {
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentStart: () => {
- // const WebSocketOrig = window.WebSocket;
+ const WebSocketOrig = window.WebSocket;
- // window.WebSocket = function fakeConstructor(dt, config) {
- // const websocket_instant = new WebSocketOrig(dt, config);
- // websocket_instant.addEventListener("message", async function (achunk) {
- // // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
- // // Do something here
- // // console.log(utf8_str);
- // });
- // return websocket_instant;
- // };
+ window.WebSocket = function fakeConstructor(dt, config) {
+ const websocket_instant = new WebSocketOrig(dt, config);
+ websocket_instant.addEventListener("message", async function (achunk) {
+ // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+ // Do something here
+ // console.log(utf8_str);
+ });
+ return websocket_instant;
+ };
- // window.WebSocket.prototype = WebSocketOrig.prototype;
- // window.WebSocket.prototype.constructor = window.WebSocket;
+ window.WebSocket.prototype = WebSocketOrig.prototype;
+ window.WebSocket.prototype.constructor = window.WebSocket;
// window.addEventListener(
// "message",
@@ -34,19 +34,21 @@ export default {
// !1
// );
- let emptyFunc = void 0;
- Object.defineProperty(window, "__d", {
- get: () => emptyFunc,
- set: (i) => {
- const c = new Proxy(i, {
- apply: async function (moduleName, dependencies, args) {
- console.log(arguments);
- return moduleName(...args);
- },
- });
- emptyFunc = c;
- },
- });
+ console.log(window.__d);
+ // let emptyFunc = void 0;
+ // Object.defineProperty(window, "__d", {
+ // get: () => emptyFunc,
+ // set: (i) => {
+ // const c = new Proxy(i, {
+ // apply: async function (moduleName, dependencies, args) {
+ // console.log(arguments);
+ // // return moduleName(...args);
+ // return i.apply(this, arguments);
+ // },
+ // });
+ // emptyFunc = c;
+ // },
+ // });
},
onDocumentIdle: () => {
diff --git a/scripts/helpers/utils.js b/scripts/helpers/utils.js
index bc188d2c..d4567aa9 100644
--- a/scripts/helpers/utils.js
+++ b/scripts/helpers/utils.js
@@ -1,10 +1,3 @@
-export async function sendEventToBackground(data) {
- // console.log("... Sending ", data, " to background...");
- const response = await chrome.runtime.sendMessage(data);
- // console.log("> ", data, " sent to background successfully", response);
- return response;
-}
-
export async function sendEventToTab(tabId, data) {
console.log("... Sending ", data, " to tab...");
const response = await chrome.tabs.sendMessage(tabId, data);
diff --git a/scripts/injectScriptToWebsite.js b/scripts/injectScriptToWebsite.js
index 17e5f135..d886fdc3 100644
--- a/scripts/injectScriptToWebsite.js
+++ b/scripts/injectScriptToWebsite.js
@@ -8,7 +8,7 @@ export default {
en: "",
vi: "",
},
- onClick: function () {
+ onClick: function () {
// https://stackoverflow.com/a/26573284
function injectScriptAndUse(src) {
var script = document.createElement("script");
@@ -46,3 +46,8 @@ export default {
}
},
};
+
+function backup() {
+ // https://stackoverflow.com/a/38840724/11898496
+ // Script loader: https://plnkr.co/edit/b9O19f?p=preview&preview
+}
From e24ca2d2d99455ff5d97fa3e4972e56b3b5abd51 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 03:06:14 +0700
Subject: [PATCH 103/164] wip
---
scripts/content-scripts/document_start.js | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 06880c2e..0c5c9900 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -11,7 +11,7 @@
s.defer = false;
s.addEventListener("load", () => {
console.log("Useful-scripts injected " + src);
- // s.remove();
+ s.remove();
});
s.src = src;
let head =
@@ -22,17 +22,6 @@
// (document.head || document.documentElement).prepend(s);
}
- console.log(window.__d);
-
- // function injectScript(url) {
- // var s = document.createElement("script");
- // s.src = url;
- // s.async = !1;
- // (document.head || document.documentElement).appendChild(s);
- // console.log("Useful-scripts injected " + url);
- // s.remove();
- // }
-
let key = "activeScripts";
let ids = (await chrome.storage.sync.get([key]))?.[key];
let search = new URLSearchParams({
From 6954d3742888f3f193848e798ab4d5452844e365 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 03:12:00 +0700
Subject: [PATCH 104/164] wip
---
scripts/fb_revealDeletedMessages.js | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index cc38f707..87298334 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -11,20 +11,19 @@ export default {
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentStart: () => {
- const WebSocketOrig = window.WebSocket;
+ // const WebSocketOrig = window.WebSocket;
+ // window.WebSocket = function fakeConstructor(dt, config) {
+ // const websocket_instant = new WebSocketOrig(dt, config);
+ // websocket_instant.addEventListener("message", async function (achunk) {
+ // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+ // // Do something here
+ // console.log(utf8_str);
+ // });
+ // return websocket_instant;
+ // };
- window.WebSocket = function fakeConstructor(dt, config) {
- const websocket_instant = new WebSocketOrig(dt, config);
- websocket_instant.addEventListener("message", async function (achunk) {
- // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
- // Do something here
- // console.log(utf8_str);
- });
- return websocket_instant;
- };
-
- window.WebSocket.prototype = WebSocketOrig.prototype;
- window.WebSocket.prototype.constructor = window.WebSocket;
+ // window.WebSocket.prototype = WebSocketOrig.prototype;
+ // window.WebSocket.prototype.constructor = window.WebSocket;
// window.addEventListener(
// "message",
@@ -34,7 +33,7 @@ export default {
// !1
// );
- console.log(window.__d);
+ // console.log(window.__d);
// let emptyFunc = void 0;
// Object.defineProperty(window, "__d", {
// get: () => emptyFunc,
From 391fa76c0e895bc6296ef2f9e4e21a9d70cda2b9 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 16:06:15 +0700
Subject: [PATCH 105/164] wip
---
scripts/content-scripts/document_end.js | 2 +-
scripts/content-scripts/document_idle.js | 2 +-
scripts/content-scripts/document_start.js | 31 +++--
scripts/content-scripts/run_scripts.js | 28 ++--
scripts/fb_downloadWatchingVideo.js | 4 +-
scripts/fb_invisible_message.js | 8 +-
scripts/fb_revealDeletedMessages.js | 162 +++++++++++++++-------
7 files changed, 151 insertions(+), 86 deletions(-)
diff --git a/scripts/content-scripts/document_end.js b/scripts/content-scripts/document_end.js
index 3131f50c..876935cc 100644
--- a/scripts/content-scripts/document_end.js
+++ b/scripts/content-scripts/document_end.js
@@ -1,6 +1,6 @@
(async () => {
let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key];
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_idle.js b/scripts/content-scripts/document_idle.js
index 605a8b4f..e9607fbc 100644
--- a/scripts/content-scripts/document_idle.js
+++ b/scripts/content-scripts/document_idle.js
@@ -1,6 +1,6 @@
(async () => {
let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key];
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 0c5c9900..2a23d311 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -4,13 +4,20 @@
(async () => {
// https://stackoverflow.com/a/8578840/11898496
- function injectScript(src) {
+ function injectScript(
+ src,
+ onload,
+ type = "text/javascript",
+ async = false,
+ defer = false
+ ) {
let s = document.createElement("script");
- s.type = "text/javascript";
- s.async = false;
- s.defer = false;
+ s.type = type;
+ s.async = async;
+ s.defer = defer;
s.addEventListener("load", () => {
console.log("Useful-scripts injected " + src);
+ onload?.();
s.remove();
});
s.src = src;
@@ -22,12 +29,18 @@
// (document.head || document.documentElement).prepend(s);
}
+ injectScript(
+ chrome.runtime.getURL(
+ "/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
+ )
+ );
+
let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key];
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
let search = new URLSearchParams({
ids: ids,
- path: chrome.runtime.getURL("/scripts/"),
event: "onDocumentStart",
+ path: chrome.runtime.getURL("/scripts/"),
}).toString();
injectScript(
@@ -35,12 +48,6 @@
"?" +
search
);
-
- injectScript(
- chrome.runtime.getURL(
- "/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
- )
- );
})();
(async () => {
diff --git a/scripts/content-scripts/run_scripts.js b/scripts/content-scripts/run_scripts.js
index 3341b78a..ce24213b 100644
--- a/scripts/content-scripts/run_scripts.js
+++ b/scripts/content-scripts/run_scripts.js
@@ -7,14 +7,9 @@
// Kể cả việc nó đã được viết ở file khác (utils, helper, ...)
// Quá trình maintain sẽ khó hơn 1 chút, nhưng script sẽ chạy chính xác hơn
-console.log(window.__d);
-
(() => {
- const params = new URLSearchParams(
- document.currentScript.src.split("?")?.[1]
- );
-
- let path = params.get("path");
+ let search = new URLSearchParams(getCurrentScriptSrc().split("?")?.[1]);
+ let path = search.get("path");
// run script on receive event
window.addEventListener("ufs-run-page-scripts", ({ detail }) => {
@@ -22,20 +17,29 @@ console.log(window.__d);
runScripts(ids, event, path);
});
- // auto run onDocumentStart
+ // auto run initial event defined in URL search params
(() => {
- let ids = params.get("ids");
- let event = params.get("event");
- if (ids) {
+ let ids = search.get("ids");
+ let event = search.get("event");
+ if (ids && event) {
let scriptIds = ids.split(",");
runScripts(scriptIds, event, path);
}
})();
})();
+function getCurrentScriptSrc() {
+ try {
+ // cannot get currentScript if script type is module: https://stackoverflow.com/a/45845801/11898496
+ // return import.meta.url;
+ throw false;
+ } catch (e) {
+ return document.currentScript.src;
+ }
+}
+
function runScripts(scriptIds, event, path) {
for (let id of scriptIds) {
- // import and run script with event name
let scriptPath = `${path}/${id}.js`;
import(scriptPath).then(({ default: script }) => {
try {
diff --git a/scripts/fb_downloadWatchingVideo.js b/scripts/fb_downloadWatchingVideo.js
index 30adc3bf..49745f0f 100644
--- a/scripts/fb_downloadWatchingVideo.js
+++ b/scripts/fb_downloadWatchingVideo.js
@@ -9,8 +9,8 @@ export default {
vi: "Tải video fb đang xem",
},
description: {
- en: "Download facebook video that you are watching (watch/story/comment)",
- vi: "Tải video facebook bạn đang xem (watch/story/comment)",
+ en: "Download any facebook video that you are watching (watch/story/comment/reel/chat)",
+ vi: "Tải bất kỳ video facebook nào mà bạn đang xem (watch/story/comment/reel/chat/bình luận/tin nhắn)",
},
whiteList: ["https://www.facebook.com/*"],
diff --git a/scripts/fb_invisible_message.js b/scripts/fb_invisible_message.js
index cea819f8..62fdb0dd 100644
--- a/scripts/fb_invisible_message.js
+++ b/scripts/fb_invisible_message.js
@@ -5,8 +5,8 @@ export default {
vi: "Tin nhắn tàng hình facebook",
},
description: {
- en: "Add character > before message to send invisible message",
- vi: "Thêm ký tự > trước tin nhắn để tạo tin nhắn tàng hình",
+ en: "Add the > character before writing a message to send hidden messages.\n\nYour friends needs to install this extension and enable it to view hidden messages.",
+ vi: "Thêm ký tự > trước tin nhắn để tạo tin nhắn tàng hình.\n\nChỉ xem được tin nhắn tàng hình khi cài extension và bật chức năng này.",
},
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
@@ -130,7 +130,6 @@ export default {
};
const checkEncode = (s) => {
- //console.log(s);
if (s?.[0] != PADDING) return false;
s = s.substr(1);
for (let c of s) if (CHARS_MAP[c] === undefined) return false;
@@ -143,8 +142,6 @@ export default {
const MWV2ChatTextMakeOrig = MWV2ChatText.make;
MWV2ChatText.make = function (a) {
let text = a?.message?.text;
- console.log(a);
- if (a.message.text.includes("thu hồi")) console.log("here");
if (checkEncode(text))
a.message.text = `[Encrypted]: ${decode(text)}`;
return MWV2ChatTextMakeOrig.apply(this, arguments);
@@ -163,7 +160,6 @@ export default {
payload.tasks = payload.tasks.map((task) => {
let payload = JSON.parse(task.payload);
- console.log(payload);
if (!payload || !payload.text) return task;
if (payload.text.length > 1 && payload.text[0] === ">") {
payload.text = encode(payload.text.substr(1));
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index 87298334..04167845 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -21,10 +21,8 @@ export default {
// });
// return websocket_instant;
// };
-
// window.WebSocket.prototype = WebSocketOrig.prototype;
// window.WebSocket.prototype.constructor = window.WebSocket;
-
// window.addEventListener(
// "message",
// function (t) {
@@ -33,68 +31,128 @@ export default {
// !1
// );
- // console.log(window.__d);
- // let emptyFunc = void 0;
- // Object.defineProperty(window, "__d", {
- // get: () => emptyFunc,
- // set: (i) => {
- // const c = new Proxy(i, {
- // apply: async function (moduleName, dependencies, args) {
- // console.log(arguments);
- // // return moduleName(...args);
- // return i.apply(this, arguments);
- // },
- // });
- // emptyFunc = c;
- // },
- // });
+ let emptyFunc = void 0;
+ Object.defineProperty(window, "__d", {
+ get: () => emptyFunc,
+ set: (i) => {
+ const c = new Proxy(i, {
+ apply: function (target, thisArg, arg) {
+ console.log(thisArg);
+ return target(...arg);
+ },
+ });
+ emptyFunc = c;
+ },
+ });
},
onDocumentIdle: () => {
- // MWV2ChatImage.bs
- requireLazy(["MWV2ChatUnsentMessage.bs"], (MWV2ChatUnsentMessage) => {
- const MWV2ChatUnsentMessageOrig = MWV2ChatUnsentMessage.make;
+ // tất cả loại tin nhắn đều được bao bọc bởi:
+ // MWPBaseMessage.bs
+ // MWMessageListAttachment.bs
+ // MWMessageListAttachmentContainer.bs
+
+ let key = "ufs_reveal_deleted_fb_messages";
+ let savedMessages = JSON.parse(localStorage.getItem(key) ?? "[]");
+
+ console.log(
+ "Load " + savedMessages.length + " messages from localStorage."
+ );
- MWV2ChatUnsentMessage.make = function (a) {
- if (a) {
- let outgoing = a.outgoing;
- let {
- isUnsent,
- messageId,
- threadKey,
- offlineThreadingId,
- displayedContentTypes,
- senderId,
- } = a.message;
+ requireLazy(
+ ["MWV2ChatUnsentMessage.bs", "MWPBaseMessage.bs", "MqttProtocolClient"],
+ (MWV2ChatUnsentMessage, MWPBaseMessage, MqttProtocolClient) => {
+ // Override unsent message component
+ const MWV2ChatUnsentMessageOrig = MWV2ChatUnsentMessage.make;
+ MWV2ChatUnsentMessage.make = function (a) {
+ if (a) {
+ let outgoing = a.outgoing;
+ let {
+ isUnsent,
+ messageId,
+ threadKey,
+ offlineThreadingId,
+ displayedContentTypes,
+ senderId,
+ } = a.message;
- if (isUnsent) {
- threadKey =
- UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(threadKey);
- senderId =
- UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(senderId);
+ if (isUnsent) {
+ threadKey =
+ UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(
+ threadKey
+ );
+ senderId =
+ UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(senderId);
- a.message.isUnsent = false;
- a.message.text = "[Hacked]: thu hồi nè";
+ a.message.isUnsent = false;
+ a.message.text = "[Hacked]: thu hồi nè";
- console.log(
- "Tin nhắn thu hồi từ " + senderId + " trong " + threadKey,
- a
- );
+ console.log(
+ "Tin nhắn thu hồi từ " + senderId + " trong " + threadKey,
+ a
+ );
+ }
}
- }
- return MWV2ChatUnsentMessageOrig.apply(this, arguments);
- };
- });
+ return MWV2ChatUnsentMessageOrig.apply(this, arguments);
+ };
+
+ // Listen for chat event
+ const MqttProtocolClientOrig = MqttProtocolClient.prototype.publish;
+ MqttProtocolClient.prototype.publish = function () {
+ let b = arguments[1];
+ console.log(b);
+ // if (b && b.includes('\\\\\\"text\\\\\\":')) {
+ // (function () {
+ // b = JSON.parse(b);
+ // if (!b || !b.payload) return;
+ // let payload = JSON.parse(b.payload);
+ // if (!payload || !payload.tasks) return;
+
+ // payload.tasks = payload.tasks.map((task) => {
+ // let payload = JSON.parse(task.payload);
+ // if (!payload || !payload.text) return task;
+ // if (payload.text.length > 1 && payload.text[0] === ">") {
+ // payload.text = encode(payload.text.substr(1));
+ // }
+ // task.payload = JSON.stringify(payload);
+ // return task;
+ // });
+
+ // b.payload = JSON.stringify(payload);
+ // b = JSON.stringify(b);
+ // })();
+ // arguments[1] = b;
+ // }
+ return MqttProtocolClientOrig.apply(this, arguments);
+ };
+ }
+ );
// Test who is typing
+ // MWChatTypingIndicator.bs
+ // MWPTypingIndicators.bs
requireLazy(["LSUpdateTypingIndicator"], (LSUpdateTypingIndicator) => {
- const LSUpdateTypingIndicatorOrig = LSUpdateTypingIndicator;
- console.log("abc");
+ alert("abc");
+ // const LSUpdateTypingIndicatorOrig = LSUpdateTypingIndicator;
+
+ // LSUpdateTypingIndicator = function () {
+ // console.log(arguments);
+ // return LSUpdateTypingIndicatorOrig.apply(this, arguments);
+ // };
+ });
- LSUpdateTypingIndicator = function (...args) {
- console.log(args);
- return LSUpdateTypingIndicatorOrig.apply(this, arguments);
- };
+ let emptyFunc = void 0;
+ Object.defineProperty(window, "__d", {
+ get: () => emptyFunc,
+ set: (i) => {
+ const c = new Proxy(i, {
+ apply: function (target, thisArg, arg) {
+ console.log(thisArg);
+ return target(...arg);
+ },
+ });
+ emptyFunc = c;
+ },
});
},
};
From 05a7cc05e421d6b799961ba0fce3154278aa5f9c Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 20:43:13 +0700
Subject: [PATCH 106/164] wip
---
empty_script.js | 8 +-
popup/helpers/lang.js | 16 ++--
popup/helpers/storage.js | 48 +++++-----
popup/index.js | 9 +-
scripts/background-scripts/index.js | 106 +++++++++++-----------
scripts/content-scripts/document_end.js | 3 +-
scripts/content-scripts/document_idle.js | 3 +-
scripts/content-scripts/document_start.js | 7 +-
scripts/fb_revealDeletedMessages.js | 66 +++++---------
scripts/fb_toggleNewFeed.js | 15 +--
scripts/helpers/constants.js | 6 ++
scripts/helpers/utils.js | 40 ++++----
12 files changed, 153 insertions(+), 174 deletions(-)
diff --git a/empty_script.js b/empty_script.js
index 9d4a7766..42d6727e 100644
--- a/empty_script.js
+++ b/empty_script.js
@@ -11,10 +11,10 @@ export default {
blackList: [],
whiteList: [],
- // run (if enable autorun) in web page context
- onDocumentStart: () => {},
- onDocumentEnd: () => {},
- onDocumentIdle: () => {},
+ // path to script file that run (if enable autorun) in web page context
+ onDocumentStart: "",
+ onDocumentEnd: "",
+ onDocumentIdle: "",
// run onclick in extension-popup-page context
onClickExtension: () => {},
diff --git a/popup/helpers/lang.js b/popup/helpers/lang.js
index c7564ece..d4cb7374 100644
--- a/popup/helpers/lang.js
+++ b/popup/helpers/lang.js
@@ -7,29 +7,29 @@ export const LANG = {
let currentLangKey = null;
-export async function setLang(lang) {
+export function setLang(lang) {
if (lang in LANG) {
currentLangKey = lang;
- await langSaver.set(lang);
+ langSaver.set(lang);
} else {
alert("WRONG LANG KEY " + lang);
}
}
-export async function toggleLang() {
+export function toggleLang() {
let newLang = currentLangKey === LANG.vi ? LANG.en : LANG.vi;
currentLangKey = newLang;
- await setLang(newLang);
+ setLang(newLang);
return newLang;
}
-export async function getLang() {
- if (!currentLangKey) currentLangKey = await langSaver.get(LANG.vi);
+export function getLang() {
+ if (!currentLangKey) currentLangKey = langSaver.get(LANG.vi);
return currentLangKey;
}
-export async function getFlag() {
- return "./assets/flag-" + (await getLang()) + ".png";
+export function getFlag() {
+ return "./assets/flag-" + getLang() + ".png";
}
export function t(o) {
diff --git a/popup/helpers/storage.js b/popup/helpers/storage.js
index c616f4bd..de159001 100644
--- a/popup/helpers/storage.js
+++ b/popup/helpers/storage.js
@@ -1,48 +1,50 @@
import { allScripts } from "../../scripts/index.js";
-import { localStorage } from "../../scripts/helpers/utils.js";
const createVariableSaver = (key, defaultValue = null) => ({
- set: async (data) => {
- await localStorage.set(key, data);
+ set: (data) => {
+ localStorage.setItem(key, JSON.stringify(data));
},
- get: async (_defaultValue) => {
- return await localStorage.get(key, _defaultValue || defaultValue);
+ get: (_defaultValue) => {
+ return (
+ JSON.parse(localStorage.getItem(key) || "null") ??
+ _defaultValue ??
+ defaultValue
+ );
},
});
const createScriptsSaver = (key, addToHead = true) => {
- const getIds = async () =>
- (await localStorage.get(key, [])).filter(
+ const getIds = () =>
+ JSON.parse(localStorage.getItem(key) ?? "[]").filter(
(savedScriptId) => savedScriptId in allScripts
);
- const has = async (script) => {
- let current = await getIds();
+ const has = (script) => {
+ let current = getIds();
let exist = current.findIndex((id) => id === script.id) >= 0;
return exist;
};
- const add = async (script) => {
- let current = await getIds();
+ const add = (script) => {
+ let current = getIds();
let newList = current.filter((id) => id != script.id); // remove duplicate
if (addToHead) newList.unshift(script.id); // only save script id
else newList.push(script.id);
- await localStorage.set(key, newList);
+ localStorage.setItem(key, JSON.stringify(newList));
};
- const remove = async (script) => {
- let current = await getIds();
+ const remove = (script) => {
+ let current = getIds();
let newList = current.filter((id) => id !== script.id);
- await localStorage.set(key, newList);
+ localStorage.setItem(key, JSON.stringify(newList));
console.log("removed ", script);
};
- const toggle = async (script) => {
- let exist = await has(script);
- if (exist) await remove(script);
- else await add(script);
+ const toggle = (script) => {
+ let exist = has(script);
+ if (exist) remove(script);
+ else add(script);
};
- const clear = async () => {
- await localStorage.set(key, []);
+ const clear = () => {
+ localStorage.setItem(key, "[]");
};
- const get = async () =>
- (await getIds()).map((savedScriptId) => allScripts[savedScriptId]);
+ const get = () => getIds().map((savedScriptId) => allScripts[savedScriptId]);
return { add, remove, has, toggle, clear, getIds, get };
};
diff --git a/popup/index.js b/popup/index.js
index 724308ea..58c84937 100644
--- a/popup/index.js
+++ b/popup/index.js
@@ -34,11 +34,11 @@ const searchInput = document.querySelector(".search input");
const searchFound = document.querySelector(".search .searchFound");
async function initLanguage() {
- flagImg.setAttribute("src", await getFlag());
+ flagImg.setAttribute("src", getFlag());
flagImg.onclick = async () => {
- await toggleLang();
- flagImg.setAttribute("src", await getFlag());
+ toggleLang();
+ flagImg.setAttribute("src", getFlag());
// reset UI
createTabs();
@@ -246,7 +246,8 @@ function createScriptButton(script, isFavorite = false) {
addFavoriteBtn.onclick = (e) => {
e.stopPropagation();
e.preventDefault();
- favoriteScriptsSaver.toggle(script).then(createTabs);
+ favoriteScriptsSaver.toggle(script);
+ createTabs();
};
button.appendChild(addFavoriteBtn);
diff --git a/scripts/background-scripts/index.js b/scripts/background-scripts/index.js
index bccfae6b..8f808be1 100644
--- a/scripts/background-scripts/index.js
+++ b/scripts/background-scripts/index.js
@@ -1,58 +1,60 @@
// import { allScripts } from "../index.js";
-// import { Events } from "../helpers/constants.js";
-// import { MsgType } from "../helpers/constants.js";
-// import {
-// checkBlackWhiteList,
-// isActiveScript,
-// isEmptyFunction,
-// isFunction,
-// runScriptInTab,
-// } from "../helpers/utils.js";
-
-// const CACHED = {
-// runCount: {},
-// };
-
-// chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
-// console.log("> Received message:", message, sender?.tab?.url);
-
-// switch (message.type) {
-// case MsgType.runScript:
-// runScript(message.event, sender.tab);
-// break;
-// }
-// });
-
-// async function runScript(event, tab) {
-// let funcName = event,
-// tabId = tab.id,
-// url = tab.url;
-
-// if (!(tabId in CACHED.runCount) || event === Events.onDocumentStart)
-// CACHED.runCount[tabId] = 0;
-
-// for (let script of Object.values(allScripts)) {
-// try {
-// if (!checkBlackWhiteList(script, url)) continue;
-
-// let func = script[funcName];
-// if (isFunction(func) && !isEmptyFunction(func)) {
-// let isActive = (await isActiveScript(script.id)) ?? true;
-// if (isActive) {
-// runScriptInTab({ func, tabId });
-// console.log(
-// `%c > Run ${script.id} ${funcName} in ${url}`,
-// "background: #222; color: #bada55"
-// );
-// CACHED.runCount[tabId]++;
-// }
-// }
-// } catch (e) {
-// console.log("ERROR at script " + script?.id, e);
-// }
+// import { Events, EventMap } from "../helpers/constants.js";
+
+// chrome.scripting.registerContentScripts(
+// [
+// {
+// id: "ufs_global_webpage_context",
+// allFrames: true,
+// matches: ["
"],
+// js: ["scripts/content-scripts/scripts/ufs_global_webpage_context.js"],
+// runAt: "document_start",
+// world: chrome.scripting.ExecutionWorld.MAIN,
+// },
+// ],
+// () => {
+// console.log("Register content script DONE.");
// }
+// );
+
+// (() => {
+// let scripts = Object.values(allScripts)
+// .map((s) =>
+// Object.values(Events).map((e) => {
+// if (!e in s) return null;
+// let isString = typeof s[e] === "string";
+// let isArray = Array.isArray(s[e]);
+// if (!(isString || isArray)) return null;
+
+// let js = isString ? [getscriptURL(s[e])] : s[e].map(getscriptURL);
+
+// // add global helper to head of array
+// js.unshift(
+// getscriptURL("content-scripts/scripts/ufs_global_webpage_context.js")
+// );
+// return {
+// id: s.id + "-" + e,
+// allFrames: true,
+// matches: s.whiteList || [""],
+// excludeMatches: s.blackList || [],
+// js: js,
+// runAt: EventMap[e],
+// world: chrome.scripting.ExecutionWorld.MAIN,
+// };
+// })
+// )
+// .flat()
+// .filter((_) => _);
+
+// console.log(scripts);
+
+// chrome.scripting.registerContentScripts(scripts, () => {
+// console.log("Register content script DONE.");
+// });
+// })();
-// updateBadge(tabId, CACHED.runCount[tabId]);
+// function getscriptURL(fileName) {
+// return "scripts/" + fileName;
// }
// function updateBadge(tabId, text = "", bgColor = "#666") {
diff --git a/scripts/content-scripts/document_end.js b/scripts/content-scripts/document_end.js
index 876935cc..0b1be793 100644
--- a/scripts/content-scripts/document_end.js
+++ b/scripts/content-scripts/document_end.js
@@ -1,6 +1,5 @@
(async () => {
- let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
+ let ids = localStorage.getItem("activeScripts") || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_idle.js b/scripts/content-scripts/document_idle.js
index e9607fbc..1f8f92e9 100644
--- a/scripts/content-scripts/document_idle.js
+++ b/scripts/content-scripts/document_idle.js
@@ -1,6 +1,5 @@
(async () => {
- let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
+ let ids = localStorage.getItem("activeScripts") || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 2a23d311..d5653e87 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -34,13 +34,12 @@
"/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
)
);
-
- let key = "activeScripts";
- let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
+ let ids = localStorage.getItem("activeScripts") || "";
+ let path = chrome.runtime.getURL("/scripts/");
let search = new URLSearchParams({
ids: ids,
+ path: path,
event: "onDocumentStart",
- path: chrome.runtime.getURL("/scripts/"),
}).toString();
injectScript(
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index 04167845..09d867e8 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -11,18 +11,18 @@ export default {
whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
onDocumentStart: () => {
- // const WebSocketOrig = window.WebSocket;
- // window.WebSocket = function fakeConstructor(dt, config) {
- // const websocket_instant = new WebSocketOrig(dt, config);
- // websocket_instant.addEventListener("message", async function (achunk) {
- // const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
- // // Do something here
- // console.log(utf8_str);
- // });
- // return websocket_instant;
- // };
- // window.WebSocket.prototype = WebSocketOrig.prototype;
- // window.WebSocket.prototype.constructor = window.WebSocket;
+ const WebSocketOrig = window.WebSocket;
+ window.WebSocket = function fakeConstructor(dt, config) {
+ const websocket_instant = new WebSocketOrig(dt, config);
+ websocket_instant.addEventListener("message", async function (achunk) {
+ const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+ // Do something here
+ console.log(utf8_str);
+ });
+ return websocket_instant;
+ };
+ window.WebSocket.prototype = WebSocketOrig.prototype;
+ window.WebSocket.prototype.constructor = window.WebSocket;
// window.addEventListener(
// "message",
// function (t) {
@@ -30,22 +30,20 @@ export default {
// },
// !1
// );
-
- let emptyFunc = void 0;
- Object.defineProperty(window, "__d", {
- get: () => emptyFunc,
- set: (i) => {
- const c = new Proxy(i, {
- apply: function (target, thisArg, arg) {
- console.log(thisArg);
- return target(...arg);
- },
- });
- emptyFunc = c;
- },
- });
+ // let emptyFunc = void 0;
+ // Object.defineProperty(window, "__d", {
+ // get: () => emptyFunc,
+ // set: (i) => {
+ // const c = new Proxy(i, {
+ // apply: function (target, thisArg, arg) {
+ // console.log(thisArg);
+ // return target(...arg);
+ // },
+ // });
+ // emptyFunc = c;
+ // },
+ // });
},
-
onDocumentIdle: () => {
// tất cả loại tin nhắn đều được bao bọc bởi:
// MWPBaseMessage.bs
@@ -140,19 +138,5 @@ export default {
// return LSUpdateTypingIndicatorOrig.apply(this, arguments);
// };
});
-
- let emptyFunc = void 0;
- Object.defineProperty(window, "__d", {
- get: () => emptyFunc,
- set: (i) => {
- const c = new Proxy(i, {
- apply: function (target, thisArg, arg) {
- console.log(thisArg);
- return target(...arg);
- },
- });
- emptyFunc = c;
- },
- });
},
};
diff --git a/scripts/fb_toggleNewFeed.js b/scripts/fb_toggleNewFeed.js
index 03b652f7..cbc6b065 100644
--- a/scripts/fb_toggleNewFeed.js
+++ b/scripts/fb_toggleNewFeed.js
@@ -10,7 +10,7 @@ export default {
},
whiteList: ["https://www.facebook.com/*"],
- onDocumentStart: function () {
+ onDocumentStart: () => {
UsefulScriptGlobalWebpageContext.DOM.onElementsVisible(
"[role='feed'], [role='main']",
(nodes) =>
@@ -19,19 +19,6 @@ export default {
);
},
- // onDocumentEnd: function () {
- // [
- // ...Array.from(document.querySelectorAll("[role='feed'], [role='main']")),
- // document.querySelector("#watch_feed"),
- // document.querySelector("#ssrb_stories_start")?.parentElement,
- // document.querySelector("#ssrb_feed_start")?.parentElement,
- // ].forEach((el) => {
- // if (el) {
- // el.style.display = "none";
- // } else console.log("ERROR: Cannot find element");
- // });
- // },
-
onClick: async function () {
[
...Array.from(document.querySelectorAll("[role='feed'], [role='main']")),
diff --git a/scripts/helpers/constants.js b/scripts/helpers/constants.js
index 3a796934..c9366e14 100644
--- a/scripts/helpers/constants.js
+++ b/scripts/helpers/constants.js
@@ -14,3 +14,9 @@ export const Events = {
onDocumentIdle: "onDocumentIdle",
onDocumentEnd: "onDocumentEnd",
};
+
+export const EventMap = {
+ [Events.onDocumentStart]: "document_start",
+ [Events.onDocumentIdle]: "document_idle",
+ [Events.onDocumentEnd]: "document_end",
+};
diff --git a/scripts/helpers/utils.js b/scripts/helpers/utils.js
index d4567aa9..8e64fb91 100644
--- a/scripts/helpers/utils.js
+++ b/scripts/helpers/utils.js
@@ -8,40 +8,40 @@ export async function sendEventToTab(tabId, data) {
// #region Storage Utils
// https://developer.chrome.com/docs/extensions/reference/storage/
-export const localStorage = {
- set: async (key, value) => {
- await chrome.storage.sync.set({ [key]: value });
- return value;
- },
- get: async (key, defaultValue = "") => {
- let result = await chrome.storage.sync.get([key]);
- return result[key] || defaultValue;
- },
-};
+// export const localStorage = {
+// set: async (key, value) => {
+// await chrome.storage.sync.set({ [key]: value });
+// return value;
+// },
+// get: async (key, defaultValue = "") => {
+// let result = await chrome.storage.sync.get([key]);
+// return result[key] || defaultValue;
+// },
+// };
const listActiveScriptsKey = "activeScripts";
-export async function setActiveScript(scriptId, isActive = true) {
- let list = await getAllActiveScriptId();
+export function setActiveScript(scriptId, isActive = true) {
+ let list = getAllActiveScriptId();
if (isActive) list.push(scriptId);
else list = list.filter((_) => _ != scriptId);
list = list.filter((_) => _);
- await localStorage.set(listActiveScriptsKey, list.join(","));
+ localStorage.setItem(listActiveScriptsKey, list.join(","));
return list;
}
-export async function isActiveScript(scriptId) {
- let currentList = await getAllActiveScriptId();
+export function isActiveScript(scriptId) {
+ let currentList = getAllActiveScriptId();
return currentList.find((_) => _ == scriptId) != null;
}
-export async function getAllActiveScriptId() {
- return (await localStorage.get(listActiveScriptsKey, "")).split(",");
+export function getAllActiveScriptId() {
+ return (localStorage.getItem(listActiveScriptsKey) || "").split(",");
}
-export async function toggleActiveScript(scriptId) {
- let current = await isActiveScript(scriptId);
+export function toggleActiveScript(scriptId) {
+ let current = isActiveScript(scriptId);
let newVal = !current;
- await setActiveScript(scriptId, newVal);
+ setActiveScript(scriptId, newVal);
return newVal;
}
From 1c443c5e579e0fba4ee0dd93fa26d57331d260a0 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Sun, 18 Dec 2022 23:14:32 +0700
Subject: [PATCH 107/164] fix
---
scripts/content-scripts/document_end.js | 3 ++-
scripts/content-scripts/document_idle.js | 3 ++-
scripts/content-scripts/document_start.js | 22 +++++++++++++---------
scripts/content-scripts/run_scripts.js | 22 +++++++++++-----------
scripts/helpers/utils.js | 4 +++-
5 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/scripts/content-scripts/document_end.js b/scripts/content-scripts/document_end.js
index 0b1be793..876935cc 100644
--- a/scripts/content-scripts/document_end.js
+++ b/scripts/content-scripts/document_end.js
@@ -1,5 +1,6 @@
(async () => {
- let ids = localStorage.getItem("activeScripts") || "";
+ let key = "activeScripts";
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_idle.js b/scripts/content-scripts/document_idle.js
index 1f8f92e9..e9607fbc 100644
--- a/scripts/content-scripts/document_idle.js
+++ b/scripts/content-scripts/document_idle.js
@@ -1,5 +1,6 @@
(async () => {
- let ids = localStorage.getItem("activeScripts") || "";
+ let key = "activeScripts";
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
window.dispatchEvent(
new CustomEvent("ufs-run-page-scripts", {
detail: {
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index d5653e87..3443fa3e 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -34,18 +34,22 @@
"/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
)
);
- let ids = localStorage.getItem("activeScripts") || "";
+
+ let key = "activeScripts";
+ let ids = (await chrome.storage.sync.get([key]))?.[key] || "";
let path = chrome.runtime.getURL("/scripts/");
- let search = new URLSearchParams({
- ids: ids,
- path: path,
- event: "onDocumentStart",
- }).toString();
+
+ localStorage.setItem(
+ "ufs-auto-run-scripts",
+ JSON.stringify({
+ ids: ids,
+ path: path,
+ event: "onDocumentStart",
+ })
+ );
injectScript(
- chrome.runtime.getURL("/scripts/content-scripts/run_scripts.js") +
- "?" +
- search
+ chrome.runtime.getURL("/scripts/content-scripts/run_scripts.js")
);
})();
diff --git a/scripts/content-scripts/run_scripts.js b/scripts/content-scripts/run_scripts.js
index ce24213b..310a12f3 100644
--- a/scripts/content-scripts/run_scripts.js
+++ b/scripts/content-scripts/run_scripts.js
@@ -8,8 +8,12 @@
// Quá trình maintain sẽ khó hơn 1 chút, nhưng script sẽ chạy chính xác hơn
(() => {
- let search = new URLSearchParams(getCurrentScriptSrc().split("?")?.[1]);
- let path = search.get("path");
+ // let search = new URLSearchParams(getCurrentScriptSrc().split("?")?.[1]);
+ // let path = search.get("path");
+
+ let { path, ids, event } = JSON.parse(
+ localStorage.getItem("ufs-auto-run-scripts") ?? "{}"
+ );
// run script on receive event
window.addEventListener("ufs-run-page-scripts", ({ detail }) => {
@@ -18,14 +22,10 @@
});
// auto run initial event defined in URL search params
- (() => {
- let ids = search.get("ids");
- let event = search.get("event");
- if (ids && event) {
- let scriptIds = ids.split(",");
- runScripts(scriptIds, event, path);
- }
- })();
+ if (ids && event) {
+ let scriptIds = ids.split(",");
+ runScripts(scriptIds, event, path);
+ }
})();
function getCurrentScriptSrc() {
@@ -39,7 +39,7 @@ function getCurrentScriptSrc() {
}
function runScripts(scriptIds, event, path) {
- for (let id of scriptIds) {
+ for (let id of scriptIds.filter((_) => _)) {
let scriptPath = `${path}/${id}.js`;
import(scriptPath).then(({ default: script }) => {
try {
diff --git a/scripts/helpers/utils.js b/scripts/helpers/utils.js
index 8e64fb91..5f37413c 100644
--- a/scripts/helpers/utils.js
+++ b/scripts/helpers/utils.js
@@ -25,7 +25,9 @@ export function setActiveScript(scriptId, isActive = true) {
if (isActive) list.push(scriptId);
else list = list.filter((_) => _ != scriptId);
list = list.filter((_) => _);
- localStorage.setItem(listActiveScriptsKey, list.join(","));
+ let valToSave = list.join(",");
+ localStorage.setItem(listActiveScriptsKey, valToSave);
+ chrome.storage.sync.set({ [listActiveScriptsKey]: valToSave }); // save to storage => content script can access
return list;
}
From 0adb12c2e65a999b9226f066f3dd4cfd88e6cb77 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Mon, 19 Dec 2022 00:41:23 +0700
Subject: [PATCH 108/164] who is typing - wip
---
empty_script.js | 8 ++---
popup/index.js | 20 +++++------
popup/tabs.js | 7 ++--
scripts/fb_revealDeletedMessages.js | 17 ++++++----
scripts/fb_whoIsTyping.js | 52 +++++++++++++++++++++++++++++
scripts/index.js | 2 ++
6 files changed, 82 insertions(+), 24 deletions(-)
create mode 100644 scripts/fb_whoIsTyping.js
diff --git a/empty_script.js b/empty_script.js
index 42d6727e..9d4a7766 100644
--- a/empty_script.js
+++ b/empty_script.js
@@ -11,10 +11,10 @@ export default {
blackList: [],
whiteList: [],
- // path to script file that run (if enable autorun) in web page context
- onDocumentStart: "",
- onDocumentEnd: "",
- onDocumentIdle: "",
+ // run (if enable autorun) in web page context
+ onDocumentStart: () => {},
+ onDocumentEnd: () => {},
+ onDocumentIdle: () => {},
// run onclick in extension-popup-page context
onClickExtension: () => {},
diff --git a/popup/index.js b/popup/index.js
index 58c84937..8924bc8c 100644
--- a/popup/index.js
+++ b/popup/index.js
@@ -33,10 +33,10 @@ const flagImg = document.querySelector("img#flag");
const searchInput = document.querySelector(".search input");
const searchFound = document.querySelector(".search .searchFound");
-async function initLanguage() {
+function initLanguage() {
flagImg.setAttribute("src", getFlag());
- flagImg.onclick = async () => {
+ flagImg.onclick = () => {
toggleLang();
flagImg.setAttribute("src", getFlag());
@@ -46,9 +46,9 @@ async function initLanguage() {
};
}
-async function createTabs() {
+function createTabs() {
// prepare tabs
- await refreshSpecialTabs();
+ refreshSpecialTabs();
// clear UI
tabDiv.innerHTML = "";
@@ -85,7 +85,7 @@ async function createTabs() {
}
// open tab
- let activeTabId = await activeTabIdSaver.get();
+ let activeTabId = activeTabIdSaver.get();
activeTabId && openTab(allTabs.find((tab) => tab.id === activeTabId));
}
@@ -126,7 +126,7 @@ async function createTabContent(tab) {
});
contentContainer.appendChild(emptyText);
} else {
- const favoriteScriptIds = await favoriteScriptsSaver.getIds();
+ const favoriteScriptIds = favoriteScriptsSaver.getIds();
tab.scripts.forEach((script) => {
let isFavorite = favoriteScriptIds.find((id) => script.id === id);
contentContainer.appendChild(createScriptButton(script, isFavorite));
@@ -157,7 +157,7 @@ function createScriptButton(script, isFavorite = false) {
const checkmark = document.createElement("button");
checkmark.className = "checkmark tooltip";
checkmark.onclick = async (e) => {
- let newValue = await toggleActiveScript(script.id);
+ let newValue = toggleActiveScript(script.id);
updateButtonChecker(script, buttonContainer, newValue);
};
@@ -279,7 +279,7 @@ function createScriptButton(script, isFavorite = false) {
async function updateButtonChecker(script, button, val) {
let checkmark = button.querySelector(".checkmark");
if (!checkmark) return;
- if (val ?? (await isActiveScript(script.id))) {
+ if (val ?? isActiveScript(script.id)) {
checkmark.classList.add("active");
checkmark.title = t({
vi: "Tắt tự động chạy",
@@ -366,7 +366,7 @@ function initSearch() {
(async function () {
// initOpenInNewTabBtn();
initSearch();
- await initLanguage();
- await createTabs();
+ initLanguage();
+ createTabs();
await checkForUpdate();
})();
diff --git a/popup/tabs.js b/popup/tabs.js
index 58a39d7c..ff5e2561 100644
--- a/popup/tabs.js
+++ b/popup/tabs.js
@@ -93,6 +93,7 @@ const tabs = [
...CATEGORY.facebook,
scripts: [
s.fb_revealDeletedMessages,
+ s.fb_whoIsTyping,
createTitle("--- UI ---", "--- Giao diện ---"),
s.fb_toggleLight,
s.fb_toggleNewFeed,
@@ -440,13 +441,13 @@ function sortScriptsByTab(scripts, _tabs, addTabTitle = true) {
return result;
}
-async function refreshSpecialTabs() {
+function refreshSpecialTabs() {
// add data to special tabs
let recentTab = specialTabs.find((tab) => tab.id === CATEGORY.recently.id);
- if (recentTab) recentTab.scripts = await recentScriptsSaver.get();
+ if (recentTab) recentTab.scripts = recentScriptsSaver.get();
let favoriteTab = specialTabs.find((tab) => tab.id === CATEGORY.favorite.id);
- if (favoriteTab) favoriteTab.scripts = await favoriteScriptsSaver.get();
+ if (favoriteTab) favoriteTab.scripts = favoriteScriptsSaver.get();
let allTab = specialTabs.find((tab) => tab.id === CATEGORY.all.id);
if (allTab) allTab.scripts = sortScriptsByTab(Object.values(s), tabs);
diff --git a/scripts/fb_revealDeletedMessages.js b/scripts/fb_revealDeletedMessages.js
index 09d867e8..b01f68ff 100644
--- a/scripts/fb_revealDeletedMessages.js
+++ b/scripts/fb_revealDeletedMessages.js
@@ -17,7 +17,10 @@ export default {
websocket_instant.addEventListener("message", async function (achunk) {
const utf8_str = new TextDecoder("utf-8").decode(achunk.data);
// Do something here
- console.log(utf8_str);
+
+ if (utf8_str.includes("updateTypingIndicator")) {
+ // console.log(utf8_str);
+ }
});
return websocket_instant;
};
@@ -130,13 +133,13 @@ export default {
// MWChatTypingIndicator.bs
// MWPTypingIndicators.bs
requireLazy(["LSUpdateTypingIndicator"], (LSUpdateTypingIndicator) => {
- alert("abc");
- // const LSUpdateTypingIndicatorOrig = LSUpdateTypingIndicator;
+ // alert("abc");
+ const LSUpdateTypingIndicatorOrig = LSUpdateTypingIndicator;
- // LSUpdateTypingIndicator = function () {
- // console.log(arguments);
- // return LSUpdateTypingIndicatorOrig.apply(this, arguments);
- // };
+ LSUpdateTypingIndicator = function () {
+ console.log(arguments);
+ return LSUpdateTypingIndicatorOrig.apply(this, arguments);
+ };
});
},
};
diff --git a/scripts/fb_whoIsTyping.js b/scripts/fb_whoIsTyping.js
new file mode 100644
index 00000000..46adeefd
--- /dev/null
+++ b/scripts/fb_whoIsTyping.js
@@ -0,0 +1,52 @@
+export default {
+ icon: '',
+ name: {
+ en: "Facebook - Who is typing to you?",
+ vi: "Facebook - Ai đang nhắn cho bạn?",
+ },
+ description: {
+ en: "Notify when someone is typing chat to you.",
+ vi: "Thông báo khi có người đang gõ tin nhắn cho bạn.",
+ },
+ whiteList: ["https://*.facebook.com/*", "https://*.messenger.com/*"],
+
+ onDocumentStart: () => {
+ function notifyTypingEvent() {
+
+ }
+ function saveTyingEvent(uid, typing) {
+ let key = "ufs-fb_whoIsTyping";
+ let old = JSON.parse(localStorage.getItem(key) ?? "[]");
+ old.push({
+ time: new Date().getTime(),
+ uid: uid,
+ typing: typing,
+ });
+ localStorage.setItem(key, JSON.stringify(old));
+ }
+
+ const WebSocketOrig = window.WebSocket;
+ window.WebSocket = function fakeConstructor(dt, config) {
+ const websocket_instant = new WebSocketOrig(dt, config);
+ websocket_instant.addEventListener("message", async function (achunk) {
+ let utf8_str = new TextDecoder("utf-8").decode(achunk.data);
+
+ if (utf8_str.includes("updateTypingIndicator")) {
+ let isStartTyping = utf8_str.includes(",true)");
+ let isStopTyping = utf8_str.includes(",false)");
+
+ let arr = utf8_str.match(/(\[)(.*?)(\])/g);
+ let uid = UsefulScriptGlobalWebpageContext.Facebook.decodeArrId(
+ JSON.parse(arr[arr.length - 2])
+ );
+
+ console.log(uid);
+ saveTyingEvent(uid, isStartTyping);
+ }
+ });
+ return websocket_instant;
+ };
+ window.WebSocket.prototype = WebSocketOrig.prototype;
+ window.WebSocket.prototype.constructor = window.WebSocket;
+ },
+};
diff --git a/scripts/index.js b/scripts/index.js
index 6479673b..6710b1de 100644
--- a/scripts/index.js
+++ b/scripts/index.js
@@ -158,6 +158,7 @@ import fb_invisible_message from "./fb_invisible_message.js";
import insta_injectDownloadBtn from "./insta_injectDownloadBtn.js";
import studocu_bypassPreview from "./studocu_bypassPreview.js";
import fb_revealDeletedMessages from "./fb_revealDeletedMessages.js";
+import fb_whoIsTyping from "./fb_whoIsTyping.js";
// inject badges
const allScripts = {
@@ -337,6 +338,7 @@ const allScripts = {
insta_injectDownloadBtn: addBadge(insta_injectDownloadBtn, BADGES.new),
studocu_bypassPreview: addBadge(studocu_bypassPreview, BADGES.new),
fb_revealDeletedMessages: addBadge(fb_revealDeletedMessages, BADGES.hot),
+ fb_whoIsTyping: addBadge(fb_whoIsTyping, BADGES.new),
};
// alert(Object.keys(allScripts).length);
From b7019949e2714d4af045d71515203ea29840b2f6 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Mon, 19 Dec 2022 01:22:50 +0700
Subject: [PATCH 109/164] detect zero-width characters
---
popup/tabs.js | 1 +
.../scripts/ufs_global_webpage_context.js | 7 ++
scripts/detect_zeroWidthCharacters.js | 108 ++++++++++++++++++
scripts/index.js | 2 +
4 files changed, 118 insertions(+)
create mode 100644 scripts/detect_zeroWidthCharacters.js
diff --git a/popup/tabs.js b/popup/tabs.js
index ff5e2561..7e9edf9d 100644
--- a/popup/tabs.js
+++ b/popup/tabs.js
@@ -229,6 +229,7 @@ const tabs = [
s.studyphim_unlimited,
s.studocu_bypassPreview,
createTitle("--- Unlock function ---", "--- Mở khoá chức năng ---"),
+ s.detect_zeroWidthCharacters,
s.simpleAllowCopy,
s.reEnableContextMenu,
s.showHiddenFields,
diff --git a/scripts/content-scripts/scripts/ufs_global_webpage_context.js b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
index f5c87a14..b3c0433f 100644
--- a/scripts/content-scripts/scripts/ufs_global_webpage_context.js
+++ b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
@@ -64,6 +64,13 @@ const UsefulScriptGlobalWebpageContext = {
// return disconnect function
return () => observer.disconnect();
},
+
+ injectCssCode(code) {
+ var css = document.createElement("style");
+ if ("textContent" in css) css.textContent = code;
+ else css.innerText = code;
+ document.head.appendChild(css);
+ },
},
Facebook: {
decodeArrId(arrId) {
diff --git a/scripts/detect_zeroWidthCharacters.js b/scripts/detect_zeroWidthCharacters.js
new file mode 100644
index 00000000..26a79de5
--- /dev/null
+++ b/scripts/detect_zeroWidthCharacters.js
@@ -0,0 +1,108 @@
+export default {
+ icon: "https://lh3.googleusercontent.com/6i_qAB7dGRV44NxLp_JzemPr0ZoHp1e2JT0QxHbAteVJwsLQ-1HLaxmcUJ19F-wKITawVukn8ZbLri2FZamcxgBB=w128-h128-e365-rj-sc0x00ffffff",
+ name: {
+ en: "Detect Zero-Width Characters",
+ vi: "Phát hiện ký tự ẩn (Zero-Width)",
+ },
+ description: {
+ en: "Detects zero-width characters, highlights the characters and containing DOM element.\n\nClick for more detail.",
+ vi: "Phát hiện ký tự ẩn (zero-width) trong văn bản cho trình duyệt, e-mail client, trình soạn thảo văn bản,...\n\nBấm để xem thêm chi tiết.",
+ },
+
+ // Code extracted from https://chrome.google.com/webstore/detail/detect-zero-width-charact/icibkhaehdofmcbfjfpppogioidkilib
+ onDocumentIdle: () => {
+ (function () {
+ var unicodeCode;
+ const zeroWidthCharacterCodes = [8203, 8204, 8205, 8288];
+
+ let elementsWithZWCC = [];
+ const highlightCharacters = function (element) {
+ const zeroWidthCharacters = String.fromCodePoint(
+ ...zeroWidthCharacterCodes
+ );
+ const regExp = new RegExp(`([${zeroWidthCharacters}])`, "g");
+ element.innerHTML = element.innerHTML.replace(
+ regExp,
+ '$1'
+ );
+ };
+ // From: https://jsfiddle.net/tim333/np874wae/13/
+ const checkElement = function (element) {
+ const text = textWithoutChildren(element);
+ [...text].forEach(function (character) {
+ unicodeCode = character.codePointAt(0);
+ if (
+ zeroWidthCharacterCodes.includes(unicodeCode) &&
+ !elementsWithZWCC.includes(element)
+ ) {
+ elementsWithZWCC.push(element);
+ }
+ });
+ };
+ // From: https://stackoverflow.com/a/9340862/535363
+ const textWithoutChildren = function (element) {
+ let child = element.firstChild,
+ texts = [];
+ while (child) {
+ if (child.nodeType == 3) {
+ texts.push(child.data);
+ }
+ child = child.nextSibling;
+ }
+ return texts.join("");
+ };
+ const checkPage = function () {
+ const allElements = document.getElementsByTagName("*");
+ [...allElements].forEach(checkElement);
+ elementsWithZWCC.forEach(function (element) {
+ element.classList.add("zero-width-characters");
+ highlightCharacters(element);
+ });
+ };
+
+ var readyStateCheckInterval = setInterval(function () {
+ if (document.readyState === "complete") {
+ clearInterval(readyStateCheckInterval);
+ // Check Page
+ checkPage();
+ // Check page again when any input field is changed
+ const inputs = document.querySelectorAll("input");
+ [...inputs].forEach(function (input) {
+ input.addEventListener("change", checkPage);
+ });
+ }
+ }, 10);
+ })();
+
+ UsefulScriptGlobalWebpageContext.DOM.injectCssCode(`
+ .zero-width-characters {
+ background-color: rgba(255, 0, 0, 0.2) !important;
+ position: relative;
+ }
+ .zero-width-characters:after {
+ background: #ffb2b2;
+ bottom: -14px;
+ color: #000;
+ content: 'Warning: Contains zero-width characters.';
+ float: right;
+ font-family: monospace;
+ font-size: 10px;
+ font-weight: bold;
+ line-height: 1;
+ padding: 2px 4px;
+ position: absolute;
+ right: 0;
+ }
+ .zero-width-character:after {
+ color: red;
+ content: '\u25CF';
+ }`);
+ },
+
+ onClick: () => {
+ prompt(
+ "Đọc bài viết bên dưới để hiểu rõ hơn chức năng này",
+ "https://viblo.asia/p/ky-tu-zero-width-sat-thu-vo-hinh-nam-giua-doan-van-ban-thuan-vo-hai-L4x5xM7qKBM"
+ );
+ },
+};
diff --git a/scripts/index.js b/scripts/index.js
index 6710b1de..f68ad511 100644
--- a/scripts/index.js
+++ b/scripts/index.js
@@ -159,6 +159,7 @@ import insta_injectDownloadBtn from "./insta_injectDownloadBtn.js";
import studocu_bypassPreview from "./studocu_bypassPreview.js";
import fb_revealDeletedMessages from "./fb_revealDeletedMessages.js";
import fb_whoIsTyping from "./fb_whoIsTyping.js";
+import detect_zeroWidthCharacters from "./detect_zeroWidthCharacters.js";
// inject badges
const allScripts = {
@@ -339,6 +340,7 @@ const allScripts = {
studocu_bypassPreview: addBadge(studocu_bypassPreview, BADGES.new),
fb_revealDeletedMessages: addBadge(fb_revealDeletedMessages, BADGES.hot),
fb_whoIsTyping: addBadge(fb_whoIsTyping, BADGES.new),
+ detect_zeroWidthCharacters: addBadge(detect_zeroWidthCharacters, BADGES.new),
};
// alert(Object.keys(allScripts).length);
From 5b03a1993e8bea68cecb96296c0ba45a088bfb20 Mon Sep 17 00:00:00 2001
From: Hoang Tran <99.hoangtran@gmail.com>
Date: Mon, 19 Dec 2022 02:31:01 +0700
Subject: [PATCH 110/164] access token iphone
---
.../scripts/ufs_global_webpage_context.js | 7 ++++
scripts/fb_getAvatarFromUid.js | 37 ++++++++++++-------
scripts/helpers/constants.js | 4 ++
3 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/scripts/content-scripts/scripts/ufs_global_webpage_context.js b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
index b3c0433f..c8cd6ef7 100644
--- a/scripts/content-scripts/scripts/ufs_global_webpage_context.js
+++ b/scripts/content-scripts/scripts/ufs_global_webpage_context.js
@@ -73,6 +73,13 @@ const UsefulScriptGlobalWebpageContext = {
},
},
Facebook: {
+ getUserAvatarFromUid(uid) {
+ return (
+ "https://graph.facebook.com/" +
+ uid +
+ "/picture?height=500&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662"
+ );
+ },
decodeArrId(arrId) {
return arrId[0] * 4294967296 + arrId[1];
},
diff --git a/scripts/fb_getAvatarFromUid.js b/scripts/fb_getAvatarFromUid.js
index 0eb9ae18..d1a89ce9 100644
--- a/scripts/fb_getAvatarFromUid.js
+++ b/scripts/fb_getAvatarFromUid.js
@@ -1,4 +1,5 @@
import { downloadData, showLoading } from "./helpers/utils.js";
+import { AccessToken } from "./helpers/constants.js";
export default {
icon: '',
@@ -12,8 +13,6 @@ export default {
},
onClickExtension: async function () {
- let accessToken = prompt("Nhập facebook access token: ");
- if (!accessToken) return;
let uids = prompt("Nhập danh sách uid, Mỗi uid 1 dòng:");
if (!uids) return;
@@ -23,25 +22,35 @@ export default {
let urls = [];
for (let uid of uids) {
setLoadingText("Đang lấy avatar của " + uid + "...");
- let url = `https://graph.facebook.com/${uid}/picture?type=large&access_token=${accessToken}`;
- let data = await fetch(url);
- if (data?.url) {
- urls.push(data?.url);
+ let url = await shared.getAvatarFromUid(uid);
+ if (url) {
+ urls.push(url);
}
}
+
+ if (urls.length === 0) alert("Không tìm được avatar nào!");
+ else if (urls.length === 1) window.open(urls[0]);
+ else {
+ if (
+ confirm("Tìm được " + urls.length + " avatars.\nBấm Ok để tải xuống.")
+ )
+ downloadData(
+ urls.join("\n"),
+ `uid-${new Date().toLocaleString()}.txt`
+ );
+ }
} catch (e) {
alert("ERROR: " + e);
} finally {
closeLoading();
}
+ },
+};
- if (urls.length === 0) alert("Không tìm được avatar nào!");
- else if (urls.length === 1) window.open(urls[0]);
- else {
- if (
- confirm("Tìm được " + urls.length + " avatars.\nBấm Ok để tải xuống.")
- )
- downloadData(urls.join("\n"), `uid-${new Date().toLocaleString()}.txt`);
- }
+export const shared = {
+ getAvatarFromUid: async (uid) => {
+ let url = `https://graph.facebook.com/${uid}/picture?height=500&access_token=${AccessToken.FacebookIphone}`;
+ let data = await fetch(url);
+ return data.url;
},
};
diff --git a/scripts/helpers/constants.js b/scripts/helpers/constants.js
index c9366e14..88121348 100644
--- a/scripts/helpers/constants.js
+++ b/scripts/helpers/constants.js
@@ -20,3 +20,7 @@ export const EventMap = {
[Events.onDocumentIdle]: "document_idle",
[Events.onDocumentEnd]: "document_end",
};
+
+export const AccessToken = {
+ FacebookIphone: "6628568379%7Cc1e620fa708a1d5696fb991c1bde5662",
+};
From f67f69fca769aab9bc56fc9cdd9f92cb78b59394 Mon Sep 17 00:00:00 2001
From: "hoang.tran12"
Date: Mon, 19 Dec 2022 17:07:42 +0700
Subject: [PATCH 111/164] refactor
---
scripts/content-scripts/document_start.js | 60 +++++++++++------------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/scripts/content-scripts/document_start.js b/scripts/content-scripts/document_start.js
index 3443fa3e..ad52b981 100644
--- a/scripts/content-scripts/document_start.js
+++ b/scripts/content-scripts/document_start.js
@@ -1,34 +1,4 @@
-// https://stackoverflow.com/a/70949953
-// https://stackoverflow.com/a/9517879
-// https://stackoverflow.com/a/2920207/11898496
-
(async () => {
- // https://stackoverflow.com/a/8578840/11898496
- function injectScript(
- src,
- onload,
- type = "text/javascript",
- async = false,
- defer = false
- ) {
- let s = document.createElement("script");
- s.type = type;
- s.async = async;
- s.defer = defer;
- s.addEventListener("load", () => {
- console.log("Useful-scripts injected " + src);
- onload?.();
- s.remove();
- });
- s.src = src;
- let head =
- document.head ||
- document.getElementsByTagName("head")[0] ||
- document.documentElement;
- head.insertBefore(s, head.firstChild);
- // (document.head || document.documentElement).prepend(s);
- }
-
injectScript(
chrome.runtime.getURL(
"/scripts/content-scripts/scripts/ufs_global_webpage_context.js"
@@ -81,3 +51,33 @@
console.log("ERROR: ", e);
}
})();
+
+// https://stackoverflow.com/a/70949953
+// https://stackoverflow.com/a/9517879
+// https://stackoverflow.com/a/2920207/11898496
+
+// https://stackoverflow.com/a/8578840/11898496
+function injectScript(
+ src,
+ onload,
+ type = "text/javascript",
+ async = false,
+ defer = false
+) {
+ let s = document.createElement("script");
+ s.type = type;
+ s.async = async;
+ s.defer = defer;
+ s.addEventListener("load", () => {
+ console.log("Useful-scripts injected " + src);
+ onload?.();
+ s.remove();
+ });
+ s.src = src;
+ let head =
+ document.head ||
+ document.getElementsByTagName("head")[0] ||
+ document.documentElement;
+ head.insertBefore(s, head.firstChild);
+ // (document.head || document.documentElement).prepend(s);
+}
From 1ebebcc52dd1931e0b78c467eba848809e6aa49b Mon Sep 17 00:00:00 2001
From: "hoang.tran12"
Date: Mon, 19 Dec 2022 17:29:53 +0700
Subject: [PATCH 112/164] optimize popup load speed
---
popup/main.js | 3 +++
popup/popup.html | 8 +++++++-
popup/styles/style.css | 8 ++++++++
3 files changed, 18 insertions(+), 1 deletion(-)
create mode 100644 popup/main.js
diff --git a/popup/main.js b/popup/main.js
new file mode 100644
index 00000000..c19f610c
--- /dev/null
+++ b/popup/main.js
@@ -0,0 +1,3 @@
+import("./index.js").then(() => {
+ document.querySelector("#loading-fullscreen")?.remove();
+});
diff --git a/popup/popup.html b/popup/popup.html
index 6c216fd6..46c86ad1 100644
--- a/popup/popup.html
+++ b/popup/popup.html
@@ -48,7 +48,13 @@ Modal Title