Skip to content

Commit e9f28f7

Browse files
committed
auto like/unlike - nice
1 parent a598c1f commit e9f28f7

File tree

2 files changed

+166
-75
lines changed

2 files changed

+166
-75
lines changed

scripts/content-scripts/ufs_global.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@ function notify({
561561
}
562562
return false;
563563
},
564-
setText(text) {
564+
setText(text, duration) {
565565
if (div) {
566566
div.innerHTML = createTrustedHtml(text);
567+
if (duration) closeAfter(duration);
567568
return true;
568569
}
569570
return false;

scripts/fb_autoLike.js

Lines changed: 164 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { UfsGlobal } from "./content-scripts/ufs_global.js";
12
import { BADGES } from "./helpers/badge.js";
23

34
export default {
@@ -7,21 +8,30 @@ export default {
78
vi: "Tự động thích bài đăng Facebook",
89
},
910
description: {
10-
en: "Auto like post on Facebook. Support all reactions, all post types (page, group, user, feed, ...)",
11-
vi: "Tự động thả cảm xúc cho bài đăng trên Facebook. Hỗ trợ mọi cảm xúc, mọi loài bài đăng (trang, nhóm, người dùng, new feed, ...)",
11+
en: `Auto like post on Facebook.
12+
<ul>
13+
<li>Support all post types (page, group, user, feed, ...)</li>
14+
<li>Support bulk remove/add reactions</li>
15+
<li>Support all reaction types</li>
16+
</ul>`,
17+
vi: `Tự động thả cảm xúc cho bài đăng trên Facebook.
18+
<ul>
19+
<li>Hỗ trợ mọi loại bài đăng (trang, nhóm, người dùng, new feed, ...)</li>
20+
<li>Hỗ trợ gỡ/thêm cảm xúc hàng loạt</li>
21+
<li>Hỗ trợ mọi loại cảm xúc</li>
22+
</ul>`,
1223
},
1324
badges: [BADGES.new],
1425
changeLogs: {
1526
"2024-07-08": "init",
1627
},
1728

18-
whiteList: [],
29+
// whiteList: ["https://*.facebook.com/*"],
30+
31+
pageScript: {
32+
onClick: () => {
33+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
1934

20-
contentScript: {
21-
onClick: async () => {
22-
function sleep(ms) {
23-
return new Promise((resolve) => setTimeout(resolve, ms));
24-
}
2535
function focusTo(element) {
2636
element.dispatchEvent(
2737
new MouseEvent("pointerover", {
@@ -33,89 +43,169 @@ export default {
3343
}
3444

3545
function scrollToBottom() {
36-
window.scrollTo(0, document.body.scrollHeight, {
37-
// behavior: "smooth",
38-
});
46+
window.scrollTo(0, document.body.scrollHeight, { behavior: "smooth" });
47+
}
48+
49+
function rand(min, max) {
50+
return Math.floor(Math.random() * (max - min + 1) + min);
51+
}
52+
53+
function isRunning(value) {
54+
if (!(typeof value === "boolean"))
55+
return window.ufs_fb_autoLike_running;
56+
else window.ufs_fb_autoLike_running = value;
3957
}
4058

4159
const Reactions = {
42-
Like: {
43-
en: "Like",
44-
vi: "Thích",
45-
emoji: "👍",
46-
},
47-
Love: {
48-
en: "Love",
49-
vi: "Yêu thích",
50-
emoji: "❤️",
51-
},
52-
Care: {
53-
en: "Care",
54-
vi: "Nghiện",
55-
emoji: "😊",
56-
},
57-
Haha: {
58-
en: "Haha",
59-
vi: "Há",
60-
emoji: "😂",
61-
},
62-
Wow: {
63-
en: "Wow",
64-
vi: "Wow",
65-
emoji: "😮",
66-
},
67-
Sad: {
68-
en: "Sad",
69-
vi: "Buồn",
70-
emoji: "😢",
60+
like: { vi: "Thích", en: "Like", emoji: "👍" },
61+
love: { vi: "Yêu thích", en: "Love", emoji: "❤️" },
62+
care: { vi: "Thương thương", en: "Care", emoji: "🤗" },
63+
haha: { vi: "Haha", en: "Haha", emoji: "😂" },
64+
wow: { vi: "Wow", en: "Wow", emoji: "😮" },
65+
sad: { vi: "Buồn", en: "Sad", emoji: "😢" },
66+
angry: { vi: "Phẫn nộ", en: "Angry", emoji: "😠" },
67+
};
68+
69+
const Types = {
70+
addReact: {
71+
vi: "Bày tỏ cảm xúc",
72+
en: "React",
73+
name: "Thả cảm xúc - Add reaction",
7174
},
72-
Angry: {
73-
en: "Angry",
74-
vi: "Khóc",
75-
emoji: "😡",
75+
removeReact: {
76+
vi: "Gỡ ",
77+
en: "Remove ",
78+
name: "Gỡ cảm xúc - Remove reaction",
7679
},
7780
};
7881

79-
const doneKey = "auto-like-done";
80-
const btns = [];
81-
while (true) {
82-
if (!btns.length) {
83-
let curBtns = Array.from(
84-
document.querySelectorAll(
85-
"[aria-label='Bày tỏ cảm xúc']:not(li *), [aria-label='React']:not(li *)"
86-
)
87-
);
88-
let added = 0;
89-
for (let btn of curBtns) {
90-
if (btn.getAttribute(doneKey) === null) {
91-
btns.push(btn);
92-
btn.setAttribute(doneKey, true);
93-
added++;
94-
}
82+
async function startAutoLike(
83+
type = Types.addReact,
84+
reaction = Reactions.love,
85+
maxPosts = Infinity
86+
) {
87+
isRunning(true);
88+
89+
const notify = UfsGlobal.DOM.notify({
90+
msg: "Đang chuẩn bị ...",
91+
duration: 999999,
92+
});
93+
94+
let count = 0;
95+
96+
const btns = [];
97+
UfsGlobal.DOM.onElementsAdded(
98+
[type.en, type.vi]
99+
.map((_) => `[aria-label*='${_}']:not(li *)`)
100+
.join(", "),
101+
(nodes) => {
102+
btns.push(...nodes);
95103
}
96-
if (added === 0) break;
97-
}
104+
);
98105

99-
for (let btn of btns) {
106+
let scrollTried = 0;
107+
while (true) {
108+
if (!isRunning()) {
109+
alert("Stopped Auto react !\n\nĐã dừng tự động thích!");
110+
break;
111+
}
112+
if (!btns.length) {
113+
scrollTried++;
114+
if (scrollTried > 50) break;
115+
notify.setText("Scrolling to bottom... " + scrollTried, 99999);
116+
scrollToBottom();
117+
await sleep(2000);
118+
continue;
119+
}
120+
scrollTried = 0;
121+
122+
const btn = btns.shift();
100123
btn.scrollIntoView({
101124
block: "center",
102-
// behavior: "smooth",
125+
behavior: "smooth",
103126
});
104127
btn.click();
105-
await sleep(500);
106-
let loveBtn = document.querySelector("[aria-label='Yêu thích']");
107-
if (loveBtn) {
108-
focusTo(loveBtn);
109-
await sleep(500);
110-
loveBtn.click();
128+
129+
if (type === Types.addReact) {
111130
await sleep(500);
131+
132+
let reactBtn = document.querySelector(
133+
[reaction.en, reaction.vi]
134+
.map((_) => `[aria-label='${_}']`)
135+
.join(", ")
136+
);
137+
console.log(reactBtn);
138+
if (reactBtn) {
139+
focusTo(reactBtn);
140+
await sleep(50);
141+
reactBtn.click();
142+
await sleep(50);
143+
}
112144
}
113-
btns.splice(btns.indexOf(btn), 1);
145+
146+
let waitFor = rand(2000, 5000);
147+
count++;
148+
if (count >= maxPosts) break;
149+
notify.setText(
150+
type.name +
151+
": " +
152+
count +
153+
"/" +
154+
(count + btns.length) +
155+
" - waiting: " +
156+
(waitFor / 1000).toFixed(1) +
157+
"s",
158+
99999
159+
);
160+
161+
await sleep(waitFor);
114162
}
115-
scrollToBottom();
116-
await sleep(3000);
163+
164+
let text = type.name + ": " + count + " posts";
165+
notify.setText(text, 5000);
166+
isRunning(false);
167+
alert(text);
168+
}
169+
170+
if (isRunning()) {
171+
return isRunning(false);
172+
}
173+
174+
const typeIndex = prompt(
175+
"Bạn muốn?\n" +
176+
Object.entries(Types)
177+
.map(([key, value], i) => i + ": " + value.name)
178+
.join("\n"),
179+
0
180+
);
181+
let selectedType = Types[Object.keys(Types)[typeIndex]];
182+
let selectedReact;
183+
if (typeIndex === null || !selectedType) return;
184+
185+
if (typeIndex == 0) {
186+
let reactIndex = prompt(
187+
"Chọn reaction:\n" +
188+
Object.entries(Reactions)
189+
.map(
190+
([key, value], i) =>
191+
i + ": " + value.emoji + " " + value.en + " - " + value.vi
192+
)
193+
.join("\n"),
194+
1
195+
);
196+
selectedReact = Reactions[Object.keys(Reactions)[reactIndex]];
197+
if (reactIndex == null || !selectedReact) return;
117198
}
118-
alert("xong");
199+
200+
let max = prompt(
201+
"Thả bao nhiêu bài post? - Max post?: (0 = tất cả/all) ",
202+
0
203+
);
204+
if (max == null) return;
205+
if (max == 0) max = Infinity;
206+
else max = parseInt(max);
207+
208+
startAutoLike(selectedType, selectedReact, max);
119209
},
120210
},
121211
};

0 commit comments

Comments
 (0)