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 });