1+ import { UfsGlobal } from "./content-scripts/ufs_global.js" ;
12import { BADGES } from "./helpers/badge.js" ;
23
34export 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