channel-worker 2.5.125 → 2.5.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/scripts/comment_facebook.js +58 -6
package/package.json
CHANGED
|
@@ -68,8 +68,15 @@ const BOX_SELECTORS = [
|
|
|
68
68
|
const OPEN_COMMENTS_SELECTORS = [
|
|
69
69
|
"[aria-label='Bình luận'], [aria-label='Comment']",
|
|
70
70
|
"[aria-label*='Để lại bình luận'], [aria-label*='Leave a comment']",
|
|
71
|
+
// Reel có thanh hành động riêng, nhãn khác hai dạng trên.
|
|
72
|
+
"[aria-label*='Xem bình luận'], [aria-label*='View comments']",
|
|
71
73
|
];
|
|
72
74
|
|
|
75
|
+
// Khung bình luận của reel mở bằng animation. Máy đang chạy nhiều lượt đăng
|
|
76
|
+
// song song thì vẽ chậm hẳn — chờ rộng tay, vì hỏng cả lượt tốn hơn nhiều so
|
|
77
|
+
// với đứng thêm mấy giây.
|
|
78
|
+
const OPEN_WAIT_MS = 12_000;
|
|
79
|
+
|
|
73
80
|
function sel(list) { return list.join(', '); }
|
|
74
81
|
|
|
75
82
|
// ─── tìm ô soạn ─────────────────────────────────────────────────────────────
|
|
@@ -93,16 +100,48 @@ async function findCommentBox(page) {
|
|
|
93
100
|
return null;
|
|
94
101
|
}
|
|
95
102
|
|
|
103
|
+
// Bấm xong PHẢI chờ tới khi ô soạn thật sự dựng, đừng ngủ cứng rồi đi tiếp.
|
|
104
|
+
//
|
|
105
|
+
// Bản đầu bấm nút rồi `pause(1800)` và trả về ngay. Khung bình luận của reel
|
|
106
|
+
// mở bằng animation, nên 1,8s chỉ đủ khi máy rảnh; 21/09 hai lượt trượt sạch
|
|
107
|
+
// đúng lúc máy đang chạy 5 lượt đăng song song, log dừng ở "bấm mở khung
|
|
108
|
+
// bình luận" rồi báo "không tìm thấy ô soạn (đã thử 7 nhãn)" — đọc lên tưởng
|
|
109
|
+
// bài tắt bình luận, thật ra khung chưa kịp vẽ. Các lượt thành công cùng ngày
|
|
110
|
+
// đều là bài có sẵn ô soạn, không qua nhánh này lần nào.
|
|
111
|
+
//
|
|
112
|
+
// Chờ tối đa OPEN_WAIT_MS và thử NÚT KHÁC nếu nút đầu không dựng được khung —
|
|
113
|
+
// trên reel có nhiều thứ mang nhãn "Bình luận" (nút ở thanh hành động, nút
|
|
114
|
+
// dưới bài), bấm trúng cái không mở panel là hỏng cả lượt.
|
|
96
115
|
async function openCommentsIfNeeded(page, log) {
|
|
116
|
+
let clicked = false;
|
|
97
117
|
for (const s of OPEN_COMMENTS_SELECTORS) {
|
|
98
118
|
const loc = page.locator(s).first();
|
|
99
119
|
if (!(await loc.isVisible().catch(() => false))) continue;
|
|
100
120
|
log('info', `[fb-cmt] chưa thấy ô soạn — bấm mở khung bình luận ("${s}")`);
|
|
101
121
|
await humanClick(page, loc).catch(() => {});
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
clicked = true;
|
|
123
|
+
const box = await waitForCommentBox(page, OPEN_WAIT_MS);
|
|
124
|
+
if (box) {
|
|
125
|
+
log('info', '[fb-cmt] khung bình luận đã dựng');
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
log('warn', `[fb-cmt] bấm "${s}" mà khung chưa dựng sau ${Math.round(OPEN_WAIT_MS / 1000)}s — thử nút khác`);
|
|
129
|
+
}
|
|
130
|
+
return clicked;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Dò lại ô soạn theo nhịp cho tới khi thấy hoặc hết giờ. Dùng vòng lặp chứ
|
|
134
|
+
// không `waitForSelector` vì ô soạn phải qua được bộ lọc của findCommentBox
|
|
135
|
+
// (ô soạn BÀI trên tường Page cũng khớp selector — gõ nhầm vào đó là đăng một
|
|
136
|
+
// bài mới toàn link).
|
|
137
|
+
async function waitForCommentBox(page, timeoutMs) {
|
|
138
|
+
const deadline = Date.now() + timeoutMs;
|
|
139
|
+
for (;;) {
|
|
140
|
+
const box = await findCommentBox(page);
|
|
141
|
+
if (box) return box;
|
|
142
|
+
if (Date.now() >= deadline) return null;
|
|
143
|
+
await pause(page, 700);
|
|
104
144
|
}
|
|
105
|
-
return false;
|
|
106
145
|
}
|
|
107
146
|
|
|
108
147
|
// ─── đọc lại để xác minh ────────────────────────────────────────────────────
|
|
@@ -261,13 +300,23 @@ async function run({ page, payload = {}, log }) {
|
|
|
261
300
|
if (gone) throw new Error(`Bài không mở được (đã xoá, đổi quyền riêng tư, hoặc link sai): ${postUrl}`);
|
|
262
301
|
|
|
263
302
|
let box = await findCommentBox(page);
|
|
303
|
+
// Chưa thấy ngay thì chờ một nhịp trước khi đi bấm nút: trang vừa mở, khối
|
|
304
|
+
// bình luận có khi còn đang vẽ.
|
|
305
|
+
if (!box) box = await waitForCommentBox(page, 4000);
|
|
306
|
+
let opened = false;
|
|
264
307
|
if (!box) {
|
|
265
|
-
await openCommentsIfNeeded(page, log);
|
|
308
|
+
opened = await openCommentsIfNeeded(page, log);
|
|
266
309
|
box = await findCommentBox(page);
|
|
267
310
|
}
|
|
268
311
|
if (!box) {
|
|
269
312
|
await assertAccountUsable(page, log);
|
|
270
|
-
|
|
313
|
+
// Nói đúng bệnh. Đã bấm được nút mở khung mà vẫn không có ô soạn thì bài
|
|
314
|
+
// KHÔNG tắt bình luận — nút đó chỉ hiện khi còn bình luận được; bệnh là
|
|
315
|
+
// khung không dựng kịp (máy bận) hoặc Facebook đổi cách dựng panel. Gộp
|
|
316
|
+
// hai chuyện vào một câu là lần sau đọc log đi sai hướng ngay từ đầu.
|
|
317
|
+
throw new Error(opened
|
|
318
|
+
? `Bấm mở khung bình luận rồi mà không có ô soạn sau ${Math.round(OPEN_WAIT_MS / 1000)}s trên ${postUrl} — máy đang bận vẽ chậm, hoặc Facebook đổi cách dựng khung bình luận của reel`
|
|
319
|
+
: `Không tìm thấy ô soạn bình luận trên ${postUrl} (đã thử ${BOX_SELECTORS.length} nhãn, cũng không thấy nút mở khung) — nhiều khả năng bài tắt bình luận hoặc Facebook đổi giao diện`);
|
|
271
320
|
}
|
|
272
321
|
|
|
273
322
|
// Đo NỀN trước khi gõ: link có thể đã nằm sẵn trong caption, hoặc bài đã
|
|
@@ -329,4 +378,7 @@ async function run({ page, payload = {}, log }) {
|
|
|
329
378
|
}
|
|
330
379
|
|
|
331
380
|
module.exports = { run };
|
|
332
|
-
module.exports.__testables = {
|
|
381
|
+
module.exports.__testables = {
|
|
382
|
+
findPostedComment, countLinkOnPage, waitForPostedComment, findCommentBox, BOX_SELECTORS, sel,
|
|
383
|
+
openCommentsIfNeeded, waitForCommentBox, OPEN_COMMENTS_SELECTORS, OPEN_WAIT_MS,
|
|
384
|
+
};
|