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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "channel-worker",
3
- "version": "2.5.125",
3
+ "version": "2.5.126",
4
4
  "description": "Channel Manager worker daemon — runs on remote machines to execute video pipeline jobs",
5
5
  "main": "lib/daemon.js",
6
6
  "bin": {
@@ -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
- await pause(page, 1800);
103
- return true;
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
- throw new Error(`Không tìm thấy ô soạn bình luận trên ${postUrl} (đã thử ${BOX_SELECTORS.length} nhãn) — nhiều khả năng bài tắt bình luận hoặc Facebook đổi giao diện`);
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 = { findPostedComment, countLinkOnPage, waitForPostedComment, findCommentBox, BOX_SELECTORS, sel };
381
+ module.exports.__testables = {
382
+ findPostedComment, countLinkOnPage, waitForPostedComment, findCommentBox, BOX_SELECTORS, sel,
383
+ openCommentsIfNeeded, waitForCommentBox, OPEN_COMMENTS_SELECTORS, OPEN_WAIT_MS,
384
+ };