biinari / zonefile-extract

Extract DNS records from your domain dashboard
The Unlicense
42 stars 10 forks source link

Use this in powershell #3

Open asmith3006 opened 3 years ago

asmith3006 commented 3 years ago

I wanted to give you this as your JS is the basis of my Powershell script.

This uses Selenium to iterate through your domain list and get the DNS. This will output a series of .zone files based on your script.

Feel free to use this as you wish.

$Username = ""
$Password = ""

$Script = @"
// CONFIG BEGIN
var defaultTTL = 300;
// CONFIG END

var table = document.getElementsByClassName('advanced_dns')[0];
var rows = table.getElementsByTagName('tr');
var i, len, row;
var hostname, type, priority, ttl, destination;
var output = '';

//output += '`$TTL ' + defaultTTL + '\n'; // start with default TTL

// skip header and last two rows (add new entry, delete all entries)
for (i = 1, len = rows.length - 2; i < len; i++) {
  row = rows[i];
  hostname = row.getElementsByClassName('dns_hostname')[0].innerText;
  type = row.getElementsByClassName('dns_type')[0].innerText;
  priority = row.getElementsByClassName('dns_priority')[0].innerText;
  ttl = row.getElementsByClassName('dns_ttl')[0].innerText || defaultTTL;
  destination = row.getElementsByClassName('dns_data')[0].title;

  if (type === 'TXT/SPF') {
    type = 'TXT';
    destination = '"' + destination + '"';
  }

  output += [hostname, ttl, 'IN', type, priority, destination].join(' ') + '\n';
}
return output;
"@

$Enter = ([OpenQA.Selenium.Keys]::Enter)

$Driver = Start-SeFirefox
Enter-SeUrl "https://sso.123-reg.co.uk/?app=ott&path=%2Fsecure" -Driver $Driver

Start-Sleep -Seconds 2

$E = Find-SeElement -Driver $Driver -Id "1"
Send-SeKeys -Element $E -Keys $Username

$E = Find-SeElement -Driver $Driver -Id "2"
Send-SeKeys -Element $e -Keys $Password
Send-SeKeys -Element $e -Keys $Enter

$E = Find-SeElement -Driver $Driver -CssSelector ".UPM__PrivacyModal > div:nth-child(1) > form:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > span:nth-child(2) > span:nth-child(1) > button:nth-child(1) > span:nth-child(1)"
Invoke-SeClick -Element $E

$E = Find-SeElement -Driver $Driver -CssSelector ".UDN__Modal > div:nth-child(1) > button:nth-child(2) > img:nth-child(2)"
Invoke-SeClick -Element $E

$E = Find-SeElement -Driver $Driver -Id "dom_select"

$DomainList = [OpenQA.Selenium.Support.UI.SelectElement]::new($E)
$domains = @()
$DomainList.Options | % {
    $Domains += $_.Text    
}
$domains | % {
    Enter-SeUrl "https://www.123-reg.co.uk/secure/cpanel/manage-dns?domain=$($_)" -Driver $Driver
    $use123 = $Driver.ExecuteScript("return `$('#not_use123ns.hidden').length")
    if ($use123 -eq "1") {
        $Driver.ExecuteScript("`$('#advanced-tab').trigger('click')")
        Start-Sleep -Second 2
        $dns = $Driver.ExecuteScript($Script)
        $dns | out-file -FilePath ".\$($_).zone"
    }
}
biinari commented 3 years ago

Thanks @asmith3006 that looks great.

I'm not familiar with powershell but perhaps if this could read the javascript from extract.js (with modifications to conditionally return instead of log the output) it would sit nicely alongside. If you fancy making a PR to that effect I'd gladly accept it.