/ clis / twitter / unbookmark.js
unbookmark.js
 1  import { CommandExecutionError } from '@jackwener/opencli/errors';
 2  import { cli, Strategy } from '@jackwener/opencli/registry';
 3  cli({
 4      site: 'twitter',
 5      name: 'unbookmark',
 6      description: 'Remove a tweet from bookmarks',
 7      domain: 'x.com',
 8      strategy: Strategy.UI,
 9      browser: true,
10      args: [
11          { name: 'url', type: 'string', positional: true, required: true, help: 'Tweet URL to unbookmark' },
12      ],
13      columns: ['status', 'message'],
14      func: async (page, kwargs) => {
15          if (!page)
16              throw new CommandExecutionError('Browser session required for twitter unbookmark');
17          await page.goto(kwargs.url);
18          await page.wait({ selector: '[data-testid="primaryColumn"]' });
19          const result = await page.evaluate(`(async () => {
20          try {
21              let attempts = 0;
22              let removeBtn = null;
23  
24              while (attempts < 20) {
25                  // Check if not bookmarked
26                  const bookmarkBtn = document.querySelector('[data-testid="bookmark"]');
27                  if (bookmarkBtn) {
28                      return { ok: true, message: 'Tweet is not bookmarked (already removed).' };
29                  }
30  
31                  removeBtn = document.querySelector('[data-testid="removeBookmark"]');
32                  if (removeBtn) break;
33  
34                  await new Promise(r => setTimeout(r, 500));
35                  attempts++;
36              }
37  
38              if (!removeBtn) {
39                  return { ok: false, message: 'Could not find Remove Bookmark button. Are you logged in?' };
40              }
41  
42              removeBtn.click();
43              await new Promise(r => setTimeout(r, 1000));
44  
45              // Verify
46              const verify = document.querySelector('[data-testid="bookmark"]');
47              if (verify) {
48                  return { ok: true, message: 'Tweet successfully removed from bookmarks.' };
49              } else {
50                  return { ok: false, message: 'Unbookmark action initiated but UI did not update.' };
51              }
52          } catch (e) {
53              return { ok: false, message: e.toString() };
54          }
55      })()`);
56          if (result.ok)
57              await page.wait(2);
58          return [{
59                  status: result.ok ? 'success' : 'failed',
60                  message: result.message
61              }];
62      }
63  });