#!/usr/bin/env node const puppeteer = require('puppeteer'); const pixel2 = puppeteer.devices['Pixel 2']; const args = process.argv.slice(2); const login = process.env.NC_LOGIN; const password = process.env.NC_PASSWORD; const domain = args[0]; const record = args[1]; const value = args[2]; if (!domain) { throw new Error('Missing domain argument'); } if (!record) { throw new Error('Missing record argument'); } if (!value) { throw new Error('Missing value argument'); } (async () => { const browser = await puppeteer.launch({ args: ['--no-sandbox'] }); try { const page = await browser.newPage(); await page.emulate(pixel2); await page.goto(`https://ap.www.namecheap.com/Domains/DomainControlPanel/${domain}/advancedns`, { waitUntil: 'networkidle2' }); await page.waitForSelector('input.nc_username'); await page.focus('input.nc_username'); await page.keyboard.type(login); await page.waitForSelector('input.nc_password'); await page.focus('input.nc_password'); await page.keyboard.type(password); await page.click('input[type="submit"]'); const recordElement = await page.waitForXPath(`//tr[descendant::p[text() = '${record}']]`); const editButton = await recordElement.$('a.mobile-edit'); await editButton.click(); const valueInput = await page.waitForSelector('.content .row input[placeholder="Value"]'); await valueInput.focus(); await valueInput.evaluate(el => el.value = ''); await page.keyboard.type(value); await page.click('.content .actions .btn'); await page.waitForXPath(`//tr[descendant::p[text() = '${record}'] and descendant::p[text() = '${value}']]`); } catch (error) { await browser.close(); throw error; } await browser.close(); })().catch(error => { console.error(error); process.exit(1); });